├── .gitignore ├── README.md ├── bin └── ccxt-server.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # REST API for CCXT library 2 | 3 | ## Install 4 | 5 | > npm install -g ccxt-server 6 | 7 | ## Run 8 | 9 | > ccxt-server 10 | 11 | ## API 12 | 13 | - [Exchanges list](#exchanges-list) 14 | - [Market's Currencies](#markets-currencies) 15 | - [Market's Symbols](#markets-symbols) 16 | - [Market's Current Tickers Values](#markets-current-tickers-values) 17 | 18 | 19 | #### Exchanges list 20 | Request 21 | ``` 22 | curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:9090/exchanges 23 | ``` 24 | 25 | Response 26 | ``` 27 | [ 28 | "_1broker", 29 | "_1btcxe", 30 | "acx", 31 | "allcoin", 32 | "anxpro", 33 | "bibox", 34 | "binance", 35 | "bit2c", 36 | "bitbank", 37 | "bitbay", 38 | "bitfinex", 39 | "bitfinex2", 40 | "bitflyer", 41 | "bithumb", 42 | "bitkk", 43 | "bitlish", 44 | "bitmarket", 45 | "bitmex", 46 | "bitso", 47 | "bitstamp", 48 | "bitstamp1", 49 | "bittrex", 50 | "bitz", 51 | "bl3p", 52 | "bleutrade", 53 | "braziliex", 54 | "btcbox", 55 | "btcchina", 56 | "btcexchange", 57 | "btcmarkets", 58 | "btctradeim", 59 | "btctradeua", 60 | "btcturk", 61 | "btcx", 62 | "bxinth", 63 | "ccex", 64 | "cex", 65 | "chbtc", 66 | "chilebit", 67 | "cobinhood", 68 | "coincheck", 69 | "coinegg", 70 | "coinex", 71 | "coinexchange", 72 | "coinfloor", 73 | "coingi", 74 | "coinmarketcap", 75 | "coinmate", 76 | "coinnest", 77 | "coinone", 78 | "coinsecure", 79 | "coinspot", 80 | "coolcoin", 81 | "cryptopia", 82 | "dsx", 83 | "ethfinex", 84 | "exmo", 85 | "exx", 86 | "flowbtc", 87 | "foxbit", 88 | "fybse", 89 | "fybsg", 90 | "gatecoin", 91 | "gateio", 92 | "gdax", 93 | "gemini", 94 | "getbtc", 95 | "hadax", 96 | "hitbtc", 97 | "hitbtc2", 98 | "huobi", 99 | "huobicny", 100 | "huobipro", 101 | "ice3x", 102 | "independentreserve", 103 | "indodax", 104 | "itbit", 105 | "jubi", 106 | "kraken", 107 | "kucoin", 108 | "kuna", 109 | "lakebtc", 110 | "lbank", 111 | "liqui", 112 | "livecoin", 113 | "luno", 114 | "lykke", 115 | "mercado", 116 | "mixcoins", 117 | "negociecoins", 118 | "nova", 119 | "okcoincny", 120 | "okcoinusd", 121 | "okex", 122 | "paymium", 123 | "poloniex", 124 | "qryptos", 125 | "quadrigacx", 126 | "quoinex", 127 | "southxchange", 128 | "surbitcoin", 129 | "therock", 130 | "tidebit", 131 | "tidex", 132 | "urdubit", 133 | "vaultoro", 134 | "vbtc", 135 | "virwox", 136 | "wex", 137 | "xbtce", 138 | "yobit", 139 | "yunbi", 140 | "zaif", 141 | "zb" 142 | ] 143 | ``` 144 | 145 | #### Market's Currencies 146 | 147 | Request 148 | :exchange - exchange name (e.g. bittrex) 149 | ``` 150 | curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:9090/currencies/:exchange 151 | ``` 152 | 153 | Response 154 | ``` 155 | { 156 | "BCH":{ 157 | "id":"BCH", 158 | "code":"BCH", 159 | "info":{ 160 | "aclass":"currency", 161 | "altname":"BCH", 162 | "decimals":10, 163 | "display_decimals":5 164 | }, 165 | "name":"BCH", 166 | "active":true, 167 | "status":"ok", 168 | "precision":10, 169 | "limits":{ 170 | "amount":{ 171 | "min":1e-10, 172 | "max":10000000000 173 | }, 174 | "price":{ 175 | "min":1e-10, 176 | "max":10000000000 177 | }, 178 | "cost":{ 179 | 180 | }, 181 | "withdraw":{ 182 | "max":10000000000 183 | } 184 | } 185 | }, 186 | "DASH":{ 187 | "id":"DASH", 188 | "code":"DASH", 189 | "info":{ 190 | "aclass":"currency", 191 | "altname":"DASH", 192 | "decimals":10, 193 | "display_decimals":5 194 | }, 195 | "name":"DASH", 196 | "active":true, 197 | "status":"ok", 198 | "precision":10, 199 | "limits":{ 200 | "amount":{ 201 | "min":1e-10, 202 | "max":10000000000 203 | }, 204 | "price":{ 205 | "min":1e-10, 206 | "max":10000000000 207 | }, 208 | "cost":{ 209 | 210 | }, 211 | "withdraw":{ 212 | "max":10000000000 213 | } 214 | } 215 | }, 216 | ... 217 | } 218 | ``` 219 | 220 | #### Market's Symbols 221 | 222 | Request 223 | :exchange - exchange name (e.g. bittrex) 224 | ``` 225 | curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:9090/symbols/:exchange 226 | ``` 227 | 228 | Response 229 | ``` 230 | [ 231 | "BCH/BTC", 232 | "BCH/EUR", 233 | "BCH/USD", 234 | "BTC/CAD", 235 | "BTC/EUR", 236 | "BTC/GBP", 237 | "BTC/JPY", 238 | "BTC/USD", 239 | "DASH/BTC", 240 | "DASH/EUR", 241 | ... 242 | ] 243 | ``` 244 | 245 | #### Market's Current Tickers Values 246 | 247 | Request 248 | :exchange - exchange name (e.g. bittrex) 249 | ``` 250 | curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://localhost:9090/tickers/:exchange 251 | ``` 252 | 253 | Response 254 | ``` 255 | { 256 | "LTC/BTC":{ 257 | "symbol":"LTC/BTC", 258 | "timestamp":1525679738000, 259 | "datetime":"2018-05-07T07:55:38.000Z", 260 | "high":0.01793101, 261 | "low":0.01734399, 262 | "bid":0.017356, 263 | "ask":0.017362, 264 | "close":0.017362, 265 | "last":0.017362, 266 | "baseVolume":200852.3536, 267 | "info":{ 268 | "date":1525679738, 269 | "last":"0.01736200", 270 | "buy":"0.01735600", 271 | "sell":"0.01736200", 272 | "high":"0.01793101", 273 | "low":"0.01734399", 274 | "vol":"200852.3536" 275 | } 276 | }, 277 | ... 278 | "ETH/BTC":{ 279 | "symbol":"ETH/BTC", 280 | "timestamp":1525679738000, 281 | "datetime":"2018-05-07T07:55:38.000Z", 282 | "high":0.08249345, 283 | "low":0.07890199, 284 | "bid":0.07894101, 285 | "ask":0.07906502, 286 | "close":0.07906502, 287 | "last":0.07906502, 288 | "baseVolume":45252.8574, 289 | "info":{ 290 | "date":1525679738, 291 | "last":"0.07906502", 292 | "buy":"0.07894101", 293 | "sell":"0.07906502", 294 | "high":"0.08249345", 295 | "low":"0.07890199", 296 | "vol":"45252.8574" 297 | } 298 | } 299 | } 300 | ``` 301 | 302 | ## Contributing 303 | 304 | Bug reports and pull requests are welcome on GitHub at https://github.com/mpakus/ccxt-server. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct. 305 | 306 | 307 | ## License 308 | 309 | The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). 310 | -------------------------------------------------------------------------------- /bin/ccxt-server.js: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env node 2 | 3 | const cloudscraper = require('cloudscraper'); 4 | const ccxt = require('ccxt'); 5 | const express = require('express'); 6 | const app = express(); 7 | 8 | const error_log =(exception, exchange) => { 9 | console.log('--------------------------------------------------------'); 10 | console.log('Failed.'); 11 | console.log(exception.constructor.name, exception.message); 12 | console.log('--------------------------------------------------------'); 13 | console.log(exchange.last_http_response); 14 | } 15 | 16 | const scrapeCloudflareHttpHeaderCookie = (url) => 17 | (new Promise((resolve, reject) => 18 | (cloudscraper.get(url, function(error, response, body) { 19 | if(error) { 20 | reject(error) 21 | } else { 22 | resolve(response.request.headers) 23 | } 24 | })) 25 | )); 26 | 27 | 28 | const fetch_currencies =(request, response) => { 29 | (async() => { 30 | const exchange = new ccxt[request.params['exchange']](); 31 | exchange.headers = await scrapeCloudflareHttpHeaderCookie(exchange.urls.www); 32 | try { 33 | await exchange.loadMarkets(); 34 | response.json(await exchange.currencies); 35 | console.log(request.originalUrl); 36 | console.log('Success.'); 37 | } catch(exception) { 38 | error_log(exception, exchange); 39 | } 40 | })(); 41 | }; 42 | 43 | const fetch_symbols =(request, response) => { 44 | (async() => { 45 | const exchange = new ccxt[request.params['exchange']](); 46 | exchange.headers = await scrapeCloudflareHttpHeaderCookie(exchange.urls.www); 47 | try { 48 | await exchange.loadMarkets(); 49 | response.json(await exchange.symbols); 50 | console.log(request.originalUrl); 51 | console.log('Success.'); 52 | } catch(exception) { 53 | error_log(exception, exchange); 54 | } 55 | })(); 56 | }; 57 | 58 | const fetch_tickers =(request, response) => { 59 | (async() => { 60 | const exchange = new ccxt[request.params['exchange']](); 61 | exchange.headers = await scrapeCloudflareHttpHeaderCookie(exchange.urls.www); 62 | try { 63 | response.json(await exchange.fetchTickers()); 64 | console.log(request.originalUrl); 65 | console.log('Success.'); 66 | } catch(exception) { 67 | error_log(exception, exchange); 68 | } 69 | })(); 70 | }; 71 | 72 | const exchanges_list =(request, response) => { 73 | try { 74 | response.json(ccxt.exchanges); 75 | console.log(request.originalUrl); 76 | console.log('Success.'); 77 | } catch(exception) { 78 | error_log(exception, exchange); 79 | } 80 | }; 81 | 82 | const cf_headers =(request, response) => { 83 | (async() => { 84 | const exchange = new ccxt[request.params['exchange']](); 85 | try { 86 | exchange.headers = await scrapeCloudflareHttpHeaderCookie(exchange.urls.www); 87 | response.json(await exchange.headers); 88 | } catch(exception) { 89 | error_log(exception, exchange); 90 | } 91 | })(); 92 | }; 93 | 94 | app.get('/exchanges', exchanges_list); 95 | app.get('/currencies/:exchange', fetch_currencies); 96 | app.get('/symbols/:exchange', fetch_symbols); 97 | app.get('/tickers/:exchange', fetch_tickers); 98 | app.get('/cf_headers/:exchange', cf_headers); 99 | 100 | app.listen(9090,() => console.log('CCXT server runs on 9090')); 101 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ccxt-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "5.5.2", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 19 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 20 | "requires": { 21 | "co": "4.6.0", 22 | "fast-deep-equal": "1.1.0", 23 | "fast-json-stable-stringify": "2.0.0", 24 | "json-schema-traverse": "0.3.1" 25 | } 26 | }, 27 | "ansi-escapes": { 28 | "version": "1.4.0", 29 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 30 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" 31 | }, 32 | "ansi-regex": { 33 | "version": "2.1.1", 34 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 35 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 36 | }, 37 | "ansi-styles": { 38 | "version": "2.2.1", 39 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 40 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 41 | }, 42 | "array-flatten": { 43 | "version": "1.1.1", 44 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 45 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 46 | }, 47 | "asn1": { 48 | "version": "0.2.3", 49 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 50 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 51 | }, 52 | "assert-plus": { 53 | "version": "1.0.0", 54 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 55 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 56 | }, 57 | "asynckit": { 58 | "version": "0.4.0", 59 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 60 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 61 | }, 62 | "aws-sign2": { 63 | "version": "0.7.0", 64 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 65 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 66 | }, 67 | "aws4": { 68 | "version": "1.7.0", 69 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 70 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 71 | }, 72 | "babel-polyfill": { 73 | "version": "6.23.0", 74 | "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", 75 | "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", 76 | "requires": { 77 | "babel-runtime": "6.26.0", 78 | "core-js": "2.5.5", 79 | "regenerator-runtime": "0.10.5" 80 | } 81 | }, 82 | "babel-runtime": { 83 | "version": "6.26.0", 84 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 85 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 86 | "requires": { 87 | "core-js": "2.5.5", 88 | "regenerator-runtime": "0.11.1" 89 | }, 90 | "dependencies": { 91 | "regenerator-runtime": { 92 | "version": "0.11.1", 93 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 94 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 95 | } 96 | } 97 | }, 98 | "bcrypt-pbkdf": { 99 | "version": "1.0.1", 100 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 101 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 102 | "optional": true, 103 | "requires": { 104 | "tweetnacl": "0.14.5" 105 | } 106 | }, 107 | "body-parser": { 108 | "version": "1.18.2", 109 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 110 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 111 | "requires": { 112 | "bytes": "3.0.0", 113 | "content-type": "1.0.4", 114 | "debug": "2.6.9", 115 | "depd": "1.1.2", 116 | "http-errors": "1.6.3", 117 | "iconv-lite": "0.4.19", 118 | "on-finished": "2.3.0", 119 | "qs": "6.5.1", 120 | "raw-body": "2.3.2", 121 | "type-is": "1.6.16" 122 | }, 123 | "dependencies": { 124 | "iconv-lite": { 125 | "version": "0.4.19", 126 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 127 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 128 | } 129 | } 130 | }, 131 | "boom": { 132 | "version": "4.3.1", 133 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 134 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 135 | "requires": { 136 | "hoek": "4.2.1" 137 | } 138 | }, 139 | "bytes": { 140 | "version": "3.0.0", 141 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 142 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 143 | }, 144 | "caseless": { 145 | "version": "0.12.0", 146 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 147 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 148 | }, 149 | "ccxt": { 150 | "version": "1.13.97", 151 | "resolved": "https://registry.npmjs.org/ccxt/-/ccxt-1.13.97.tgz", 152 | "integrity": "sha512-BVtE9/JKCqR7peOfbUG8tWdOiocOIak5sAfYA6nzmhgZi+4NVkhOt7aBEWsWpUqb8SiLzqb230cMar4HWD32aQ==", 153 | "requires": { 154 | "cloudscraper": "1.4.1", 155 | "crypto-js": "3.1.9-1", 156 | "fetch-ponyfill": "4.1.0", 157 | "opencollective": "1.0.3", 158 | "qs": "6.5.1" 159 | } 160 | }, 161 | "chalk": { 162 | "version": "1.1.3", 163 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 164 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 165 | "requires": { 166 | "ansi-styles": "2.2.1", 167 | "escape-string-regexp": "1.0.5", 168 | "has-ansi": "2.0.0", 169 | "strip-ansi": "3.0.1", 170 | "supports-color": "2.0.0" 171 | } 172 | }, 173 | "chardet": { 174 | "version": "0.4.2", 175 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 176 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" 177 | }, 178 | "cli-cursor": { 179 | "version": "2.1.0", 180 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 181 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 182 | "requires": { 183 | "restore-cursor": "2.0.0" 184 | } 185 | }, 186 | "cli-width": { 187 | "version": "2.2.0", 188 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 189 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 190 | }, 191 | "cloudscraper": { 192 | "version": "1.4.1", 193 | "resolved": "https://registry.npmjs.org/cloudscraper/-/cloudscraper-1.4.1.tgz", 194 | "integrity": "sha1-8rRDHzFyhtgZsTVyZso0Y7ES68o=", 195 | "requires": { 196 | "request": "2.85.0" 197 | } 198 | }, 199 | "co": { 200 | "version": "4.6.0", 201 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 202 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 203 | }, 204 | "combined-stream": { 205 | "version": "1.0.6", 206 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 207 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 208 | "requires": { 209 | "delayed-stream": "1.0.0" 210 | } 211 | }, 212 | "content-disposition": { 213 | "version": "0.5.2", 214 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 215 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 216 | }, 217 | "content-type": { 218 | "version": "1.0.4", 219 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 220 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 221 | }, 222 | "cookie": { 223 | "version": "0.3.1", 224 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 225 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 226 | }, 227 | "cookie-signature": { 228 | "version": "1.0.6", 229 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 230 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 231 | }, 232 | "core-js": { 233 | "version": "2.5.5", 234 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.5.tgz", 235 | "integrity": "sha1-sU3ek2xkDAV5prUMq8wTLdYSfjs=" 236 | }, 237 | "core-util-is": { 238 | "version": "1.0.2", 239 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 240 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 241 | }, 242 | "cryptiles": { 243 | "version": "3.1.2", 244 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 245 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 246 | "requires": { 247 | "boom": "5.2.0" 248 | }, 249 | "dependencies": { 250 | "boom": { 251 | "version": "5.2.0", 252 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 253 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 254 | "requires": { 255 | "hoek": "4.2.1" 256 | } 257 | } 258 | } 259 | }, 260 | "crypto-js": { 261 | "version": "3.1.9-1", 262 | "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", 263 | "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" 264 | }, 265 | "dashdash": { 266 | "version": "1.14.1", 267 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 268 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 269 | "requires": { 270 | "assert-plus": "1.0.0" 271 | } 272 | }, 273 | "debug": { 274 | "version": "2.6.9", 275 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 276 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 277 | "requires": { 278 | "ms": "2.0.0" 279 | } 280 | }, 281 | "delayed-stream": { 282 | "version": "1.0.0", 283 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 284 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 285 | }, 286 | "depd": { 287 | "version": "1.1.2", 288 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 289 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 290 | }, 291 | "destroy": { 292 | "version": "1.0.4", 293 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 294 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 295 | }, 296 | "ecc-jsbn": { 297 | "version": "0.1.1", 298 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 299 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 300 | "optional": true, 301 | "requires": { 302 | "jsbn": "0.1.1" 303 | } 304 | }, 305 | "ee-first": { 306 | "version": "1.1.1", 307 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 308 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 309 | }, 310 | "encodeurl": { 311 | "version": "1.0.2", 312 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 313 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 314 | }, 315 | "encoding": { 316 | "version": "0.1.12", 317 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 318 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 319 | "requires": { 320 | "iconv-lite": "0.4.22" 321 | } 322 | }, 323 | "escape-html": { 324 | "version": "1.0.3", 325 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 326 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 327 | }, 328 | "escape-string-regexp": { 329 | "version": "1.0.5", 330 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 331 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 332 | }, 333 | "etag": { 334 | "version": "1.8.1", 335 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 336 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 337 | }, 338 | "express": { 339 | "version": "4.16.3", 340 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 341 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 342 | "requires": { 343 | "accepts": "1.3.5", 344 | "array-flatten": "1.1.1", 345 | "body-parser": "1.18.2", 346 | "content-disposition": "0.5.2", 347 | "content-type": "1.0.4", 348 | "cookie": "0.3.1", 349 | "cookie-signature": "1.0.6", 350 | "debug": "2.6.9", 351 | "depd": "1.1.2", 352 | "encodeurl": "1.0.2", 353 | "escape-html": "1.0.3", 354 | "etag": "1.8.1", 355 | "finalhandler": "1.1.1", 356 | "fresh": "0.5.2", 357 | "merge-descriptors": "1.0.1", 358 | "methods": "1.1.2", 359 | "on-finished": "2.3.0", 360 | "parseurl": "1.3.2", 361 | "path-to-regexp": "0.1.7", 362 | "proxy-addr": "2.0.3", 363 | "qs": "6.5.1", 364 | "range-parser": "1.2.0", 365 | "safe-buffer": "5.1.1", 366 | "send": "0.16.2", 367 | "serve-static": "1.13.2", 368 | "setprototypeof": "1.1.0", 369 | "statuses": "1.4.0", 370 | "type-is": "1.6.16", 371 | "utils-merge": "1.0.1", 372 | "vary": "1.1.2" 373 | }, 374 | "dependencies": { 375 | "safe-buffer": { 376 | "version": "5.1.1", 377 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 378 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 379 | } 380 | } 381 | }, 382 | "extend": { 383 | "version": "3.0.1", 384 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 385 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 386 | }, 387 | "external-editor": { 388 | "version": "2.2.0", 389 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 390 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 391 | "requires": { 392 | "chardet": "0.4.2", 393 | "iconv-lite": "0.4.22", 394 | "tmp": "0.0.33" 395 | } 396 | }, 397 | "extsprintf": { 398 | "version": "1.3.0", 399 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 400 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 401 | }, 402 | "fast-deep-equal": { 403 | "version": "1.1.0", 404 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 405 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 406 | }, 407 | "fast-json-stable-stringify": { 408 | "version": "2.0.0", 409 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 410 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 411 | }, 412 | "fetch-ponyfill": { 413 | "version": "4.1.0", 414 | "resolved": "https://registry.npmjs.org/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz", 415 | "integrity": "sha1-rjzl9zLGReq4fkroeTQUcJsjmJM=", 416 | "requires": { 417 | "node-fetch": "1.7.3" 418 | } 419 | }, 420 | "figures": { 421 | "version": "2.0.0", 422 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 423 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 424 | "requires": { 425 | "escape-string-regexp": "1.0.5" 426 | } 427 | }, 428 | "finalhandler": { 429 | "version": "1.1.1", 430 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 431 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 432 | "requires": { 433 | "debug": "2.6.9", 434 | "encodeurl": "1.0.2", 435 | "escape-html": "1.0.3", 436 | "on-finished": "2.3.0", 437 | "parseurl": "1.3.2", 438 | "statuses": "1.4.0", 439 | "unpipe": "1.0.0" 440 | } 441 | }, 442 | "forever-agent": { 443 | "version": "0.6.1", 444 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 445 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 446 | }, 447 | "form-data": { 448 | "version": "2.3.2", 449 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 450 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 451 | "requires": { 452 | "asynckit": "0.4.0", 453 | "combined-stream": "1.0.6", 454 | "mime-types": "2.1.18" 455 | } 456 | }, 457 | "forwarded": { 458 | "version": "0.1.2", 459 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 460 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 461 | }, 462 | "fresh": { 463 | "version": "0.5.2", 464 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 465 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 466 | }, 467 | "getpass": { 468 | "version": "0.1.7", 469 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 470 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 471 | "requires": { 472 | "assert-plus": "1.0.0" 473 | } 474 | }, 475 | "har-schema": { 476 | "version": "2.0.0", 477 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 478 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 479 | }, 480 | "har-validator": { 481 | "version": "5.0.3", 482 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 483 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 484 | "requires": { 485 | "ajv": "5.5.2", 486 | "har-schema": "2.0.0" 487 | } 488 | }, 489 | "has-ansi": { 490 | "version": "2.0.0", 491 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 492 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 493 | "requires": { 494 | "ansi-regex": "2.1.1" 495 | } 496 | }, 497 | "hawk": { 498 | "version": "6.0.2", 499 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 500 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 501 | "requires": { 502 | "boom": "4.3.1", 503 | "cryptiles": "3.1.2", 504 | "hoek": "4.2.1", 505 | "sntp": "2.1.0" 506 | } 507 | }, 508 | "hoek": { 509 | "version": "4.2.1", 510 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", 511 | "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" 512 | }, 513 | "http-errors": { 514 | "version": "1.6.3", 515 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 516 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 517 | "requires": { 518 | "depd": "1.1.2", 519 | "inherits": "2.0.3", 520 | "setprototypeof": "1.1.0", 521 | "statuses": "1.4.0" 522 | } 523 | }, 524 | "http-signature": { 525 | "version": "1.2.0", 526 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 527 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 528 | "requires": { 529 | "assert-plus": "1.0.0", 530 | "jsprim": "1.4.1", 531 | "sshpk": "1.14.1" 532 | } 533 | }, 534 | "iconv-lite": { 535 | "version": "0.4.22", 536 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.22.tgz", 537 | "integrity": "sha512-1AinFBeDTnsvVEP+V1QBlHpM1UZZl7gWB6fcz7B1Ho+LI1dUh2sSrxoCfVt2PinRHzXAziSniEV3P7JbTDHcXA==", 538 | "requires": { 539 | "safer-buffer": "2.1.2" 540 | } 541 | }, 542 | "inherits": { 543 | "version": "2.0.3", 544 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 545 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 546 | }, 547 | "inquirer": { 548 | "version": "3.0.6", 549 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", 550 | "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", 551 | "requires": { 552 | "ansi-escapes": "1.4.0", 553 | "chalk": "1.1.3", 554 | "cli-cursor": "2.1.0", 555 | "cli-width": "2.2.0", 556 | "external-editor": "2.2.0", 557 | "figures": "2.0.0", 558 | "lodash": "4.17.10", 559 | "mute-stream": "0.0.7", 560 | "run-async": "2.3.0", 561 | "rx": "4.1.0", 562 | "string-width": "2.1.1", 563 | "strip-ansi": "3.0.1", 564 | "through": "2.3.8" 565 | } 566 | }, 567 | "ipaddr.js": { 568 | "version": "1.6.0", 569 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 570 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 571 | }, 572 | "is-fullwidth-code-point": { 573 | "version": "2.0.0", 574 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 575 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 576 | }, 577 | "is-promise": { 578 | "version": "2.1.0", 579 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 580 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 581 | }, 582 | "is-stream": { 583 | "version": "1.1.0", 584 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 585 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 586 | }, 587 | "is-typedarray": { 588 | "version": "1.0.0", 589 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 590 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 591 | }, 592 | "isstream": { 593 | "version": "0.1.2", 594 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 595 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 596 | }, 597 | "jsbn": { 598 | "version": "0.1.1", 599 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 600 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 601 | "optional": true 602 | }, 603 | "json-schema": { 604 | "version": "0.2.3", 605 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 606 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 607 | }, 608 | "json-schema-traverse": { 609 | "version": "0.3.1", 610 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 611 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 612 | }, 613 | "json-stringify-safe": { 614 | "version": "5.0.1", 615 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 616 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 617 | }, 618 | "jsprim": { 619 | "version": "1.4.1", 620 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 621 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 622 | "requires": { 623 | "assert-plus": "1.0.0", 624 | "extsprintf": "1.3.0", 625 | "json-schema": "0.2.3", 626 | "verror": "1.10.0" 627 | } 628 | }, 629 | "lodash": { 630 | "version": "4.17.10", 631 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 632 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 633 | }, 634 | "media-typer": { 635 | "version": "0.3.0", 636 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 637 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 638 | }, 639 | "merge-descriptors": { 640 | "version": "1.0.1", 641 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 642 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 643 | }, 644 | "methods": { 645 | "version": "1.1.2", 646 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 647 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 648 | }, 649 | "mime": { 650 | "version": "1.4.1", 651 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 652 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 653 | }, 654 | "mime-db": { 655 | "version": "1.33.0", 656 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 657 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 658 | }, 659 | "mime-types": { 660 | "version": "2.1.18", 661 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 662 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 663 | "requires": { 664 | "mime-db": "1.33.0" 665 | } 666 | }, 667 | "mimic-fn": { 668 | "version": "1.2.0", 669 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 670 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 671 | }, 672 | "minimist": { 673 | "version": "1.2.0", 674 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 675 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 676 | }, 677 | "ms": { 678 | "version": "2.0.0", 679 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 680 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 681 | }, 682 | "mute-stream": { 683 | "version": "0.0.7", 684 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 685 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 686 | }, 687 | "negotiator": { 688 | "version": "0.6.1", 689 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 690 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 691 | }, 692 | "node-fetch": { 693 | "version": "1.7.3", 694 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", 695 | "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", 696 | "requires": { 697 | "encoding": "0.1.12", 698 | "is-stream": "1.1.0" 699 | } 700 | }, 701 | "oauth-sign": { 702 | "version": "0.8.2", 703 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 704 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 705 | }, 706 | "object-assign": { 707 | "version": "4.1.1", 708 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 709 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 710 | }, 711 | "on-finished": { 712 | "version": "2.3.0", 713 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 714 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 715 | "requires": { 716 | "ee-first": "1.1.1" 717 | } 718 | }, 719 | "onetime": { 720 | "version": "2.0.1", 721 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 722 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 723 | "requires": { 724 | "mimic-fn": "1.2.0" 725 | } 726 | }, 727 | "opencollective": { 728 | "version": "1.0.3", 729 | "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", 730 | "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", 731 | "requires": { 732 | "babel-polyfill": "6.23.0", 733 | "chalk": "1.1.3", 734 | "inquirer": "3.0.6", 735 | "minimist": "1.2.0", 736 | "node-fetch": "1.6.3", 737 | "opn": "4.0.2" 738 | }, 739 | "dependencies": { 740 | "node-fetch": { 741 | "version": "1.6.3", 742 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", 743 | "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", 744 | "requires": { 745 | "encoding": "0.1.12", 746 | "is-stream": "1.1.0" 747 | } 748 | } 749 | } 750 | }, 751 | "opn": { 752 | "version": "4.0.2", 753 | "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", 754 | "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", 755 | "requires": { 756 | "object-assign": "4.1.1", 757 | "pinkie-promise": "2.0.1" 758 | } 759 | }, 760 | "os-tmpdir": { 761 | "version": "1.0.2", 762 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 763 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 764 | }, 765 | "parseurl": { 766 | "version": "1.3.2", 767 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 768 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 769 | }, 770 | "path-to-regexp": { 771 | "version": "0.1.7", 772 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 773 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 774 | }, 775 | "performance-now": { 776 | "version": "2.1.0", 777 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 778 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 779 | }, 780 | "pinkie": { 781 | "version": "2.0.4", 782 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 783 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 784 | }, 785 | "pinkie-promise": { 786 | "version": "2.0.1", 787 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 788 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 789 | "requires": { 790 | "pinkie": "2.0.4" 791 | } 792 | }, 793 | "proxy-addr": { 794 | "version": "2.0.3", 795 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 796 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 797 | "requires": { 798 | "forwarded": "0.1.2", 799 | "ipaddr.js": "1.6.0" 800 | } 801 | }, 802 | "punycode": { 803 | "version": "1.4.1", 804 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 805 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 806 | }, 807 | "qs": { 808 | "version": "6.5.1", 809 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 810 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 811 | }, 812 | "range-parser": { 813 | "version": "1.2.0", 814 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 815 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 816 | }, 817 | "raw-body": { 818 | "version": "2.3.2", 819 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 820 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 821 | "requires": { 822 | "bytes": "3.0.0", 823 | "http-errors": "1.6.2", 824 | "iconv-lite": "0.4.19", 825 | "unpipe": "1.0.0" 826 | }, 827 | "dependencies": { 828 | "depd": { 829 | "version": "1.1.1", 830 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 831 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 832 | }, 833 | "http-errors": { 834 | "version": "1.6.2", 835 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 836 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 837 | "requires": { 838 | "depd": "1.1.1", 839 | "inherits": "2.0.3", 840 | "setprototypeof": "1.0.3", 841 | "statuses": "1.4.0" 842 | } 843 | }, 844 | "iconv-lite": { 845 | "version": "0.4.19", 846 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 847 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 848 | }, 849 | "setprototypeof": { 850 | "version": "1.0.3", 851 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 852 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 853 | } 854 | } 855 | }, 856 | "regenerator-runtime": { 857 | "version": "0.10.5", 858 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", 859 | "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" 860 | }, 861 | "request": { 862 | "version": "2.85.0", 863 | "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", 864 | "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", 865 | "requires": { 866 | "aws-sign2": "0.7.0", 867 | "aws4": "1.7.0", 868 | "caseless": "0.12.0", 869 | "combined-stream": "1.0.6", 870 | "extend": "3.0.1", 871 | "forever-agent": "0.6.1", 872 | "form-data": "2.3.2", 873 | "har-validator": "5.0.3", 874 | "hawk": "6.0.2", 875 | "http-signature": "1.2.0", 876 | "is-typedarray": "1.0.0", 877 | "isstream": "0.1.2", 878 | "json-stringify-safe": "5.0.1", 879 | "mime-types": "2.1.18", 880 | "oauth-sign": "0.8.2", 881 | "performance-now": "2.1.0", 882 | "qs": "6.5.1", 883 | "safe-buffer": "5.1.2", 884 | "stringstream": "0.0.5", 885 | "tough-cookie": "2.3.4", 886 | "tunnel-agent": "0.6.0", 887 | "uuid": "3.2.1" 888 | } 889 | }, 890 | "restore-cursor": { 891 | "version": "2.0.0", 892 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 893 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 894 | "requires": { 895 | "onetime": "2.0.1", 896 | "signal-exit": "3.0.2" 897 | } 898 | }, 899 | "run-async": { 900 | "version": "2.3.0", 901 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 902 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 903 | "requires": { 904 | "is-promise": "2.1.0" 905 | } 906 | }, 907 | "rx": { 908 | "version": "4.1.0", 909 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", 910 | "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" 911 | }, 912 | "safe-buffer": { 913 | "version": "5.1.2", 914 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 915 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 916 | }, 917 | "safer-buffer": { 918 | "version": "2.1.2", 919 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 920 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 921 | }, 922 | "send": { 923 | "version": "0.16.2", 924 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 925 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 926 | "requires": { 927 | "debug": "2.6.9", 928 | "depd": "1.1.2", 929 | "destroy": "1.0.4", 930 | "encodeurl": "1.0.2", 931 | "escape-html": "1.0.3", 932 | "etag": "1.8.1", 933 | "fresh": "0.5.2", 934 | "http-errors": "1.6.3", 935 | "mime": "1.4.1", 936 | "ms": "2.0.0", 937 | "on-finished": "2.3.0", 938 | "range-parser": "1.2.0", 939 | "statuses": "1.4.0" 940 | } 941 | }, 942 | "serve-static": { 943 | "version": "1.13.2", 944 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 945 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 946 | "requires": { 947 | "encodeurl": "1.0.2", 948 | "escape-html": "1.0.3", 949 | "parseurl": "1.3.2", 950 | "send": "0.16.2" 951 | } 952 | }, 953 | "setprototypeof": { 954 | "version": "1.1.0", 955 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 956 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 957 | }, 958 | "signal-exit": { 959 | "version": "3.0.2", 960 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 961 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 962 | }, 963 | "sntp": { 964 | "version": "2.1.0", 965 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 966 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 967 | "requires": { 968 | "hoek": "4.2.1" 969 | } 970 | }, 971 | "sshpk": { 972 | "version": "1.14.1", 973 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 974 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", 975 | "requires": { 976 | "asn1": "0.2.3", 977 | "assert-plus": "1.0.0", 978 | "bcrypt-pbkdf": "1.0.1", 979 | "dashdash": "1.14.1", 980 | "ecc-jsbn": "0.1.1", 981 | "getpass": "0.1.7", 982 | "jsbn": "0.1.1", 983 | "tweetnacl": "0.14.5" 984 | } 985 | }, 986 | "statuses": { 987 | "version": "1.4.0", 988 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 989 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 990 | }, 991 | "string-width": { 992 | "version": "2.1.1", 993 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 994 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 995 | "requires": { 996 | "is-fullwidth-code-point": "2.0.0", 997 | "strip-ansi": "4.0.0" 998 | }, 999 | "dependencies": { 1000 | "ansi-regex": { 1001 | "version": "3.0.0", 1002 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1003 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 1004 | }, 1005 | "strip-ansi": { 1006 | "version": "4.0.0", 1007 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1008 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1009 | "requires": { 1010 | "ansi-regex": "3.0.0" 1011 | } 1012 | } 1013 | } 1014 | }, 1015 | "stringstream": { 1016 | "version": "0.0.5", 1017 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 1018 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 1019 | }, 1020 | "strip-ansi": { 1021 | "version": "3.0.1", 1022 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1023 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1024 | "requires": { 1025 | "ansi-regex": "2.1.1" 1026 | } 1027 | }, 1028 | "supports-color": { 1029 | "version": "2.0.0", 1030 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1031 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 1032 | }, 1033 | "through": { 1034 | "version": "2.3.8", 1035 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1036 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 1037 | }, 1038 | "tmp": { 1039 | "version": "0.0.33", 1040 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1041 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1042 | "requires": { 1043 | "os-tmpdir": "1.0.2" 1044 | } 1045 | }, 1046 | "tough-cookie": { 1047 | "version": "2.3.4", 1048 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 1049 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 1050 | "requires": { 1051 | "punycode": "1.4.1" 1052 | } 1053 | }, 1054 | "tunnel-agent": { 1055 | "version": "0.6.0", 1056 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1057 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1058 | "requires": { 1059 | "safe-buffer": "5.1.2" 1060 | } 1061 | }, 1062 | "tweetnacl": { 1063 | "version": "0.14.5", 1064 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1065 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1066 | "optional": true 1067 | }, 1068 | "type-is": { 1069 | "version": "1.6.16", 1070 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1071 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1072 | "requires": { 1073 | "media-typer": "0.3.0", 1074 | "mime-types": "2.1.18" 1075 | } 1076 | }, 1077 | "unpipe": { 1078 | "version": "1.0.0", 1079 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1080 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1081 | }, 1082 | "utils-merge": { 1083 | "version": "1.0.1", 1084 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1085 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1086 | }, 1087 | "uuid": { 1088 | "version": "3.2.1", 1089 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 1090 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 1091 | }, 1092 | "vary": { 1093 | "version": "1.1.2", 1094 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1095 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1096 | }, 1097 | "verror": { 1098 | "version": "1.10.0", 1099 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1100 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1101 | "requires": { 1102 | "assert-plus": "1.0.0", 1103 | "core-util-is": "1.0.2", 1104 | "extsprintf": "1.3.0" 1105 | } 1106 | } 1107 | } 1108 | } 1109 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ccxt-server", 3 | "version": "1.0.1", 4 | "description": "CCXT Node.js REST Server", 5 | "main": "index.js", 6 | "dependencies": { 7 | "ccxt": "^1.11", 8 | "express": "^4.16.3" 9 | }, 10 | "devDependencies": {}, 11 | "scripts": { 12 | "test": "echo \"Error: no test specified\" && exit 1", 13 | "ccxt-server": "bin/ccxt-server.js" 14 | }, 15 | "bin": { 16 | "ccxt-server": "bin/ccxt-server.js" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/mpakus/ccxt-server.git" 21 | }, 22 | "keywords": [ 23 | "ccxt", 24 | "cryptocurrency", 25 | "btc", 26 | "eth", 27 | "ltc", 28 | "usdt", 29 | "crypto" 30 | ], 31 | "author": "Ibragimov \"MpaK\" Renat (http://aomega.co)", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/mpakus/ccxt-server/issues" 35 | }, 36 | "homepage": "https://github.com/mpakus/ccxt-server#readme" 37 | } 38 | --------------------------------------------------------------------------------