diff --git a/.travis.yml b/.travis.yml index de40433..793139d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ node_js: - "node" before_deploy: - - export NEXT_VERSION=3.2.1 + - export NEXT_VERSION=3.3.1 - export COMMIT_HASH=$(git log --format=%h -1) - export DIST_PATH=build - export PUBLISH_REPO=blinksocks/blinksocks-nightly-releases diff --git a/CHANGELOG.md b/CHANGELOG.md index 48323fa..38b116c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,138 @@ # Change Log +## 3.3.1 (2018-06-15) + +### :rocket: Features & Improvements + +- package: upgrade winston to v3.0.0. +- proxies: add `https` support. +- transport: set handshake timeout of ws to 10s. +- docs: add `Test Using curl`. +- docs: add a batch of [examples](./docs/examples). + +### :bug: Bug Fixes: + +- config: fix default port issue. + +### Migrating from 3.3.0 to 3.3.1 + +``` +$ npm install -g blinksocks@3.3.1 +``` + +## 3.3.0 (2018-06-12) + +### :exclamation: Notable Changes + +- **transports**: add `wss`([WebSocket/TLS](docs/config#blinksocks-over-websockettls)). + +If you encounter the following warning, and the certificate is `self-signed`, please add `"tls_cert_self_signed": true` to client configuration and provide server certificate in `"tls_cert"` as well: + +``` +warn: [xxx:outbound] [x.x.x.x:xxxxx] self signed certificate +``` + +```diff +--- a/blinksocks.client.old.json ++++ b/blinksocks.client.new.json + { + "service": "socks5://127.0.0.1:1081", + "server": { + "service": "tls://localhost:1082", + "key": "AuM3R$]Pnj^Cqg^9", + "presets": [ +@@ -18,11 +17,10 @@ + "mux": false, + "mux_concurrency": 10, + "tls_cert": "cert.pem", ++ "tls_cert_self_signed": true + }, + "dns": [], + "dns_expire": 3600, + "timeout": 300, +``` + +### :rocket: Features & Improvements + +- **config**: add `tls_cert_self_signed` option. + +### :bug: Bug Fixes: + +- **transports/tls**: require `"tls_cert_self_signed": true` if use `self-singed` certificate. + +### Migrating from 3.2.2 to 3.3.0 + +``` +$ npm install -g blinksocks@3.3.0 +``` + +## 3.2.2 (2018-06-10) + +### :exclamation: Notable Changes + +> For security reason, **executables** are no longer uploaded in the following releases, we only publish npm packages. + +### :rocket: Features & Improvements + +- **deploy**: add `install-run-debian.sh`. +- **transports**: add `pathname` support for websocket. + +### :bug: Bug Fixes: + +- **proxies**: fix a security bug of authorization bypass when use `socks` or `http` protocol. + +### Migrating from 3.2.1 to 3.2.2 + +``` +$ npm install -g blinksocks@3.2.2 +``` + +## 3.2.1 (2018-05-12) + +### :rocket: Features & Improvements + +- **benchmark**: add test for chacha20-ietf. +- **hub**: set a timer to prune udp relays. +- **src**: move constants from `presets/actions.js` to `src/constants.js`. +- **src**: remove `preset.js`, implement `_write()` in `IPreset`. +- **test**: add udp test for `obfs-tls1.2-ticket`. + +### :bug: Bug Fixes: + +- **core**: add `speed-tester.js`, fix speed measurement. + +### Migrating from 3.2.0 to 3.2.1 + +``` +$ npm install -g blinksocks@3.2.1 +``` + ## 3.2.0 (2018-04-28) > Node.js 10 is supported in this version! ### :exclamation: Notable Changes -- src: support socks4(a), socks5, http `basic authorization`(username/password). -- presets: add `IPresetAddressing::onInitTargetAddress()` and `IPresetAddressing::resolveTargetAddress()`. -- presets: add `chacha20-ietf` method for `ss-stream-cipher`, but require Node.js 10.x. -- presets: deprecated `IPreset::onNotified()`. -- presets: deprecated `auto-conf` preset. +- **src**: support socks4(a), socks5, http `basic authorization`(username/password). +- **presets**: add `IPresetAddressing::onInitTargetAddress()` and `IPresetAddressing::resolveTargetAddress()`. +- **presets**: add `chacha20-ietf` method for `ss-stream-cipher`, but require Node.js 10.x. +- **presets**: deprecated `IPreset::onNotified()`. +- **presets**: deprecated `auto-conf` preset. ### :rocket: Features & Improvements -- core: add `Pipe::initTargetAddress()`. -- utils: add `uint64ToBuffer()`, `incrementLE()` and `incrementBE()`. -- package: upgrade ws from v3.3.3 to v5.1.1. -- package: use WHATWG URL API instead of legacy qs api. -- package: add package-lock.json. -- package: remove unused dependencies. -- ci: add test on the latest stable Node.js. +- **core**: add `Pipe::initTargetAddress()`. +- **utils**: add `uint64ToBuffer()`, `incrementLE()` and `incrementBE()`. +- **package**: upgrade ws from v3.3.3 to v5.1.1. +- **package**: use WHATWG URL API instead of legacy qs api. +- **package**: add package-lock.json. +- **package**: remove unused dependencies. +- **ci**: add test on the latest stable Node.js. ### :bug: Bug Fixes: -- hub: fix sequence between calling `relay::on()` and `relay.init()`. -- hub: patch `server.getConnections()` for ws. +- **hub**: fix sequence between calling `relay::on()` and `relay.init()`. +- **hub**: patch `server.getConnections()` for ws. ### Migrating from 3.1.1 to 3.2.0 @@ -37,13 +144,13 @@ $ npm install -g blinksocks@3.2.0 ### :rocket: Features & Improvements -- api: remove Hub::getPerformance(). -- api: add Hub::getUploadSpeed(), Hub::getDownloadSpeed() and Hub::getConnStatuses(). -- benchmark: enlarge wait time before kill iperf server. -- package: upgrade winston logger to v3. -- package: remove husky and precommit hook, it's annoying. -- test: add udp tests for multiplexing. -- docs: add usage for systemd. +- **api**: remove Hub::getPerformance(). +- **api**: add Hub::getUploadSpeed(), Hub::getDownloadSpeed() and Hub::getConnStatuses(). +- **benchmark**: enlarge wait time before kill iperf server. +- **package**: upgrade winston logger to v3. +- **package**: remove husky and precommit hook, it's annoying. +- **test**: add udp tests for multiplexing. +- **docs**: add usage for systemd. ### :bug: Bug Fixes: @@ -61,18 +168,18 @@ $ npm install -g blinksocks@3.1.1 ### :rocket: Features & Improvements -- lib: compiled to Node.js 8. -- core: start udp server only when use socks protocol on client. -- core: add performance.js to collect upload/download speed. -- core: add Hub::getConnections(), Hub::getTotalRead(), Hub::getTotalWritten() and Hub::getPerformance(). -- test: add tests for udp relay. -- test: add tests for multiplexing over ws and tls. +- **lib**: compiled to Node.js 8. +- **core**: start udp server only when use socks protocol on client. +- **core**: add performance.js to collect upload/download speed. +- **core**: add Hub::getConnections(), Hub::getTotalRead(), Hub::getTotalWritten() and Hub::getPerformance(). +- **test**: add tests for udp relay. +- **test**: add tests for multiplexing over ws and tls. ### :bug: Bug Fixes: -- src: reduce error rate when enable multiplexing on server. -- core: include target address in tracker's log when enable multiplexing. -- core: avoid putting duplicate target address in tracker's log. +- **src**: reduce error rate when enable multiplexing on server. +- **core**: include target address in tracker's log when enable multiplexing. +- **core**: avoid putting duplicate target address in tracker's log. ### Migrating from 3.0.0 to 3.1.0 @@ -84,30 +191,30 @@ $ npm install -g blinksocks@3.1.0 ### :boom: Breaking Changes: -- bin/init: remove "workers". -- bin/init: replace "servers: []" to "server: {}". -- core: remove balancer. -- presets: remove `stats` preset. -- presets: remove `tracker` preset, re-implement in core. -- presets: remove `access-control` preset, re-implement in core. +- **bin/init**: remove "workers". +- **bin/init**: replace "servers: []" to "server: {}". +- **core**: remove balancer. +- **presets**: remove `stats` preset. +- **presets**: remove `tracker` preset, re-implement in core. +- **presets**: remove `access-control` preset, re-implement in core. ### :rocket: Features & Improvements -- bin/init: add "acl" and "acl_conf" on server side. -- src: refactor src/dns-cache.js and move it to utils/. -- src: move config items from global to local. -- core: expose Config::getLogFilePath(). -- benchmark: use json output of iperf. -- presets/mux: discretize cid and other improvements. -- ci: add scripts to do nightly release automatically. -- test: add e2e tests. +- **bin/init**: add "acl" and "acl_conf" on server side. +- **src**: refactor src/dns-cache.js and move it to utils/. +- **src**: move config items from global to local. +- **core**: expose Config::getLogFilePath(). +- **benchmark**: use json output of iperf. +- **presets/mux**: discretize cid and other improvements. +- **ci**: add scripts to do nightly release automatically. +- **test**: add e2e tests. ### :bug: Bug Fixes: -- src: fix "send() is not a function" when using mux though http proxy. -- core: fix "cannot read property 'remoteInfo' of null" of mux-relay.js. -- core: fix sub connection id collision. -- core: handle listen "error" event. +- **src**: fix "send() is not a function" when using mux though http proxy. +- **core**: fix "cannot read property 'remoteInfo' of null" of mux-relay.js. +- **core**: fix sub connection id collision. +- **core**: handle listen "error" event. ### Committers: 2 @@ -181,21 +288,21 @@ After v3, blinksocks no longer support multiple servers and cluster mode, so you ### :rocket: Features & Improvements -- core: add mux-relay. -- benchmark: archive reports of 2017. -- package: upgrade pkg to v4.3.0. -- package: compile before running benchmark. -- presets: add mux preset. -- transports: refactor and optimize websocket transport. -- transports: add this.ctx. -- transports: add mux transport. -- utils: add a faster version of crypto.randomBytes(). - +- **core**: add mux-relay. +- **benchmark**: archive reports of 2017. +- **package**: upgrade pkg to v4.3.0. +- **package**: compile before running benchmark. +- **presets**: add mux preset. +- **transports**: refactor and optimize websocket transport. +- **transports**: add this.ctx. +- **transports**: add mux transport. +- **utils**: add a faster version of crypto.randomBytes(). +** ### :bug: Bug Fixes: -- proxies: fix crash when client reset the socks connection later. -- utils: fix getRandomInt(). -- utils: remove generateMutexId(). +- **proxies**: fix crash when client reset the socks connection later. +- **utils**: fix getRandomInt(). +- **utils**: remove generateMutexId(). ### Upgrade from 2.8.5 to 2.9.0 diff --git a/README.md b/README.md index cb40d5a..3bbbb2e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ * Cross-platform: running on Linux, Windows and macOS. * Lightweight proxy interfaces: Socks5/Socks4/Socks4a and HTTP. -* Multiple Transport Layers: TCP, UDP, [TLS] and [WebSocket]. +* Multiple Transport Layers: TCP, UDP, [TLS], [WebSocket] and [WebSocket/TLS]. * TLS/TLS/WebSocket [multiplexing]. * Convenient protocol [customization]. * Access Control List([ACL]) support. @@ -51,21 +51,10 @@ Please check out [blinksocks-nightly-releases](https://github.com/blinksocks/bli ## Run blinksocks -**npm version(require Node.js, recommended)** - ``` $ blinksocks --help ``` -**executable version(~~Node.js~~, not GUI)** - -Tips: You can [download](https://github.com/blinksocks/blinksocks/releases) precompiled executables for different platforms and launch it directly without having Node.js installed. - -``` -$ ./blinksocks --help // Linux and macOS -$ blinksocks.exe --help // Windows -``` - For configuring blinksocks, please refer to [Configuration](docs/config). ## Documents @@ -75,6 +64,7 @@ For configuring blinksocks, please refer to [Configuration](docs/config). 1. [Usage](docs/usage) 2. [Configuration](docs/config) 3. [Presets](docs/presets) +4. [Examples](docs/examples) ### For Developers @@ -91,11 +81,12 @@ See [contributors](https://github.com/blinksocks/blinksocks/graphs/contributors) Apache License 2.0 -[TLS]: docs/config#blinksocks-over-tls -[WebSocket]: docs/config#blinksocks-over-websocket -[multiplexing]: docs/config#multiplexing [customization]: docs/development/api [ACL]: docs/config#access-control-list -[shadowsocks]: docs/presets/RECOMMENDATIONS.md#work-with-shadowsocks -[shadowsocksR]: docs/presets/RECOMMENDATIONS.md#work-with-shadowsocksr -[v2ray vmess]: docs/presets/RECOMMENDATIONS.md#work-with-v2ray-vmess +[TLS]: docs/examples/tls +[WebSocket]: docs/examples/websocket +[WebSocket/TLS]: docs/examples/websocket-tls +[multiplexing]: docs/examples/multiplexing +[shadowsocks]: docs/examples/shadowsocks +[shadowsocksR]: docs/examples/shadowsocksr +[v2ray vmess]: docs/examples/v2ray-vmess diff --git a/bin/cli.js b/bin/cli.js index bdad62b..cd3e7bd 100644 --- a/bin/cli.js +++ b/bin/cli.js @@ -101,12 +101,8 @@ function main() { } if (hasOption('--list-presets')) { - const { presets, legacyPresets } = modules; - console.log(chalk.bold.underline('[Built-In]')); - console.log(presets.join(os.EOL)); - console.log(''); - console.log(chalk.bold.underline('[Deprecated]')); - console.log(legacyPresets ? legacyPresets.map((name) => `${chalk.gray(name)}`).join(os.EOL) : '-'); + const { builtInPresetMap } = modules; + console.log(Object.keys(builtInPresetMap).join(os.EOL)); return; } diff --git a/bin/init.js b/bin/init.js index 6da9332..1d7d316 100644 --- a/bin/init.js +++ b/bin/init.js @@ -38,24 +38,30 @@ module.exports = function init({ isMinimal, isOverwrite, isDryRun = false }) { 'presets': [ { 'name': 'ss-base' }, { 'name': 'obfs-random-padding' }, - { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } } + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], 'tls_cert': 'cert.pem', + 'tls_cert_self_signed': false, 'mux': false, - 'mux_concurrency': 10 + 'mux_concurrency': 10, }, + 'https_key': 'https_key.pem', + 'https_cert': 'https_cert.pem', 'dns': [], 'dns_expire': 3600, 'timeout': timeout, 'log_path': 'bs-client.log', 'log_level': 'info', - 'log_max_days': 30 + 'log_max_days': 30, }; if (isMinimal) { delete clientJson.server.tls_cert; + delete clientJson.server.tls_cert_self_signed; delete clientJson.server.mux; delete clientJson.server.mux_concurrency; + delete clientJson.https_key; + delete clientJson.https_cert; delete clientJson.dns; delete clientJson.dns_expire; delete clientJson.timeout; @@ -70,7 +76,7 @@ module.exports = function init({ isMinimal, isOverwrite, isDryRun = false }) { 'presets': [ { 'name': 'ss-base' }, { 'name': 'obfs-random-padding' }, - { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } } + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], 'tls_key': 'key.pem', 'tls_cert': 'cert.pem', @@ -83,7 +89,7 @@ module.exports = function init({ isMinimal, isOverwrite, isDryRun = false }) { 'redirect': '', 'log_path': 'bs-server.log', 'log_level': 'info', - 'log_max_days': 30 + 'log_max_days': 30, }; if (isMinimal) { diff --git a/deploy/install-run-debian.sh b/deploy/install-run-debian.sh new file mode 100755 index 0000000..fc3dee6 --- /dev/null +++ b/deploy/install-run-debian.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - +sudo apt-get install -y nodejs + +npm install --global pm2 blinksocks + +echo "$ node --version" +node --version + +echo "$ npm --version" +npm --version + +echo "$ blinksocks --version" +blinksocks --version + +echo "$ blinksocks init" +blinksocks init + +echo "$ pm2 start blinksocks -- --config blinksocks.server.json" +pm2 start blinksocks -- --config blinksocks.server.json + +echo "$ cat blinksocks.server.json" +cat blinksocks.server.json +echo "" diff --git a/docs/README.md b/docs/README.md index 2477962..855059d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,6 +5,7 @@ 1. [Usage](usage) 2. [Configuration](config) 3. [Presets](presets) +4. [Examples](examples) ## For Developers diff --git a/docs/config/README.md b/docs/config/README.md index f5fedf0..a2545b9 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -31,9 +31,12 @@ $ blinksocks init } ], "tls_cert": "cert.pem", + "tls_cert_self_signed": false, "mux": false, "mux_concurrency": 10 }, + "https_key": "https_key.pem", + "https_cert": "https_cert.pem", "dns": [], "dns_expire": 3600, "timeout": 221, @@ -76,28 +79,31 @@ $ blinksocks init } ``` -| KEY | DESCRIPTION | DEFAULT | REMARKS | -| :---------------- | :----------------------------------------------------------- | :-------------- | :---------------------------------------------------------- | -| service | local service address | - | a [WHATWG URL] e.g, "socks://127.0.0.1:1080" | -| server | remote server config | - | **CLIENT ONLY** | -| server.service | remote service address | - | `://:` | -| server.key | remote server master key | - | - | -| presets | an ordered list of presets to build a protocol stack | - | see [presets] | -| presets[i].name | preset name | - | - | -| presets[i].params | preset params | - | - | -| tls_key | private key for TLS | - | required on server if `` is "tls" | -| tls_cert | certificate for TLS | - | required on both client and server if `` is "tls" | -| acl | enable access control list or not | false | **SERVER ONLY** | -| acl_conf | access control list configuration file | - | **SERVER ONLY**, see below | -| timeout | timeout for each connection | 600 | in seconds | -| mux | enable multiplexing or not | false | - | -| mux_concurrency | the max mux connection established between client and server | 10 | **CLIENT ONLY** | -| redirect | target address to redirect when preset fail to process | "" | **SERVER ONLY** `:` | -| dns | a list of DNS server IPs | [] | - | -| dns_expire | in-memory DNS cache expiration time | 3600 | in seconds | -| log_path | log file path | "bs-[type].log" | a relative/absolute directory or a file to put logs in | -| log_level | log level | "info" | ['error', 'warn', 'info', 'verbose', 'debug', 'silly'] | -| log_max_days | the max of days a log file will be saved | 30 | remove this option if you want to keep all log files | +| KEY | DESCRIPTION | DEFAULT | REMARKS | +| :------------------- | :----------------------------------------------------------- | :-------------- | :---------------------------------------------------------- | +| service | local service address | - | [WHATWG URL] e.g, "socks://127.0.0.1:1080" | +| server | remote server config | - | **CLIENT ONLY** | +| server.service | remote service address | - | [WHATWG URL] e.g, "tls://example.com:443" | +| server.key | remote server master key | - | - | +| presets | an ordered list of presets to build a protocol stack | - | see [presets] | +| presets[i].name | preset name | - | - | +| presets[i].params | preset params | - | - | +| tls_key | private key path for TLS | - | required on server if `` is "tls" | +| tls_cert | certificate path for TLS | - | required on both client and server if `` is "tls" | +| tls_cert_self_signed | whether "tls_cert" is `self-signed` or not | false | **CLIENT ONLY** | +| https_key | private key path for HTTPS | - | **CLIENT ONLY** | +| https_cert | certificate path for HTTPS | - | **CLIENT ONLY** | +| acl | enable access control list or not | false | **SERVER ONLY** | +| acl_conf | access control list configuration file | - | **SERVER ONLY**, see below | +| timeout | timeout for each connection | 600 | in seconds | +| mux | enable multiplexing or not | false | - | +| mux_concurrency | the max mux connection established between client and server | 10 | **CLIENT ONLY** | +| redirect | target address to redirect when preset fail to process | "" | **SERVER ONLY** `:` | +| dns | a list of DNS server IPs | [] | - | +| dns_expire | in-memory DNS cache expiration time | 3600 | in seconds | +| log_path | log file path | "bs-[type].log" | a relative/absolute file path to put logs in | +| log_level | log level | "info" | ['error', 'warn', 'info', 'verbose', 'debug', 'silly'] | +| log_max_days | the max of days a log file will be saved | 30 | remove this option if you want to keep all log files | ### Service @@ -105,12 +111,12 @@ $ blinksocks init The `` should be: -* On client side: `tcp`, `socks`/`socks5`/`socks4`/`socks4a` or `http`/`https`. -* On server side: `tcp`, `tls` or `ws`. +* On client side: `tcp`, `socks`/`socks5`/`socks4`/`socks4a`, `http` or `https`. +* On server side: `tcp`, `tls`, `ws` or `wss`. #### Service Authentication -* Create a **http** service with [Basic Authentication](https://www.iana.org/go/rfc7617). +* Create a **http/https** service with [Basic Authentication](https://www.iana.org/go/rfc7617). ``` // blinksocks.client.json @@ -177,77 +183,6 @@ In this case, it uses [iperf](https://en.wikipedia.org/wiki/Iperf) to test netwo For more information about presets, please check out [presets]. -### blinksocks over TLS - -By default, blinksocks use "tcp" as transport, but you can take advantage of TLS technology to protect your data well. - -To enable blinksocks over TLS, you should: - -1. Generate `key.pem` and `cert.pem` on server - -``` -// self-signed -$ openssl req -x509 -newkey rsa:4096 -nodes -sha256 -subj '/CN=localhost' \ - -keyout key.pem -out cert.pem -``` - -> NOTE: Remember the **Common Name(CN)** you typed in the command line. - -2. Server config - -Change `tcp://` to `tls://`, then provide `tls_key` and `tls_cert`: - -``` -{ - "service": "tls://:", - "tls_key": "key.pem", - "tls_cert": "cert.pem", - ... -} -``` - -3. Client config - -Change server's `tcp://` to `tls://`, then provide `tls_cert`: - -``` -{ - ... - "server": { - "service": "tls://:", // take care of - "tls_cert": "cert.pem", - ... - }, - ... -} -``` - -### blinksocks over WebSocket - -Like blinksocks over TLS, it's much easier to setup a websocket tunnel: - -1. Server config - -``` -{ - "service": "ws://:", - ... -} -``` - -2. Client config - -``` -{ - ... - "server": { - "service": "ws://:", - ... - }, - ... -} -``` - ### Access Control List You can enable ACL on **server** by setting **acl: true** and provide a acl configuration file in **acl_conf**: @@ -281,36 +216,6 @@ Rules in **acl.txt** has a priority from lower to higher. > NOTE: acl requires a restart each time you updated **acl_conf**. -### Multiplexing - -Since blinksocks v2.9.0, blinksocks supports TCP/TLS/WS multiplexing. - -You can enable this feature easily by setting `mux: true` on both client and server, and set `mux_concurrency: ` on client. - -1. Server config - -``` -{ - "mux": true, - ... -} -``` - -2. Client config - -``` -{ - ... - "server": { - ... - "mux": true, - "mux_concurrency": 10 - ... - }, - ... -} -``` - ### Log Path Specify a relative or absolute path to store log file, if no `log_path` provided, log file named `bs-[type].log` will be stored in the working directory. @@ -352,4 +257,4 @@ apps <--SOCKS5--> [blinksocks client] <--UDP--> [blinksocks server] <--UDP--> de [WHATWG URL]: https://nodejs.org/dist/latest/docs/api/url.html#url_url_strings_and_url_objects [presets]: ../presets [winston]: https://github.com/winstonjs/winston -[UDP ASSOCIATE]: https://tools.ietf.org/html/rfc1928#section-4 \ No newline at end of file +[UDP ASSOCIATE]: https://tools.ietf.org/html/rfc1928#section-4 diff --git a/docs/development/preparation/README.md b/docs/development/preparation/README.md index 83733eb..ddec217 100644 --- a/docs/development/preparation/README.md +++ b/docs/development/preparation/README.md @@ -65,13 +65,3 @@ After compile, we can change version in `package.json` then publish a package to ``` $ npm publish ``` - -## Package - -For users don't have Node.js installed, we use [zeit/pkg](https://github.com/zeit/pkg) to prepare compiled executables: - -``` -$ npm run pkg -``` - -This will generate compressed executables for different platforms named `blinksocks-{platform}-${arch}-${version}.gz`. And can be distribute to target platform at once. diff --git a/docs/examples/README.md b/docs/examples/README.md new file mode 100644 index 0000000..b6ff855 --- /dev/null +++ b/docs/examples/README.md @@ -0,0 +1,3 @@ +# Examples + +Here I post some particle configuration of blinksocks, please enter each directory for more details. diff --git a/docs/examples/multiplexing/README.md b/docs/examples/multiplexing/README.md new file mode 100644 index 0000000..4964769 --- /dev/null +++ b/docs/examples/multiplexing/README.md @@ -0,0 +1,31 @@ +# Multiplexing + +**Minimal Version Required: v2.9.x** + +blinksocks supports TCP/TLS/WS multiplexing. + +You can enable this feature easily by setting `"mux": true` on both client and server, and set `"mux_concurrency": ` on client. + +1. Client config + +``` +{ + ... + "server": { + ... + "mux": true, + "mux_concurrency": 10 + ... + }, + ... +} +``` + +2. Server config + +``` +{ + "mux": true, + ... +} +``` diff --git a/docs/examples/multiplexing/blinksocks.client.json b/docs/examples/multiplexing/blinksocks.client.json new file mode 100644 index 0000000..e574c05 --- /dev/null +++ b/docs/examples/multiplexing/blinksocks.client.json @@ -0,0 +1,23 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:17720", + "key": "#{N-^!6{SExKTQ|b", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ], + "mux": true, + "mux_concurrency": 10 + } +} diff --git a/docs/examples/multiplexing/blinksocks.server.json b/docs/examples/multiplexing/blinksocks.server.json new file mode 100644 index 0000000..002f645 --- /dev/null +++ b/docs/examples/multiplexing/blinksocks.server.json @@ -0,0 +1,19 @@ +{ + "service": "tcp://0.0.0.0:17720", + "key": "#{N-^!6{SExKTQ|b", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ], + "mux": true +} diff --git a/docs/examples/obfs-random-padding/README.md b/docs/examples/obfs-random-padding/README.md new file mode 100644 index 0000000..6a1938b --- /dev/null +++ b/docs/examples/obfs-random-padding/README.md @@ -0,0 +1,23 @@ +# obfs-random-padding + +`obfs-random-padding` provides ability to prevent traffic analysis(based on sequence of round trip packet length between client and server): + +## To prevent traffic analysis + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "obfs-random-padding"}, + {"name": "ss-stream-cipher","params": {"method": "aes-128-ctr"}} +] +``` + +## To prevent traffic analysis and ensure integrity as well + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "obfs-random-padding"}, + {"name": "ss-aead-cipher","params": {"method": "aes-128-gcm"}} +] +``` diff --git a/docs/examples/obfs-random-padding/blinksocks.client.json b/docs/examples/obfs-random-padding/blinksocks.client.json new file mode 100644 index 0000000..31b466b --- /dev/null +++ b/docs/examples/obfs-random-padding/blinksocks.client.json @@ -0,0 +1,21 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:50102", + "key": "&8[j;(>fjLGm,db]", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ] + } +} diff --git a/docs/examples/obfs-random-padding/blinksocks.server.json b/docs/examples/obfs-random-padding/blinksocks.server.json new file mode 100644 index 0000000..5bc8cbb --- /dev/null +++ b/docs/examples/obfs-random-padding/blinksocks.server.json @@ -0,0 +1,18 @@ +{ + "service": "tcp://0.0.0.0:50102", + "key": "&8[j;(>fjLGm,db]", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ] +} \ No newline at end of file diff --git a/docs/examples/obfs-tls-session-ticket/README.md b/docs/examples/obfs-tls-session-ticket/README.md new file mode 100644 index 0000000..cbc7427 --- /dev/null +++ b/docs/examples/obfs-tls-session-ticket/README.md @@ -0,0 +1,7 @@ +# obfs-tls-session-ticket + +**Minimal Version Required: v2.x** + +You can append a **http** or **tls** obfuscator to preset list to avoid bad [QoS], **obfs-tls1.2-ticket** is recommended. + +[QoS]: https://en.wikipedia.org/wiki/Quality_of_service diff --git a/docs/examples/obfs-tls-session-ticket/blinksocks.client.json b/docs/examples/obfs-tls-session-ticket/blinksocks.client.json new file mode 100644 index 0000000..2f29a7f --- /dev/null +++ b/docs/examples/obfs-tls-session-ticket/blinksocks.client.json @@ -0,0 +1,26 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:14938", + "key": "had2a8#(kVKA2&gx", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ss-aead-cipher", + "params": { + "method": "aes-256-gcm" + } + }, + { + "name": "obfs-tls1.2-ticket", + "params": { + "sni": [ + "example.com" + ] + } + } + ] + } +} diff --git a/docs/examples/obfs-tls-session-ticket/blinksocks.server.json b/docs/examples/obfs-tls-session-ticket/blinksocks.server.json new file mode 100644 index 0000000..209318b --- /dev/null +++ b/docs/examples/obfs-tls-session-ticket/blinksocks.server.json @@ -0,0 +1,23 @@ +{ + "service": "tcp://0.0.0.0:14938", + "key": "had2a8#(kVKA2&gx", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ss-aead-cipher", + "params": { + "method": "aes-256-gcm" + } + }, + { + "name": "obfs-tls1.2-ticket", + "params": { + "sni": [ + "example.com" + ] + } + } + ] +} diff --git a/docs/examples/shadowsocks/README.md b/docs/examples/shadowsocks/README.md new file mode 100644 index 0000000..2d331d6 --- /dev/null +++ b/docs/examples/shadowsocks/README.md @@ -0,0 +1,23 @@ +# shadowsocks + +**Minimal Version Required: v1.x** + +To work with **shadowsocks**, you can just add two presets: + +**AEAD Ciphers(Newer Versions), Recommend** + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "ss-aead-cipher", "params": {"method": "aes-256-gcm"}} +] +``` + +**Steam Ciphers(Older Versions)** + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "ss-stream-cipher", "params": {"method": "aes-256-cfb"}} +] +``` diff --git a/docs/examples/shadowsocks/blinksocks.client.json b/docs/examples/shadowsocks/blinksocks.client.json new file mode 100644 index 0000000..e799897 --- /dev/null +++ b/docs/examples/shadowsocks/blinksocks.client.json @@ -0,0 +1,18 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:49849", + "key": "XyDw&JndtwhV?m<6", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ss-aead-cipher", + "params": { + "method": "aes-256-gcm" + } + } + ] + } +} diff --git a/docs/examples/shadowsocks/blinksocks.server.json b/docs/examples/shadowsocks/blinksocks.server.json new file mode 100644 index 0000000..1820bbc --- /dev/null +++ b/docs/examples/shadowsocks/blinksocks.server.json @@ -0,0 +1,15 @@ +{ + "service": "tcp://0.0.0.0:49849", + "key": "XyDw&JndtwhV?m<6", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-256-gcm" + } + } + ] +} diff --git a/docs/examples/shadowsocksr/README.md b/docs/examples/shadowsocksr/README.md new file mode 100644 index 0000000..350594f --- /dev/null +++ b/docs/examples/shadowsocksr/README.md @@ -0,0 +1,42 @@ +# shadowsocksr + +**Minimal Version Required: v2.x** + +> NOTE: To work with shadowsocksR, you must add both "ss-base" and "ss-stream-cipher". + +
+ Notice in shadowsocksR config + + ``` + { + ... + "method": "aes-128-ctr", + "protocol": "auth_aes128_md5", + "protocol_param": "", // protocol_param must be empty + "obfs": "plain", // obfs must be "plain" + "obfs_param": "", + ... + } + ``` + +
+ +**auth_aes128_md5 / auth_aes128_sha1** + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "ssr-auth-aes128-md5"}, + {"name": "ss-stream-cipher", "params": {"method": "aes-256-ctr"}} +] +``` + +**auth_chain_a / auth_chain_b** + +``` +"presets": [ + {"name": "ss-base"}, + {"name": "ssr-auth-chain-a"}, + {"name": "ss-stream-cipher", "params": {"method": "none"}} +] +``` diff --git a/docs/examples/shadowsocksr/blinksocks.client.json b/docs/examples/shadowsocksr/blinksocks.client.json new file mode 100644 index 0000000..9be7f8f --- /dev/null +++ b/docs/examples/shadowsocksr/blinksocks.client.json @@ -0,0 +1,21 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:24045", + "key": "?4H}vrE_[WQj9[>F", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ssr-auth-chain-a" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "none" + } + } + ] + } +} diff --git a/docs/examples/shadowsocksr/blinksocks.server.json b/docs/examples/shadowsocksr/blinksocks.server.json new file mode 100644 index 0000000..c33b6cf --- /dev/null +++ b/docs/examples/shadowsocksr/blinksocks.server.json @@ -0,0 +1,18 @@ +{ + "service": "tcp://0.0.0.0:24045", + "key": "?4H}vrE_[WQj9[>F", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "ssr-auth-chain-a" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "none" + } + } + ] +} diff --git a/docs/examples/tls/README.md b/docs/examples/tls/README.md new file mode 100644 index 0000000..48da9df --- /dev/null +++ b/docs/examples/tls/README.md @@ -0,0 +1,40 @@ +# tls + +**Minimal Version Required: v2.x** + +blinksocks can transfer data using `tls`: + +``` ++-------------+ +-------------+ +------------+ +| | tls://site.com/path | | tcp:// | | +| bs-client <-----------------------> bs-server <-----------> Target | +| | | | | | ++-------------+ +-------------+ +------------+ +``` + +When use `tls://` as transport, make sure both `tls_cert` and `tls_key` is provided to `bs-server`. + +> If your are using self-signed certificate on server, please also provide the same `tls_cert` on client and also set `"tls_cert_self_signed": true`. + +Make sure you provide **Common Name** of certificate NOT IP in client config: + +``` +{ + ... + "server": { + "service": "tls://:", + "tls_cert": "cert.pem", + "tls_cert_self_signed": true + ... + }, + ... +} +``` + +## Generate key.pem and cert.pem + +``` +// self-signed certificate +$ openssl req -x509 -newkey rsa:4096 -nodes -sha256 -subj '/CN=example.com' \ + -keyout key.pem -out cert.pem +``` diff --git a/docs/examples/tls/blinksocks.client.json b/docs/examples/tls/blinksocks.client.json new file mode 100644 index 0000000..81280b6 --- /dev/null +++ b/docs/examples/tls/blinksocks.client.json @@ -0,0 +1,17 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tls://example.com:11902", + "key": "NdFCdXFK/TTP2GdU", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ], + "tls_cert": "cert.pem", + "tls_cert_self_signed": true + } +} diff --git a/docs/examples/tls/blinksocks.server.json b/docs/examples/tls/blinksocks.server.json new file mode 100644 index 0000000..447d673 --- /dev/null +++ b/docs/examples/tls/blinksocks.server.json @@ -0,0 +1,14 @@ +{ + "service": "tls://0.0.0.0:11902", + "key": "NdFCdXFK/TTP2GdU", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ], + "tls_key": "key.pem", + "tls_cert": "cert.pem" +} diff --git a/docs/examples/v2ray-vmess/README.md b/docs/examples/v2ray-vmess/README.md new file mode 100644 index 0000000..d9256c4 --- /dev/null +++ b/docs/examples/v2ray-vmess/README.md @@ -0,0 +1,67 @@ +# v2ray-vmess + +**Minimal Version Required: v2.x** + +> NOTE: To work with v2ray vmess, you should only provide "v2ray-vmess" in preset list. + +
+ v2ray client + + ``` + "outbound": { + "protocol": "vmess", + "settings": { + "vnext": [ + { + "address": "127.0.0.1", + "port": 10086, + "users": [ + { + "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", + "security": "aes-128-gcm", + "alterId": 0 // [must be the default value: 0] + } + ] + } + ] + }, + "mux": { + "enabled": false // [must be false] + } + }, + ``` + +
+ +
+ v2ray server + +``` + "inbound": { + "port": 10086, + "protocol": "vmess", + "settings": { + "clients": [ + { + "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", + "level": 1, + "alterId": 0 // [must be the default value: 0] + } + ] + } + }, +``` + +
+ +``` +"presets": [ + { + "name": "v2ray-vmess", + "params": { + "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", + "security": "aes-128-gcm" + } + } +] +``` diff --git a/docs/examples/v2ray-vmess/blinksocks.client.json b/docs/examples/v2ray-vmess/blinksocks.client.json new file mode 100644 index 0000000..b62a189 --- /dev/null +++ b/docs/examples/v2ray-vmess/blinksocks.client.json @@ -0,0 +1,16 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "tcp://example.com:65282", + "key": "z{]5AWaxEFCMTKA,", + "presets": [ + { + "name": "v2ray-vmess", + "params": { + "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", + "security": "aes-128-gcm" + } + } + ] + } +} diff --git a/docs/examples/v2ray-vmess/blinksocks.server.json b/docs/examples/v2ray-vmess/blinksocks.server.json new file mode 100644 index 0000000..34697bf --- /dev/null +++ b/docs/examples/v2ray-vmess/blinksocks.server.json @@ -0,0 +1,13 @@ +{ + "service": "tcp://0.0.0.0:65282", + "key": "z{]5AWaxEFCMTKA,", + "presets": [ + { + "name": "v2ray-vmess", + "params": { + "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", + "security": "aes-128-gcm" + } + } + ] +} diff --git a/docs/examples/websocket-caddy-tls/Caddyfile b/docs/examples/websocket-caddy-tls/Caddyfile new file mode 100644 index 0000000..6279445 --- /dev/null +++ b/docs/examples/websocket-caddy-tls/Caddyfile @@ -0,0 +1,9 @@ +example.com { + proxy / 127.0.0.1:59463 { + websocket + header_upstream Host {host} + header_upstream X-Real-IP {remote} + header_upstream X-Forwarded-For {remote} + header_upstream X-Forwarded-Proto {scheme} + } +} diff --git a/docs/examples/websocket-caddy-tls/README.md b/docs/examples/websocket-caddy-tls/README.md new file mode 100644 index 0000000..e80ddf7 --- /dev/null +++ b/docs/examples/websocket-caddy-tls/README.md @@ -0,0 +1,20 @@ +# websocket-caddy-tls + +**Minimal Version Required: v3.3.1** + +blinksocks can transfer data through [caddy] proxy server using [WebSocket/TLS]: + +``` + +--------------------------------------------------+ + | Caddy Server | ++-------------+ | +-----------+ | +------------+ +| | wss://site.com/path | :433 ws://127.0.0.1:1234 | | | tcp:// | | +| bs-client <-----------------------> proxy /path +--------------------> bs-server <-------------> Target | +| | (encrypted) | (encrypted) | | | (raw) | | ++-------------+ | +-----------+ | +------------+ + | | + +--------------------------------------------------+ +``` + +[caddy]: https://caddyserver.com +[WebSocket/TLS]: ../websocket-tls diff --git a/docs/examples/websocket-caddy-tls/blinksocks.client.json b/docs/examples/websocket-caddy-tls/blinksocks.client.json new file mode 100644 index 0000000..430c7af --- /dev/null +++ b/docs/examples/websocket-caddy-tls/blinksocks.client.json @@ -0,0 +1,15 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "wss://example.com:443/your-custom-path", + "key": "8;:2%]zTbPc[2g-%", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ] + } +} diff --git a/docs/examples/websocket-caddy-tls/blinksocks.server.json b/docs/examples/websocket-caddy-tls/blinksocks.server.json new file mode 100644 index 0000000..36b748e --- /dev/null +++ b/docs/examples/websocket-caddy-tls/blinksocks.server.json @@ -0,0 +1,12 @@ +{ + "service": "ws://0.0.0.0:59463/your-custom-path", + "key": "8;:2%]zTbPc[2g-%", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ] +} diff --git a/docs/examples/websocket-tls/README.md b/docs/examples/websocket-tls/README.md new file mode 100644 index 0000000..eee265f --- /dev/null +++ b/docs/examples/websocket-tls/README.md @@ -0,0 +1,20 @@ +# websocket-tls + +**Minimal Version Required: v3.3.1** + +blinksocks can transfer data using [WebSocket/TLS]: + + +``` ++-------------+ +-------------+ +------------+ +| | wss://site.com/path | | tcp:// | | +| bs-client <-----------------------> bs-server <-----------> Target | +| | (encrypted) | | (raw) | | ++-------------+ +-------------+ +------------+ +``` + +When use `wss://` as transport, make sure both `tls_cert` and `tls_key` is provided to `bs-server`. + +> If your are using self-signed certificate on server, please also provide the same `tls_cert` on client and set `"tls_cert_self_signed": true`. + +[WebSocket/TLS]: ../websocket-tls diff --git a/docs/examples/websocket-tls/blinksocks.client.json b/docs/examples/websocket-tls/blinksocks.client.json new file mode 100644 index 0000000..ae99748 --- /dev/null +++ b/docs/examples/websocket-tls/blinksocks.client.json @@ -0,0 +1,17 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "wss://example.com:48079", + "key": "98{U64+Z4bX#d,Ra", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ], + "tls_cert": "cert.pem", + "tls_cert_self_signed": true + } +} diff --git a/docs/examples/websocket-tls/blinksocks.server.json b/docs/examples/websocket-tls/blinksocks.server.json new file mode 100644 index 0000000..d9c5b41 --- /dev/null +++ b/docs/examples/websocket-tls/blinksocks.server.json @@ -0,0 +1,14 @@ +{ + "service": "wss://0.0.0.0:48079", + "key": "98{U64+Z4bX#d,Ra", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + } + ], + "tls_key": "key.pem", + "tls_cert": "cert.pem" +} diff --git a/docs/examples/websocket/README.md b/docs/examples/websocket/README.md new file mode 100644 index 0000000..0233849 --- /dev/null +++ b/docs/examples/websocket/README.md @@ -0,0 +1,13 @@ +# websocket + +**Minimal Version Required: v2.6.2** + +blinksocks can transfer data using `websocket`: + +``` ++-------------+ +-------------+ +------------+ +| | ws://site.com/path | | tcp:// | | +| bs-client <----------------------> bs-server <-----------> Target | +| | | | | | ++-------------+ +-------------+ +------------+ +``` diff --git a/docs/examples/websocket/blinksocks.client.json b/docs/examples/websocket/blinksocks.client.json new file mode 100644 index 0000000..0496edf --- /dev/null +++ b/docs/examples/websocket/blinksocks.client.json @@ -0,0 +1,21 @@ +{ + "service": "socks5://127.0.0.1:1080", + "server": { + "service": "ws://127.0.0.1:6336", + "key": "?B4-y[tsFQCV/zK%", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ] + } +} diff --git a/docs/examples/websocket/blinksocks.server.json b/docs/examples/websocket/blinksocks.server.json new file mode 100644 index 0000000..a4e76c4 --- /dev/null +++ b/docs/examples/websocket/blinksocks.server.json @@ -0,0 +1,18 @@ +{ + "service": "ws://0.0.0.0:6336", + "key": "?B4-y[tsFQCV/zK%", + "presets": [ + { + "name": "ss-base" + }, + { + "name": "obfs-random-padding" + }, + { + "name": "ss-stream-cipher", + "params": { + "method": "aes-128-ctr" + } + } + ] +} diff --git a/docs/presets/README.md b/docs/presets/README.md index 6d84ab9..e671f4d 100644 --- a/docs/presets/README.md +++ b/docs/presets/README.md @@ -326,7 +326,7 @@ all features from **ss-aead-cipher** and prevent server from being detected by p ## Have trouble in choosing presets? -Here is a [list](./RECOMMENDATIONS.md) of recommended conbinations. +Here is a [list](../examples) of recommended conbinations. [base-auth]: ../../src/presets/base-auth.js [ss-base]: ../../src/presets/ss-base.js diff --git a/docs/presets/RECOMMENDATIONS.md b/docs/presets/RECOMMENDATIONS.md deleted file mode 100644 index ea0d017..0000000 --- a/docs/presets/RECOMMENDATIONS.md +++ /dev/null @@ -1,167 +0,0 @@ -# Recommended Combinations - -## Work with shadowsocks - -To work with **shadowsocks**, please choose one of the following configurations: - -**Steam Ciphers(Older Versions)** - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "ss-stream-cipher", "params": {"method": "aes-256-cfb"}} -] -``` - -**AEAD Ciphers(Newer Versions)** - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "ss-aead-cipher", "params": {"method": "aes-256-gcm"}} -] -``` - -## Work with shadowsocksR - -> NOTE: To work with shadowsocksR, you must add both "ss-base" and "ss-stream-cipher". - -
- Notice in shadowsocksR config - - ``` - { - ... - "method": "aes-128-ctr", - "protocol": "auth_aes128_md5", - "protocol_param": "", // protocol_param must be empty - "obfs": "plain", // obfs must be "plain" - "obfs_param": "", - ... - } - ``` - -
- -**auth_aes128_md5 / auth_aes128_sha1** - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "ssr-auth-aes128-md5"}, - {"name": "ss-stream-cipher", "params": {"method": "aes-256-ctr"}} -] -``` - -**auth_chain_a / auth_chain_b** - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "ssr-auth-chain-a"}, - {"name": "ss-stream-cipher", "params": {"method": "none"}} -] -``` - -## Work with v2ray vmess - -> Notice in v2ray configs: - -
- v2ray client - - ``` - "outbound": { - "protocol": "vmess", - "settings": { - "vnext": [ - { - "address": "127.0.0.1", - "port": 10086, - "users": [ - { - "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", - "security": "aes-128-gcm", - "alterId": 0 // [must be the default value: 0] - } - ] - } - ] - }, - "mux": { - "enabled": false // [must be false] - } - }, - ``` - -
- -
- v2ray server - -``` - "inbound": { - "port": 10086, - "protocol": "vmess", - "settings": { - "clients": [ - { - "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", - "level": 1, - "alterId": 0 // [must be the default value: 0] - } - ] - } - }, -``` - -
- -``` -"presets": [ - { - "name": "v2ray-vmess", - "params": { - "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", - "security": "aes-128-gcm" - } - } -] -``` - -## Avoid Bad QoS - -You can use **http** or **tls** obfuscator to avoid bad [QoS], **tls** is recommended. - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "ss-aead-cipher", "params": {"method": "aes-256-gcm"}}, - {"name": "obfs-tls1.2-ticket", "params": {"sni": ["example.com"]}} -] -``` - -## To prevent traffic analysis - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "obfs-random-padding"}, - {"name": "ss-stream-cipher","params": {"method": "aes-128-ctr"}} -] -``` - -## To prevent traffic analysis and ensure integrity as well - -``` -"presets": [ - {"name": "ss-base"}, - {"name": "obfs-random-padding"}, - {"name": "ss-aead-cipher","params": {"method": "aes-128-gcm"}} -] -``` - -> You can also check out [benchmark] to choose a combination you prefer. - -[QoS]: https://en.wikipedia.org/wiki/Quality_of_service -[benchmark]: ../benchmark/README.md diff --git a/docs/usage/README.md b/docs/usage/README.md index d9b5c7a..65f329b 100644 --- a/docs/usage/README.md +++ b/docs/usage/README.md @@ -52,6 +52,23 @@ After init, you should edit `blinksocks.client.json` to tell blinksocks client w You can also check out [Configuration](../config) for explanation of every option. +## Test Using curl + +[curl](https://curl.haxx.se/) is an useful tool which can send requests via a variety of proxy protocols: + +``` +# SOCKS +$ curl -Lx socks5://localhost:1080 www.google.com +$ curl -Lx socks4://localhost:1080 www.google.com +$ curl -Lx socks4a://localhost:1080 www.google.com + +# HTTP +$ curl -Lx http://localhost:1080 www.google.com + +# HTTPS +$ curl --proxy-insecure -Lx https://localhost:1080 www.google.com +``` + ## Run in production ### Using pm2 @@ -117,25 +134,6 @@ WantedBy=multi-user.target # journalctl -u blinksocks.service ``` -### Using executables - -``` -// download archive from releases page -$ wget https://github.com/blinksocks/blinksocks/releases/download/v2.5.3/blinksocks-linux-x64-v2.5.3.gz - -// you'd better check sha256sum listed in sha256sum.txt -$ wget https://github.com/blinksocks/blinksocks/releases/download/v2.5.3/sha256sum.txt - -// decompress -$ gunzip blinksocks-linux-x64-v2.5.3.gz - -// grant executable permission -$ chmod +x blinksocks-linux-x64-v2.5.3 - -// run directly -$ ./blinksocks-linux-x64-v2.5.3 --help -``` - ## Work with browsers Most of the time, you are surfing the Internet via web browsers such as Firefox or Google Chrome. diff --git a/lib/constants.js b/lib/constants.js index 71e278d..7e8a17d 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.MUX_CLOSE_CONN = exports.MUX_DATA_FRAME = exports.MUX_NEW_CONN = exports.CONNECTED_TO_REMOTE = exports.CONNECT_TO_REMOTE = exports.PRESET_FAILED = exports.MAX_BUFFERED_SIZE = exports.PIPE_DECODE = exports.PIPE_ENCODE = exports.APP_ID = undefined; +exports.PROTOCOL_DEFAULT_PORTS = exports.MUX_CLOSE_CONN = exports.MUX_DATA_FRAME = exports.MUX_NEW_CONN = exports.CONNECTED_TO_REMOTE = exports.CONNECT_TO_REMOTE = exports.PRESET_FAILED = exports.MAX_BUFFERED_SIZE = exports.PIPE_DECODE = exports.PIPE_ENCODE = exports.APP_ID = undefined; var _crypto = require('./utils/crypto'); @@ -15,4 +15,13 @@ const CONNECT_TO_REMOTE = exports.CONNECT_TO_REMOTE = 'CONNECT_TO_REMOTE'; const CONNECTED_TO_REMOTE = exports.CONNECTED_TO_REMOTE = 'CONNECTED_TO_REMOTE'; const MUX_NEW_CONN = exports.MUX_NEW_CONN = 'MUX_NEW_CONN'; const MUX_DATA_FRAME = exports.MUX_DATA_FRAME = 'MUX_DATA_FRAME'; -const MUX_CLOSE_CONN = exports.MUX_CLOSE_CONN = 'MUX_CLOSE_CONN'; \ No newline at end of file +const MUX_CLOSE_CONN = exports.MUX_CLOSE_CONN = 'MUX_CLOSE_CONN'; + +const PROTOCOL_DEFAULT_PORTS = exports.PROTOCOL_DEFAULT_PORTS = { + 'ftp:': 21, + 'gopher:': 70, + 'http:': 80, + 'https:': 443, + 'ws:': 80, + 'wss:': 443 +}; \ No newline at end of file diff --git a/lib/core/config.js b/lib/core/config.js index 91d53bb..df7da6d 100644 --- a/lib/core/config.js +++ b/lib/core/config.js @@ -41,6 +41,8 @@ var _lodash2 = _interopRequireDefault(_lodash); var _acl = require('./acl'); +var _constants = require('../constants'); + var _presets = require('../presets'); var _defs = require('../presets/defs'); @@ -62,17 +64,22 @@ class Config { this.local_search_params = null; this.local_host = null; this.local_port = null; + this.local_pathname = null; this.server = null; this.is_client = null; this.is_server = null; + this.https_key = null; + this.https_cert = null; this.timeout = null; this.redirect = null; this.dns_expire = null; this.dns = null; - this.transport = null; + this.server_protocol = null; this.server_host = null; this.server_port = null; + this.server_pathname = null; this.tls_cert = null; + this.tls_cert_self_signed = false; this.tls_key = null; this.key = null; this.acl = false; @@ -81,20 +88,21 @@ class Config { this.acl_tries = {}; this.presets = null; this.udp_presets = null; - this.mux = null; + this.mux = false; this.mux_concurrency = null; this.log_path = null; this.log_level = null; this.log_max_days = null; this.stores = []; - const { protocol, hostname, port, searchParams, username, password } = new _url.URL(json.service); + const { protocol, hostname, port, pathname, searchParams, username, password } = new _url.URL(json.service); this.local_protocol = protocol.slice(0, -1); this.local_username = username; this.local_password = password; this.local_search_params = searchParams; this.local_host = hostname; - this.local_port = +port; + this.local_port = +port || +_constants.PROTOCOL_DEFAULT_PORTS[protocol]; + this.local_pathname = pathname; let server; @@ -121,6 +129,13 @@ class Config { this._initServer(server); } + if (this.is_client && this.local_protocol === 'https') { + _utils.logger.info(`[config] loading ${json.https_cert}`); + this.https_cert = loadFileSync(json.https_cert); + _utils.logger.info(`[config] loading ${json.https_key}`); + this.https_key = loadFileSync(json.https_key); + } + this.timeout = json.timeout !== undefined ? json.timeout * 1e3 : 600 * 1e3; this.dns_expire = json.dns_expire !== undefined ? json.dns_expire * 1e3 : _utils.DNS_DEFAULT_EXPIRE; @@ -133,14 +148,20 @@ class Config { } _initServer(server) { - const { protocol, hostname, port } = new _url.URL(server.service); - this.transport = protocol.slice(0, -1); + const { protocol, hostname, port, pathname } = new _url.URL(server.service); + this.server_protocol = protocol.slice(0, -1); this.server_host = hostname; - this.server_port = +port; + this.server_port = +port || +_constants.PROTOCOL_DEFAULT_PORTS[protocol]; + this.server_pathname = pathname; - if (this.transport === 'tls') { - _utils.logger.info(`[config] loading ${server.tls_cert}`); - this.tls_cert = loadFileSync(server.tls_cert); + if (this.server_protocol === 'tls' || this.server_protocol === 'wss') { + if (this.is_client) { + this.tls_cert_self_signed = !!server.tls_cert_self_signed; + } + if (this.tls_cert_self_signed || this.is_server) { + _utils.logger.info(`[config] loading ${server.tls_cert}`); + this.tls_cert = loadFileSync(server.tls_cert); + } if (this.is_server) { _utils.logger.info(`[config] loading ${server.tls_key}`); this.tls_key = loadFileSync(server.tls_key); @@ -164,7 +185,7 @@ class Config { this.redirect = server.redirect; } - this.mux = !!server.mux; + this.mux = server.mux === true; if (this.is_client) { this.mux_concurrency = server.mux_concurrency || 10; } @@ -226,15 +247,15 @@ class Config { throw Error('"service" must be provided as "://:[?params]"'); } - const { protocol: _protocol, hostname, port, searchParams } = new _url.URL(json.service); + const { protocol, hostname, port: _port, searchParams } = new _url.URL(json.service); - if (typeof _protocol !== 'string') { + if (typeof protocol !== 'string') { throw Error('service.protocol is invalid'); } - const protocol = _protocol.slice(0, -1); + const proto = protocol.slice(0, -1); const available_client_protocols = ['tcp', 'http', 'https', 'socks', 'socks5', 'socks4', 'socks4a']; - if (!available_client_protocols.includes(protocol)) { + if (!available_client_protocols.includes(proto)) { throw Error(`service.protocol must be: ${available_client_protocols.join(', ')}`); } @@ -242,11 +263,12 @@ class Config { throw Error('service.host is invalid'); } + const port = _port || _constants.PROTOCOL_DEFAULT_PORTS[protocol] || ''; if (!(0, _utils.isValidPort)(+port)) { throw Error('service.port is invalid'); } - if (protocol === 'tcp') { + if (proto === 'tcp') { const forward = searchParams.get('forward'); if (!forward) { @@ -262,6 +284,15 @@ class Config { } } + if (proto === 'https') { + if (typeof json.https_cert !== 'string' || json.https_cert === '') { + throw Error('"https_cert" must be provided'); + } + if (typeof json.https_key !== 'string' || json.https_key === '') { + throw Error('"https_key" must be provided'); + } + } + let server; if (json.servers) { @@ -308,23 +339,29 @@ class Config { throw Error('"service" must be provided as "://:[?params]"'); } - const { protocol: _protocol, hostname, port } = new _url.URL(server.service); + const { protocol, hostname, port: _port } = new _url.URL(server.service); - if (typeof _protocol !== 'string') { + if (typeof protocol !== 'string') { throw Error('service.protocol is invalid'); } - const protocol = _protocol.slice(0, -1); - const available_server_protocols = ['tcp', 'ws', 'tls']; - if (!available_server_protocols.includes(protocol)) { + const proto = protocol.slice(0, -1); + const available_server_protocols = ['tcp', 'ws', 'wss', 'tls']; + if (!available_server_protocols.includes(proto)) { throw Error(`service.protocol must be: ${available_server_protocols.join(', ')}`); } - if (protocol === 'tls') { - if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { - throw Error('"tls_cert" must be provided'); + if (proto === 'tls' || proto === 'wss') { + if (from_client && server.tls_cert_self_signed) { + if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { + throw Error('"tls_cert" must be provided when "tls_cert_self_signed" is set'); + } } + if (!from_client) { + if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { + throw Error('"tls_cert" must be provided'); + } if (typeof server.tls_key !== 'string' || server.tls_key === '') { throw Error('"tls_key" must be provided'); } @@ -335,6 +372,7 @@ class Config { throw Error('service.host is invalid'); } + const port = _port || _constants.PROTOCOL_DEFAULT_PORTS[protocol] || ''; if (!(0, _utils.isValidPort)(+port)) { throw Error('service.port is invalid'); } diff --git a/lib/core/hub.js b/lib/core/hub.js index 7930ac7..ee6f8fa 100644 --- a/lib/core/hub.js +++ b/lib/core/hub.js @@ -19,6 +19,14 @@ var _net = require('net'); var _net2 = _interopRequireDefault(_net); +var _http = require('http'); + +var _http2 = _interopRequireDefault(_http); + +var _https = require('https'); + +var _https2 = _interopRequireDefault(_https); + var _url = require('url'); var _tls = require('tls'); @@ -43,6 +51,8 @@ var _relay = require('./relay'); var _muxRelay = require('./mux-relay'); +var _speedTester = require('./speed-tester'); + var _utils = require('../utils'); var _proxies = require('../proxies'); @@ -67,14 +77,23 @@ class Hub { this._tcpRelays = new Map(); this._muxRelays = new Map(); this._udpRelays = null; - this._prevHrtime = process.hrtime(); + this._upSpeedTester = null; + this._dlSpeedTester = null; this._totalRead = 0; this._totalWritten = 0; - this._prevTotalRead = 0; - this._prevTotalWritten = 0; this._connQueue = []; this._udpCleanerTimer = null; + this._onRead = size => { + this._totalRead += size; + this._dlSpeedTester.feed(size); + }; + + this._onWrite = size => { + this._totalWritten += size; + this._upSpeedTester.feed(size); + }; + this._onConnection = (socket, proxyRequest = null) => { _utils.logger.verbose(`[hub] [${socket.remoteAddress}:${socket.remotePort}] connected`); @@ -117,8 +136,8 @@ class Hub { relay.on('_error', err => updateConnStatus('error', err.message)); relay.on('_connect', targetAddress => updateConnStatus('target', targetAddress)); - relay.on('_read', size => this._totalRead += size); - relay.on('_write', size => this._totalWritten += size); + relay.on('_read', this._onRead); + relay.on('_write', this._onWrite); relay.on('close', () => { updateConnStatus('close'); this._tcpRelays.delete(relay.id); @@ -130,6 +149,8 @@ class Hub { this._config = new _config.Config(config); this._udpRelays = (0, _lruCache2.default)({ max: 500, maxAge: 1e5, dispose: (_, relay) => relay.destroy() }); + this._upSpeedTester = new _speedTester.SpeedTester(); + this._dlSpeedTester = new _speedTester.SpeedTester(); } async run() { @@ -190,21 +211,11 @@ class Hub { } getUploadSpeed() { - const [sec, nano] = process.hrtime(this._prevHrtime); - const totalWritten = this._totalWritten; - const diff = totalWritten - this._prevTotalWritten; - const speed = Math.ceil(diff / (sec + nano / 1e9)); - this._prevTotalWritten = totalWritten; - return speed; + return this._upSpeedTester.getSpeed(); } getDownloadSpeed() { - const [sec, nano] = process.hrtime(this._prevHrtime); - const totalRead = this._totalRead; - const diff = totalRead - this._prevTotalRead; - const speed = Math.ceil(diff / (sec + nano / 1e9)); - this._prevTotalRead = totalRead; - return speed; + return this._dlSpeedTester.getSpeed(); } getConnStatuses() { @@ -227,6 +238,7 @@ class Hub { return new Promise((resolve, reject) => { const { local_protocol, local_search_params, local_host, local_port } = this._config; const { local_username: username, local_password: password } = this._config; + const { https_key, https_cert } = this._config; let server = null; switch (local_protocol) { case 'tcp': @@ -242,11 +254,22 @@ class Hub { case 'socks5': case 'socks4': case 'socks4a': - server = _proxies.socks.createServer({ bindAddress: local_host, bindPort: local_port, username, password }); + server = _proxies.socks.createServer({ + bindAddress: local_host, + bindPort: local_port, + username, + password + }); break; case 'http': case 'https': - server = _proxies.http.createServer({ username, password }); + server = _proxies.http.createServer({ + secure: local_protocol === 'https', + https_key, + https_cert, + username, + password + }); break; default: return reject(Error(`unsupported protocol: "${local_protocol}"`)); @@ -266,18 +289,19 @@ class Hub { } async _createServerOnServer() { + const { local_protocol, local_host, local_port, local_pathname, tls_key, tls_cert } = this._config; return new Promise((resolve, reject) => { const address = { - host: this._config.local_host, - port: this._config.local_port + host: local_host, + port: local_port }; const onListening = server => { - const service = `${this._config.local_protocol}://${this._config.local_host}:${this._config.local_port}`; + const service = `${local_protocol}://${local_host}:${local_port}` + (local_pathname ? local_pathname : ''); _utils.logger.info(`[hub] blinksocks server is running at ${service}`); resolve(server); }; let server = null; - switch (this._config.local_protocol) { + switch (local_protocol) { case 'tcp': { server = _net2.default.createServer(); @@ -285,29 +309,38 @@ class Hub { server.listen(address, () => onListening(server)); break; } + case 'wss': case 'ws': { - server = new _ws2.default.Server(_extends({}, address, { + let http_s_server = null; + if (local_protocol === 'wss') { + http_s_server = _https2.default.createServer({ key: tls_key, cert: tls_cert }); + } else { + http_s_server = _http2.default.createServer(); + } + server = new _ws2.default.Server({ + server: http_s_server, + path: local_pathname, perMessageDeflate: false - })); + }); server.getConnections = server._server.getConnections.bind(server._server); server.on('connection', (ws, req) => { ws.remoteAddress = req.connection.remoteAddress; ws.remotePort = req.connection.remotePort; this._onConnection(ws); }); - server.on('listening', () => onListening(server)); + http_s_server.listen(address, () => onListening(http_s_server)); break; } case 'tls': { - server = _tls2.default.createServer({ key: [this._config.tls_key], cert: [this._config.tls_cert] }); + server = _tls2.default.createServer({ key: tls_key, cert: tls_cert }); server.on('secureConnection', this._onConnection); server.listen(address, () => onListening(server)); break; } default: - return reject(Error(`unsupported protocol: "${this._config.local_protocol}"`)); + return reject(Error(`unsupported protocol: "${local_protocol}"`)); } server.on('error', reject); }); @@ -385,8 +418,8 @@ class Hub { muxRelay = this._createRelay(context, true); muxRelay.on('_error', err => updateConnStatus('error', err.message)); muxRelay.on('_connect', targetAddress => updateConnStatus('target', targetAddress)); - muxRelay.on('_read', size => this._totalRead += size); - muxRelay.on('_write', size => this._totalWritten += size); + muxRelay.on('_read', this._onRead); + muxRelay.on('_write', this._onWrite); muxRelay.on('close', () => { updateConnStatus('close'); this._muxRelays.delete(muxRelay.id); @@ -411,9 +444,9 @@ class Hub { _createRelay(context, isMux = false) { const props = { - config: this._config, context: context, - transport: this._config.transport, + config: this._config, + transport: this._config.server_protocol, presets: this._config.presets }; if (isMux) { diff --git a/lib/core/index.js b/lib/core/index.js index a495588..5492e7e 100644 --- a/lib/core/index.js +++ b/lib/core/index.js @@ -26,40 +26,4 @@ Object.keys(_hub).forEach(function (key) { return _hub[key]; } }); -}); - -var _pipe = require('./pipe'); - -Object.keys(_pipe).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _pipe[key]; - } - }); -}); - -var _relay = require('./relay'); - -Object.keys(_relay).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _relay[key]; - } - }); -}); - -var _muxRelay = require('./mux-relay'); - -Object.keys(_muxRelay).forEach(function (key) { - if (key === "default" || key === "__esModule") return; - Object.defineProperty(exports, key, { - enumerable: true, - get: function () { - return _muxRelay[key]; - } - }); }); \ No newline at end of file diff --git a/lib/core/relay.js b/lib/core/relay.js index 32302c5..1636e72 100644 --- a/lib/core/relay.js +++ b/lib/core/relay.js @@ -144,6 +144,7 @@ class Relay extends _events2.default { 'udp': [_transports.UdpInbound, _transports.UdpOutbound], 'tls': [_transports.TlsInbound, _transports.TlsOutbound], 'ws': [_transports.WsInbound, _transports.WsOutbound], + 'wss': [_transports.WssInbound, _transports.WssOutbound], 'mux': [_transports.MuxInbound, _transports.MuxOutbound] }; let Inbound = null, diff --git a/lib/core/speed-tester.js b/lib/core/speed-tester.js new file mode 100644 index 0000000..eefce5f --- /dev/null +++ b/lib/core/speed-tester.js @@ -0,0 +1,26 @@ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +class SpeedTester { + constructor() { + this.totalBytes = 0; + this.lastTime = Date.now(); + } + + feed(bytes) { + this.totalBytes += bytes; + } + + getSpeed() { + const now = Date.now(); + const timeDiff = now - this.lastTime; + const speed = this.totalBytes / (timeDiff / 1e3); + this.lastTime = now; + this.totalBytes = 0; + return speed; + } + +} +exports.SpeedTester = SpeedTester; \ No newline at end of file diff --git a/lib/presets/index.js b/lib/presets/index.js index a3248f7..f23576b 100644 --- a/lib/presets/index.js +++ b/lib/presets/index.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.presets = undefined; +exports.builtInPresetMap = undefined; exports.getPresetClassByName = getPresetClassByName; var _mux = require('./_mux'); @@ -64,7 +64,20 @@ var _aeadRandomCipher2 = _interopRequireDefault(_aeadRandomCipher); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -const presetMap = { +function checkPresetClass(clazz) { + if (typeof clazz !== 'function') { + return false; + } + + const requiredMethods = ['onDestroy', 'onInit', 'beforeOut', 'beforeIn', 'clientOut', 'serverIn', 'serverOut', 'clientIn', 'beforeOutUdp', 'beforeInUdp', 'clientOutUdp', 'serverInUdp', 'serverOutUdp', 'clientInUdp']; + if (requiredMethods.some(method => typeof clazz.prototype[method] !== 'function')) { + return false; + } + const requiredStaticMethods = ['onCheckParams', 'onCache']; + return !requiredStaticMethods.some(method => typeof clazz[method] !== 'function'); +} + +const builtInPresetMap = exports.builtInPresetMap = { 'mux': _mux2.default, 'base-auth': _baseAuth2.default, @@ -87,24 +100,8 @@ const presetMap = { 'aead-random-cipher': _aeadRandomCipher2.default }; -function checkPresetClass(clazz) { - if (typeof clazz !== 'function') { - return false; - } - - const requiredMethods = ['onDestroy', 'onInit', 'beforeOut', 'beforeIn', 'clientOut', 'serverIn', 'serverOut', 'clientIn', 'beforeOutUdp', 'beforeInUdp', 'clientOutUdp', 'serverInUdp', 'serverOutUdp', 'clientInUdp']; - if (requiredMethods.some(method => typeof clazz.prototype[method] !== 'function')) { - return false; - } - const requiredStaticMethods = ['onCheckParams', 'onCache']; - if (requiredStaticMethods.some(method => typeof clazz[method] !== 'function')) { - return false; - } - return true; -} - function getPresetClassByName(name, allowPrivate = false) { - let clazz = presetMap[name]; + let clazz = builtInPresetMap[name]; if (clazz === undefined) { try { clazz = require(name); @@ -119,6 +116,4 @@ function getPresetClassByName(name, allowPrivate = false) { throw Error(`cannot load private preset "${name}"`); } return clazz; -} - -const presets = exports.presets = Object.keys(presetMap); \ No newline at end of file +} \ No newline at end of file diff --git a/lib/proxies/http.js b/lib/proxies/http.js index b5e2bc8..5af358b 100644 --- a/lib/proxies/http.js +++ b/lib/proxies/http.js @@ -11,6 +11,10 @@ var _http = require('http'); var _http2 = _interopRequireDefault(_http); +var _https = require('https'); + +var _https2 = _interopRequireDefault(_https); + var _utils = require('../utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -27,8 +31,16 @@ function checkBasicAuthorization(credentials, { username, password }) { return true; } -function createServer({ username, password }) { - const server = _http2.default.createServer(); +function createServer({ secure, https_key, https_cert, username, password }) { + const name = secure ? 'https' : 'http'; + let server = null; + if (secure) { + server = _https2.default.createServer({ key: https_key, cert: https_cert }); + } else { + server = _http2.default.createServer(); + } + + const isAuthRequired = username !== '' && password !== ''; server.on('request', (req, res) => { const { hostname, port, pathname } = new _url.URL(req.url); @@ -39,15 +51,15 @@ function createServer({ username, password }) { if (hostname === null || !(0, _utils.isValidPort)(_port)) { const remote = `${socket.remoteAddress}:${socket.remotePort}`; - _utils.logger.warn(`[http] drop invalid http request sent from ${remote}`); + _utils.logger.warn(`[${name}] drop invalid http request sent from ${remote}`); return res.end(); } - const proxyAuth = headers['proxy-authorization']; - if (proxyAuth && username !== '' && password !== '') { + if (isAuthRequired) { + const proxyAuth = headers['proxy-authorization'] || ''; const [type, credentials] = proxyAuth.split(' '); if (type !== 'Basic' || !checkBasicAuthorization(credentials, { username, password })) { - _utils.logger.error(`[http] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); + _utils.logger.error(`[${name}] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); return res.end('HTTP/1.1 401 Unauthorized\r\n\r\n'); } } @@ -82,15 +94,15 @@ function createServer({ username, password }) { if (hostname === null || !(0, _utils.isValidPort)(port)) { const remote = `${socket.remoteAddress}:${socket.remotePort}`; - _utils.logger.warn(`[http] [${appAddress}] drop invalid http CONNECT request sent from ${remote}`); + _utils.logger.warn(`[${name}] [${appAddress}] drop invalid http CONNECT request sent from ${remote}`); return socket.destroy(); } - const proxyAuth = req.headers['proxy-authorization']; - if (proxyAuth && username !== '' && password !== '') { + if (isAuthRequired) { + const proxyAuth = req.headers['proxy-authorization'] || ''; const [type, credentials] = proxyAuth.split(' '); if (type !== 'Basic' || !checkBasicAuthorization(credentials, { username, password })) { - _utils.logger.error(`[http] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); + _utils.logger.error(`[${name}] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); return socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); } } @@ -105,8 +117,8 @@ function createServer({ username, password }) { }); server.on('clientError', (err, socket) => { - const appAddress = `${socket.remoteAddress}:${socket.remotePort}`; - _utils.logger.error(`[http] [${appAddress}] invalid http request: ${err.message}`); + const appAddress = `${socket.remoteAddress || ''}:${socket.remotePort || ''}`; + _utils.logger.error(`[${name}] [${appAddress}] invalid http request: ${err.message}`); socket.destroy(); }); diff --git a/lib/proxies/socks.js b/lib/proxies/socks.js index 1982b0c..c56b0eb 100644 --- a/lib/proxies/socks.js +++ b/lib/proxies/socks.js @@ -220,6 +220,7 @@ const STAGE_DONE = 3; function createServer({ bindAddress, bindPort, username, password }) { const server = _net2.default.createServer(); + const isAuthRequired = username !== '' && password !== ''; server.on('connection', socket => { const appAddress = `${socket.remoteAddress}:${socket.remotePort}`; @@ -240,6 +241,11 @@ function createServer({ bindAddress, bindPort, username, password }) { const { method } = request; switch (method) { case METHOD_NO_AUTH: + if (isAuthRequired) { + _utils.logger.error(`[socks] [${appAddress}] server requires authorization but got METHOD_NO_AUTH`); + socket.end(Buffer.from([SOCKS_VERSION_V5, METHOD_NOT_ACCEPTABLE])); + break; + } stage = STAGE_SOCKS5_REQUEST_MESSAGE; socket.write(Buffer.from([SOCKS_VERSION_V5, METHOD_NO_AUTH])); @@ -276,7 +282,7 @@ function createServer({ bindAddress, bindPort, username, password }) { } else if (stage === STAGE_SOCKS5_INITIAL_NEGOTIATION_MESSAGE) { request = parseSocks5InitialNegotiation(buffer); if (request !== null) { - if (username !== '' && password !== '') { + if (isAuthRequired) { if (username !== request.username || password !== request.password) { _utils.logger.error(`[socks] [${appAddress}] invalid socks5 authorization, username=${request.username} password=${request.password}`); socket.end(Buffer.from([SOCKS_VERSION_V5, 0x01])); diff --git a/lib/transports/index.js b/lib/transports/index.js index dbf84c3..5f7f1bc 100644 --- a/lib/transports/index.js +++ b/lib/transports/index.js @@ -52,6 +52,18 @@ Object.keys(_ws).forEach(function (key) { }); }); +var _wss = require('./wss'); + +Object.keys(_wss).forEach(function (key) { + if (key === "default" || key === "__esModule") return; + Object.defineProperty(exports, key, { + enumerable: true, + get: function () { + return _wss[key]; + } + }); +}); + var _mux = require('./mux'); Object.keys(_mux).forEach(function (key) { diff --git a/lib/transports/tcp.js b/lib/transports/tcp.js index 2e4bc5a..de3680d 100644 --- a/lib/transports/tcp.js +++ b/lib/transports/tcp.js @@ -332,7 +332,11 @@ class TcpOutbound extends _defs.Outbound { await this.connect({ host, port }); } if (this._config.is_client) { - await this.connect({ host: this._config.server_host, port: this._config.server_port }); + await this.connect({ + host: this._config.server_host, + port: this._config.server_port, + pathname: this._config.server_pathname + }); } this._socket.on('connect', () => { if (typeof onConnected === 'function') { @@ -360,11 +364,11 @@ class TcpOutbound extends _defs.Outbound { } } - async connect({ host, port }) { + async connect(target) { if (this._socket && !this._socket.destroyed) { this._socket.destroy(); } - this._socket = await this._connect({ host, port }); + this._socket = await this._connect(target); this._socket.on('error', this.onError); this._socket.on('end', this.onHalfClose); this._socket.on('close', this.onClose); diff --git a/lib/transports/tls.js b/lib/transports/tls.js index f631b76..9fa2a94 100644 --- a/lib/transports/tls.js +++ b/lib/transports/tls.js @@ -40,7 +40,11 @@ class TlsOutbound extends _tcp.TcpOutbound { async _connect({ host, port }) { _utils.logger.info(`[tls:outbound] [${this.remote}] connecting to tls://${host}:${port}`); - return _tls2.default.connect({ host, port, ca: [this._config.tls_cert] }); + const options = { host, port }; + if (this._config.tls_cert_self_signed) { + options.ca = [this._config.tls_cert]; + } + return _tls2.default.connect(options); } } diff --git a/lib/transports/ws.js b/lib/transports/ws.js index 4647ab8..36ba178 100644 --- a/lib/transports/ws.js +++ b/lib/transports/ws.js @@ -68,13 +68,25 @@ class WsOutbound extends _tcp.TcpOutbound { return this._socket && this._socket.readyState === _ws2.default.OPEN; } - async _connect({ host, port }) { - _utils.logger.info(`[${this.name}] [${this.remote}] connecting to ws://${host}:${port}`); - const socket = new _ws2.default(`ws://${host}:${port}`, { perMessageDeflate: false }); + async _connect(target) { + const address = this.getConnAddress(target); + _utils.logger.info(`[${this.name}] [${this.remote}] connecting to ${address}`); + const socket = new _ws2.default(address, this.getConnOptions({ + handshakeTimeout: 1e4, + perMessageDeflate: false + })); socket.on('message', this.onReceive); socket.on('close', () => socket.destroyed = true); return patchWebsocket.call(this, socket); } + getConnAddress({ host, port, pathname }) { + return `ws://${host}:${port}` + (pathname ? pathname : ''); + } + + getConnOptions(options) { + return options; + } + } exports.WsOutbound = WsOutbound; \ No newline at end of file diff --git a/lib/transports/wss.js b/lib/transports/wss.js new file mode 100644 index 0000000..4b7a060 --- /dev/null +++ b/lib/transports/wss.js @@ -0,0 +1,40 @@ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.WssOutbound = exports.WssInbound = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _ws = require('./ws'); + +class WssInbound extends _ws.WsInbound { + + get name() { + return 'wss:inbound'; + } + +} + +exports.WssInbound = WssInbound; +class WssOutbound extends _ws.WsOutbound { + + get name() { + return 'wss:outbound'; + } + + getConnAddress({ host, port, pathname }) { + return `wss://${host}:${port}` + (pathname ? pathname : ''); + } + + getConnOptions(options) { + const _options = _extends({}, options); + if (this._config.tls_cert_self_signed) { + _options.ca = [this._config.tls_cert]; + } + return _options; + } + +} +exports.WssOutbound = WssOutbound; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ae98f7c..93f9e10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "blinksocks", - "version": "3.1.1", + "version": "3.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20,10 +20,10 @@ "dev": true, "requires": { "@babel/types": "7.0.0-beta.44", - "jsesc": "2.5.1", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "jsesc": "^2.5.1", + "lodash": "^4.2.0", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -69,9 +69,9 @@ "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==", "dev": true, "requires": { - "chalk": "2.4.1", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^3.0.0" } }, "@babel/template": { @@ -83,7 +83,7 @@ "@babel/code-frame": "7.0.0-beta.44", "@babel/types": "7.0.0-beta.44", "babylon": "7.0.0-beta.44", - "lodash": "4.17.5" + "lodash": "^4.2.0" }, "dependencies": { "babylon": { @@ -106,10 +106,10 @@ "@babel/helper-split-export-declaration": "7.0.0-beta.44", "@babel/types": "7.0.0-beta.44", "babylon": "7.0.0-beta.44", - "debug": "3.1.0", - "globals": "11.4.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "debug": "^3.1.0", + "globals": "^11.1.0", + "invariant": "^2.2.0", + "lodash": "^4.2.0" }, "dependencies": { "babylon": { @@ -141,9 +141,9 @@ "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==", "dev": true, "requires": { - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "2.0.0" + "esutils": "^2.0.2", + "lodash": "^4.2.0", + "to-fast-properties": "^2.0.0" }, "dependencies": { "to-fast-properties": { @@ -172,7 +172,7 @@ "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" } }, "acorn-jsx": { @@ -181,7 +181,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -192,25 +192,16 @@ } } }, - "acorn-object-rest-spread": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/acorn-object-rest-spread/-/acorn-object-rest-spread-1.1.0.tgz", - "integrity": "sha1-eGma790Y7DGCyq2t9S4ml8BI9HY=", - "dev": true, - "requires": { - "acorn": "5.5.3" - } - }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -225,9 +216,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -253,7 +244,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -263,8 +254,8 @@ "dev": true, "optional": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "append-transform": { @@ -273,7 +264,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "argparse": { @@ -282,7 +273,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -291,7 +282,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -318,7 +309,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -368,7 +359,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "requires": { - "lodash": "4.17.5" + "lodash": "^4.14.0" } }, "async-each": { @@ -390,9 +381,9 @@ "dev": true }, "atob": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.0.tgz", - "integrity": "sha512-SuiKH8vbsOyCALjA/+EINmt/Kdl+TQPrtFgW7XZZcwtryFu9e5kQoX3bjCW6mIvGH1fbeAZZuvwGR5IlBRznGw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", "dev": true }, "aws-sign2": { @@ -413,21 +404,21 @@ "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-polyfill": "6.26.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "chokidar": "1.7.0", - "commander": "2.15.1", - "convert-source-map": "1.5.1", - "fs-readdir-recursive": "1.1.0", - "glob": "7.1.2", - "lodash": "4.17.5", - "output-file-sync": "1.1.2", - "path-is-absolute": "1.0.1", - "slash": "1.0.0", - "source-map": "0.5.7", - "v8flags": "2.1.1" + "babel-core": "^6.26.0", + "babel-polyfill": "^6.26.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "chokidar": "^1.6.1", + "commander": "^2.11.0", + "convert-source-map": "^1.5.0", + "fs-readdir-recursive": "^1.0.0", + "glob": "^7.1.2", + "lodash": "^4.17.4", + "output-file-sync": "^1.1.2", + "path-is-absolute": "^1.0.1", + "slash": "^1.0.0", + "source-map": "^0.5.6", + "v8flags": "^2.1.1" } }, "babel-code-frame": { @@ -436,9 +427,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -453,11 +444,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "supports-color": { @@ -474,25 +465,25 @@ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" } }, "babel-eslint": { @@ -505,8 +496,8 @@ "@babel/traverse": "7.0.0-beta.44", "@babel/types": "7.0.0-beta.44", "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0" + "eslint-scope": "~3.7.1", + "eslint-visitor-keys": "^1.0.0" }, "dependencies": { "babylon": { @@ -523,14 +514,14 @@ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -539,9 +530,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -550,10 +541,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -562,10 +553,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -574,9 +565,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -585,11 +576,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -598,8 +589,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -608,8 +599,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -618,8 +609,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -628,9 +619,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -639,11 +630,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -652,12 +643,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -666,18 +657,18 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-22.4.3.tgz", - "integrity": "sha512-BgSjmtl3mW3i+VeVHEr9d2zFSAT66G++pJcHQiUjd00pkW+voYXFctIm/indcqOWWXw5a1nUpR1XWszD9fJ1qg==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.0.1.tgz", + "integrity": "sha1-u6079SP7IC2gXtCmVAtIyE7tE6Y=", "dev": true, "requires": { - "babel-plugin-istanbul": "4.1.6", - "babel-preset-jest": "22.4.3" + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.0.1" } }, "babel-messages": { @@ -686,7 +677,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -695,7 +686,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-istanbul": { @@ -704,16 +695,16 @@ "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" } }, "babel-plugin-jest-hoist": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.4.3.tgz", - "integrity": "sha512-zhvv4f6OTWy2bYevcJftwGCWXMFe7pqoz41IhMi4xna7xNsX5NygdagsrE0y6kkfuXq8UalwvPwKTyAxME2E/g==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.0.1.tgz", + "integrity": "sha1-6qEclkVjrqnCG+zvK994U/fzwUg=", "dev": true }, "babel-plugin-syntax-async-functions": { @@ -752,9 +743,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-class-properties": { @@ -763,10 +754,10 @@ "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -775,7 +766,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -784,7 +775,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -793,11 +784,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -806,15 +797,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -823,8 +814,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -833,7 +824,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -842,8 +833,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -852,7 +843,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -861,9 +852,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -872,7 +863,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -881,21 +872,21 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -904,9 +895,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -915,9 +906,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -926,8 +917,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -936,12 +927,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -950,8 +941,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -960,7 +951,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -969,9 +960,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -980,7 +971,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -989,7 +980,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -998,9 +989,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -1009,9 +1000,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-object-rest-spread": { @@ -1020,8 +1011,8 @@ "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, "babel-plugin-transform-regenerator": { @@ -1030,7 +1021,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -1039,8 +1030,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-polyfill": { @@ -1049,9 +1040,9 @@ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "regenerator-runtime": "0.10.5" + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" }, "dependencies": { "regenerator-runtime": { @@ -1063,51 +1054,51 @@ } }, "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-preset-jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-22.4.3.tgz", - "integrity": "sha512-a+M3LTEXTq3gxv0uBN9Qm6ahUl7a8pj923nFbCUdqFUSsf3YrX8Uc+C3MEwji5Af3LiQjSC7w4ooYewlz8HRTA==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.0.1.tgz", + "integrity": "sha1-YxzFRcbPAhlDATvK8i9F2H/mIZg=", "dev": true, "requires": { - "babel-plugin-jest-hoist": "22.4.3", - "babel-plugin-syntax-object-rest-spread": "6.13.0" + "babel-plugin-jest-hoist": "^23.0.1", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, "babel-register": { @@ -1116,13 +1107,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.5", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -1131,8 +1122,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -1141,11 +1132,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1154,15 +1145,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1171,10 +1162,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1195,13 +1186,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1210,7 +1201,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -1219,7 +1210,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1228,7 +1219,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1237,9 +1228,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1263,7 +1254,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "binary-extensions": { @@ -1273,22 +1264,13 @@ "dev": true, "optional": true }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1298,9 +1280,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-process-hrtime": { @@ -1319,13 +1301,13 @@ } }, "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.7.tgz", + "integrity": "sha512-oYVLxFVqpX9uMhOIQBLtZL+CX4uY8ZpWcjNTaxyWl5rO8yA9SSNikFnAfvk8J3P/7z3BZwNmEqFKaJoYltj3MQ==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000830", - "electron-to-chromium": "1.3.42" + "caniuse-lite": "^1.0.30000835", + "electron-to-chromium": "^1.3.45" } }, "bser": { @@ -1334,7 +1316,7 @@ "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "dev": true, "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "buffer-from": { @@ -1349,27 +1331,21 @@ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" }, "dependencies": { "isobject": { @@ -1386,7 +1362,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -1403,11 +1379,20 @@ "optional": true }, "caniuse-lite": { - "version": "1.0.30000830", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz", - "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==", + "version": "1.0.30000839", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000839.tgz", + "integrity": "sha512-gJZIfmkuy84agOeAZc7WJOexZhisZaBSFk96gkGM6TkH7+1mBfr/MSPnXC8lO0g7guh/ucbswYjruvDbzc6i0g==", "dev": true }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1421,8 +1406,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -1430,9 +1415,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chardet": { @@ -1448,24 +1433,17 @@ "dev": true, "optional": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.0", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true, - "optional": true - }, "ci-info": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", @@ -1484,10 +1462,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1496,7 +1474,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "isobject": { @@ -1513,7 +1491,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -1529,8 +1507,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -1561,8 +1539,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -1570,8 +1548,8 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.8.0.tgz", "integrity": "sha1-iQwHw/1OZJU3Y4kRz2keVFi2/KU=", "requires": { - "color-convert": "0.5.3", - "color-string": "0.3.0" + "color-convert": "^0.5.0", + "color-string": "^0.3.0" }, "dependencies": { "color-convert": { @@ -1586,7 +1564,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1599,7 +1577,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colornames": { @@ -1608,17 +1586,17 @@ "integrity": "sha1-2BH9bIT1kClJmorEQ2ICk1uSvjE=" }, "colors": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", - "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz", + "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw==" }, "colorspace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.0.1.tgz", "integrity": "sha1-yZx5btMRKLmHalLh7l7gOkpxl0k=", "requires": { - "color": "0.8.0", - "text-hex": "0.0.0" + "color": "0.8.x", + "text-hex": "0.0.x" } }, "combined-stream": { @@ -1627,7 +1605,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1637,9 +1615,9 @@ "dev": true }, "compare-versions": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.1.0.tgz", - "integrity": "sha512-4hAxDSBypT/yp2ySFD346So6Ragw5xmBn/e/agIGl3bZr6DLUqnoRZPusxKrXdYRZpgexO9daejmIenlq/wrIQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz", + "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==", "dev": true }, "component-emitter": { @@ -1660,10 +1638,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "convert-source-map": { @@ -1687,17 +1665,31 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-env": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", - "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", + "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.2" + "cross-spawn": "^6.0.5", + "is-windows": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } } }, "cross-spawn": { @@ -1706,29 +1698,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.1" - } - } + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cssom": { @@ -1738,12 +1710,12 @@ "dev": true }, "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.3.1.tgz", + "integrity": "sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA==", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "cycle": { @@ -1757,7 +1729,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "data-urls": { @@ -1766,9 +1738,9 @@ "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", "dev": true, "requires": { - "abab": "1.0.4", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.0" + "abab": "^1.0.4", + "whatwg-mimetype": "^2.0.0", + "whatwg-url": "^6.4.0" } }, "debug": { @@ -1804,7 +1776,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "define-properties": { @@ -1813,8 +1785,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "define-property": { @@ -1823,8 +1795,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1833,7 +1805,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1842,7 +1814,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1851,9 +1823,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -1876,13 +1848,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1897,7 +1869,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-newline": { @@ -1911,9 +1883,9 @@ "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.0.tgz", "integrity": "sha1-4QkJALSVI+hSe+IPCBJ1IF8q42o=", "requires": { - "colorspace": "1.0.1", - "enabled": "1.0.2", - "kuler": "0.0.0" + "colorspace": "1.0.x", + "enabled": "1.0.x", + "kuler": "0.0.x" } }, "diff": { @@ -1928,7 +1900,7 @@ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "domexception": { @@ -1937,7 +1909,7 @@ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "4.0.2" + "webidl-conversions": "^4.0.2" } }, "ecc-jsbn": { @@ -1947,13 +1919,13 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "electron-to-chromium": { - "version": "1.3.42", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.42.tgz", - "integrity": "sha1-lcM78B0MxAVVauyJn+Yf1NduoPk=", + "version": "1.3.45", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", + "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=", "dev": true }, "enabled": { @@ -1961,7 +1933,7 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", "requires": { - "env-variable": "0.0.4" + "env-variable": "0.0.x" } }, "env-variable": { @@ -1975,20 +1947,20 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1997,9 +1969,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "escape-string-regexp": { @@ -2013,11 +1985,11 @@ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -2041,44 +2013,44 @@ "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "ajv": "5.5.2", - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "concat-stream": "1.6.2", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.4", - "esquery": "1.0.1", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.4.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.11.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "regexpp": "1.1.0", - "require-uncached": "1.0.3", - "semver": "5.5.0", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", "table": "4.0.2", - "text-table": "0.2.0" + "text-table": "~0.2.0" }, "dependencies": { "ansi-regex": { @@ -2108,7 +2080,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -2125,16 +2097,24 @@ "integrity": "sha512-HBkv9Q0LU/IhNUauC8TrbhcN79Yq/+xh2bYTOcv6KMaV2tsvVphkHwDTJ9r3C6mJUnmxrtzT3DQfrWj0rOISqQ==", "dev": true, "requires": { - "eslint-rule-composer": "0.3.0" + "eslint-rule-composer": "^0.3.0" } }, "eslint-plugin-flowtype": { - "version": "2.46.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.3.tgz", - "integrity": "sha512-VpnNeC4E6t2E2NCw8Oveda91p8CPEaujZURC1KhHe4lBRZJla3o0DVvZu1QGXQZO1ZJ4vUmy3TCp95PqGvIZgQ==", + "version": "2.49.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.49.3.tgz", + "integrity": "sha512-wO0S4QbXPReKtydxbY5A0UieOaF9jBO5BMuxYPQOTa082JCpKEoC7+o3fnKsVVycwX47lvqLiUGRsWauCiA9aw==", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } } }, "eslint-rule-composer": { @@ -2149,8 +2129,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint-visitor-keys": { @@ -2165,8 +2145,8 @@ "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, "requires": { - "acorn": "5.5.3", - "acorn-jsx": "3.0.1" + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -2181,7 +2161,7 @@ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -2190,7 +2170,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2211,7 +2191,7 @@ "integrity": "sha512-aLt95pexaugVtQerpmE51+4QfWrNc304uez7jvj6fWnN8GeEHpttB8F36n8N7uVhUMbH/1enbxQ9HImZ4w/9qg==", "dev": true, "requires": { - "merge": "1.2.0" + "merge": "^1.1.3" } }, "execa": { @@ -2220,13 +2200,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit": { @@ -2241,7 +2221,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2250,27 +2230,21 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, - "expand-template": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.0.3.tgz", - "integrity": "sha1-bDAzIxd6YrGyLAcCefeGEoe2mxo=", - "dev": true - }, "expect": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-22.4.3.tgz", - "integrity": "sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.1.0.tgz", + "integrity": "sha1-v9/VeiogFw2HWZnul4fMcfAcIF8=", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "jest-diff": "22.4.3", - "jest-get-type": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3" + "ansi-styles": "^3.2.0", + "jest-diff": "^23.0.1", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.0.1", + "jest-message-util": "^23.1.0", + "jest-regex-util": "^23.0.0" } }, "extend": { @@ -2285,8 +2259,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2295,7 +2269,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2306,9 +2280,9 @@ "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.21", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2317,7 +2291,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -2344,13 +2318,18 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.4.tgz", + "integrity": "sha512-mNlGUdKOeGNleyrmgbKYtbnCr9KZkZXU7eM89JRo8vY10f7Ul1Fbj07hUBW3N4fC0xM+fmfFfa2zM7mIizhpNQ==" + }, "fb-watchman": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "bser": "2.0.0" + "bser": "^2.0.0" } }, "fecha": { @@ -2364,7 +2343,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -2373,8 +2352,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "file-stream-rotator": { @@ -2382,7 +2361,7 @@ "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.2.1.tgz", "integrity": "sha1-DW/qGpp6uiWofP0xtuJp5E6PCvI=", "requires": { - "moment": "2.22.1" + "moment": "^2.11.2" } }, "filename-regex": { @@ -2397,8 +2376,8 @@ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "filesize": { @@ -2407,16 +2386,16 @@ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-up": { @@ -2425,7 +2404,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "flat-cache": { @@ -2434,10 +2413,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "for-in": { @@ -2452,7 +2431,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -2473,9 +2452,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "fragment-cache": { @@ -2484,28 +2463,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" - } - }, - "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" - } - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" + "map-cache": "^0.2.2" } }, "fs-readdir-recursive": { @@ -2521,37 +2479,29 @@ "dev": true }, "fsevents": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.0.tgz", - "integrity": "sha512-ROrBIbmw4ulxmQTwYAAGyN/0xgIOAFd6gX/K3F1aGLP/K5KxkubrlGISMV5EEWEB7qtiEdE0HpaqvMMHR+Ib6w==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.9.1" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, "dev": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true @@ -2562,91 +2512,39 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true - }, "balanced-match": { - "version": "0.4.2", - "bundled": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", + "version": "1.0.0", "bundled": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } + "dev": true }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, + "dev": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true - }, - "co": { - "version": "4.6.0", - "bundled": true + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true }, "code-point-at": { "version": "1.1.0", "bundled": true, "dev": true }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "dev": true }, "console-control-strings": { "version": "1.1.0", @@ -2655,45 +2553,25 @@ }, "core-util-is": { "version": "1.0.2", - "bundled": true - }, - "cryptiles": { - "version": "2.0.5", "bundled": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - } - } + "dev": true, + "optional": true }, "debug": { - "version": "2.6.8", + "version": "2.6.9", "bundled": true, + "dev": true, + "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { - "version": "0.4.2", + "version": "0.5.1", "bundled": true, "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -2701,62 +2579,25 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "ecc-jsbn": { - "version": "0.1.1", + "fs-minipass": { + "version": "1.2.5", "bundled": true, + "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", - "bundled": true - }, - "fstream": { - "version": "1.0.11", "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "dev": true, + "optional": true }, "gauge": { "version": "2.7.4", @@ -2764,55 +2605,28 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - } + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { "version": "7.1.2", "bundled": true, + "dev": true, + "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2821,43 +2635,41 @@ "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", + "iconv-lite": { + "version": "0.4.21", "bundled": true, + "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "safer-buffer": "^2.1.0" } }, - "hoek": { - "version": "2.16.3", - "bundled": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.1", "bundled": true, + "dev": true, + "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, + "dev": true, + "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "dev": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -2867,144 +2679,87 @@ "bundled": true, "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true - }, "isarray": { "version": "1.0.0", - "bundled": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", "bundled": true, + "dev": true, "optional": true }, - "json-schema": { - "version": "0.2.3", - "bundled": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "requires": { - "mime-db": "1.27.0" - } - }, "minimatch": { "version": "3.0.4", "bundled": true, + "dev": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } }, "mkdirp": { "version": "0.5.1", "bundled": true, + "dev": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, - "node-pre-gyp": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", - "integrity": "sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA=", + "needle": { + "version": "2.2.0", + "bundled": true, "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.0", - "rc": "1.2.1", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "4.4.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "dev": true, - "optional": true, - "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - } - } + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -3013,20 +2768,36 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "npmlog": { - "version": "4.1.0", + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", "bundled": true, "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3034,10 +2805,6 @@ "bundled": true, "dev": true }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true - }, "object-assign": { "version": "4.1.1", "bundled": true, @@ -3047,8 +2814,9 @@ "once": { "version": "1.4.0", "bundled": true, + "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3064,45 +2832,37 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { "version": "1.0.1", - "bundled": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true + "bundled": true, + "dev": true, + "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true - }, - "qs": { - "version": "6.4.0", - "bundled": true + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3114,59 +2874,48 @@ } }, "readable-stream": { - "version": "2.2.9", + "version": "2.3.6", "bundled": true, + "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "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" } }, "rimraf": { - "version": "2.6.1", + "version": "2.6.2", "bundled": true, + "dev": true, + "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { - "version": "5.0.1", - "bundled": true + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true }, "semver": { - "version": "5.3.0", + "version": "5.5.0", "bundled": true, "dev": true, "optional": true @@ -3183,61 +2932,31 @@ "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true - } - } - }, "string-width": { "version": "1.0.2", "bundled": true, "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, + "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3247,65 +2966,25 @@ "optional": true }, "tar": { - "version": "2.2.1", + "version": "4.4.1", "bundled": true, + "dev": true, + "optional": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true - }, "util-deprecate": { "version": "1.0.2", - "bundled": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true - }, - "verror": { - "version": "1.3.6", "bundled": true, - "requires": { - "extsprintf": "1.0.2" - } + "dev": true, + "optional": true }, "wide-align": { "version": "1.1.2", @@ -3313,19 +2992,18 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { "version": "1.0.2", - "bundled": true + "bundled": true, + "dev": true }, "yallist": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true, - "optional": true + "bundled": true, + "dev": true } } }, @@ -3365,7 +3043,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { @@ -3374,12 +3052,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3388,8 +3066,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -3398,7 +3076,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -3413,12 +3091,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "graceful-fs": { @@ -3439,10 +3117,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -3457,7 +3135,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -3474,17 +3152,17 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.2.tgz", + "integrity": "sha512-D5/WxwX+SrGfs/fiQn34RAoIZkCLJBDEfBWS1kmTI6G/1mtjhxTBiIiJi8EsKhwaQqKqj7lpKOi3i69tg3P+OQ==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -3493,7 +3171,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -3507,9 +3185,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -3526,8 +3204,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -3536,7 +3214,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3545,7 +3223,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3556,37 +3234,19 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" - } - }, - "hoek": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", - "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", - "dev": true - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -3601,7 +3261,7 @@ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "http-signature": { @@ -3610,9 +3270,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -3621,7 +3281,7 @@ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore": { @@ -3630,24 +3290,14 @@ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", "dev": true }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "3.0.4" - } - }, "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { - "pkg-dir": "2.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -3656,27 +3306,20 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "inquirer": { "version": "3.3.0", @@ -3684,20 +3327,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { @@ -3712,7 +3355,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3723,7 +3366,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3743,7 +3386,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -3759,7 +3402,7 @@ "dev": true, "optional": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3774,7 +3417,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { @@ -3789,7 +3432,7 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -3798,7 +3441,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-date-object": { @@ -3813,9 +3456,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -3838,7 +3481,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -3859,7 +3502,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -3880,7 +3523,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -3889,7 +3532,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-odd": { @@ -3898,7 +3541,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -3921,7 +3564,7 @@ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -3930,7 +3573,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { @@ -3939,7 +3582,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -3974,7 +3617,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -4015,8 +3658,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -4045,42 +3687,18 @@ "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", "dev": true, "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.11.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", - "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", - "dev": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - } - } + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" } }, "istanbul-lib-coverage": { @@ -4095,7 +3713,7 @@ "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -4104,13 +3722,13 @@ "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -4119,10 +3737,10 @@ "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "has-flag": { @@ -4137,22 +3755,22 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz", - "integrity": "sha512-fDa0hwU/5sDXwAklXgAoCJCOsFsBplVQ6WBldz5UwaqOzmDhUK4nfuR7/G//G2lERlblUNJB8P6e8cXq3a7MlA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz", + "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -4172,17 +3790,17 @@ "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jest": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-22.4.3.tgz", - "integrity": "sha512-FFCdU/pXOEASfHxFDOWUysI/+FFoqiXJADEIXgDKuZyqSmBD3tZ4BEGH7+M79v7czj7bbkhwtd2LaEDcJiM/GQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.1.0.tgz", + "integrity": "sha1-u7f4kxAKEadC3YvQ0EelSwlorRo=", "dev": true, "requires": { - "import-local": "1.0.0", - "jest-cli": "22.4.3" + "import-local": "^1.0.0", + "jest-cli": "^23.1.0" }, "dependencies": { "ansi-regex": { @@ -4192,45 +3810,46 @@ "dev": true }, "jest-cli": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-22.4.3.tgz", - "integrity": "sha512-IiHybF0DJNqZPsbjn4Cy4vcqcmImpoFwNFnkehzVw8lTUSl4axZh5DHewu5bdpZF2Y5gUqFKYzH0FH4Qx2k+UA==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.1.0.tgz", + "integrity": "sha1-64vdTODRUlCJLjGtm2m8mdKo9r8=", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "exit": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "import-local": "1.0.0", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "22.4.3", - "jest-config": "22.4.3", - "jest-environment-jsdom": "22.4.3", - "jest-get-type": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-message-util": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve-dependencies": "22.4.3", - "jest-runner": "22.4.3", - "jest-runtime": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "realpath-native": "1.0.0", - "rimraf": "2.6.2", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.3.0", - "yargs": "10.1.2" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.0.1", + "jest-config": "^23.1.0", + "jest-environment-jsdom": "^23.1.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.1.0", + "jest-message-util": "^23.1.0", + "jest-regex-util": "^23.0.0", + "jest-resolve-dependencies": "^23.0.1", + "jest-runner": "^23.1.0", + "jest-runtime": "^23.1.0", + "jest-snapshot": "^23.0.1", + "jest-util": "^23.1.0", + "jest-validate": "^23.0.1", + "jest-watcher": "^23.1.0", + "jest-worker": "^23.0.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" } }, "strip-ansi": { @@ -4239,79 +3858,91 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "jest-changed-files": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-22.4.3.tgz", - "integrity": "sha512-83Dh0w1aSkUNFhy5d2dvqWxi/y6weDwVVLU6vmK0cV9VpRxPzhTeGimbsbRDSnEoszhF937M4sDLLeS7Cu/Tmw==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.0.1.tgz", + "integrity": "sha1-95Vy0HIIROpd+EwqRI6GLCJU9gw=", "dev": true, "requires": { - "throat": "4.1.0" + "throat": "^4.0.0" } }, "jest-config": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-22.4.3.tgz", - "integrity": "sha512-KSg3EOToCgkX+lIvenKY7J8s426h6ahXxaUFJxvGoEk0562Z6inWj1TnKoGycTASwiLD+6kSYFALcjdosq9KIQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.1.0.tgz", + "integrity": "sha1-cIyg9DHTVu5CT7SJXTMIAGvdgkE=", "dev": true, "requires": { - "chalk": "2.4.1", - "glob": "7.1.2", - "jest-environment-jsdom": "22.4.3", - "jest-environment-node": "22.4.3", - "jest-get-type": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "pretty-format": "22.4.3" + "babel-core": "^6.0.0", + "babel-jest": "^23.0.1", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.1.0", + "jest-environment-node": "^23.1.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.1.0", + "jest-regex-util": "^23.0.0", + "jest-resolve": "^23.1.0", + "jest-util": "^23.1.0", + "jest-validate": "^23.0.1", + "pretty-format": "^23.0.1" } }, "jest-diff": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-22.4.3.tgz", - "integrity": "sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.0.1.tgz", + "integrity": "sha1-PUkTfO4SwyCktNK0pvpugtSRoWo=", "dev": true, "requires": { - "chalk": "2.4.1", - "diff": "3.5.0", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.0.1" } }, "jest-docblock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-22.4.3.tgz", - "integrity": "sha512-uPKBEAw7YrEMcXueMKZXn/rbMxBiSv48fSqy3uEnmgOlQhSX+lthBqHb1fKWNVmFqAp9E/RsSdBfiV31LbzaOg==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.0.1.tgz", + "integrity": "sha1-3t3RgzO+XcJBUmCgTvP86SdrVyU=", "dev": true, "requires": { - "detect-newline": "2.1.0" + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.1.0.tgz", + "integrity": "sha1-FhRrWSw1SGelrl4TzfFcbGW2lsY=", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.0.1" } }, "jest-environment-jsdom": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-22.4.3.tgz", - "integrity": "sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.1.0.tgz", + "integrity": "sha1-hZKZFOI77TV32sl1X0EG0Gl8R5w=", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3", - "jsdom": "11.8.0" + "jest-mock": "^23.1.0", + "jest-util": "^23.1.0", + "jsdom": "^11.5.1" } }, "jest-environment-node": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-22.4.3.tgz", - "integrity": "sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.1.0.tgz", + "integrity": "sha1-RSwL+UnPy7rNoeF2Lu7XC8eEx9U=", "dev": true, "requires": { - "jest-mock": "22.4.3", - "jest-util": "22.4.3" + "jest-mock": "^23.1.0", + "jest-util": "^23.1.0" } }, "jest-get-type": { @@ -4321,37 +3952,124 @@ "dev": true }, "jest-haste-map": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-22.4.3.tgz", - "integrity": "sha512-4Q9fjzuPVwnaqGKDpIsCSoTSnG3cteyk2oNVjBX12HHOaF1oxql+uUiqZb5Ndu7g/vTZfdNwwy4WwYogLh29DQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.1.0.tgz", + "integrity": "sha1-GObH1ajScTb5G32YUvhd4McHTEk=", "dev": true, "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "22.4.3", - "jest-serializer": "22.4.3", - "jest-worker": "22.4.3", - "micromatch": "2.3.11", - "sane": "2.5.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^23.0.1", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.0.1", + "micromatch": "^2.3.11", + "sane": "^2.0.0" } }, "jest-jasmine2": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-22.4.3.tgz", - "integrity": "sha512-yZCPCJUcEY6R5KJB/VReo1AYI2b+5Ky+C+JA1v34jndJsRcLpU4IZX4rFJn7yDTtdNbO/nNqg+3SDIPNH2ecnw==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.1.0.tgz", + "integrity": "sha1-SvqzFym2VN3NKwdK3YSTlvE7MLg=", "dev": true, "requires": { - "chalk": "2.4.1", - "co": "4.6.0", - "expect": "22.4.3", - "graceful-fs": "4.1.11", - "is-generator-fn": "1.0.0", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "jest-message-util": "22.4.3", - "jest-snapshot": "22.4.3", - "jest-util": "22.4.3", - "source-map-support": "0.5.4" + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.1.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.0.1", + "jest-each": "^23.1.0", + "jest-matcher-utils": "^23.0.1", + "jest-message-util": "^23.1.0", + "jest-snapshot": "^23.0.1", + "jest-util": "^23.1.0", + "pretty-format": "^23.0.1" + } + }, + "jest-leak-detector": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.0.1.tgz", + "integrity": "sha1-nboHUFrDSVw50+wJrB5WRZnoYaA=", + "dev": true, + "requires": { + "pretty-format": "^23.0.1" + } + }, + "jest-matcher-utils": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.0.1.tgz", + "integrity": "sha1-DGwNrt+YM8Kn82I2Bp7+y0w/bl8=", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.0.1" + } + }, + "jest-message-util": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.1.0.tgz", + "integrity": "sha1-moCbpIfsrFzlEdTmmO47XuJGHqk=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.1.0.tgz", + "integrity": "sha1-o4HDGxIasfYMRiotrbe4bczKxIc=", + "dev": true + }, + "jest-regex-util": { + "version": "23.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.0.0.tgz", + "integrity": "sha1-3Vwf3gxG9DcTFM8Q96dRoj9Oj3Y=", + "dev": true + }, + "jest-resolve": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.1.0.tgz", + "integrity": "sha1-ueMW7s69bwC8UKOWDRUnuuZXktI=", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.0.1.tgz", + "integrity": "sha1-0BoQ3a2RUsTOzfXqwriFccS2pk0=", + "dev": true, + "requires": { + "jest-regex-util": "^23.0.0", + "jest-snapshot": "^23.0.1" + } + }, + "jest-runner": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.1.0.tgz", + "integrity": "sha1-+iCpM//3MaVDKzVh5/ZCZZT6KbU=", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.1.0", + "jest-docblock": "^23.0.1", + "jest-haste-map": "^23.1.0", + "jest-jasmine2": "^23.1.0", + "jest-leak-detector": "^23.0.1", + "jest-message-util": "^23.1.0", + "jest-runtime": "^23.1.0", + "jest-util": "^23.1.0", + "jest-worker": "^23.0.1", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" }, "dependencies": { "source-map": { @@ -4361,125 +4079,44 @@ "dev": true }, "source-map-support": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", - "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } } } }, - "jest-leak-detector": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-22.4.3.tgz", - "integrity": "sha512-NZpR/Ls7+ndO57LuXROdgCGz2RmUdC541tTImL9bdUtU3WadgFGm0yV+Ok4Fuia/1rLAn5KaJ+i76L6e3zGJYQ==", - "dev": true, - "requires": { - "pretty-format": "22.4.3" - } - }, - "jest-matcher-utils": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-22.4.3.tgz", - "integrity": "sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "jest-get-type": "22.4.3", - "pretty-format": "22.4.3" - } - }, - "jest-message-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-22.4.3.tgz", - "integrity": "sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "chalk": "2.4.1", - "micromatch": "2.3.11", - "slash": "1.0.0", - "stack-utils": "1.0.1" - } - }, - "jest-mock": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-22.4.3.tgz", - "integrity": "sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==", - "dev": true - }, - "jest-regex-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-22.4.3.tgz", - "integrity": "sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==", - "dev": true - }, - "jest-resolve": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-22.4.3.tgz", - "integrity": "sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==", - "dev": true, - "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.4.1" - } - }, - "jest-resolve-dependencies": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-22.4.3.tgz", - "integrity": "sha512-06czCMVToSN8F2U4EvgSB1Bv/56gc7MpCftZ9z9fBgUQM7dzHGCMBsyfVA6dZTx8v0FDcnALf7hupeQxaBCvpA==", - "dev": true, - "requires": { - "jest-regex-util": "22.4.3" - } - }, - "jest-runner": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-22.4.3.tgz", - "integrity": "sha512-U7PLlQPRlWNbvOHWOrrVay9sqhBJmiKeAdKIkvX4n1G2tsvzLlf77nBD28GL1N6tGv4RmuTfI8R8JrkvCa+IBg==", - "dev": true, - "requires": { - "exit": "0.1.2", - "jest-config": "22.4.3", - "jest-docblock": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-jasmine2": "22.4.3", - "jest-leak-detector": "22.4.3", - "jest-message-util": "22.4.3", - "jest-runtime": "22.4.3", - "jest-util": "22.4.3", - "jest-worker": "22.4.3", - "throat": "4.1.0" - } - }, "jest-runtime": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-22.4.3.tgz", - "integrity": "sha512-Eat/esQjevhx9BgJEC8udye+FfoJ2qvxAZfOAWshYGS22HydHn5BgsvPdTtt9cp0fSl5LxYOFA1Pja9Iz2Zt8g==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.1.0.tgz", + "integrity": "sha1-tK4OhyWeys/UqIS2OdsHz03WIK8=", "dev": true, "requires": { - "babel-core": "6.26.3", - "babel-jest": "22.4.3", - "babel-plugin-istanbul": "4.1.6", - "chalk": "2.4.1", - "convert-source-map": "1.5.1", - "exit": "0.1.2", - "graceful-fs": "4.1.11", - "jest-config": "22.4.3", - "jest-haste-map": "22.4.3", - "jest-regex-util": "22.4.3", - "jest-resolve": "22.4.3", - "jest-util": "22.4.3", - "jest-validate": "22.4.3", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "realpath-native": "1.0.0", - "slash": "1.0.0", + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.1.0", + "jest-haste-map": "^23.1.0", + "jest-message-util": "^23.1.0", + "jest-regex-util": "^23.0.0", + "jest-resolve": "^23.1.0", + "jest-snapshot": "^23.0.1", + "jest-util": "^23.1.0", + "jest-validate": "^23.0.1", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "10.1.2" + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" }, "dependencies": { "strip-bom": { @@ -4491,38 +4128,39 @@ } }, "jest-serializer": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-22.4.3.tgz", - "integrity": "sha512-uPaUAppx4VUfJ0QDerpNdF43F68eqKWCzzhUlKNDsUPhjOon7ZehR4C809GCqh765FoMRtTVUVnGvIoskkYHiw==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", "dev": true }, "jest-snapshot": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-22.4.3.tgz", - "integrity": "sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.0.1.tgz", + "integrity": "sha1-ZnT6Gbnraamcq+zUFb3cQtavPn4=", "dev": true, "requires": { - "chalk": "2.4.1", - "jest-diff": "22.4.3", - "jest-matcher-utils": "22.4.3", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-diff": "^23.0.1", + "jest-matcher-utils": "^23.0.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.0.1" } }, "jest-util": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-22.4.3.tgz", - "integrity": "sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==", + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.1.0.tgz", + "integrity": "sha1-wCUbrzRkTG3S/qeKli9CY6xVdy0=", "dev": true, "requires": { - "callsites": "2.0.0", - "chalk": "2.4.1", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "jest-message-util": "22.4.3", - "mkdirp": "0.5.1", - "source-map": "0.6.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.1.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "callsites": { @@ -4540,25 +4178,35 @@ } }, "jest-validate": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-22.4.3.tgz", - "integrity": "sha512-CfFM18W3GSP/xgmA4UouIx0ljdtfD2mjeBC6c89Gg17E44D4tQhAcTrZmf9djvipwU30kSTnk6CzcxdCCeSXfA==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.0.1.tgz", + "integrity": "sha1-zZ8BqJ0mu4hfEqhmdxXpyGWldU8=", "dev": true, "requires": { - "chalk": "2.4.1", - "jest-config": "22.4.3", - "jest-get-type": "22.4.3", - "leven": "2.1.0", - "pretty-format": "22.4.3" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.0.1" + } + }, + "jest-watcher": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.1.0.tgz", + "integrity": "sha1-qNWELjjZ+0r/+CPfartCpYrmzb0=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" } }, "jest-worker": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-22.4.3.tgz", - "integrity": "sha512-B1ucW4fI8qVAuZmicFxI1R3kr2fNeYJyvIQ1rKcuLYnenFV5K5aMbxFj6J0i00Ju83S8jP2d7Dz14+AvbIHRYQ==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.0.1.tgz", + "integrity": "sha1-nmSd2WP/QEYCb5HEAX8Dmmqkp7w=", "dev": true, "requires": { - "merge-stream": "1.0.1" + "merge-stream": "^1.0.1" } }, "js-sha3": { @@ -4578,8 +4226,8 @@ "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -4590,37 +4238,37 @@ "optional": true }, "jsdom": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.8.0.tgz", - "integrity": "sha512-fZZSH6P8tVqYIQl0WKpZuQljPu2cW41Uj/c9omtyGwjwZCB8c82UAi7BSQs/F1FgWovmZsoU02z3k28eHp0Cdw==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.11.0.tgz", + "integrity": "sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A==", "dev": true, "requires": { - "abab": "1.0.4", - "acorn": "5.5.3", - "acorn-globals": "4.1.0", - "array-equal": "1.0.0", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "data-urls": "1.0.0", - "domexception": "1.0.1", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "left-pad": "1.3.0", - "nwmatcher": "1.4.4", + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.3.1 < 0.4.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwsapi": "^2.0.0", "parse5": "4.0.0", - "pn": "1.1.0", - "request": "2.85.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "w3c-hr-time": "1.0.1", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-mimetype": "2.1.0", - "whatwg-url": "6.4.0", - "ws": "4.1.0", - "xml-name-validator": "3.0.0" + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" }, "dependencies": { "ws": { @@ -4629,8 +4277,8 @@ "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dev": true, "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } } } @@ -4653,15 +4301,6 @@ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", "dev": true }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "0.0.0" - } - }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -4680,21 +4319,6 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -4713,7 +4337,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "kuler": { @@ -4737,7 +4361,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "left-pad": { @@ -4758,8 +4382,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "libsodium": { @@ -4781,11 +4405,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "locate-path": { @@ -4794,8 +4418,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -4826,12 +4450,21 @@ "integrity": "sha1-MmjyanyI5PSxdY1nknGBTjH6WyY=" }, "logform": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/logform/-/logform-1.4.2.tgz", - "integrity": "sha512-6fk2qTAHUpUAQ6Gzlly3v8KzdCjsN9T8tMW6aRpoNYjfE9na+DY6Bg3T31j28GloqcSl2VmkvZ8t6BjOdCfP6w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.7.0.tgz", + "integrity": "sha512-IyyAkQiA0I3LEar69J0bR5kg7204883jsWW4os9ypXiEsHueuPwfEClC3aSelhG+pIbMD0l23nAkz5VRXZYMWA==", "requires": { - "colors": "1.2.1", - "fecha": "2.3.3" + "colors": "^1.2.1", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "long": { @@ -4851,16 +4484,16 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "makeerror": { @@ -4869,7 +4502,7 @@ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "tmpl": "1.0.4" + "tmpl": "1.0.x" } }, "map-cache": { @@ -4884,16 +4517,22 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, "mem": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "merge": { @@ -4908,7 +4547,7 @@ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "readable-stream": "2.3.6" + "readable-stream": "^2.0.1" } }, "micromatch": { @@ -4917,19 +4556,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mime-db": { @@ -4944,7 +4583,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -4959,7 +4598,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4968,42 +4607,14 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, - "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true - } - } - }, - "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "2.2.4" - } - }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5012,7 +4623,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5027,9 +4638,9 @@ } }, "moment": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", - "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" }, "ms": { "version": "2.0.0", @@ -5037,16 +4648,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multistream": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.0.tgz", - "integrity": "sha1-YlwmfVxEQkrWKUeItbtNo9yzLx0=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -5066,18 +4667,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "arr-diff": { @@ -5106,17 +4707,11 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" - } + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true }, "node-int64": { "version": "0.4.0", @@ -5130,10 +4725,10 @@ "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", "dev": true, "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, "normalize-package-data": { @@ -5142,10 +4737,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5154,25 +4749,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -5181,7 +4758,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -5190,10 +4767,10 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, - "nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "nwsapi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.1.tgz", + "integrity": "sha512-xOJJb7kAAGy6UOklbaIPA0iu/27VMHfAbMUgYJlXz4qRXytIkPGM2vwfbxa+tbaqcqHNsP6RN4eDZlePelWKpQ==", "dev": true }, "oauth-sign": { @@ -5214,9 +4791,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -5225,7 +4802,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5242,7 +4819,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" }, "dependencies": { "isobject": { @@ -5259,8 +4836,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.omit": { @@ -5269,8 +4846,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -5279,7 +4856,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" }, "dependencies": { "isobject": { @@ -5296,7 +4873,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "one-time": { @@ -5310,7 +4887,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "optimist": { @@ -5319,8 +4896,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -5337,12 +4914,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-homedir": { @@ -5357,9 +4934,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -5374,9 +4951,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" } }, "p-finally": { @@ -5391,7 +4968,7 @@ "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -5400,7 +4977,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -5415,10 +4992,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -5427,7 +5004,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse5": { @@ -5478,9 +5055,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "performance-now": { @@ -5507,136 +5084,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" - } - }, - "pkg": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.3.1.tgz", - "integrity": "sha512-QaOXdF9doVkrXpeu0D5ODLDLjYE4LE2WAk7/wSgNiCsCajg4ExjApxwkVIanz61tR8oIe+8vkmW0WpAwfV1ExA==", - "dev": true, - "requires": { - "acorn": "5.5.3", - "acorn-object-rest-spread": "1.1.0", - "babel-runtime": "6.25.0", - "chalk": "2.1.0", - "escodegen": "1.8.1", - "fs-extra": "4.0.1", - "globby": "6.1.0", - "minimist": "1.2.0", - "multistream": "2.1.0", - "pkg-fetch": "2.5.4", - "progress": "2.0.0", - "resolve": "1.4.0", - "simple-bufferstream": "1.0.0", - "stream-meter": "1.0.4" - }, - "dependencies": { - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "dev": true, - "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.10.5" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5645,230 +5093,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" - } - }, - "pkg-fetch": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.5.4.tgz", - "integrity": "sha512-KASiP5yytve4otDY242Zp3r+e11whyoSl79QmmBS3Qg4rvZsYOC5RE0szM0SZrVxg93sqYcINxHlXmzBTJDOeA==", - "dev": true, - "requires": { - "babel-runtime": "6.25.0", - "byline": "5.0.0", - "chalk": "2.1.0", - "expand-template": "1.0.3", - "fs-extra": "4.0.1", - "in-publish": "2.0.0", - "minimist": "1.2.0", - "progress": "2.0.0", - "request": "2.81.0", - "request-progress": "3.0.0", - "semver": "5.4.1", - "unique-temp-dir": "1.0.0" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true - }, - "babel-runtime": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz", - "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=", - "dev": true, - "requires": { - "core-js": "2.5.5", - "regenerator-runtime": "0.10.5" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "find-up": "^2.1.0" } }, "pluralize": { @@ -5902,13 +5127,13 @@ "dev": true }, "pretty-format": { - "version": "22.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-22.4.3.tgz", - "integrity": "sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==", + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.0.1.tgz", + "integrity": "sha1-1h0GUmjkx1kIO8y8onoBrXx2AfQ=", "dev": true, "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { @@ -5928,8 +5153,7 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "progress": { "version": "2.0.0", @@ -5943,55 +5167,39 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -6001,9 +5209,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -6012,8 +5220,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { @@ -6022,8 +5230,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -6032,7 +5240,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } } } @@ -6041,15 +5249,14 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { - "core-util-is": "1.0.2", - "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.2" + "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" } }, "readdirp": { @@ -6059,10 +5266,10 @@ "dev": true, "optional": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "realpath-native": { @@ -6071,7 +5278,7 @@ "integrity": "sha512-XJtlRJ9jf0E1H1SLeJyQ9PGzQD7S65h1pRXEcAeK48doKOnKxcgPeNohJvD5u/2sI9J1oke6E8bZHS/fmW1UiQ==", "dev": true, "requires": { - "util.promisify": "1.0.0" + "util.promisify": "^1.0.0" } }, "regenerate": { @@ -6092,9 +5299,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -6103,7 +5310,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -6112,8 +5319,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpp": { @@ -6128,9 +5335,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -6145,7 +5352,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -6180,46 +5387,35 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" - } - }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dev": true, - "requires": { - "throttleit": "1.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "request-promise-core": { @@ -6228,7 +5424,7 @@ "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.13.1" } }, "request-promise-native": { @@ -6238,8 +5434,8 @@ "dev": true, "requires": { "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, "require-directory": { @@ -6260,8 +5456,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "resolve": { @@ -6276,7 +5472,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" }, "dependencies": { "resolve-from": { @@ -6305,8 +5501,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -6322,7 +5518,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -6331,16 +5527,22 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -6355,14 +5557,13 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "safe-regex": { "version": "1.1.0", @@ -6370,7 +5571,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -6380,19 +5581,20 @@ "dev": true }, "sane": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.0.tgz", - "integrity": "sha512-glfKd7YH4UCrh/7dD+UESsr8ylKWRE7UQPoXuz28FgmcF0ViJQhCTCCZHICRKxf8G8O1KdLEn20dcICK54c7ew==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", "dev": true, "requires": { - "anymatch": "2.0.0", - "exec-sh": "0.2.1", - "fb-watchman": "2.0.0", - "fsevents": "1.2.0", - "micromatch": "3.1.10", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.18.0" + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" }, "dependencies": { "anymatch": { @@ -6401,8 +5603,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -6423,16 +5625,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -6441,7 +5643,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6452,13 +5654,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -6467,7 +5669,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -6476,7 +5678,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -6485,7 +5687,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6494,7 +5696,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6505,7 +5707,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6514,7 +5716,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6525,9 +5727,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -6544,14 +5746,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -6560,7 +5762,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -6569,7 +5771,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6580,10 +5782,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -6592,7 +5794,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6603,7 +5805,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6612,7 +5814,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6621,9 +5823,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -6632,7 +5834,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6641,7 +5843,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6664,19 +5866,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "minimist": { @@ -6717,10 +5919,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -6729,7 +5931,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6740,7 +5942,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -6761,12 +5963,6 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, - "simple-bufferstream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-bufferstream/-/simple-bufferstream-1.0.0.tgz", - "integrity": "sha1-XKsQ6FGqccZnt3th/hux2QpguqQ=", - "dev": true - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -6779,7 +5975,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "smart-buffer": { @@ -6794,14 +5990,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -6810,7 +6006,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -6819,7 +6015,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6830,9 +6026,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -6841,7 +6037,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -6850,7 +6046,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6859,7 +6055,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6868,9 +6064,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "isobject": { @@ -6893,16 +6089,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" - } - }, - "sntp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", - "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", - "dev": true, - "requires": { - "hoek": "4.2.1" + "kind-of": "^3.2.0" } }, "socks": { @@ -6911,8 +6098,8 @@ "integrity": "sha512-uRKV9uXQ9ytMbGm2+DilS1jB7N3AC0mmusmW5TVWjNuBZjxS8+lX38fasKVY9I4opv/bY/iqTbcpFFaTwpfwRg==", "dev": true, "requires": { - "ip": "1.1.5", - "smart-buffer": "4.0.1" + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" } }, "source-map": { @@ -6922,16 +6109,16 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", - "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.0", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -6940,7 +6127,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -6955,8 +6142,8 @@ "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -6971,8 +6158,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -6987,7 +6174,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -7002,14 +6189,14 @@ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "stack-trace": { @@ -7029,8 +6216,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -7039,7 +6226,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -7050,23 +6237,14 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } - }, "string-length": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -7081,7 +6259,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7092,8 +6270,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -7108,7 +6286,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7117,24 +6295,17 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7143,7 +6314,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -7163,7 +6334,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "symbol-tree": { @@ -7178,12 +6349,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.5.2", - "ajv-keywords": "2.1.1", - "chalk": "2.4.1", - "lodash": "4.17.5", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "test-exclude": { @@ -7192,11 +6363,11 @@ "integrity": "sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ==", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.10", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" }, "dependencies": { "arr-diff": { @@ -7217,16 +6388,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -7235,7 +6406,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -7246,13 +6417,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -7261,7 +6432,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -7270,7 +6441,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -7279,7 +6450,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7288,7 +6459,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7299,7 +6470,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7308,7 +6479,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7319,9 +6490,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -7338,14 +6509,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -7354,7 +6525,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -7363,7 +6534,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -7374,10 +6545,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -7386,7 +6557,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -7397,7 +6568,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -7406,7 +6577,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -7415,9 +6586,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -7426,7 +6597,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7435,7 +6606,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7458,19 +6629,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } } } @@ -7492,12 +6663,6 @@ "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7510,7 +6675,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "tmpl": { @@ -7531,7 +6696,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -7540,10 +6705,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -7552,8 +6717,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" }, "dependencies": { "is-number": { @@ -7562,7 +6727,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } } } @@ -7573,7 +6738,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" }, "dependencies": { "punycode": { @@ -7590,7 +6755,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "2.1.0" + "punycode": "^2.1.0" } }, "trim-right": { @@ -7600,9 +6765,9 @@ "dev": true }, "triple-beam": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.1.0.tgz", - "integrity": "sha1-KsOHyMS9BL0mxh34kaYHn4WS/hA=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "tunnel-agent": { "version": "0.6.0", @@ -7610,7 +6775,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -7626,7 +6791,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "typedarray": { @@ -7642,9 +6807,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -7654,9 +6819,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -7669,22 +6834,16 @@ "dev": true, "optional": true }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -7693,7 +6852,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -7702,39 +6861,22 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", - "dev": true, - "requires": { - "mkdirp": "0.5.1", - "os-tmpdir": "1.0.2", - "uid2": "0.0.3" - } - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7743,9 +6885,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7785,7 +6927,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -7805,8 +6947,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -7814,8 +6955,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "1.1.2", - "object.getownpropertydescriptors": "2.0.3" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "uuid": { @@ -7830,7 +6971,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "1.1.1" + "user-home": "^1.1.1" } }, "validate-npm-package-license": { @@ -7839,8 +6980,8 @@ "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", "dev": true, "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "verror": { @@ -7849,9 +6990,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "w3c-hr-time": { @@ -7860,7 +7001,7 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "0.1.2" + "browser-process-hrtime": "^0.1.2" } }, "walker": { @@ -7869,7 +7010,7 @@ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "makeerror": "1.0.11" + "makeerror": "1.0.x" } }, "watch": { @@ -7878,8 +7019,8 @@ "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", "dev": true, "requires": { - "exec-sh": "0.2.1", - "minimist": "1.2.0" + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -7920,14 +7061,14 @@ "dev": true }, "whatwg-url": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", - "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.1.tgz", + "integrity": "sha512-FwygsxsXx27x6XXuExA/ox3Ktwcbf+OAvrKmLulotDAiO1Q6ixchPFaHYsis2zZBZSJTR0+dR+JVtf7MlbqZjw==", "dev": true, "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, "which": { @@ -7936,7 +7077,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -7953,43 +7094,77 @@ "optional": true }, "winston": { - "version": "3.0.0-rc5", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.0.0-rc5.tgz", - "integrity": "sha512-BRYS7jsNkfLAqGu4dZW3kp6CmqiWKrComvfsIMYdsnpPre7g8BIw63nWRyX69vxyLYvZdszcEyxJkJmILXd/pA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.0.0.tgz", + "integrity": "sha512-7QyfOo1PM5zGL6qma6NIeQQMh71FBg/8fhkSAePqtf5YEi6t+UrPDcUuHhuuUasgso49ccvMEsmqr0GBG2qaMQ==", "requires": { - "async": "2.6.0", - "diagnostics": "1.1.0", - "is-stream": "1.1.0", - "logform": "1.4.2", + "async": "^2.6.0", + "diagnostics": "^1.0.1", + "is-stream": "^1.1.0", + "logform": "^1.9.0", "one-time": "0.0.4", - "stack-trace": "0.0.10", - "triple-beam": "1.1.0", - "winston-transport": "3.1.0" + "readable-stream": "^2.3.6", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.2.0" + }, + "dependencies": { + "logform": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-1.9.0.tgz", + "integrity": "sha512-H1gneJlqo1dwmXq52p/X57SztuX20aWQArp69u4x7DDmCkMZgMLtBTm2LMoTz0+wu7HdkICiPj6vBbX8WJFRig==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.2.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } } }, "winston-compat": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.1.tgz", - "integrity": "sha512-jX06xvtGj/4g9fySHLgx9VfD8Meh7yRuJcoqaDmaO7/SoD/meu2HmWcdwL+Tv+mpzG8M0cxgt/c+WPP6wwXKMg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/winston-compat/-/winston-compat-0.1.4.tgz", + "integrity": "sha512-mMEfFsSm6GmkFF+f4/0UJtG4N1vSaczGmXLVJYmS/+u2zUaIPcw2ZRuwUg2TvVBjswgiraN+vNnAG8z4fRUZ4w==", "requires": { - "cycle": "1.0.3" + "cycle": "~1.0.3", + "logform": "^1.6.0", + "triple-beam": "^1.2.0" } }, "winston-daily-rotate-file": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.1.3.tgz", - "integrity": "sha512-1LOIn0GI290yMkEQLHWrBHBYQxepVZbdQwiPdhoBa8B9L/4KcCf/di4VuEW+Tm61yhie4neaK03e/YGGSt0BPg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-3.2.1.tgz", + "integrity": "sha512-qLVFJrgU/x3sH9k6sa+/WWeHKJefbQTb9LBJECt3St/Ls6ElHh4jQskgFos5kvOPfFX5IrQKbO2V1Ww8oLGyWw==", "requires": { - "file-stream-rotator": "0.2.1", - "semver": "5.5.0", - "triple-beam": "1.1.0", - "winston-compat": "0.1.1" + "file-stream-rotator": "^0.2.1", + "semver": "^5.5.0", + "triple-beam": "^1.1.0", + "winston-compat": "^0.1.3", + "winston-transport": "^3.2.1" + }, + "dependencies": { + "winston-transport": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-3.2.1.tgz", + "integrity": "sha512-WPqbdAmMK/kfWCWKM2bA1o997wWPZ0jg5NpO8JPqoaDZgCiZnFpIEddcf7Ur4UZV2sYRUdySVBWKx0+gQQ/jrg==" + } } }, "winston-transport": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-3.1.0.tgz", - "integrity": "sha512-an7m67xdTagPQI7EAhP5HfN2QN+t5+beLwdA7RJi95PGtSrHKBM53mbmglGLGz2tVpF7iy8bdh6NQBMW+Aw9aw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.2.0.tgz", + "integrity": "sha512-0R1bvFqxSlK/ZKTH86nymOuKv/cT1PQBMuDdA7k7f0S9fM44dNH6bXnuxwXPrN8lefJgtZq08BKdyZ0DZIy/rg==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + } }, "wordwrap": { "version": "1.0.0", @@ -8003,8 +7178,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -8013,7 +7188,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -8022,9 +7197,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -8041,7 +7216,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -8050,17 +7225,17 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.1.1.tgz", - "integrity": "sha512-bOusvpCb09TOBLbpMKszd45WKC2KPtxiyiHanv+H2DE3Az+1db5a/L7sVJZVDPUC1Br8f0SKRr1KjLpD1U/IAw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.0.tgz", + "integrity": "sha512-c18dMeW+PEQdDFzkhDsnBAlS4Z8KGStBQQUcQ5mf7Nf689jyGk0594L+i9RaQuf4gog6SvWLJorz2NfSaqxZ7w==", "requires": { - "async-limiter": "1.0.0" + "async-limiter": "~1.0.0" } }, "xml-name-validator": { @@ -8081,23 +7256,23 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", - "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "dev": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.1.0" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" }, "dependencies": { "ansi-regex": { @@ -8107,14 +7282,14 @@ "dev": true }, "cliui": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", - "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "strip-ansi": { @@ -8123,18 +7298,18 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, "yargs-parser": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", - "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index 90343d0..155d175 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blinksocks", - "version": "3.2.0", + "version": "3.3.1", "description": "A framework for building composable proxy protocol stack", "main": "lib/index.js", "files": [ @@ -13,17 +13,15 @@ "scripts": { "test": "npm run lint && npm run test:coverage", "test:coverage": "jest --runInBand --silent --coverage --bail", - "lint": "eslint bin src test pkg", + "lint": "eslint bin src test", "compile": "cross-env NODE_ENV=production babel src --out-dir lib --ignore __tests__,__mocks__", - "prepkg": "npm run compile && rimraf pkg/blinksocks-* pkg/sha256sum.txt", - "pkg": "pkg --out-path pkg/ --targets node8.9.0-linux-x64,node8.9.0-macos-x64,node8.9.0-win-x64 .", - "postpkg": "node pkg/postpkg.js", "debug:client": "cross-env NODE_ENV=development node --inspect --inspect-port=9200 bin/cli.js blinksocks.client.json", "debug:server": "cross-env NODE_ENV=development node --inspect --inspect-port=9300 bin/cli.js blinksocks.server.json", "client": "cross-env NODE_ENV=production node bin/cli.js blinksocks.client.json", "server": "cross-env NODE_ENV=production node bin/cli.js blinksocks.server.json", "prebenchmark": "npm run compile", - "benchmark": "node benchmark/bootstrap.js" + "benchmark": "node benchmark/bootstrap.js", + "prepublishOnly": "npm run compile" }, "dependencies": { "chalk": "^2.4.1", @@ -34,30 +32,28 @@ "lodash.isplainobject": "^4.0.6", "lodash.uniqueid": "^4.0.1", "long": "^4.0.0", - "lru-cache": "^4.1.2", - "winston": "^3.0.0-rc4", - "winston-daily-rotate-file": "^3.1.3", - "ws": "^5.1.1" + "lru-cache": "^4.1.3", + "winston": "^3.0.0", + "winston-daily-rotate-file": "^3.2.1", + "ws": "^5.2.0" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-core": "^6.26.3", "babel-eslint": "^8.2.3", - "babel-jest": "^22.4.3", + "babel-jest": "^23.0.1", "babel-plugin-transform-class-properties": "^6.24.1", "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-preset-env": "^1.6.1", + "babel-preset-env": "^1.7.0", "babel-register": "^6.26.0", - "cross-env": "^5.1.4", + "cross-env": "^5.2.0", "eslint": "^4.19.1", "eslint-config-babel": "^7.0.2", "eslint-plugin-babel": "^5.1.0", - "eslint-plugin-flowtype": "^2.46.3", - "jest": "^22.4.3", + "eslint-plugin-flowtype": "^2.49.3", + "jest": "^23.1.0", "lodash.clonedeep": "^4.5.0", "mkdirp": "^0.5.1", - "pkg": "^4.3.1", - "rimraf": "^2.6.2", "socks": "^2.2.0" }, "repository": { diff --git a/pkg/postpkg.js b/pkg/postpkg.js deleted file mode 100755 index 3196d5d..0000000 --- a/pkg/postpkg.js +++ /dev/null @@ -1,46 +0,0 @@ -const crypto = require('crypto'); -const fs = require('fs'); -const path = require('path'); -const utils = require('util'); -const zlib = require('zlib'); - -const { version } = require('../package.json'); - -const readdir = utils.promisify(fs.readdir); -const remove = utils.promisify(fs.unlink); -const appendFile = utils.promisify(fs.appendFile); -const readFile = utils.promisify(fs.readFile); - -async function sha256sum(file) { - const sha256 = crypto.createHash('sha256'); - const input = await readFile(file); - return sha256.update(input).digest('hex'); -} - -(async function main() { - try { - let files = await readdir(path.resolve(__dirname)); - files = files.filter((f) => f.startsWith('blinksocks-')); - for (const file of files) { - const name = path.basename(file, '.exe'); - const ext = path.extname(file); - const newName = `${name}-x64-v${version}${ext}.gz`; - - const input = path.join(__dirname, file); - const output = path.join(__dirname, newName); - const hashFile = path.join(__dirname, 'sha256sum.txt'); - - // compress into .gz - const stream = fs.createReadStream(input).pipe(zlib.createGzip()).pipe(fs.createWriteStream(output)); - - stream.on('finish', async () => { - // calc sha256sum - await appendFile(hashFile, `${path.basename(output)} ${await sha256sum(output)}\n`); - // remove original - await remove(input); - }); - } - } catch (err) { - console.error(err.message); - } -})(); diff --git a/src/constants.js b/src/constants.js index f36bb3f..4d3c69a 100644 --- a/src/constants.js +++ b/src/constants.js @@ -11,3 +11,13 @@ export const CONNECTED_TO_REMOTE = 'CONNECTED_TO_REMOTE'; export const MUX_NEW_CONN = 'MUX_NEW_CONN'; export const MUX_DATA_FRAME = 'MUX_DATA_FRAME'; export const MUX_CLOSE_CONN = 'MUX_CLOSE_CONN'; + +// https://url.spec.whatwg.org/#url-miscellaneous +export const PROTOCOL_DEFAULT_PORTS = { + 'ftp:': 21, + 'gopher:': 70, + 'http:': 80, + 'https:': 443, + 'ws:': 80, + 'wss:': 443, +}; diff --git a/src/core/config.js b/src/core/config.js index 5c33833..59f9e44 100644 --- a/src/core/config.js +++ b/src/core/config.js @@ -8,6 +8,7 @@ import winston from 'winston'; import WinstonDailyRotateFile from 'winston-daily-rotate-file'; import isPlainObject from 'lodash.isplainobject'; import { ACL } from './acl'; +import { PROTOCOL_DEFAULT_PORTS } from '../constants'; import { getPresetClassByName } from '../presets'; import { IPresetAddressing } from '../presets/defs'; import { DNSCache, isValidHostname, isValidPort, logger, DNS_DEFAULT_EXPIRE } from '../utils'; @@ -24,21 +25,28 @@ export class Config { local_search_params = null; local_host = null; local_port = null; + local_pathname = null; server = null; is_client = null; is_server = null; + https_key = null; + https_cert = null; + timeout = null; redirect = null; dns_expire = null; dns = null; - transport = null; + server_protocol = null; server_host = null; server_port = null; + server_pathname = null; + tls_cert = null; + tls_cert_self_signed = false; tls_key = null; key = null; @@ -62,14 +70,17 @@ export class Config { stores = []; constructor(json) { - const { protocol, hostname, port, searchParams, username, password } = new URL(json.service); + // service + const { protocol, hostname, port, pathname, searchParams, username, password } = new URL(json.service); this.local_protocol = protocol.slice(0, -1); this.local_username = username; this.local_password = password; this.local_search_params = searchParams; this.local_host = hostname; - this.local_port = +port; + this.local_port = +port || +PROTOCOL_DEFAULT_PORTS[protocol]; + this.local_pathname = pathname; + // server let server; // TODO(remove in next version): make backwards compatibility to "json.servers" if (json.servers !== undefined) { @@ -78,7 +89,7 @@ export class Config { chalk.bgYellowBright('WARN'), '"servers" will be deprecated in the next version,' + ' please configure only one server in "server: {...}",' + - ' for migration guide please refer to CHANGELOG.md.' + ' for migration guide please refer to CHANGELOG.md.', ); } else { server = json.server; @@ -100,8 +111,15 @@ export class Config { this._initServer(server); } - // common + // https_cert, https_key + if (this.is_client && this.local_protocol === 'https') { + logger.info(`[config] loading ${json.https_cert}`); + this.https_cert = loadFileSync(json.https_cert); + logger.info(`[config] loading ${json.https_key}`); + this.https_key = loadFileSync(json.https_key); + } + // common this.timeout = (json.timeout !== undefined) ? json.timeout * 1e3 : 600 * 1e3; this.dns_expire = (json.dns_expire !== undefined) ? json.dns_expire * 1e3 : DNS_DEFAULT_EXPIRE; @@ -117,18 +135,22 @@ export class Config { _initServer(server) { // service - const { protocol, hostname, port } = new URL(server.service); - this.transport = protocol.slice(0, -1); + const { protocol, hostname, port, pathname } = new URL(server.service); + this.server_protocol = protocol.slice(0, -1); this.server_host = hostname; - this.server_port = +port; + this.server_port = +port || +PROTOCOL_DEFAULT_PORTS[protocol]; + this.server_pathname = pathname; - // preload tls_cert and tls_key - if (this.transport === 'tls' || this.transport === 'h2') { - if (server.tls_cert) { + // preload tls_cert or tls_key + if (['tls', 'wss', 'h2'].includes(this.server_protocol)) { + if (this.is_client) { + this.tls_cert_self_signed = !!server.tls_cert_self_signed; + } + if (this.tls_cert_self_signed || this.is_server) { logger.info(`[config] loading ${server.tls_cert}`); this.tls_cert = loadFileSync(server.tls_cert); } - if (this.is_server && server.tls_key) { + if (this.is_server) { logger.info(`[config] loading ${server.tls_key}`); this.tls_key = loadFileSync(server.tls_key); } @@ -164,7 +186,7 @@ export class Config { // remove unnecessary presets if (this.mux) { this.presets = this.presets.filter( - ({ name }) => !IPresetAddressing.isPrototypeOf(getPresetClassByName(name)) + ({ name }) => !IPresetAddressing.isPrototypeOf(getPresetClassByName(name)), ); } @@ -208,7 +230,7 @@ export class Config { // TODO: Enable coloring. Currently we have to prevent dumping color characters in log files. // colorize(), prettyPrint(), - printf((info) => `${info.timestamp} - ${info.level}: ${info.message}`) + printf((info) => `${info.timestamp} - ${info.level}: ${info.message}`), ), transports: trans, }); @@ -233,19 +255,18 @@ export class Config { throw Error('"service" must be provided as "://:[?params]"'); } - const { protocol: _protocol, hostname, port, searchParams } = new URL(json.service); + const { protocol, hostname, port: _port, searchParams } = new URL(json.service); // service.protocol - if (typeof _protocol !== 'string') { + if (typeof protocol !== 'string') { throw Error('service.protocol is invalid'); } - const protocol = _protocol.slice(0, -1); + const proto = protocol.slice(0, -1); const available_client_protocols = [ - 'tcp', 'http', 'https', - 'socks', 'socks5', 'socks4', 'socks4a' + 'tcp', 'http', 'https', 'socks', 'socks5', 'socks4', 'socks4a', ]; - if (!available_client_protocols.includes(protocol)) { + if (!available_client_protocols.includes(proto)) { throw Error(`service.protocol must be: ${available_client_protocols.join(', ')}`); } @@ -255,12 +276,13 @@ export class Config { } // service.port + const port = _port || PROTOCOL_DEFAULT_PORTS[protocol] || ''; if (!isValidPort(+port)) { throw Error('service.port is invalid'); } // service.query - if (protocol === 'tcp') { + if (proto === 'tcp') { const forward = searchParams.get('forward'); // ?forward @@ -277,6 +299,16 @@ export class Config { } } + // https_cert, https_key + if (proto === 'https') { + if (typeof json.https_cert !== 'string' || json.https_cert === '') { + throw Error('"https_cert" must be provided'); + } + if (typeof json.https_key !== 'string' || json.https_key === '') { + throw Error('"https_key" must be provided'); + } + } + // server let server; // TODO(remove in next version): make backwards compatibility to "json.servers" @@ -329,27 +361,33 @@ export class Config { throw Error('"service" must be provided as "://:[?params]"'); } - const { protocol: _protocol, hostname, port } = new URL(server.service); + const { protocol, hostname, port: _port } = new URL(server.service); // service.protocol - if (typeof _protocol !== 'string') { + if (typeof protocol !== 'string') { throw Error('service.protocol is invalid'); } - const protocol = _protocol.slice(0, -1); + const proto = protocol.slice(0, -1); const available_server_protocols = [ - 'tcp', 'ws', 'tls', 'h2' + 'tcp', 'ws', 'wss', 'tls', 'h2' ]; - if (!available_server_protocols.includes(protocol)) { + if (!available_server_protocols.includes(proto)) { throw Error(`service.protocol must be: ${available_server_protocols.join(', ')}`); } // tls_cert, tls_key - if (protocol === 'tls' || protocol === 'h2') { - if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { - throw Error('"tls_cert" must be provided'); + if (['tls', 'wss', 'h2'].includes(proto)) { + if (from_client && server.tls_cert_self_signed) { + if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { + throw Error('"tls_cert" must be provided when "tls_cert_self_signed" is set'); + } } + // on server, both tls_cert and tls_key must be set if (!from_client) { + if (typeof server.tls_cert !== 'string' || server.tls_cert === '') { + throw Error('"tls_cert" must be provided'); + } if (typeof server.tls_key !== 'string' || server.tls_key === '') { throw Error('"tls_key" must be provided'); } @@ -362,6 +400,7 @@ export class Config { } // service.port + const port = _port || PROTOCOL_DEFAULT_PORTS[protocol] || ''; if (!isValidPort(+port)) { throw Error('service.port is invalid'); } diff --git a/src/core/hub.js b/src/core/hub.js index 9a0b627..612ddab 100644 --- a/src/core/hub.js +++ b/src/core/hub.js @@ -1,6 +1,8 @@ import _sodium from 'libsodium-wrappers'; import dgram from 'dgram'; import net from 'net'; +import http from 'http'; +import https from 'https'; import { URL } from 'url'; import http2 from 'http2'; import tls from 'tls'; @@ -12,7 +14,7 @@ import { Relay } from './relay'; import { MuxRelay } from './mux-relay'; import { SpeedTester } from './speed-tester'; import { dumpHex, getRandomInt, hash, logger } from '../utils'; -import { http, socks, tcp } from '../proxies'; +import { http as httpProxy, socks, tcp } from '../proxies'; import { APP_ID } from '../constants'; export const MAX_CONNECTIONS = 50; @@ -149,6 +151,7 @@ export class Hub { return new Promise((resolve, reject) => { const { local_protocol, local_search_params, local_host, local_port } = this._config; const { local_username: username, local_password: password } = this._config; + const { https_key, https_cert } = this._config; let server = null; switch (local_protocol) { case 'tcp': { @@ -163,11 +166,22 @@ export class Hub { case 'socks5': case 'socks4': case 'socks4a': - server = socks.createServer({ bindAddress: local_host, bindPort: local_port, username, password }); + server = socks.createServer({ + bindAddress: local_host, + bindPort: local_port, + username, + password, + }); break; case 'http': case 'https': - server = http.createServer({ username, password }); + server = httpProxy.createServer({ + secure: local_protocol === 'https', + https_key, + https_cert, + username, + password, + }); break; default: return reject(Error(`unsupported protocol: "${local_protocol}"`)); @@ -187,14 +201,14 @@ export class Hub { } async _createServerOnServer() { - const { local_protocol, local_host, local_port, tls_key, tls_cert } = this._config; + const { local_protocol, local_host, local_port, local_pathname, tls_key, tls_cert } = this._config; return new Promise((resolve, reject) => { const address = { host: local_host, port: local_port, }; const onListening = (server) => { - const service = `${local_protocol}://${local_host}:${local_port}`; + const service = `${local_protocol}://${local_host}:${local_port}` + (local_pathname ? local_pathname : ''); logger.info(`[hub] blinksocks server is running at ${service}`); resolve(server); }; @@ -206,9 +220,17 @@ export class Hub { server.listen(address, () => onListening(server)); break; } + case 'wss': case 'ws': { + let http_s_server = null; + if (local_protocol === 'wss') { + http_s_server = https.createServer({ key: tls_key, cert: tls_cert }); + } else { + http_s_server = http.createServer(); + } server = new ws.Server({ - ...address, + server: http_s_server, + path: local_pathname, perMessageDeflate: false, }); server.getConnections = server._server.getConnections.bind(server._server); @@ -217,7 +239,7 @@ export class Hub { ws.remotePort = req.connection.remotePort; this._onConnection(ws); }); - server.on('listening', () => onListening(server)); + http_s_server.listen(address, () => onListening(http_s_server)); break; } case 'tls': { @@ -423,9 +445,9 @@ export class Hub { _createRelay(context, isMux = false) { const props = { - config: this._config, context: context, - transport: this._config.transport, + config: this._config, + transport: this._config.server_protocol, presets: this._config.presets, }; if (isMux) { diff --git a/src/core/relay.js b/src/core/relay.js index b021d60..574c62b 100644 --- a/src/core/relay.js +++ b/src/core/relay.js @@ -10,6 +10,7 @@ import { TlsInbound, TlsOutbound, Http2Inbound, Http2Outbound, WsInbound, WsOutbound, + WssInbound, WssOutbound, MuxInbound, MuxOutbound, } from '../transports'; @@ -134,6 +135,7 @@ export class Relay extends EventEmitter { 'tls': [TlsInbound, TlsOutbound], 'h2': [Http2Inbound, Http2Outbound], 'ws': [WsInbound, WsOutbound], + 'wss': [WssInbound, WssOutbound], 'mux': [MuxInbound, MuxOutbound], }; let Inbound = null, Outbound = null; diff --git a/src/presets/index.js b/src/presets/index.js index 42308bb..8e04724 100644 --- a/src/presets/index.js +++ b/src/presets/index.js @@ -26,7 +26,29 @@ import ObfsTls12TicketPreset from './obfs-tls1.2-ticket'; // others import AeadRandomCipherPreset from './aead-random-cipher'; -const presetMap = { +/** + * check if a class is a valid preset class + * @param clazz + * @returns {boolean} + */ +function checkPresetClass(clazz) { + if (typeof clazz !== 'function') { + return false; + } + // check require hooks + const requiredMethods = [ + 'onDestroy', 'onInit', + 'beforeOut', 'beforeIn', 'clientOut', 'serverIn', 'serverOut', 'clientIn', + 'beforeOutUdp', 'beforeInUdp', 'clientOutUdp', 'serverInUdp', 'serverOutUdp', 'clientInUdp' + ]; + if (requiredMethods.some((method) => typeof clazz.prototype[method] !== 'function')) { + return false; + } + const requiredStaticMethods = ['onCheckParams', 'onCache']; + return !requiredStaticMethods.some((method) => typeof clazz[method] !== 'function'); +} + +export const builtInPresetMap = { // functional 'mux': MuxPreset, @@ -56,35 +78,12 @@ const presetMap = { 'aead-random-cipher': AeadRandomCipherPreset }; -/** - * check if a class is a valid preset class - * @param clazz - * @returns {boolean} - */ -function checkPresetClass(clazz) { - if (typeof clazz !== 'function') { - return false; - } - // check require hooks - const requiredMethods = [ - 'onDestroy', 'onInit', - 'beforeOut', 'beforeIn', 'clientOut', 'serverIn', 'serverOut', 'clientIn', - 'beforeOutUdp', 'beforeInUdp', 'clientOutUdp', 'serverInUdp', 'serverOutUdp', 'clientInUdp' - ]; - if (requiredMethods.some((method) => typeof clazz.prototype[method] !== 'function')) { - return false; - } - const requiredStaticMethods = ['onCheckParams', 'onCache']; - if (requiredStaticMethods.some((method) => typeof clazz[method] !== 'function')) { - return false; - } - return true; -} - export function getPresetClassByName(name, allowPrivate = false) { - let clazz = presetMap[name]; + // load from built-in + let clazz = builtInPresetMap[name]; if (clazz === undefined) { try { + // load from external clazz = require(name); } catch (err) { throw Error(`cannot load preset "${name}" from built-in modules or external`); @@ -98,5 +97,3 @@ export function getPresetClassByName(name, allowPrivate = false) { } return clazz; } - -export const presets = Object.keys(presetMap); diff --git a/src/proxies/http.js b/src/proxies/http.js index 77b1638..3cba8c8 100644 --- a/src/proxies/http.js +++ b/src/proxies/http.js @@ -1,5 +1,6 @@ import { URL } from 'url'; import http from 'http'; +import https from 'https'; import { logger, isValidPort } from '../utils'; function checkBasicAuthorization(credentials, { username, password }) { @@ -14,8 +15,16 @@ function checkBasicAuthorization(credentials, { username, password }) { return true; } -export function createServer({ username, password }) { - const server = http.createServer(); +export function createServer({ secure, https_key, https_cert, username, password }) { + const name = secure ? 'https' : 'http'; + let server = null; + if (secure) { + server = https.createServer({ key: https_key, cert: https_cert }); + } else { + server = http.createServer(); + } + + const isAuthRequired = username !== '' && password !== ''; // Simple HTTP Proxy server.on('request', (req, res) => { @@ -27,16 +36,16 @@ export function createServer({ username, password }) { if (hostname === null || !isValidPort(_port)) { const remote = `${socket.remoteAddress}:${socket.remotePort}`; - logger.warn(`[http] drop invalid http request sent from ${remote}`); + logger.warn(`[${name}] drop invalid http request sent from ${remote}`); return res.end(); } // Basic Authorization - const proxyAuth = headers['proxy-authorization']; - if (proxyAuth && username !== '' && password !== '') { + if (isAuthRequired) { + const proxyAuth = headers['proxy-authorization'] || ''; const [type, credentials] = proxyAuth.split(' '); if (type !== 'Basic' || !checkBasicAuthorization(credentials, { username, password })) { - logger.error(`[http] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); + logger.error(`[${name}] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); return res.end('HTTP/1.1 401 Unauthorized\r\n\r\n'); } } @@ -63,7 +72,7 @@ export function createServer({ username, password }) { // free to recv from application now socket.resume(); - } + }, }); }); @@ -76,16 +85,16 @@ export function createServer({ username, password }) { if (hostname === null || !isValidPort(port)) { const remote = `${socket.remoteAddress}:${socket.remotePort}`; - logger.warn(`[http] [${appAddress}] drop invalid http CONNECT request sent from ${remote}`); + logger.warn(`[${name}] [${appAddress}] drop invalid http CONNECT request sent from ${remote}`); return socket.destroy(); } // Basic Authorization - const proxyAuth = req.headers['proxy-authorization']; - if (proxyAuth && username !== '' && password !== '') { + if (isAuthRequired) { + const proxyAuth = req.headers['proxy-authorization'] || ''; const [type, credentials] = proxyAuth.split(' '); if (type !== 'Basic' || !checkBasicAuthorization(credentials, { username, password })) { - logger.error(`[http] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); + logger.error(`[${name}] [${appAddress}] authorization failed, type=${type} credentials=${credentials}`); return socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); } } @@ -95,14 +104,14 @@ export function createServer({ username, password }) { port: port, onConnected: () => { socket.write('HTTP/1.1 200 Connection Established\r\n\r\n'); - } + }, }); }); // errors server.on('clientError', (err, socket) => { - const appAddress = `${socket.remoteAddress}:${socket.remotePort}`; - logger.error(`[http] [${appAddress}] invalid http request: ${err.message}`); + const appAddress = `${socket.remoteAddress || ''}:${socket.remotePort || ''}`; + logger.error(`[${name}] [${appAddress}] invalid http request: ${err.message}`); socket.destroy(); }); diff --git a/src/proxies/socks.js b/src/proxies/socks.js index 70372f7..704059d 100644 --- a/src/proxies/socks.js +++ b/src/proxies/socks.js @@ -287,6 +287,7 @@ const STAGE_DONE = 3; export function createServer({ bindAddress, bindPort, username, password }) { const server = net.createServer(); + const isAuthRequired = username !== '' && password !== ''; server.on('connection', (socket) => { const appAddress = `${socket.remoteAddress}:${socket.remotePort}`; @@ -308,6 +309,11 @@ export function createServer({ bindAddress, bindPort, username, password }) { const { method } = request; switch (method) { case METHOD_NO_AUTH: + if (isAuthRequired) { + logger.error(`[socks] [${appAddress}] server requires authorization but got METHOD_NO_AUTH`); + socket.end(Buffer.from([SOCKS_VERSION_V5, METHOD_NOT_ACCEPTABLE])); + break; + } stage = STAGE_SOCKS5_REQUEST_MESSAGE; // Socks5 Select Message socket.write(Buffer.from([SOCKS_VERSION_V5, METHOD_NO_AUTH])); @@ -347,7 +353,7 @@ export function createServer({ bindAddress, bindPort, username, password }) { request = parseSocks5InitialNegotiation(buffer); if (request !== null) { // Username/Password Authentication - if (username !== '' && password !== '') { + if (isAuthRequired) { if (username !== request.username || password !== request.password) { logger.error(`[socks] [${appAddress}] invalid socks5 authorization, username=${request.username} password=${request.password}`); socket.end(Buffer.from([SOCKS_VERSION_V5, 0x01])); diff --git a/src/transports/index.js b/src/transports/index.js index 00e2dac..4345a59 100644 --- a/src/transports/index.js +++ b/src/transports/index.js @@ -3,4 +3,5 @@ export * from './udp'; export * from './tls'; export * from './h2'; export * from './ws'; +export * from './wss'; export * from './mux'; diff --git a/src/transports/tcp.js b/src/transports/tcp.js index f70f8cb..4ae6421 100644 --- a/src/transports/tcp.js +++ b/src/transports/tcp.js @@ -343,7 +343,11 @@ export class TcpOutbound extends Outbound { await this.connect({ host, port }); } if (this._config.is_client) { - await this.connect({ host: this._config.server_host, port: this._config.server_port }); + await this.connect({ + host: this._config.server_host, + port: this._config.server_port, + pathname: this._config.server_pathname, + }); } this._socket.on('connect', () => { if (typeof onConnected === 'function') { @@ -371,12 +375,12 @@ export class TcpOutbound extends Outbound { } } - async connect({ host, port }) { + async connect(target) { // close alive connection before create a new one if (this._socket && !this._socket.destroyed) { this._socket.destroy(); } - this._socket = await this._connect({ host, port }); + this._socket = await this._connect(target); this._socket.on('error', this.onError); this._socket.on('end', this.onHalfClose); this._socket.on('close', this.onClose); diff --git a/src/transports/tls.js b/src/transports/tls.js index 9b5bdbc..4381c30 100644 --- a/src/transports/tls.js +++ b/src/transports/tls.js @@ -29,7 +29,11 @@ export class TlsOutbound extends TcpOutbound { // overwrite _connect of tcp outbound using tls.connect() async _connect({ host, port }) { logger.info(`[tls:outbound] [${this.remote}] connecting to tls://${host}:${port}`); - return tls.connect({ host, port, ca: [this._config.tls_cert] }); + const options = { host, port }; + if (this._config.tls_cert_self_signed) { + options.ca = [this._config.tls_cert]; + } + return tls.connect(options); } } diff --git a/src/transports/ws.js b/src/transports/ws.js index b5f2489..9470ac4 100644 --- a/src/transports/ws.js +++ b/src/transports/ws.js @@ -6,7 +6,7 @@ function patchWebsocket(ws) { ws.write = (buffer) => ws.send(buffer, { compress: false, mask: false, - fin: true // send data out immediately + fin: true, // send data out immediately }, () => this.emit('drain')); ws.end = () => ws.close(); ws.destroy = () => ws.close(); @@ -57,12 +57,24 @@ export class WsOutbound extends TcpOutbound { return this._socket && this._socket.readyState === WebSocket.OPEN; } - async _connect({ host, port }) { - logger.info(`[${this.name}] [${this.remote}] connecting to ws://${host}:${port}`); - const socket = new WebSocket(`ws://${host}:${port}`, { perMessageDeflate: false }); + async _connect(target) { + const address = this.getConnAddress(target); + logger.info(`[${this.name}] [${this.remote}] connecting to ${address}`); + const socket = new WebSocket(address, this.getConnOptions({ + handshakeTimeout: 1e4, // 10s + perMessageDeflate: false, + })); socket.on('message', this.onReceive); socket.on('close', () => socket.destroyed = true); return patchWebsocket.call(this, socket); } + getConnAddress({ host, port, pathname }) { + return `ws://${host}:${port}` + (pathname ? pathname : ''); + } + + getConnOptions(options) { + return options; + } + } diff --git a/src/transports/wss.js b/src/transports/wss.js new file mode 100644 index 0000000..a9cc036 --- /dev/null +++ b/src/transports/wss.js @@ -0,0 +1,29 @@ +import { WsInbound, WsOutbound } from './ws'; + +export class WssInbound extends WsInbound { + + get name() { + return 'wss:inbound'; + } + +} + +export class WssOutbound extends WsOutbound { + + get name() { + return 'wss:outbound'; + } + + getConnAddress({ host, port, pathname }) { + return `wss://${host}:${port}` + (pathname ? pathname : ''); + } + + getConnOptions(options) { + const _options = { ...options }; + if (this._config.tls_cert_self_signed) { + _options.ca = [this._config.tls_cert]; + } + return _options; + } + +} diff --git a/test/e2e/acl.test.js b/test/e2e/acl.test.js index d991d83..76bb573 100644 --- a/test/e2e/acl.test.js +++ b/test/e2e/acl.test.js @@ -9,10 +9,10 @@ const clientJson = { 'presets': [ { 'name': 'ss-base' }, { 'name': 'obfs-random-padding' }, - { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } } + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], }, - 'log_level': 'debug' + 'log_level': 'debug', }; const serverJson = { @@ -21,11 +21,11 @@ const serverJson = { 'presets': [ { 'name': 'ss-base' }, { 'name': 'obfs-random-padding' }, - { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } } + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], 'acl': true, 'acl_conf': path.resolve(__dirname, 'resources', 'acl.txt'), - 'log_level': 'debug' + 'log_level': 'debug', }; test('acl', async () => await run({ clientJson, serverJson, not: true })); diff --git a/test/e2e/aead-random-cipher.test.js b/test/e2e/aead-random-cipher.test.js index d04b094..a956d4d 100644 --- a/test/e2e/aead-random-cipher.test.js +++ b/test/e2e/aead-random-cipher.test.js @@ -1,24 +1,24 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "aead-random-cipher", "params": { "method": "aes-256-gcm" } }, - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'aead-random-cipher', 'params': { 'method': 'aes-256-gcm' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "aead-random-cipher", "params": { "method": "aes-256-gcm" } }, - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'aead-random-cipher', 'params': { 'method': 'aes-256-gcm' } }, + ], }; test('aead-random-cipher', async () => await run({ clientJson, serverJson })); diff --git a/test/e2e/base-auth.test.js b/test/e2e/base-auth.test.js index a7039d2..8962281 100644 --- a/test/e2e/base-auth.test.js +++ b/test/e2e/base-auth.test.js @@ -1,22 +1,22 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "base-auth", "params": { "method": "sha1" } }, - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'base-auth', 'params': { 'method': 'sha1' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "base-auth", "params": { "method": "sha1" } }, - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'base-auth', 'params': { 'method': 'sha1' } }, + ], }; test('base-auth', async () => await run({ clientJson, serverJson })); diff --git a/test/e2e/init-configs-minimal.test.js b/test/e2e/init-configs-minimal.test.js index b5171d0..db486aa 100644 --- a/test/e2e/init-configs-minimal.test.js +++ b/test/e2e/init-configs-minimal.test.js @@ -1,26 +1,26 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], }; test('init-configs-minimal, tcp', async () => { diff --git a/test/e2e/init-configs.test.js b/test/e2e/init-configs.test.js index 7251b74..ce069fa 100644 --- a/test/e2e/init-configs.test.js +++ b/test/e2e/init-configs.test.js @@ -1,45 +1,46 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "2/tS:7|.-ec.7cxk", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '2/tS:7|.-ec.7cxk', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "tls_cert": "cert.pem", - "mux": false, - "mux_concurrency": 10 + 'tls_cert': 'cert.pem', + 'tls_cert_self_signed': false, + 'mux': false, + 'mux_concurrency': 10, }, - "dns": [], - "dns_expire": 3600, - "timeout": 610, - "log_path": "bs-client.log", - "log_level": "info", - "log_max_days": 30 + 'dns': [], + 'dns_expire': 3600, + 'timeout': 610, + 'log_path': 'bs-client.log', + 'log_level': 'info', + 'log_max_days': 30, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "2/tS:7|.-ec.7cxk", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } + 'service': 'tcp://127.0.0.1:1082', + 'key': '2/tS:7|.-ec.7cxk', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "tls_key": "key.pem", - "tls_cert": "cert.pem", - "mux": false, - "dns": [], - "dns_expire": 3600, - "timeout": 610, - "redirect": "", - "log_path": "bs-server.log", - "log_level": "info", - "log_max_days": 30 + 'tls_key': 'key.pem', + 'tls_cert': 'cert.pem', + 'mux': false, + 'dns': [], + 'dns_expire': 3600, + 'timeout': 610, + 'redirect': '', + 'log_path': 'bs-server.log', + 'log_level': 'info', + 'log_max_days': 30, }; test('init-configs', async () => { diff --git a/test/e2e/multiplexing.test.js b/test/e2e/multiplexing.test.js index 2f10426..38e4a8a 100644 --- a/test/e2e/multiplexing.test.js +++ b/test/e2e/multiplexing.test.js @@ -6,34 +6,35 @@ const tlsKey = path.resolve(__dirname, 'resources', 'key.pem'); const tlsCert = path.resolve(__dirname, 'resources', 'cert.pem'); const client = { - "service": "socks5://127.0.0.1:1081", - "server": { + 'service': 'socks5://127.0.0.1:1081', + 'server': { // "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "mux": true, - "mux_concurrency": 5, - "tls_cert": tlsCert, + 'mux': true, + 'mux_concurrency': 5, + 'tls_cert': tlsCert, + 'tls_cert_self_signed': true, }, - "log_level": "debug" + 'log_level': 'debug', }; const server = { // "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "mux": true, - "tls_cert": tlsCert, - "tls_key": tlsKey, - "log_level": "debug" + 'mux': true, + 'tls_cert': tlsCert, + 'tls_key': tlsKey, + 'log_level': 'debug', }; test('multiplexing over tcp', async () => { diff --git a/test/e2e/obfs-http.test.js b/test/e2e/obfs-http.test.js index 01f6943..61802af 100644 --- a/test/e2e/obfs-http.test.js +++ b/test/e2e/obfs-http.test.js @@ -4,24 +4,24 @@ import run from '../common/run-e2e'; const mockfile = path.resolve(__dirname, 'resources', 'http-mock.txt'); const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-http", "params": { "file": mockfile } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-http', 'params': { 'file': mockfile } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-http", "params": { "file": mockfile } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-http', 'params': { 'file': mockfile } }, + ], }; test('obfs-http', async () => await run({ clientJson, serverJson, repeat: 5 })); diff --git a/test/e2e/obfs-tls1.2-ticket.test.js b/test/e2e/obfs-tls1.2-ticket.test.js index f4181f7..c30a7ca 100644 --- a/test/e2e/obfs-tls1.2-ticket.test.js +++ b/test/e2e/obfs-tls1.2-ticket.test.js @@ -1,24 +1,24 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-tls1.2-ticket", "params": { "sni": ["test.com", "example.com"] } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-tls1.2-ticket', 'params': { 'sni': ['test.com', 'example.com'] } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-tls1.2-ticket" } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-tls1.2-ticket' }, + ], }; test('obfs-tls1.2-ticket', async () => { diff --git a/test/e2e/proxies.test.js b/test/e2e/proxies.test.js index 16ef307..4511320 100644 --- a/test/e2e/proxies.test.js +++ b/test/e2e/proxies.test.js @@ -2,25 +2,25 @@ import run from '../common/run-e2e'; const clientJson = { // "service": "", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] - } + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], }; test('http-proxy', async () => await run({ diff --git a/test/e2e/ss-aead-cipher.test.js b/test/e2e/ss-aead-cipher.test.js index 6304f72..6cca0da 100644 --- a/test/e2e/ss-aead-cipher.test.js +++ b/test/e2e/ss-aead-cipher.test.js @@ -2,26 +2,26 @@ import clone from 'lodash.clonedeep'; import run from '../common/run-e2e'; const client = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + ], + }, }; const server = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + ], }; test('ss-aead-cipher, aes-128-gcm', async () => { - const cipher = { "name": "ss-aead-cipher", "params": { "method": "aes-128-gcm" } }; + const cipher = { 'name': 'ss-aead-cipher', 'params': { 'method': 'aes-128-gcm' } }; const clientJson = clone(client); const serverJson = clone(server); @@ -34,7 +34,7 @@ test('ss-aead-cipher, aes-128-gcm', async () => { }); test('ss-aead-cipher, chacha20-ietf-poly1305', async () => { - const cipher = { "name": "ss-aead-cipher", "params": { "method": "chacha20-ietf-poly1305" } }; + const cipher = { 'name': 'ss-aead-cipher', 'params': { 'method': 'chacha20-ietf-poly1305' } }; const clientJson = clone(client); const serverJson = clone(server); @@ -47,7 +47,7 @@ test('ss-aead-cipher, chacha20-ietf-poly1305', async () => { }); test('ss-aead-cipher, xchacha20-ietf-poly1305', async () => { - const cipher = { "name": "ss-aead-cipher", "params": { "method": "xchacha20-ietf-poly1305" } }; + const cipher = { 'name': 'ss-aead-cipher', 'params': { 'method': 'xchacha20-ietf-poly1305' } }; const clientJson = clone(client); const serverJson = clone(server); diff --git a/test/e2e/ss-stream-cipher.test.js b/test/e2e/ss-stream-cipher.test.js index d89eabc..270faff 100644 --- a/test/e2e/ss-stream-cipher.test.js +++ b/test/e2e/ss-stream-cipher.test.js @@ -2,26 +2,26 @@ import clone from 'lodash.clonedeep'; import run from '../common/run-e2e'; const client = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + ], + }, }; const server = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + ], }; test('ss-stream-cipher, aes-256-cfb', async () => { - const cipher = { "name": "ss-stream-cipher", "params": { "method": "aes-256-cfb" } }; + const cipher = { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-256-cfb' } }; const clientJson = clone(client); const serverJson = clone(server); @@ -34,7 +34,7 @@ test('ss-stream-cipher, aes-256-cfb', async () => { }); test('ss-stream-cipher, rc4-md5', async () => { - const cipher = { "name": "ss-stream-cipher", "params": { "method": "rc4-md5" } }; + const cipher = { 'name': 'ss-stream-cipher', 'params': { 'method': 'rc4-md5' } }; const clientJson = clone(client); const serverJson = clone(server); @@ -47,7 +47,7 @@ test('ss-stream-cipher, rc4-md5', async () => { }); test('ss-stream-cipher, rc4-md5-6', async () => { - const cipher = { "name": "ss-stream-cipher", "params": { "method": "rc4-md5-6" } }; + const cipher = { 'name': 'ss-stream-cipher', 'params': { 'method': 'rc4-md5-6' } }; const clientJson = clone(client); const serverJson = clone(server); diff --git a/test/e2e/ssr-auth-aes128-md5.test.js b/test/e2e/ssr-auth-aes128-md5.test.js index 495bbf2..39ba607 100644 --- a/test/e2e/ssr-auth-aes128-md5.test.js +++ b/test/e2e/ssr-auth-aes128-md5.test.js @@ -1,26 +1,26 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-aes128-md5" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-256-cfb" } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-aes128-md5' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-256-cfb' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-aes128-md5" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-256-cfb" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-aes128-md5' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-256-cfb' } }, + ], }; test('ssr-auth-aes128-md5', async () => { diff --git a/test/e2e/ssr-auth-aes128-sha1.test.js b/test/e2e/ssr-auth-aes128-sha1.test.js index dfe3f65..bdc0ec7 100644 --- a/test/e2e/ssr-auth-aes128-sha1.test.js +++ b/test/e2e/ssr-auth-aes128-sha1.test.js @@ -1,26 +1,26 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-aes128-sha1" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-256-cfb" } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-aes128-sha1' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-256-cfb' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-aes128-sha1" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-256-cfb" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-aes128-sha1' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-256-cfb' } }, + ], }; test('ssr-auth-aes128-sha1', async () => { diff --git a/test/e2e/ssr-auth-chain-a.test.js b/test/e2e/ssr-auth-chain-a.test.js index f38fd78..d6e1ff8 100644 --- a/test/e2e/ssr-auth-chain-a.test.js +++ b/test/e2e/ssr-auth-chain-a.test.js @@ -1,26 +1,26 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-chain-a" }, - { "name": "ss-stream-cipher", "params": { "method": "none" } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-chain-a' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'none' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-chain-a" }, - { "name": "ss-stream-cipher", "params": { "method": "none" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-chain-a' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'none' } }, + ], }; test('ssr-auth-chain-a', async () => { diff --git a/test/e2e/ssr-auth-chain-b.test.js b/test/e2e/ssr-auth-chain-b.test.js index 638dcb7..2f16554 100644 --- a/test/e2e/ssr-auth-chain-b.test.js +++ b/test/e2e/ssr-auth-chain-b.test.js @@ -1,26 +1,26 @@ import run from '../common/run-e2e'; const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-chain-b" }, - { "name": "ss-stream-cipher", "params": { "method": "none" } } - ] - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-chain-b' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'none' } }, + ], + }, }; const serverJson = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "ssr-auth-chain-b" }, - { "name": "ss-stream-cipher", "params": { "method": "none" } } - ] + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'ssr-auth-chain-b' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'none' } }, + ], }; test('ssr-auth-chain-b', async () => { diff --git a/test/e2e/transport-layer-tls.test.js b/test/e2e/transport-layer-tls.test.js index ed47e49..d71dd8f 100644 --- a/test/e2e/transport-layer-tls.test.js +++ b/test/e2e/transport-layer-tls.test.js @@ -1,33 +1,43 @@ import path from 'path'; +import clone from 'lodash.clonedeep'; import run from '../common/run-e2e'; const tlsKey = path.resolve(__dirname, 'resources', 'key.pem'); const tlsCert = path.resolve(__dirname, 'resources', 'cert.pem'); -const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tls://localhost:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } +const client = { + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tls://localhost:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "tls_cert": tlsCert - } + 'tls_cert': tlsCert, + 'tls_cert_self_signed': false, + }, }; -const serverJson = { - "service": "tls://localhost:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } +const server = { + 'service': 'tls://localhost:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, ], - "tls_cert": tlsCert, - "tls_key": tlsKey + 'tls_cert': tlsCert, + 'tls_key': tlsKey, }; -test('transport-layer-tls', async () => await run({ clientJson, serverJson })); +test('transport-layer-tls, tls_cert_self_signed is false', async () => { + await run({ clientJson: client, serverJson: server, not: true }); +}); + +test('transport-layer-tls, tls_cert_self_signed is true', async () => { + const clientJson = clone(client); + clientJson.server['tls_cert_self_signed'] = true; + await run({ clientJson, serverJson: server }); +}); diff --git a/test/e2e/transport-layer-ws.test.js b/test/e2e/transport-layer-ws.test.js index 491f921..867e896 100644 --- a/test/e2e/transport-layer-ws.test.js +++ b/test/e2e/transport-layer-ws.test.js @@ -1,26 +1,39 @@ +import clone from 'lodash.clonedeep'; import run from '../common/run-e2e'; -const clientJson = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "ws://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] - } +const client = { + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'ws://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], + }, }; -const serverJson = { - "service": "ws://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD", - "presets": [ - { "name": "ss-base" }, - { "name": "obfs-random-padding" }, - { "name": "ss-stream-cipher", "params": { "method": "aes-128-ctr" } } - ] +const server = { + 'service': 'ws://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], }; -test('transport-layer-ws', async () => await run({ clientJson, serverJson })); +test('transport-layer-ws path=/', async () => { + await run({ clientJson: client, serverJson: server }); +}); + +test('transport-layer-ws path=/test-path', async () => { + const clientJson = clone(client); + const serverJson = clone(server); + + clientJson.server.service = 'ws://127.0.0.1:1082/test-path'; + serverJson.service = 'ws://127.0.0.1:1082/test-path'; + + await run({ clientJson, serverJson }); +}); diff --git a/test/e2e/transport-layer-wss.test.js b/test/e2e/transport-layer-wss.test.js new file mode 100644 index 0000000..4748dbf --- /dev/null +++ b/test/e2e/transport-layer-wss.test.js @@ -0,0 +1,34 @@ +import path from 'path'; +import run from '../common/run-e2e'; + +const tlsKey = path.resolve(__dirname, 'resources', 'key.pem'); +const tlsCert = path.resolve(__dirname, 'resources', 'cert.pem'); + +const clientJson = { + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'wss://localhost:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], + 'tls_cert': tlsCert, + 'tls_cert_self_signed': true, + }, +}; + +const serverJson = { + 'service': 'wss://localhost:1082', + 'key': '9{*2gdBSdCrgnSBD', + 'presets': [ + { 'name': 'ss-base' }, + { 'name': 'obfs-random-padding' }, + { 'name': 'ss-stream-cipher', 'params': { 'method': 'aes-128-ctr' } }, + ], + 'tls_cert': tlsCert, + 'tls_key': tlsKey, +}; + +test('transport-layer-wss', async () => await run({ clientJson, serverJson })); diff --git a/test/e2e/v2ray-vmess.test.js b/test/e2e/v2ray-vmess.test.js index 9b4fdc6..6fd8aea 100644 --- a/test/e2e/v2ray-vmess.test.js +++ b/test/e2e/v2ray-vmess.test.js @@ -2,25 +2,25 @@ import clone from 'lodash.clonedeep'; import run from '../common/run-e2e'; const client = { - "service": "socks5://127.0.0.1:1081", - "server": { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD" - } + 'service': 'socks5://127.0.0.1:1081', + 'server': { + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', + }, }; const server = { - "service": "tcp://127.0.0.1:1082", - "key": "9{*2gdBSdCrgnSBD" + 'service': 'tcp://127.0.0.1:1082', + 'key': '9{*2gdBSdCrgnSBD', }; test('v2ray-vmess, none', async () => { const presets = [{ - "name": "v2ray-vmess", - "params": { - "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", - "security": "none" - } + 'name': 'v2ray-vmess', + 'params': { + 'id': 'c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7', + 'security': 'none', + }, }]; const clientJson = clone(client); const serverJson = clone(server); @@ -33,11 +33,11 @@ test('v2ray-vmess, none', async () => { test('v2ray-vmess, aes-128-gcm', async () => { const presets = [{ - "name": "v2ray-vmess", - "params": { - "id": "c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7", - "security": "aes-128-gcm" - } + 'name': 'v2ray-vmess', + 'params': { + 'id': 'c2485913-4e9e-41eb-8cc5-b2e7db8d3bc7', + 'security': 'aes-128-gcm', + }, }]; const clientJson = clone(client); const serverJson = clone(server); diff --git a/test/src/core/__mocks__/fs.js b/test/src/core/__mocks__/fs.js index fb7f736..18d7149 100644 --- a/test/src/core/__mocks__/fs.js +++ b/test/src/core/__mocks__/fs.js @@ -1,18 +1,18 @@ const fs = jest.genMockFromModule('fs'); -fs.statSync = function () { +fs.statSync = function() { return { - isFile: () => true + isFile: () => true, }; }; -fs.lstatSync = function () { +fs.lstatSync = function() { const err = new Error(); err.code = 'ENOENT'; throw err; }; -fs.readFileSync = function () { +fs.readFileSync = function() { return Buffer.alloc(0); }; diff --git a/test/src/core/config.test.js b/test/src/core/config.test.js index 5bf9b20..47aec91 100644 --- a/test/src/core/config.test.js +++ b/test/src/core/config.test.js @@ -30,9 +30,9 @@ describe('Config#test', () => { service: 'tcp://127.0.0.1:1082', key: 'abc', presets: [{ - name: 'ss-base' - }] - } + name: 'ss-base', + }], + }, }; it('should throw when ?forward is invalid', () => { @@ -96,9 +96,9 @@ describe('Config#testOnClient', () => { service: 'tcp://127.0.0.1:1082', key: 'abc', presets: [{ - name: 'ss-base' - }] - } + name: 'ss-base', + }], + }, }; it('should throw when service is not provided', () => { @@ -175,13 +175,13 @@ describe('Config#init', () => { service: 'tcp://127.0.0.1:1082', key: 'abc', presets: [{ - name: 'ss-base' - }] + name: 'ss-base', + }], }, dns: ['8.8.8.8'], log_level: 'warn', log_path: 'blinksocks.log', - log_max_days: 30 + log_max_days: 30, }; it('should config set correctly', () => { @@ -205,15 +205,15 @@ describe('Config#initServer', () => { service: 'tls://127.0.0.1:1082', key: 'abc', presets: [{ - name: 'ss-base' + name: 'ss-base', }], tls_cert: 'mock_cert.pem', - tls_key: 'mock_key.pem' + tls_key: 'mock_key.pem', }; it('should config set correctly', () => { const config = new Config(serverConf); - expect(config.transport).toBe('tls'); + expect(config.server_protocol).toBe('tls'); expect(config.tls_cert).toBeDefined(); expect(config.tls_key).toBeDefined(); }); diff --git a/test/src/core/speed-tester.test.js b/test/src/core/speed-tester.test.js new file mode 100644 index 0000000..d701d0d --- /dev/null +++ b/test/src/core/speed-tester.test.js @@ -0,0 +1,7 @@ +import { SpeedTester } from '../../../src/core/speed-tester'; + +test('SpeedTester::getSpeed()', () => { + const st = new SpeedTester(); + st.feed(10); + expect(st.getSpeed()).toBeGreaterThan(0); +}); diff --git a/test/src/presets/index.test.js b/test/src/presets/index.test.js new file mode 100644 index 0000000..4350a31 --- /dev/null +++ b/test/src/presets/index.test.js @@ -0,0 +1,13 @@ +import { getPresetClassByName } from '../../../src/presets'; + +test('getPresetClassByName, fail', () => { + expect(() => getPresetClassByName('_unknown_')).toThrow(); + expect(() => getPresetClassByName('mux')).toThrow(); + expect(() => getPresetClassByName(require.resolve('./mock_invalid_preset_a'))).toThrow(); + expect(() => getPresetClassByName(require.resolve('./mock_invalid_preset_b'))).toThrow(); +}); + +test('getPresetClassByName, success', () => { + expect(() => getPresetClassByName('ss-base')).not.toThrow(); + expect(() => getPresetClassByName(require.resolve('./mock_valid_preset'))).not.toThrow(); +}); diff --git a/test/src/presets/mock_invalid_preset_a.js b/test/src/presets/mock_invalid_preset_a.js new file mode 100644 index 0000000..697d236 --- /dev/null +++ b/test/src/presets/mock_invalid_preset_a.js @@ -0,0 +1,3 @@ +module.exports = class MockPreset { + +}; diff --git a/test/src/presets/mock_invalid_preset_b.js b/test/src/presets/mock_invalid_preset_b.js new file mode 100644 index 0000000..b894a23 --- /dev/null +++ b/test/src/presets/mock_invalid_preset_b.js @@ -0,0 +1 @@ +module.exports = null; diff --git a/test/src/presets/mock_valid_preset.js b/test/src/presets/mock_valid_preset.js new file mode 100644 index 0000000..6fbf28b --- /dev/null +++ b/test/src/presets/mock_valid_preset.js @@ -0,0 +1,5 @@ +import { IPreset } from '../../../src/presets/defs'; + +module.exports = class MockPreset extends IPreset { + +}; diff --git a/test/src/utils/advanced-buffer.test.js b/test/src/utils/advanced-buffer.test.js index 1ede666..5c59cd5 100644 --- a/test/src/utils/advanced-buffer.test.js +++ b/test/src/utils/advanced-buffer.test.js @@ -1,31 +1,31 @@ import { AdvancedBuffer } from '../../../src/utils/advanced-buffer'; -describe('AdvancedBuffer#constructor', function () { +describe('AdvancedBuffer#constructor', function() { - it('should throw when options is not given', function () { + it('should throw when options is not given', function() { expect(() => new AdvancedBuffer()).toThrow(); }); - it('should throw when getPacketLength not Function', function () { + it('should throw when getPacketLength not Function', function() { expect(() => new AdvancedBuffer({ getPacketLength: null })).toThrow(); }); }); -describe('AdvancedBuffer#put', function () { +describe('AdvancedBuffer#put', function() { - it('should throw when pass a non-buffer to put() ', function () { + it('should throw when pass a non-buffer to put() ', function() { const buffer = new AdvancedBuffer({ - getPacketLength: () => 0 + getPacketLength: () => 0, }); expect(() => buffer.put()).toThrow(); }); - it('should leave 0xff', function () { + it('should leave 0xff', function() { const buffer = new AdvancedBuffer({ getPacketLength: (chunk) => { return (chunk.length < 2) ? 0 : chunk.readUInt16BE(0); - } + }, }); const callback = jest.fn(); buffer.on('data', callback); @@ -39,7 +39,7 @@ describe('AdvancedBuffer#put', function () { expect(callback).toHaveBeenCalledTimes(3); }); - it('should drop the first byte', function () { + it('should drop the first byte', function() { let dropped = false; const buffer = new AdvancedBuffer({ getPacketLength: (chunk) => { @@ -49,7 +49,7 @@ describe('AdvancedBuffer#put', function () { } else { return chunk.length > 1 ? chunk.readUInt16BE(0) : 0; } - } + }, }); const callback = jest.fn(); buffer.on('data', callback); @@ -63,9 +63,9 @@ describe('AdvancedBuffer#put', function () { expect(callback).toHaveBeenCalledTimes(3); }); - it('should drop buffer', function () { + it('should drop buffer', function() { const buffer = new AdvancedBuffer({ - getPacketLength: () => -1 + getPacketLength: () => -1, }); const callback = jest.fn(); buffer.on('data', callback); @@ -76,9 +76,9 @@ describe('AdvancedBuffer#put', function () { }); -describe('AdvancedBuffer#clear', function () { +describe('AdvancedBuffer#clear', function() { - it('should throw when pass a non-buffer to put() ', function () { + it('should throw when pass a non-buffer to put() ', function() { const buffer = new AdvancedBuffer({ getPacketLength: () => 0 }); buffer.put(Buffer.from([0x00])); buffer.clear(); diff --git a/test/src/utils/crypto.test.js b/test/src/utils/crypto.test.js index 29311ab..82549c6 100644 --- a/test/src/utils/crypto.test.js +++ b/test/src/utils/crypto.test.js @@ -11,11 +11,11 @@ test('randomBytes', () => { const tests = [{ func: 'hash', args: ['md5', Buffer.from([1, 2, 3, 4])], - comparator: (output) => output.equals(Buffer.from('08d6c05a21512a79a1dfeb9d2a8f262f', 'hex')) + comparator: (output) => output.equals(Buffer.from('08d6c05a21512a79a1dfeb9d2a8f262f', 'hex')), }, { func: 'hmac', args: ['md5', '', Buffer.from([1, 2, 3, 4])], - comparator: (output) => output.equals(Buffer.from('7f8adea19a1ac02186fa895af72a7fa1', 'hex')) + comparator: (output) => output.equals(Buffer.from('7f8adea19a1ac02186fa895af72a7fa1', 'hex')), }, { func: 'shake128', args: [Buffer.from([1, 2, 3, 4])], @@ -23,31 +23,31 @@ const tests = [{ output.nextBytes(1).equals(Buffer.from([0xac])) && output.nextBytes(1).equals(Buffer.from([0xca])) && output.nextBytes(64).length === 64 - ) + ), }, { func: 'fnv1a', args: [Buffer.from([1, 2, 3, 4])], - comparator: (output) => output.equals(Buffer.from([0x57, 0x34, 0xa8, 0x7d])) + comparator: (output) => output.equals(Buffer.from([0x57, 0x34, 0xa8, 0x7d])), }, { func: 'xor', args: [Buffer.from([1, 2, 3]), Buffer.from([4, 5, 6])], - comparator: (output) => output.equals(Buffer.from([5, 7, 5])) + comparator: (output) => output.equals(Buffer.from([5, 7, 5])), }, { func: 'xor', args: [Buffer.from([1, 2]), Buffer.from([4, 5, 6])], - comparator: (output) => output === null + comparator: (output) => output === null, }, { func: 'xor', args: [[1, 2, 3], [4, 5, 6]], - comparator: ([a, b, c]) => a === 5 && b === 7 && c === 5 + comparator: ([a, b, c]) => a === 5 && b === 7 && c === 5, }, { func: 'EVP_BytesToKey', args: [Buffer.from('password'), 16, 16], - comparator: (output) => output.equals(Buffer.from('5f4dcc3b5aa765d61d8327deb882cf99', 'hex')) + comparator: (output) => output.equals(Buffer.from('5f4dcc3b5aa765d61d8327deb882cf99', 'hex')), }, { func: 'HKDF', args: ['md5', Buffer.alloc(0), Buffer.from([1, 2, 3, 4]), Buffer.alloc(0), 16], - comparator: (output) => output.equals(Buffer.from('160ade10f83c4275fca1c8cd0583e4e6', 'hex')) + comparator: (output) => output.equals(Buffer.from('160ade10f83c4275fca1c8cd0583e4e6', 'hex')), }]; for (const { func, args, comparator } of tests) { diff --git a/test/src/utils/dns-cache.test.js b/test/src/utils/dns-cache.test.js index 3e7e3b8..d78850d 100644 --- a/test/src/utils/dns-cache.test.js +++ b/test/src/utils/dns-cache.test.js @@ -5,14 +5,14 @@ async function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } -it('should return an ip address', async function () { +it('should return an ip address', async function() { DNSCache.clear(); expect(net.isIP(await DNSCache.get('localhost'))).toBe(4); expect(net.isIP(await DNSCache.get('localhost'))).toBe(4); expect(net.isIP(await DNSCache.get('127.0.0.1'))).toBe(4); }); -it('should throw if fail to resolve', async function () { +it('should throw if fail to resolve', async function() { try { await DNSCache.get('xxx'); } catch (err) { @@ -20,7 +20,7 @@ it('should throw if fail to resolve', async function () { } }); -it('should remove from pool if expire', async function () { +it('should remove from pool if expire', async function() { DNSCache.init(100); await DNSCache.get('localhost'); await sleep(100); @@ -28,7 +28,7 @@ it('should remove from pool if expire', async function () { expect(DNSCache.pool).toEqual({}); }); -it('pool should be empty', function () { +it('pool should be empty', function() { DNSCache.init(0); DNSCache._put('', ''); expect(DNSCache.pool).toEqual({});