diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..e641aa8 --- /dev/null +++ b/Readme.md @@ -0,0 +1,77 @@ +# Moe-counter + +多种风格可选的萌萌计数器 + +![Moe-counter](https://count.getloli.com/get/@Moe-counter.github) + +
+More theme + +##### moebooru +![moebooru](https://count.getloli.com/get/@demo?theme=moebooru) + +##### rule34 +![Rule34](https://count.getloli.com/get/@demo?theme=rule34) + +##### gelbooru +![Gelbooru](https://count.getloli.com/get/@demo?theme=gelbooru)
+ +## Demo +[https://count.getloli.com](https://count.getloli.com) + +## Usage + +### Install + +#### Run on Repl.it + +- Open the url [https://repl.it/@journeyad/Moe-counter](https://repl.it/@journeyad/Moe-counter) +- Just hit the **Fork** button +- And hit the **Run** button + +#### Deploying on your own server + +```shell +$ git clone https://github.com/journey-ad/Moe-counter.git +$ cd Moe-counter +$ yarn install + +$ yarn start +``` + +### Confignation + +`config.yml` + +```yaml +app: + port: 3000 + +db: + type: mongodb # sqlite or mongodb +``` + +If you use mongodb, you need to specify the environment variable `DB_URL` + +```shell +# eg: +export DB_URL=mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count +``` + +repl.it can use `.env` file, [documentation](https://docs.repl.it/repls/secret-keys) + +``` +DB_URL="mongodb+srv://account:passwd@***.***.***.mongodb.net/db_count" +``` + +## Credits + +* [repl.it](https://repl.it/) +* [moebooru](https://github.com/moebooru/moebooru) +* rule34.xxx NSFW +* gelbooru.com NSFW +* [Icons8](https://icons8.com/icons/set/star) + +## License + +MIT \ No newline at end of file diff --git a/assets/style.css b/assets/style.css new file mode 100644 index 0000000..7a37b12 --- /dev/null +++ b/assets/style.css @@ -0,0 +1,5 @@ +@media screen and (max-width: 900px) { + iframe { + display: none; + } +} \ No newline at end of file diff --git a/assets/theme/gelbooru/0.gif b/assets/theme/gelbooru/0.gif new file mode 100644 index 0000000..6c348e5 Binary files /dev/null and b/assets/theme/gelbooru/0.gif differ diff --git a/assets/theme/gelbooru/1.gif b/assets/theme/gelbooru/1.gif new file mode 100644 index 0000000..1c33ee3 Binary files /dev/null and b/assets/theme/gelbooru/1.gif differ diff --git a/assets/theme/gelbooru/2.gif b/assets/theme/gelbooru/2.gif new file mode 100644 index 0000000..e6df16c Binary files /dev/null and b/assets/theme/gelbooru/2.gif differ diff --git a/assets/theme/gelbooru/3.gif b/assets/theme/gelbooru/3.gif new file mode 100644 index 0000000..3ee1bcd Binary files /dev/null and b/assets/theme/gelbooru/3.gif differ diff --git a/assets/theme/gelbooru/4.gif b/assets/theme/gelbooru/4.gif new file mode 100644 index 0000000..aabf121 Binary files /dev/null and b/assets/theme/gelbooru/4.gif differ diff --git a/assets/theme/gelbooru/5.gif b/assets/theme/gelbooru/5.gif new file mode 100644 index 0000000..46f4940 Binary files /dev/null and b/assets/theme/gelbooru/5.gif differ diff --git a/assets/theme/gelbooru/6.gif b/assets/theme/gelbooru/6.gif new file mode 100644 index 0000000..cd316a0 Binary files /dev/null and b/assets/theme/gelbooru/6.gif differ diff --git a/assets/theme/gelbooru/7.gif b/assets/theme/gelbooru/7.gif new file mode 100644 index 0000000..6019a72 Binary files /dev/null and b/assets/theme/gelbooru/7.gif differ diff --git a/assets/theme/gelbooru/8.gif b/assets/theme/gelbooru/8.gif new file mode 100644 index 0000000..9baa78f Binary files /dev/null and b/assets/theme/gelbooru/8.gif differ diff --git a/assets/theme/gelbooru/9.gif b/assets/theme/gelbooru/9.gif new file mode 100644 index 0000000..1e3f85f Binary files /dev/null and b/assets/theme/gelbooru/9.gif differ diff --git a/assets/theme/konachan/0.gif b/assets/theme/moebooru/0.gif similarity index 100% rename from assets/theme/konachan/0.gif rename to assets/theme/moebooru/0.gif diff --git a/assets/theme/konachan/1.gif b/assets/theme/moebooru/1.gif similarity index 100% rename from assets/theme/konachan/1.gif rename to assets/theme/moebooru/1.gif diff --git a/assets/theme/konachan/2.gif b/assets/theme/moebooru/2.gif similarity index 100% rename from assets/theme/konachan/2.gif rename to assets/theme/moebooru/2.gif diff --git a/assets/theme/konachan/3.gif b/assets/theme/moebooru/3.gif similarity index 100% rename from assets/theme/konachan/3.gif rename to assets/theme/moebooru/3.gif diff --git a/assets/theme/konachan/4.gif b/assets/theme/moebooru/4.gif similarity index 100% rename from assets/theme/konachan/4.gif rename to assets/theme/moebooru/4.gif diff --git a/assets/theme/konachan/5.gif b/assets/theme/moebooru/5.gif similarity index 100% rename from assets/theme/konachan/5.gif rename to assets/theme/moebooru/5.gif diff --git a/assets/theme/konachan/6.gif b/assets/theme/moebooru/6.gif similarity index 100% rename from assets/theme/konachan/6.gif rename to assets/theme/moebooru/6.gif diff --git a/assets/theme/konachan/7.gif b/assets/theme/moebooru/7.gif similarity index 100% rename from assets/theme/konachan/7.gif rename to assets/theme/moebooru/7.gif diff --git a/assets/theme/konachan/8.gif b/assets/theme/moebooru/8.gif similarity index 100% rename from assets/theme/konachan/8.gif rename to assets/theme/moebooru/8.gif diff --git a/assets/theme/konachan/9.gif b/assets/theme/moebooru/9.gif similarity index 100% rename from assets/theme/konachan/9.gif rename to assets/theme/moebooru/9.gif diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..f63ed72 --- /dev/null +++ b/config.yml @@ -0,0 +1,5 @@ +app: + port: 3000 + +db: + type: mongodb # sqlite or mongodb \ No newline at end of file diff --git a/count.db b/count.db deleted file mode 100644 index d4dc6af..0000000 Binary files a/count.db and /dev/null differ diff --git a/db/index.js b/db/index.js new file mode 100644 index 0000000..d6d9f48 --- /dev/null +++ b/db/index.js @@ -0,0 +1,17 @@ +'use strict' + +const config = require('config-yml') + +let db + +switch(config.db.type){ + case 'mongo': + db = require('./mongo') + break; + case 'sqlite': + default: + db = require('./sqlite') + break; +} + +module.exports = db \ No newline at end of file diff --git a/db/mongodb.js b/db/mongodb.js new file mode 100644 index 0000000..fa7e96d --- /dev/null +++ b/db/mongodb.js @@ -0,0 +1,36 @@ +'use strict' + +const mongoose = require('mongoose') +const schema = require('./schema') + +mongoose.connect(process.env.DB_URL, { + useNewUrlParser: true, + useUnifiedTopology: true, + useFindAndModify: false +}) + +const Count = mongoose.connection.model('Count', schema) + +function getNum(name) { + return Count + .findOne({ name }, '-_id -__v') + .exec() +} + +function getAll() { + return Count + .find({ }, '-_id -__v') + .exec() +} + +function setNum(name, num) { + return Count + .findOneAndUpdate({ name }, { name, num }, { upsert: true }) + .exec() +} + +module.exports = { + getNum, + getAll, + setNum +} \ No newline at end of file diff --git a/db/schema.js b/db/schema.js new file mode 100644 index 0000000..f558723 --- /dev/null +++ b/db/schema.js @@ -0,0 +1,8 @@ +'use strict' + +const mongoose = require('mongoose'); + +module.exports = new mongoose.Schema({ + name: { type: String, required: true }, + num: { type: Number, required: true } +}, { collection: 'tb_count', versionKey: false }); \ No newline at end of file diff --git a/utils/db.js b/db/sqlite.js similarity index 100% rename from utils/db.js rename to db/sqlite.js diff --git a/index.js b/index.js index 7f20e1d..81d7364 100644 --- a/index.js +++ b/index.js @@ -1,34 +1,15 @@ 'use strict' const fs = require('fs') +const config = require('config-yml') const express = require('express') const compression = require('compression') -const db = require('./utils/db') +const db = require('./db') const themify = require('./utils/themify') const PLACES = 7 -function getCountImage({ count, theme='konachan', PLACES=PLACES }) { - // This is not the greatest way for generating an SVG but it'll do for now - const countArray = count.toString().padStart(PLACES, '0').split('') - - const parts = countArray.reduce((acc, next, index) => ` - ${acc} - -`, '') - - return ` - - Kawaii Count - - ${parts} - - -` -} - - const app = express() app.use(express.static('assets')) app.use(compression()) @@ -41,8 +22,8 @@ app.get('/', (req, res) => { // get the image app.get('/get/@:name', async (req, res) => { const name = req.params.name - const theme = req.query.theme || 'konachan' - let length = PLACES, num = 0 + const theme = req.query.theme || 'moebooru' + let length = PLACES, count = 0 // This helps with GitHub's image cache res.set({ @@ -54,19 +35,19 @@ app.get('/get/@:name', async (req, res) => { res.set({ 'cache-control': 'max-age=31536000' }) - num = '0123456789' + count = '0123456789' length = 10 } else { - const counter = await db.getNum(name) - num = counter.num + 1 + const counter = await db.getNum(name) || { name, num: 0 } + count = counter.num + 1 - db.setNum(counter.name, num) + db.setNum(counter.name, count) console.log(counter, `theme: ${theme}`) } // Send the generated SVG as the result - res.send(getCountImage({ count: num, theme, PLACES: length })) + res.send(themify.getCountImage({ count, theme, length })) }) app.get('/heart-beat', (req, res) => { @@ -78,6 +59,6 @@ app.get('/heart-beat', (req, res) => { console.log('heart-beat') }); -const listener = app.listen(process.env.PORT, () => { +const listener = app.listen(config.app.port, () => { console.log('Your app is listening on port ' + listener.address().port) }) diff --git a/package-lock.json b/package-lock.json index 5353ed8..6eb4c7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,6 +74,14 @@ "readable-stream": "^2.0.6" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -144,6 +152,15 @@ "tweetnacl": "^0.14.3" } }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -153,6 +170,11 @@ "inherits": "~2.0.0" } }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -179,11 +201,21 @@ "concat-map": "0.0.1" } }, + "bson": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.5.tgz", + "integrity": "sha512-kDuEzldR21lHciPQAIulLs1LZlCXdLziXI6Mb/TDkwXhb//UORJNPXgcRs2CuO4H0DcMkpfT3/ySsP3unoZjBg==" + }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -203,6 +235,16 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -251,6 +293,18 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "config-yml": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/config-yml/-/config-yml-0.10.3.tgz", + "integrity": "sha512-OsFOdaVpC7o0lNLOT9HGicTEB/txYESVqsCpeXdU86i1OrcMR4QJ0qwkmVujOe54kYA0bkKFucF9WvjCFVOvqQ==", + "requires": { + "js-yaml": "^3.6.1", + "lodash": "^4.13.1", + "moment": "^2.13.0", + "shelljs": "^0.7.0", + "yargs": "^4.7.1" + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -310,6 +364,11 @@ "ms": "2.0.0" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -326,6 +385,11 @@ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -366,11 +430,24 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -451,6 +528,15 @@ "unpipe": "~1.0.0" } }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -518,6 +604,11 @@ "wide-align": "^1.1.0" } }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -543,8 +634,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "optional": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "har-schema": { "version": "2.0.0", @@ -572,6 +662,11 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -611,6 +706,14 @@ "minimatch": "^3.0.4" } }, + "image-size": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.8.3.tgz", + "integrity": "sha512-SMtq1AJ+aqHB45c3FsB4ERK0UCiA2d3H1uq8s+8T0Pf8A3W4teyBQyaFaktH6xvZqh+npwlKU7i4fJo0r7TYTg==", + "requires": { + "queue": "6.0.1" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -630,11 +733,26 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, "is-expression": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", @@ -671,6 +789,11 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -693,6 +816,15 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -738,16 +870,52 @@ "promise": "^7.0.1" } }, + "kareem": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", + "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "lodash": { "version": "4.17.19", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -814,6 +982,86 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "mongodb": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.10.tgz", + "integrity": "sha512-p/C48UvTU/dr/PQEDKfb9DsCVDJWXGmdJNFC+u5FPmTQVtog69X6D8vrWHz+sJx1zJnd96sjdh9ueo7bx2ILTw==", + "requires": { + "bl": "^2.2.0", + "bson": "^1.1.4", + "denque": "^1.4.1", + "require_optional": "^1.0.1", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.9.28", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.9.28.tgz", + "integrity": "sha512-A8lNRk4eCQDzk+DagSMYdH94LAYrbTK83LgrUlzqdig3YXvizW3DApJqOWQ5DdhuimvsfiD0Z5NTVzXl/rgi2w==", + "requires": { + "bson": "^1.1.4", + "kareem": "2.3.1", + "mongodb": "3.5.10", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.7.0", + "mquery": "3.2.2", + "ms": "2.1.2", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "7.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" + }, + "mpath": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.7.0.tgz", + "integrity": "sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==" + }, + "mquery": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", + "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -925,6 +1173,17 @@ "abbrev": "1" } }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "npm-bundled": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", @@ -1001,6 +1260,14 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -1015,11 +1282,27 @@ "os-tmpdir": "^1.0.0" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1035,12 +1318,40 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "optional": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -1192,6 +1503,14 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "queue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", + "integrity": "sha512-AJBQabRCCNr9ANq8v77RJEv73DPbn55cdTb+Giq4X0AVnNVZvMHlYp7XlQiN+1npCZj1DuSmaA2hYVUUDgxFDg==", + "requires": { + "inherits": "~2.0.3" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -1219,6 +1538,25 @@ "strip-json-comments": "~2.0.1" } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -1233,6 +1571,19 @@ "util-deprecate": "~1.0.1" } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -1269,6 +1620,25 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "^2.0.0", + "semver": "^5.1.0" + } + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -1277,6 +1647,11 @@ "path-parse": "^1.0.6" } }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -1295,6 +1670,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -1353,11 +1737,73 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "sift": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", + "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "sqlite3": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.0.tgz", @@ -1416,6 +1862,14 @@ "ansi-regex": "^2.0.0" } }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1511,6 +1965,15 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "optional": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1541,6 +2004,11 @@ "isexe": "^2.0.0" } }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", @@ -1549,6 +2017,11 @@ "string-width": "^1.0.2 || 2" } }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + }, "with": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", @@ -1560,15 +2033,59 @@ "babel-walk": "3.0.0-canary-5" } }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", + "requires": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "requires": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } } } } diff --git a/package.json b/package.json index c50fe41..baf9850 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,11 @@ "license": "MIT", "dependencies": { "compression": "^1.7.4", + "config-yml": "^0.10.3", "express": "^4.17.1", + "image-size": "^0.8.3", "mime-types": "^2.1.27", + "mongoose": "^5.9.28", "pug": "^3.0.0", "sqlite3": "^5.0.0" } diff --git a/utils/themify.js b/utils/themify.js index c440cd8..2db9886 100644 --- a/utils/themify.js +++ b/utils/themify.js @@ -3,6 +3,7 @@ const fs = require('fs') const path = require('path') const mimeType = require('mime-types') +const sizeOf = require('image-size') const themePath = path.resolve(__dirname, '../assets/theme') @@ -12,8 +13,15 @@ fs.readdirSync(themePath).forEach(theme => { if(!(theme in themeList)) themeList[theme] = {} const imgList = fs.readdirSync(path.resolve(themePath, theme)) imgList.forEach(img => { + const imgPath = path.resolve(themePath, theme, img) const name = path.parse(img).name - themeList[theme][name] = convertToDatauri(path.resolve(themePath, theme, img)) + const { width, height } = sizeOf(imgPath) + + themeList[theme][name] = { + width, + height, + data: convertToDatauri(imgPath) + } }) }) @@ -24,11 +32,36 @@ function convertToDatauri(path){ return `data:${mime};base64,${base64}` } -function wrap(num, theme='konachan'){ - if(!(theme in themeList)) theme = 'konachan' - return themeList[theme][num] +function getCountImage({ count, theme='moebooru', length=7 }) { + if(!(theme in themeList)) theme = 'moebooru' + + // This is not the greatest way for generating an SVG but it'll do for now + const countArray = count.toString().padStart(length, '0').split('') + + let x = 0, y = 0 + const parts = countArray.reduce((acc, next, index) => { + const { width, height, data } = themeList[theme][next] + + const image = `${acc} + ` + + x += width + + if(height > y) y = height + + return image + }, '') + + return ` + + Moe Count + + ${parts} + + +` } module.exports = { - wrap + getCountImage } \ No newline at end of file diff --git a/views/index.pug b/views/index.pug index 1908114..e2fa8d3 100644 --- a/views/index.pug +++ b/views/index.pug @@ -1,9 +1,10 @@ html head - title='Kawaii Counter!' + title='Moe Counter!' meta(name='viewport', content='width=device-width, initial-scale=1') link(rel='icon', type='image/png', href='favicon.png') link(rel='stylesheet', href='https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/light.min.css') + link(rel='stylesheet', href='style.css') body h3 How to use: @@ -18,7 +19,7 @@ html code ![:name](https://count.getloli.com/get/@:name) h3 eg: - Kawaii Count! + Moe Count! i Data can access by anyone, please | DO NOT @@ -27,22 +28,26 @@ html details summary(style='display: inline-block;') h3(style='display: inline-block; cursor: pointer;') More theme - p(style='margin: 0;') Just use the query parameters theme, like this: https://count.getloli.com/get/@:name?theme=konachan - h5 konachan - img(src='https://count.getloli.com/get/@demo?theme=konachan', alt='Konachan') + p(style='margin: 0;') Just use the query parameters theme, like this: https://count.getloli.com/get/@:name?theme=moebooru + h5 moebooru + img(src='https://count.getloli.com/get/@demo?theme=moebooru', alt='moebooru') h5 rule34 img(src='https://count.getloli.com/get/@demo?theme=rule34', alt='Rule34') + h5 gelbooru + img(src='https://count.getloli.com/get/@demo?theme=gelbooru', alt='Gelbooru') h3 Credits ul li a(href='https://repl.it/', target='_blank', rel='nofollow') repl.it li - a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') konachan.com - | NSFW + a(href='https://github.com/moebooru/moebooru', target='_blank', rel='nofollow') moebooru li a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') rule34.xxx | NSFW + li + a(href='javascript:alert("!!! NSFW LINK !!!\\nPlease enter the url manually")') gelbooru.com + | NSFW li a(href='https://icons8.com/icons/set/star', target='_blank', rel='nofollow') Icons8 @@ -52,10 +57,11 @@ html input#name(type='text', placeholder=':name', style='display: inline-block; width: 80px; height: 1.4em; line-height: 1.4em; margin: 0 4px; vertical-align: middle;') code ?theme= select#theme(style='display: inline-block; height: 1.6em; line-height: 1.6em; font-size: 14px; margin: 0 4px; padding: 0 4px; vertical-align: middle;') - option(value='konachan') konachan + option(value='moebooru') moebooru option(value='rule34') rule34 - button#get(style='margin: 10px 0') Get - img#result(style='display: block; width: 315px; height: 100px') + option(value='gelbooru') gelbooru + button#get(style='margin: 10px 0;') Get + img#result(style='display: block;') script. var btn = document.getElementById('get'), @@ -65,7 +71,7 @@ html var name = document.getElementById('name'), themeEl = document.getElementById('theme') var text = name.value ? name.value.trim() : '' - var theme = themeEl.value || 'konachan' + var theme = themeEl.value || 'moebooru' if(!text) { alert('Please input counter name.') return @@ -74,7 +80,7 @@ html img.src = 'https://count.getloli.com/get/@' + text + '?theme=' + theme }) - iframe(src="https://chat.getloli.com/room/@kawaii-counter?title=%E5%8F%AF%E7%88%B1%E7%9A%84%E8%AE%A1%E6%95%B0%E5%99%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF", scrolling="no", frameborder="0", height="70%", width="26%", style="position: fixed;top: 2%;right: 5%;") + iframe(src="https://chat.getloli.com/room/@Moe-counter?title=%E5%8F%AF%E7%88%B1%E7%9A%84%E8%AE%A1%E6%95%B0%E5%99%A8%E7%9A%84%E7%95%99%E8%A8%80%E6%9D%BF", scrolling="no", frameborder="0", height="70%", width="26%", style="position: fixed;top: 2%;right: 5%;") p.copy - a(href='https://repl.it/@journeyad/kawaii-counter') source code \ No newline at end of file + a(href='https://repl.it/@journeyad/Moe-counter') source code \ No newline at end of file