├── .gitignore ├── README.md ├── config.EXAMPLE.json ├── db.js ├── header.png ├── icon.png ├── index.js ├── log.js ├── package-lock.json ├── package.json ├── routes ├── info.js ├── note.js └── user.js └── util ├── addUser.js ├── backup.js └── flush.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | config.json 3 | data 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Clipnote Server 2 | 3 | Server implementation for sharing animations created with [Clipnote Studio](https://calcium-chan.itch.io/clipnote). 4 | 5 | # Setup 6 | Run `npm install` to install the required packages and then start it with `npm start`. 7 | 8 | ## Config Setup 9 | Copy the example config file in /setup to the root directory and rename it to config.json. Change it as necessary. 10 | -------------------------------------------------------------------------------- /config.EXAMPLE.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2.00, 3 | 4 | "serverTitle": "Clipnote Server", 5 | "serverMOTD": "example clipnote server", 6 | "signupURL": "example.com/signup", 7 | 8 | "dbString": "REPLACE THIS WITH A MONGODB CONNECTION STRING", 9 | "dbName": "clip", 10 | 11 | "renderUploads": false, 12 | 13 | "uploadSizeLimit": 10000000, 14 | 15 | "port": 3000 16 | } 17 | -------------------------------------------------------------------------------- /db.js: -------------------------------------------------------------------------------- 1 | /* database functions */ 2 | const MongoClient = require('mongodb').MongoClient; 3 | const log = require('./log.js'); 4 | var db; 5 | module.exports = { 6 | connect: function(server, database) { 7 | MongoClient.connect(server, {useUnifiedTopology: true}, function(err, client) { 8 | if(err) throw err; 9 | else { 10 | db = client.db(database); 11 | log.info("Connected to database"); 12 | } 13 | }); 14 | }, 15 | 16 | listNotes: function(page, sort, max, cb) { 17 | if(max === undefined) max = 6; 18 | var skip = max * (page - 1); 19 | var order; 20 | switch(sort) { 21 | case 'time': 22 | order = {time: -1}; 23 | break; 24 | case 'score': 25 | order = {rating: -1}; 26 | break; 27 | default: 28 | order = {time: 1}; 29 | break; 30 | } 31 | db.collection("notes").find({}).toArray(function(err, res) { 32 | var total = Math.ceil(res.length / max); 33 | db.collection("notes").find({}, {projection: {_id: 0}}).skip(skip).limit(parseInt(max)).sort(order).toArray(function(error, result) { 34 | return cb(error, {notes: result, totalPages: total}); 35 | }); 36 | }); 37 | }, 38 | 39 | getNote: function(note, cb) { 40 | db.collection("notes").findOne({uuid: note}, {projection: {_id: 0}}, function(err, result) { 41 | return cb(err, result); 42 | }); 43 | }, 44 | 45 | insertNote: function(uuid, author, cb) { 46 | var obj = { 47 | uuid: uuid, 48 | author: author, 49 | locked: false, 50 | spinoff: false, 51 | rating: 0, 52 | time: new Date() 53 | } 54 | db.collection("notes").insertOne(obj, function(err, res) { 55 | if (err) throw err; 56 | return cb(err); 57 | }); 58 | }, 59 | 60 | getUser: function(username, cb) { 61 | db.collection("users").findOne({username: username}, {projection: {_id: 0, username: 1, permissions: 1, stars: 1, joinDate: 1}}, function (err, res) { 62 | return cb(err, res); 63 | }); 64 | }, 65 | 66 | getUserHash: function(username, cb) { 67 | db.collection("users").findOne({username: username}, {projection: {hash: 1}}, function(err, res) { 68 | if(res !== null) return cb(err, res['hash']); 69 | else return cb(err, null) 70 | }); 71 | }, 72 | }; -------------------------------------------------------------------------------- /header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1bpp/clipnote-server/1508d171c80177590327393da11471f045a53443/header.png -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1bpp/clipnote-server/1508d171c80177590327393da11471f045a53443/icon.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | /* clipnote server */ 2 | const express = require('express'); 3 | const cors = require('cors'); 4 | const fs = require('fs'); 5 | const app = express(); 6 | const db = require('./db.js'); 7 | const log = require('./log.js'); 8 | 9 | const config = JSON.parse(fs.readFileSync('./config.json')); 10 | 11 | /* routes */ 12 | const info = require('./routes/info.js'); 13 | const note = require('./routes/note.js'); 14 | const user = require ('./routes/user.js'); 15 | 16 | if (!fs.existsSync(__dirname + '/data')) { 17 | log.info('Data folders not found; creating') 18 | fs.mkdirSync(__dirname + '/data'); 19 | fs.mkdirSync(__dirname + '/data/notes'); 20 | fs.mkdirSync(__dirname + '/data/thumbnails'); 21 | } 22 | 23 | db.connect(config.dbString, config.dbName); 24 | 25 | app.use(cors()); 26 | 27 | app.use('/info', info); 28 | app.use('/note', note); 29 | app.use('/user', user); 30 | 31 | app.listen(config.port, () => log.info('Server version ' + config.version + ' started; running on port ' + config.port)); 32 | -------------------------------------------------------------------------------- /log.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | function timestamp() { 4 | var d = new Date(); 5 | return `[${d.toLocaleString()}]`; 6 | } 7 | 8 | module.exports = { 9 | info: function(message) { 10 | console.log(timestamp() + " [i] " + message); 11 | }, 12 | warn: function(message) { 13 | console.log(timestamp() + " [!] WARNING: " + message); 14 | }, 15 | error: function(message) { 16 | console.log(timestamp() + " [!!] ERROR: " + message); 17 | } 18 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clipshare", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "accepts": { 13 | "version": "1.3.7", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 15 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 16 | "requires": { 17 | "mime-types": "~2.1.24", 18 | "negotiator": "0.6.2" 19 | } 20 | }, 21 | "ansi-regex": { 22 | "version": "2.1.1", 23 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 24 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 25 | }, 26 | "append-field": { 27 | "version": "1.0.0", 28 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", 29 | "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" 30 | }, 31 | "aproba": { 32 | "version": "1.2.0", 33 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 34 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 35 | }, 36 | "are-we-there-yet": { 37 | "version": "1.1.5", 38 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 39 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 40 | "requires": { 41 | "delegates": "^1.0.0", 42 | "readable-stream": "^2.0.6" 43 | } 44 | }, 45 | "array-flatten": { 46 | "version": "1.1.1", 47 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 48 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 49 | }, 50 | "async": { 51 | "version": "0.9.2", 52 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 53 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" 54 | }, 55 | "balanced-match": { 56 | "version": "1.0.0", 57 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 58 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 59 | }, 60 | "basic-auth": { 61 | "version": "2.0.1", 62 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 63 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 64 | "requires": { 65 | "safe-buffer": "5.1.2" 66 | } 67 | }, 68 | "bcrypt": { 69 | "version": "5.0.0", 70 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", 71 | "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", 72 | "requires": { 73 | "node-addon-api": "^3.0.0", 74 | "node-pre-gyp": "0.15.0" 75 | } 76 | }, 77 | "big-integer": { 78 | "version": "1.6.48", 79 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", 80 | "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" 81 | }, 82 | "bignumber.js": { 83 | "version": "9.0.0", 84 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", 85 | "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" 86 | }, 87 | "binary": { 88 | "version": "0.3.0", 89 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 90 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 91 | "requires": { 92 | "buffers": "~0.1.1", 93 | "chainsaw": "~0.1.0" 94 | } 95 | }, 96 | "bl": { 97 | "version": "2.2.1", 98 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", 99 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", 100 | "requires": { 101 | "readable-stream": "^2.3.5", 102 | "safe-buffer": "^5.1.1" 103 | } 104 | }, 105 | "bluebird": { 106 | "version": "3.4.7", 107 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", 108 | "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" 109 | }, 110 | "body-parser": { 111 | "version": "1.19.0", 112 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 113 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 114 | "requires": { 115 | "bytes": "3.1.0", 116 | "content-type": "~1.0.4", 117 | "debug": "2.6.9", 118 | "depd": "~1.1.2", 119 | "http-errors": "1.7.2", 120 | "iconv-lite": "0.4.24", 121 | "on-finished": "~2.3.0", 122 | "qs": "6.7.0", 123 | "raw-body": "2.4.0", 124 | "type-is": "~1.6.17" 125 | } 126 | }, 127 | "brace-expansion": { 128 | "version": "1.1.11", 129 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 130 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 131 | "requires": { 132 | "balanced-match": "^1.0.0", 133 | "concat-map": "0.0.1" 134 | } 135 | }, 136 | "bson": { 137 | "version": "1.1.5", 138 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", 139 | "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" 140 | }, 141 | "buffer-from": { 142 | "version": "1.1.1", 143 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 144 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 145 | }, 146 | "buffer-indexof-polyfill": { 147 | "version": "1.0.2", 148 | "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", 149 | "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" 150 | }, 151 | "buffers": { 152 | "version": "0.1.1", 153 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 154 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 155 | }, 156 | "busboy": { 157 | "version": "0.2.14", 158 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", 159 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", 160 | "requires": { 161 | "dicer": "0.2.5", 162 | "readable-stream": "1.1.x" 163 | }, 164 | "dependencies": { 165 | "isarray": { 166 | "version": "0.0.1", 167 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 168 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 169 | }, 170 | "readable-stream": { 171 | "version": "1.1.14", 172 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 173 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 174 | "requires": { 175 | "core-util-is": "~1.0.0", 176 | "inherits": "~2.0.1", 177 | "isarray": "0.0.1", 178 | "string_decoder": "~0.10.x" 179 | } 180 | }, 181 | "string_decoder": { 182 | "version": "0.10.31", 183 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 184 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 185 | } 186 | } 187 | }, 188 | "bytes": { 189 | "version": "3.1.0", 190 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 191 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 192 | }, 193 | "chainsaw": { 194 | "version": "0.1.0", 195 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 196 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 197 | "requires": { 198 | "traverse": ">=0.3.0 <0.4" 199 | } 200 | }, 201 | "chownr": { 202 | "version": "1.1.4", 203 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 204 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 205 | }, 206 | "code-point-at": { 207 | "version": "1.1.0", 208 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 209 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 210 | }, 211 | "colors": { 212 | "version": "1.4.0", 213 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 214 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 215 | }, 216 | "concat-map": { 217 | "version": "0.0.1", 218 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 219 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 220 | }, 221 | "concat-stream": { 222 | "version": "1.6.2", 223 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 224 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 225 | "requires": { 226 | "buffer-from": "^1.0.0", 227 | "inherits": "^2.0.3", 228 | "readable-stream": "^2.2.2", 229 | "typedarray": "^0.0.6" 230 | } 231 | }, 232 | "console-control-strings": { 233 | "version": "1.1.0", 234 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 235 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 236 | }, 237 | "content-disposition": { 238 | "version": "0.5.3", 239 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 240 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 241 | "requires": { 242 | "safe-buffer": "5.1.2" 243 | } 244 | }, 245 | "content-type": { 246 | "version": "1.0.4", 247 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 248 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 249 | }, 250 | "cookie": { 251 | "version": "0.4.0", 252 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 253 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 254 | }, 255 | "cookie-signature": { 256 | "version": "1.0.6", 257 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 258 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 259 | }, 260 | "core-util-is": { 261 | "version": "1.0.2", 262 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 263 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 264 | }, 265 | "cors": { 266 | "version": "2.8.5", 267 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 268 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 269 | "requires": { 270 | "object-assign": "^4", 271 | "vary": "^1" 272 | } 273 | }, 274 | "cycle": { 275 | "version": "1.0.3", 276 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 277 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 278 | }, 279 | "debug": { 280 | "version": "2.6.9", 281 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 282 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 283 | "requires": { 284 | "ms": "2.0.0" 285 | } 286 | }, 287 | "deep-equal": { 288 | "version": "0.2.2", 289 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", 290 | "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" 291 | }, 292 | "deep-extend": { 293 | "version": "0.6.0", 294 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 295 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 296 | }, 297 | "delegates": { 298 | "version": "1.0.0", 299 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 300 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 301 | }, 302 | "denque": { 303 | "version": "1.4.1", 304 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 305 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 306 | }, 307 | "depd": { 308 | "version": "1.1.2", 309 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 310 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 311 | }, 312 | "destroy": { 313 | "version": "1.0.4", 314 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 315 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 316 | }, 317 | "detect-libc": { 318 | "version": "1.0.3", 319 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 320 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 321 | }, 322 | "dicer": { 323 | "version": "0.2.5", 324 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", 325 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", 326 | "requires": { 327 | "readable-stream": "1.1.x", 328 | "streamsearch": "0.1.2" 329 | }, 330 | "dependencies": { 331 | "isarray": { 332 | "version": "0.0.1", 333 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 334 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 335 | }, 336 | "readable-stream": { 337 | "version": "1.1.14", 338 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 339 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 340 | "requires": { 341 | "core-util-is": "~1.0.0", 342 | "inherits": "~2.0.1", 343 | "isarray": "0.0.1", 344 | "string_decoder": "~0.10.x" 345 | } 346 | }, 347 | "string_decoder": { 348 | "version": "0.10.31", 349 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 350 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 351 | } 352 | } 353 | }, 354 | "duplexer2": { 355 | "version": "0.1.4", 356 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 357 | "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", 358 | "requires": { 359 | "readable-stream": "^2.0.2" 360 | } 361 | }, 362 | "ee-first": { 363 | "version": "1.1.1", 364 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 365 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 366 | }, 367 | "encodeurl": { 368 | "version": "1.0.2", 369 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 370 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 371 | }, 372 | "escape-html": { 373 | "version": "1.0.3", 374 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 375 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 376 | }, 377 | "etag": { 378 | "version": "1.8.1", 379 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 380 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 381 | }, 382 | "express": { 383 | "version": "4.17.1", 384 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 385 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 386 | "requires": { 387 | "accepts": "~1.3.7", 388 | "array-flatten": "1.1.1", 389 | "body-parser": "1.19.0", 390 | "content-disposition": "0.5.3", 391 | "content-type": "~1.0.4", 392 | "cookie": "0.4.0", 393 | "cookie-signature": "1.0.6", 394 | "debug": "2.6.9", 395 | "depd": "~1.1.2", 396 | "encodeurl": "~1.0.2", 397 | "escape-html": "~1.0.3", 398 | "etag": "~1.8.1", 399 | "finalhandler": "~1.1.2", 400 | "fresh": "0.5.2", 401 | "merge-descriptors": "1.0.1", 402 | "methods": "~1.1.2", 403 | "on-finished": "~2.3.0", 404 | "parseurl": "~1.3.3", 405 | "path-to-regexp": "0.1.7", 406 | "proxy-addr": "~2.0.5", 407 | "qs": "6.7.0", 408 | "range-parser": "~1.2.1", 409 | "safe-buffer": "5.1.2", 410 | "send": "0.17.1", 411 | "serve-static": "1.14.1", 412 | "setprototypeof": "1.1.1", 413 | "statuses": "~1.5.0", 414 | "type-is": "~1.6.18", 415 | "utils-merge": "1.0.1", 416 | "vary": "~1.1.2" 417 | } 418 | }, 419 | "express-basic-auth": { 420 | "version": "1.2.0", 421 | "resolved": "https://registry.npmjs.org/express-basic-auth/-/express-basic-auth-1.2.0.tgz", 422 | "integrity": "sha512-iJ0h1Gk6fZRrFmO7tP9nIbxwNgCUJASfNj5fb0Hy15lGtbqqsxpt7609+wq+0XlByZjXmC/rslWQtnuSTVRIcg==", 423 | "requires": { 424 | "basic-auth": "^2.0.1" 425 | } 426 | }, 427 | "eyes": { 428 | "version": "0.1.8", 429 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 430 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 431 | }, 432 | "finalhandler": { 433 | "version": "1.1.2", 434 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 435 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 436 | "requires": { 437 | "debug": "2.6.9", 438 | "encodeurl": "~1.0.2", 439 | "escape-html": "~1.0.3", 440 | "on-finished": "~2.3.0", 441 | "parseurl": "~1.3.3", 442 | "statuses": "~1.5.0", 443 | "unpipe": "~1.0.0" 444 | } 445 | }, 446 | "forwarded": { 447 | "version": "0.1.2", 448 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 449 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 450 | }, 451 | "fresh": { 452 | "version": "0.5.2", 453 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 454 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 455 | }, 456 | "fs-minipass": { 457 | "version": "1.2.7", 458 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 459 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 460 | "requires": { 461 | "minipass": "^2.6.0" 462 | } 463 | }, 464 | "fs.realpath": { 465 | "version": "1.0.0", 466 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 467 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 468 | }, 469 | "fstream": { 470 | "version": "1.0.12", 471 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", 472 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", 473 | "requires": { 474 | "graceful-fs": "^4.1.2", 475 | "inherits": "~2.0.0", 476 | "mkdirp": ">=0.5 0", 477 | "rimraf": "2" 478 | }, 479 | "dependencies": { 480 | "rimraf": { 481 | "version": "2.7.1", 482 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 483 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 484 | "requires": { 485 | "glob": "^7.1.3" 486 | } 487 | } 488 | } 489 | }, 490 | "gauge": { 491 | "version": "2.7.4", 492 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 493 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 494 | "requires": { 495 | "aproba": "^1.0.3", 496 | "console-control-strings": "^1.0.0", 497 | "has-unicode": "^2.0.0", 498 | "object-assign": "^4.1.0", 499 | "signal-exit": "^3.0.0", 500 | "string-width": "^1.0.1", 501 | "strip-ansi": "^3.0.1", 502 | "wide-align": "^1.1.0" 503 | } 504 | }, 505 | "glob": { 506 | "version": "7.1.6", 507 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 508 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 509 | "requires": { 510 | "fs.realpath": "^1.0.0", 511 | "inflight": "^1.0.4", 512 | "inherits": "2", 513 | "minimatch": "^3.0.4", 514 | "once": "^1.3.0", 515 | "path-is-absolute": "^1.0.0" 516 | } 517 | }, 518 | "graceful-fs": { 519 | "version": "4.2.4", 520 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", 521 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" 522 | }, 523 | "has-unicode": { 524 | "version": "2.0.1", 525 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 526 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 527 | }, 528 | "http-errors": { 529 | "version": "1.7.2", 530 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 531 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 532 | "requires": { 533 | "depd": "~1.1.2", 534 | "inherits": "2.0.3", 535 | "setprototypeof": "1.1.1", 536 | "statuses": ">= 1.5.0 < 2", 537 | "toidentifier": "1.0.0" 538 | } 539 | }, 540 | "i": { 541 | "version": "0.3.6", 542 | "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", 543 | "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" 544 | }, 545 | "iconv-lite": { 546 | "version": "0.4.24", 547 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 548 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 549 | "requires": { 550 | "safer-buffer": ">= 2.1.2 < 3" 551 | } 552 | }, 553 | "ignore-walk": { 554 | "version": "3.0.3", 555 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 556 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 557 | "requires": { 558 | "minimatch": "^3.0.4" 559 | } 560 | }, 561 | "inflight": { 562 | "version": "1.0.6", 563 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 564 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 565 | "requires": { 566 | "once": "^1.3.0", 567 | "wrappy": "1" 568 | } 569 | }, 570 | "inherits": { 571 | "version": "2.0.3", 572 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 573 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 574 | }, 575 | "ini": { 576 | "version": "1.3.7", 577 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", 578 | "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" 579 | }, 580 | "ipaddr.js": { 581 | "version": "1.9.1", 582 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 583 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 584 | }, 585 | "is-fullwidth-code-point": { 586 | "version": "1.0.0", 587 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 588 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 589 | "requires": { 590 | "number-is-nan": "^1.0.0" 591 | } 592 | }, 593 | "isarray": { 594 | "version": "1.0.0", 595 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 596 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 597 | }, 598 | "isstream": { 599 | "version": "0.1.2", 600 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 601 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 602 | }, 603 | "listenercount": { 604 | "version": "1.0.1", 605 | "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", 606 | "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" 607 | }, 608 | "media-typer": { 609 | "version": "0.3.0", 610 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 611 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 612 | }, 613 | "memory-pager": { 614 | "version": "1.5.0", 615 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 616 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", 617 | "optional": true 618 | }, 619 | "merge-descriptors": { 620 | "version": "1.0.1", 621 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 622 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 623 | }, 624 | "methods": { 625 | "version": "1.1.2", 626 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 627 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 628 | }, 629 | "mime": { 630 | "version": "1.6.0", 631 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 632 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 633 | }, 634 | "mime-db": { 635 | "version": "1.44.0", 636 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 637 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 638 | }, 639 | "mime-types": { 640 | "version": "2.1.27", 641 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 642 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 643 | "requires": { 644 | "mime-db": "1.44.0" 645 | } 646 | }, 647 | "minimatch": { 648 | "version": "3.0.4", 649 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 650 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 651 | "requires": { 652 | "brace-expansion": "^1.1.7" 653 | } 654 | }, 655 | "minimist": { 656 | "version": "1.2.5", 657 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 658 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 659 | }, 660 | "minipass": { 661 | "version": "2.9.0", 662 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 663 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 664 | "requires": { 665 | "safe-buffer": "^5.1.2", 666 | "yallist": "^3.0.0" 667 | } 668 | }, 669 | "minizlib": { 670 | "version": "1.3.3", 671 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 672 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 673 | "requires": { 674 | "minipass": "^2.9.0" 675 | } 676 | }, 677 | "mkdirp": { 678 | "version": "0.5.5", 679 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 680 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 681 | "requires": { 682 | "minimist": "^1.2.5" 683 | } 684 | }, 685 | "mongodb": { 686 | "version": "3.6.2", 687 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", 688 | "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", 689 | "requires": { 690 | "bl": "^2.2.1", 691 | "bson": "^1.1.4", 692 | "denque": "^1.4.1", 693 | "require_optional": "^1.0.1", 694 | "safe-buffer": "^5.1.2", 695 | "saslprep": "^1.0.0" 696 | } 697 | }, 698 | "ms": { 699 | "version": "2.0.0", 700 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 701 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 702 | }, 703 | "multer": { 704 | "version": "1.4.2", 705 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", 706 | "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", 707 | "requires": { 708 | "append-field": "^1.0.0", 709 | "busboy": "^0.2.11", 710 | "concat-stream": "^1.5.2", 711 | "mkdirp": "^0.5.1", 712 | "object-assign": "^4.1.1", 713 | "on-finished": "^2.3.0", 714 | "type-is": "^1.6.4", 715 | "xtend": "^4.0.0" 716 | } 717 | }, 718 | "mute-stream": { 719 | "version": "0.0.8", 720 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 721 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 722 | }, 723 | "mysql": { 724 | "version": "2.18.1", 725 | "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", 726 | "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", 727 | "requires": { 728 | "bignumber.js": "9.0.0", 729 | "readable-stream": "2.3.7", 730 | "safe-buffer": "5.1.2", 731 | "sqlstring": "2.3.1" 732 | } 733 | }, 734 | "ncp": { 735 | "version": "1.0.1", 736 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", 737 | "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" 738 | }, 739 | "needle": { 740 | "version": "2.5.2", 741 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", 742 | "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", 743 | "requires": { 744 | "debug": "^3.2.6", 745 | "iconv-lite": "^0.4.4", 746 | "sax": "^1.2.4" 747 | }, 748 | "dependencies": { 749 | "debug": { 750 | "version": "3.2.6", 751 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 752 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 753 | "requires": { 754 | "ms": "^2.1.1" 755 | } 756 | }, 757 | "ms": { 758 | "version": "2.1.2", 759 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 760 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 761 | } 762 | } 763 | }, 764 | "negotiator": { 765 | "version": "0.6.2", 766 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 767 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 768 | }, 769 | "node-addon-api": { 770 | "version": "3.0.2", 771 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", 772 | "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" 773 | }, 774 | "node-pre-gyp": { 775 | "version": "0.15.0", 776 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", 777 | "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", 778 | "requires": { 779 | "detect-libc": "^1.0.2", 780 | "mkdirp": "^0.5.3", 781 | "needle": "^2.5.0", 782 | "nopt": "^4.0.1", 783 | "npm-packlist": "^1.1.6", 784 | "npmlog": "^4.0.2", 785 | "rc": "^1.2.7", 786 | "rimraf": "^2.6.1", 787 | "semver": "^5.3.0", 788 | "tar": "^4.4.2" 789 | }, 790 | "dependencies": { 791 | "rimraf": { 792 | "version": "2.7.1", 793 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 794 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 795 | "requires": { 796 | "glob": "^7.1.3" 797 | } 798 | } 799 | } 800 | }, 801 | "nopt": { 802 | "version": "4.0.3", 803 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 804 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 805 | "requires": { 806 | "abbrev": "1", 807 | "osenv": "^0.1.4" 808 | } 809 | }, 810 | "npm-bundled": { 811 | "version": "1.1.1", 812 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 813 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 814 | "requires": { 815 | "npm-normalize-package-bin": "^1.0.1" 816 | } 817 | }, 818 | "npm-normalize-package-bin": { 819 | "version": "1.0.1", 820 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 821 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 822 | }, 823 | "npm-packlist": { 824 | "version": "1.4.8", 825 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", 826 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", 827 | "requires": { 828 | "ignore-walk": "^3.0.1", 829 | "npm-bundled": "^1.0.1", 830 | "npm-normalize-package-bin": "^1.0.1" 831 | } 832 | }, 833 | "npmlog": { 834 | "version": "4.1.2", 835 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 836 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 837 | "requires": { 838 | "are-we-there-yet": "~1.1.2", 839 | "console-control-strings": "~1.1.0", 840 | "gauge": "~2.7.3", 841 | "set-blocking": "~2.0.0" 842 | } 843 | }, 844 | "number-is-nan": { 845 | "version": "1.0.1", 846 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 847 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 848 | }, 849 | "object-assign": { 850 | "version": "4.1.1", 851 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 852 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 853 | }, 854 | "on-finished": { 855 | "version": "2.3.0", 856 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 857 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 858 | "requires": { 859 | "ee-first": "1.1.1" 860 | } 861 | }, 862 | "once": { 863 | "version": "1.4.0", 864 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 865 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 866 | "requires": { 867 | "wrappy": "1" 868 | } 869 | }, 870 | "os-homedir": { 871 | "version": "1.0.2", 872 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 873 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 874 | }, 875 | "os-tmpdir": { 876 | "version": "1.0.2", 877 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 878 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 879 | }, 880 | "osenv": { 881 | "version": "0.1.5", 882 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 883 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 884 | "requires": { 885 | "os-homedir": "^1.0.0", 886 | "os-tmpdir": "^1.0.0" 887 | } 888 | }, 889 | "parseurl": { 890 | "version": "1.3.3", 891 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 892 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 893 | }, 894 | "path-is-absolute": { 895 | "version": "1.0.1", 896 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 897 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 898 | }, 899 | "path-to-regexp": { 900 | "version": "0.1.7", 901 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 902 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 903 | }, 904 | "pkginfo": { 905 | "version": "0.4.1", 906 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", 907 | "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" 908 | }, 909 | "process-nextick-args": { 910 | "version": "2.0.1", 911 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 912 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 913 | }, 914 | "prompt": { 915 | "version": "1.0.0", 916 | "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", 917 | "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", 918 | "requires": { 919 | "colors": "^1.1.2", 920 | "pkginfo": "0.x.x", 921 | "read": "1.0.x", 922 | "revalidator": "0.1.x", 923 | "utile": "0.3.x", 924 | "winston": "2.1.x" 925 | } 926 | }, 927 | "proxy-addr": { 928 | "version": "2.0.6", 929 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 930 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 931 | "requires": { 932 | "forwarded": "~0.1.2", 933 | "ipaddr.js": "1.9.1" 934 | } 935 | }, 936 | "qs": { 937 | "version": "6.7.0", 938 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 939 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 940 | }, 941 | "range-parser": { 942 | "version": "1.2.1", 943 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 944 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 945 | }, 946 | "raw-body": { 947 | "version": "2.4.0", 948 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 949 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 950 | "requires": { 951 | "bytes": "3.1.0", 952 | "http-errors": "1.7.2", 953 | "iconv-lite": "0.4.24", 954 | "unpipe": "1.0.0" 955 | } 956 | }, 957 | "rc": { 958 | "version": "1.2.8", 959 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 960 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 961 | "requires": { 962 | "deep-extend": "^0.6.0", 963 | "ini": "~1.3.0", 964 | "minimist": "^1.2.0", 965 | "strip-json-comments": "~2.0.1" 966 | } 967 | }, 968 | "read": { 969 | "version": "1.0.7", 970 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 971 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 972 | "requires": { 973 | "mute-stream": "~0.0.4" 974 | } 975 | }, 976 | "readable-stream": { 977 | "version": "2.3.7", 978 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 979 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 980 | "requires": { 981 | "core-util-is": "~1.0.0", 982 | "inherits": "~2.0.3", 983 | "isarray": "~1.0.0", 984 | "process-nextick-args": "~2.0.0", 985 | "safe-buffer": "~5.1.1", 986 | "string_decoder": "~1.1.1", 987 | "util-deprecate": "~1.0.1" 988 | } 989 | }, 990 | "require_optional": { 991 | "version": "1.0.1", 992 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 993 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 994 | "requires": { 995 | "resolve-from": "^2.0.0", 996 | "semver": "^5.1.0" 997 | } 998 | }, 999 | "resolve-from": { 1000 | "version": "2.0.0", 1001 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1002 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1003 | }, 1004 | "revalidator": { 1005 | "version": "0.1.8", 1006 | "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", 1007 | "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" 1008 | }, 1009 | "rimraf": { 1010 | "version": "3.0.2", 1011 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1012 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1013 | "requires": { 1014 | "glob": "^7.1.3" 1015 | } 1016 | }, 1017 | "safe-buffer": { 1018 | "version": "5.1.2", 1019 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1020 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1021 | }, 1022 | "safer-buffer": { 1023 | "version": "2.1.2", 1024 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1025 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1026 | }, 1027 | "saslprep": { 1028 | "version": "1.0.3", 1029 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", 1030 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", 1031 | "optional": true, 1032 | "requires": { 1033 | "sparse-bitfield": "^3.0.3" 1034 | } 1035 | }, 1036 | "sax": { 1037 | "version": "1.2.4", 1038 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1039 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1040 | }, 1041 | "semver": { 1042 | "version": "5.7.1", 1043 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1044 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1045 | }, 1046 | "send": { 1047 | "version": "0.17.1", 1048 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 1049 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 1050 | "requires": { 1051 | "debug": "2.6.9", 1052 | "depd": "~1.1.2", 1053 | "destroy": "~1.0.4", 1054 | "encodeurl": "~1.0.2", 1055 | "escape-html": "~1.0.3", 1056 | "etag": "~1.8.1", 1057 | "fresh": "0.5.2", 1058 | "http-errors": "~1.7.2", 1059 | "mime": "1.6.0", 1060 | "ms": "2.1.1", 1061 | "on-finished": "~2.3.0", 1062 | "range-parser": "~1.2.1", 1063 | "statuses": "~1.5.0" 1064 | }, 1065 | "dependencies": { 1066 | "ms": { 1067 | "version": "2.1.1", 1068 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1069 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1070 | } 1071 | } 1072 | }, 1073 | "serve-static": { 1074 | "version": "1.14.1", 1075 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1076 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1077 | "requires": { 1078 | "encodeurl": "~1.0.2", 1079 | "escape-html": "~1.0.3", 1080 | "parseurl": "~1.3.3", 1081 | "send": "0.17.1" 1082 | } 1083 | }, 1084 | "set-blocking": { 1085 | "version": "2.0.0", 1086 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1087 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1088 | }, 1089 | "setimmediate": { 1090 | "version": "1.0.5", 1091 | "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", 1092 | "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" 1093 | }, 1094 | "setprototypeof": { 1095 | "version": "1.1.1", 1096 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1097 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1098 | }, 1099 | "signal-exit": { 1100 | "version": "3.0.3", 1101 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 1102 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 1103 | }, 1104 | "sparse-bitfield": { 1105 | "version": "3.0.3", 1106 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 1107 | "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", 1108 | "optional": true, 1109 | "requires": { 1110 | "memory-pager": "^1.0.2" 1111 | } 1112 | }, 1113 | "sqlstring": { 1114 | "version": "2.3.1", 1115 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1116 | "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 1117 | }, 1118 | "stack-trace": { 1119 | "version": "0.0.10", 1120 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1121 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 1122 | }, 1123 | "statuses": { 1124 | "version": "1.5.0", 1125 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1126 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1127 | }, 1128 | "streamsearch": { 1129 | "version": "0.1.2", 1130 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", 1131 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" 1132 | }, 1133 | "string-width": { 1134 | "version": "1.0.2", 1135 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1136 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1137 | "requires": { 1138 | "code-point-at": "^1.0.0", 1139 | "is-fullwidth-code-point": "^1.0.0", 1140 | "strip-ansi": "^3.0.0" 1141 | } 1142 | }, 1143 | "string_decoder": { 1144 | "version": "1.1.1", 1145 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1146 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1147 | "requires": { 1148 | "safe-buffer": "~5.1.0" 1149 | } 1150 | }, 1151 | "strip-ansi": { 1152 | "version": "3.0.1", 1153 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1154 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1155 | "requires": { 1156 | "ansi-regex": "^2.0.0" 1157 | } 1158 | }, 1159 | "strip-json-comments": { 1160 | "version": "2.0.1", 1161 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1162 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1163 | }, 1164 | "tar": { 1165 | "version": "4.4.13", 1166 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 1167 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 1168 | "requires": { 1169 | "chownr": "^1.1.1", 1170 | "fs-minipass": "^1.2.5", 1171 | "minipass": "^2.8.6", 1172 | "minizlib": "^1.2.1", 1173 | "mkdirp": "^0.5.0", 1174 | "safe-buffer": "^5.1.2", 1175 | "yallist": "^3.0.3" 1176 | } 1177 | }, 1178 | "toidentifier": { 1179 | "version": "1.0.0", 1180 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1181 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1182 | }, 1183 | "traverse": { 1184 | "version": "0.3.9", 1185 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 1186 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 1187 | }, 1188 | "type-is": { 1189 | "version": "1.6.18", 1190 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1191 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1192 | "requires": { 1193 | "media-typer": "0.3.0", 1194 | "mime-types": "~2.1.24" 1195 | } 1196 | }, 1197 | "typedarray": { 1198 | "version": "0.0.6", 1199 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1200 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1201 | }, 1202 | "unpipe": { 1203 | "version": "1.0.0", 1204 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1205 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1206 | }, 1207 | "unzipper": { 1208 | "version": "0.9.15", 1209 | "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.9.15.tgz", 1210 | "integrity": "sha512-2aaUvO4RAeHDvOCuEtth7jrHFaCKTSXPqUkXwADaLBzGbgZGzUDccoEdJ5lW+3RmfpOZYNx0Rw6F6PUzM6caIA==", 1211 | "requires": { 1212 | "big-integer": "^1.6.17", 1213 | "binary": "~0.3.0", 1214 | "bluebird": "~3.4.1", 1215 | "buffer-indexof-polyfill": "~1.0.0", 1216 | "duplexer2": "~0.1.4", 1217 | "fstream": "^1.0.12", 1218 | "listenercount": "~1.0.1", 1219 | "readable-stream": "~2.3.6", 1220 | "setimmediate": "~1.0.4" 1221 | } 1222 | }, 1223 | "util-deprecate": { 1224 | "version": "1.0.2", 1225 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1226 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1227 | }, 1228 | "utile": { 1229 | "version": "0.3.0", 1230 | "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", 1231 | "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", 1232 | "requires": { 1233 | "async": "~0.9.0", 1234 | "deep-equal": "~0.2.1", 1235 | "i": "0.3.x", 1236 | "mkdirp": "0.x.x", 1237 | "ncp": "1.0.x", 1238 | "rimraf": "2.x.x" 1239 | }, 1240 | "dependencies": { 1241 | "rimraf": { 1242 | "version": "2.7.1", 1243 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1244 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1245 | "requires": { 1246 | "glob": "^7.1.3" 1247 | } 1248 | } 1249 | } 1250 | }, 1251 | "utils-merge": { 1252 | "version": "1.0.1", 1253 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1254 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1255 | }, 1256 | "uuid": { 1257 | "version": "3.4.0", 1258 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 1259 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1260 | }, 1261 | "vary": { 1262 | "version": "1.1.2", 1263 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1264 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1265 | }, 1266 | "wide-align": { 1267 | "version": "1.1.3", 1268 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1269 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1270 | "requires": { 1271 | "string-width": "^1.0.2 || 2" 1272 | } 1273 | }, 1274 | "winston": { 1275 | "version": "2.1.1", 1276 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz", 1277 | "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", 1278 | "requires": { 1279 | "async": "~1.0.0", 1280 | "colors": "1.0.x", 1281 | "cycle": "1.0.x", 1282 | "eyes": "0.1.x", 1283 | "isstream": "0.1.x", 1284 | "pkginfo": "0.3.x", 1285 | "stack-trace": "0.0.x" 1286 | }, 1287 | "dependencies": { 1288 | "async": { 1289 | "version": "1.0.0", 1290 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 1291 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 1292 | }, 1293 | "colors": { 1294 | "version": "1.0.3", 1295 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 1296 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 1297 | }, 1298 | "pkginfo": { 1299 | "version": "0.3.1", 1300 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 1301 | "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" 1302 | } 1303 | } 1304 | }, 1305 | "wrappy": { 1306 | "version": "1.0.2", 1307 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1308 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1309 | }, 1310 | "xtend": { 1311 | "version": "4.0.2", 1312 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1313 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1314 | }, 1315 | "yallist": { 1316 | "version": "3.1.1", 1317 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1318 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1319 | } 1320 | } 1321 | } 1322 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "clipshare", 3 | "version": "1.0.0", 4 | "description": "clipnote hatena", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/zxczxcxzc/clipnote-share.git" 13 | }, 14 | "author": "", 15 | "license": "ISC", 16 | "bugs": { 17 | "url": "https://github.com/zxczxcxzc/clipnote-share/issues" 18 | }, 19 | "homepage": "https://github.com/zxczxcxzc/clipnote-share#readme", 20 | "dependencies": { 21 | "bcrypt": "^5.0.0", 22 | "body-parser": "^1.18.3", 23 | "cors": "^2.8.5", 24 | "express": "^4.16.4", 25 | "express-basic-auth": "^1.2.0", 26 | "mongodb": "^3.4.1", 27 | "multer": "^1.4.1", 28 | "mysql": "^2.16.0", 29 | "prompt": "^1.0.0", 30 | "rimraf": "^3.0.0", 31 | "unzipper": "^0.9.11", 32 | "uuid": "^3.3.2" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /routes/info.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const fs = require('fs'); 3 | const config = JSON.parse(fs.readFileSync('./config.json')); 4 | const router = express.Router(); 5 | 6 | 7 | router.get('/', (req, res) => { 8 | res.json({ title: config.serverTitle, motd: config.serverMOTD, version: config.version, signup: config.signupURL }); 9 | }); 10 | 11 | router.get('/icon', (req, res) => { 12 | res.sendFile('icon.png', { root: '.' }); 13 | }); 14 | 15 | router.get('/header', (req, res) => { 16 | res.sendFile('header.png', { root: '.'}); 17 | }); 18 | 19 | module.exports = router; -------------------------------------------------------------------------------- /routes/note.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const multer = require('multer'); 3 | const zip = require('unzipper'); 4 | const uuidv4 = require('uuid/v4'); 5 | const fs = require('fs'); 6 | const db = require('../db'); 7 | const config = JSON.parse(fs.readFileSync('./config.json')); 8 | const router = express.Router(); 9 | 10 | 11 | router.get('/list', (req, res) => { 12 | db.listNotes(req.query.page, req.query.sort, req.query.max, (err, notes) => { 13 | res.json(notes); 14 | }); 15 | }); 16 | 17 | router.get('/info/:noteId', (req, res) => { 18 | db.getNote(req.params.noteId, (err, note) => { 19 | if(note === null || err) res.sendStatus(404); 20 | else res.json(note); 21 | }); 22 | }); 23 | 24 | router.get('/thumbnail/:noteId', (req, res) => { 25 | db.getNote(req.params.noteId, (err, note) => { 26 | if(note !== null) { 27 | fs.access('data/thumbnails/' + req.params.noteId + '.png', fs.F_OK, (err) => { 28 | if(err) res.sendStatus(404); 29 | else res.sendFile(req.params.noteId + '.png', { root: 'data/thumbnails/' }); 30 | }); 31 | } else res.sendStatus(404); 32 | }); 33 | }); 34 | 35 | router.get('/download/:noteId', (req, res) => { 36 | var id = req.params.noteId; 37 | if(id.endsWith('.clip')) 38 | id = id.split('.clip')[0]; 39 | 40 | db.getNote(id, (err, note) => { 41 | if(note !== null) 42 | res.download(__dirname + '/../data/notes/' + id, id + '.clip'); 43 | else res.sendStatus(404); 44 | }); 45 | }); 46 | 47 | module.exports = router; -------------------------------------------------------------------------------- /routes/user.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const bcrypt = require('bcrypt'); 3 | const basicAuth = require('express-basic-auth'); 4 | const bodyParser = require('body-parser'); 5 | const multer = require('multer'); 6 | const zip = require('unzipper'); 7 | const uuidv4 = require('uuid/v4'); 8 | const fs = require('fs'); 9 | const db = require('../db'); 10 | const config = JSON.parse(fs.readFileSync('./config.json')); 11 | const log = require('../log'); 12 | const router = express.Router(); 13 | 14 | router.use(bodyParser.urlencoded({ extended: false })); 15 | router.use(bodyParser.json()); 16 | 17 | router.use(basicAuth({ 18 | authorizer: authorizer, 19 | authorizeAsync: true, 20 | unauthorizedResponse: getUnauthorizedResponse 21 | })); 22 | 23 | function authorizer(username, password, cb) { 24 | db.getUserHash(username, (err, hash) => { 25 | if(err || hash === null) 26 | return cb(null, false); 27 | else bcrypt.compare(password, hash).then(function(res) { 28 | return cb(null, res); 29 | }); 30 | }); 31 | } 32 | 33 | function getUnauthorizedResponse(req) { 34 | return "Authorization Error"; 35 | } 36 | 37 | var storage = multer.diskStorage({ 38 | destination: function (req, file, cb) { 39 | cb(null, 'data/notes'); 40 | }, 41 | filename: function (req, file, cb) { 42 | cb(null, uuidv4()); 43 | } 44 | }); 45 | var upload = multer({ storage: storage, limits: { fileSize: config.uploadSizeLimit } }); 46 | 47 | router.get('/profile/:id', (req, res) => { 48 | db.getUser(req.params.id, (err, profile) => { 49 | res.json(profile); 50 | }); 51 | }); 52 | 53 | router.post('/upload', upload.single('file'), (req, res) => { 54 | log.info('Starting upload ' + req.file.filename); 55 | let validFrames = false; 56 | let validFiles = true; 57 | let thumbnail = false; 58 | fs.createReadStream('data/notes/' + req.file.filename) 59 | .pipe(zip.Parse()) 60 | .on('entry', (entry) => { 61 | if(!(entry.path.endsWith('.png') || entry.path.endsWith('.ogg') || entry.path.endsWith('.ini'))) { 62 | validFiles = false; 63 | entry.autodrain(); 64 | } 65 | else if(entry.path.includes('0,') && entry.path.endsWith('.png')) { 66 | validFrames = true; 67 | entry.autodrain(); 68 | } 69 | else if(entry.path == "thumb.png") { 70 | thumbnail = true; 71 | entry.pipe(fs.createWriteStream('data/thumbnails/' + req.file.filename + '.png')); 72 | } 73 | else entry.autodrain(); 74 | }) 75 | .on('error', (err) => { 76 | validFiles = false; 77 | }) 78 | .on('finish', () => { 79 | if(validFiles && validFrames) { 80 | log.info(`Uploaded note ${req.file.filename} by author ${req.auth.user}`); 81 | db.insertNote(req.file.filename, req.auth.user, (err) => { 82 | res.sendStatus(200); 83 | }); 84 | } else { 85 | log.error('Upload ' + req.file.filename + ' failed: invalid files'); 86 | if (thumbnail) fs.unlink('data/thumbnails/' + req.file.filename, (err) => { if(err) throw err }); 87 | fs.unlink('data/notes/' + req.file.filename, (err) => { if(err) throw err }); 88 | res.sendStatus(400); 89 | } 90 | }); 91 | }); 92 | 93 | 94 | module.exports = router; -------------------------------------------------------------------------------- /util/addUser.js: -------------------------------------------------------------------------------- 1 | const MongoClient = require('mongodb').MongoClient; 2 | const fs = require('fs'); 3 | const uuidv4 = require('uuid/v4'); 4 | const bcrypt = require('bcrypt'); 5 | const prompt = require('prompt'); 6 | const config = JSON.parse(fs.readFileSync('../config.json')); 7 | 8 | var schema = { 9 | properties: { 10 | username: { 11 | required: true, 12 | pattern: /^[A-Za-z0-9-_]{1,25}$/, 13 | message: "letters, numbers, underscore and dash only, maximum length is 25 characters" 14 | }, 15 | password: { 16 | required: true 17 | }, 18 | permissions: { 19 | required: true, 20 | pattern: /^[0-3]$/, 21 | message: 'Must be 0-3', 22 | description: "permission level (1 - normal user, 2 - moderator, 3 - admin, 0 - banned)" 23 | } 24 | } 25 | }; 26 | 27 | prompt.start(); 28 | 29 | prompt.get(schema, function (err, result) { 30 | MongoClient.connect(config.dbString, {useUnifiedTopology: true}, function(err, client) { 31 | if(err) throw err; 32 | else { 33 | console.log('connected to database'); 34 | let hash = bcrypt.hashSync(result.password, 10); 35 | let obj = { 36 | id: uuidv4(), 37 | username: result.username, 38 | permissions: result.permissions, 39 | stars: 0, 40 | joinDate: new Date(), 41 | lastLogin: null, 42 | ban: null, 43 | hash: hash 44 | } 45 | db = client.db(config.dbName); 46 | db.collection("users").insertOne(obj, function(err, res) { 47 | if (err) throw err; 48 | console.log('added user!'); 49 | client.close(); 50 | }); 51 | } 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /util/backup.js: -------------------------------------------------------------------------------- 1 | const prompt = require('prompt'); 2 | 3 | console.log("*Only local files will be backed up.*") 4 | var yesno = { 5 | name: 'backup', 6 | message: 'Back up all notes? [yes/no]', 7 | validator: /y[es]*|n[o]?/, 8 | warning: 'Must respond yes or no' 9 | }; 10 | 11 | prompt.get(yesno, function (err, result) { 12 | let confirm = result.backup.startsWith('y'); 13 | if(confirm) { 14 | 15 | } 16 | }); 17 | 18 | -------------------------------------------------------------------------------- /util/flush.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const prompt = require('prompt'); 3 | const rimraf = require('rimraf'); 4 | const MongoClient = require('mongodb').MongoClient; 5 | const config = JSON.parse(fs.readFileSync('../config.json')); 6 | 7 | prompt.start(); 8 | 9 | var schema = { 10 | properties: { 11 | notes: { 12 | message: 'Delete all notes? [yes/no]', 13 | validator: /y[es]*|n[o]?/, 14 | warning: 'Must respond yes or no' 15 | }, 16 | users: { 17 | message: 'Delete all users? [yes/no]', 18 | validator: /y[es]*|n[o]?/, 19 | warning: 'Must respond yes or no' 20 | } 21 | } 22 | }; 23 | 24 | prompt.get(schema, (err, result) => { 25 | var notes = result.notes.startsWith('y'); 26 | var users = result.users.startsWith('y'); 27 | MongoClient.connect(config.dbString, {useUnifiedTopology: true}, function(err, client) { 28 | if(err) throw err; 29 | else { 30 | db = client.db(config.dbName); 31 | if(notes) { 32 | rimraf.sync('../data/'); 33 | console.log('deleted local files'); 34 | db.collection('notes').drop((err, res) => { 35 | if(err) throw err; 36 | if(res) console.log('cleared notes db'); 37 | client.close(); 38 | }); 39 | } 40 | if(users) { 41 | db.collection('users').drop((err, res) => { 42 | if(err) throw err; 43 | if(res) console.log('cleared users db'); 44 | client.close(); 45 | }); 46 | } 47 | } 48 | }); 49 | }); --------------------------------------------------------------------------------