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 `
-
-`
-}
-
-
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 `
+
+`
}
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:
-
+
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