From 9c07e84b343dfee9372dfaf006288af8fa86d5c7 Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 7 Sep 2021 19:07:43 -0600 Subject: [PATCH 01/32] use `process.cwd()` instead of `__dirname` for `path.join` --- utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils.js b/utils.js index 00e5502..15f9629 100755 --- a/utils.js +++ b/utils.js @@ -74,7 +74,7 @@ function getDatedDirname() { } // Set up pathing & the logger -const path = (...paths) => Path.join(__dirname, ...paths); +const path = (...paths) => Path.join(process.cwd(), ...paths); const logger = new TLog({ level: process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'info' : 'debug'), timestamp: { From 2aadafe37b24da6d22707d51b0b7832fbec54417 Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 7 Sep 2021 19:43:46 -0600 Subject: [PATCH 02/32] moved all `.js` files into `src/` & removed TLog socket plugin --- ass-x | 2 +- {generators/gfycat => gfycat}/adjectives.txt | 0 {generators/gfycat => gfycat}/animals.txt | 0 package.json | 11 +++++------ ass.js => src/ass.js | 12 ++++++------ auth.js => src/auth.js | 2 +- checkEngine.js => src/checkEngine.js | 2 +- data.js => src/data.js | 0 {generators => src/generators}/gfycat.js | 7 +++++-- {generators => src/generators}/lengthGen.js | 0 {generators => src/generators}/random.js | 0 {generators => src/generators}/token.js | 2 +- {generators => src/generators}/zws.js | 0 hash.js => src/hash.js | 0 metrics.js => src/metrics.js | 4 ++-- {routers => src/routers}/resource.js | 4 ++-- {routers => src/routers}/upload.js | 4 ++-- setup.js => src/setup.js | 4 ++-- storage.js => src/storage.js | 4 ++-- thumbnails.js => src/thumbnails.js | 2 +- utils.js => src/utils.js | 12 ++++-------- vibrant.js => src/vibrant.js | 0 22 files changed, 35 insertions(+), 37 deletions(-) rename {generators/gfycat => gfycat}/adjectives.txt (100%) rename {generators/gfycat => gfycat}/animals.txt (100%) rename ass.js => src/ass.js (85%) mode change 100755 => 100644 rename auth.js => src/auth.js (93%) rename checkEngine.js => src/checkEngine.js (94%) rename data.js => src/data.js (100%) rename {generators => src/generators}/gfycat.js (67%) rename {generators => src/generators}/lengthGen.js (100%) rename {generators => src/generators}/random.js (100%) rename {generators => src/generators}/token.js (95%) rename {generators => src/generators}/zws.js (100%) rename hash.js => src/hash.js (100%) rename metrics.js => src/metrics.js (92%) rename {routers => src/routers}/resource.js (97%) rename {routers => src/routers}/upload.js (98%) rename setup.js => src/setup.js (98%) mode change 100755 => 100644 rename storage.js => src/storage.js (98%) rename thumbnails.js => src/thumbnails.js (98%) rename utils.js => src/utils.js (90%) mode change 100755 => 100644 rename vibrant.js => src/vibrant.js (100%) diff --git a/ass-x b/ass-x index ac4fbe6..7c7eb2a 160000 --- a/ass-x +++ b/ass-x @@ -1 +1 @@ -Subproject commit ac4fbe6d850919a4c347cf3bb69c8d2cb60cd87d +Subproject commit 7c7eb2a5b3b8e644f2a6b8caf7e8041cf7b5e42e diff --git a/generators/gfycat/adjectives.txt b/gfycat/adjectives.txt similarity index 100% rename from generators/gfycat/adjectives.txt rename to gfycat/adjectives.txt diff --git a/generators/gfycat/animals.txt b/gfycat/animals.txt similarity index 100% rename from generators/gfycat/animals.txt rename to gfycat/animals.txt diff --git a/package.json b/package.json index 16e6d3a..fe9739e 100755 --- a/package.json +++ b/package.json @@ -8,15 +8,14 @@ "npm": ">=7.x.x" }, "scripts": { - "start": "node ass.js", - "setup": "node setup.js", - "metrics": "node metrics.js", - "new-token": "node generators/token.js", + "start": "node src/ass.js", + "setup": "node src/setup.js", + "metrics": "node src/metrics.js", + "new-token": "node src/generators/token.js", "restart": "systemctl restart ass.service", - "engine-check": "node checkEngine.js", + "engine-check": "node src/checkEngine.js", "prestart": "npm run engine-check", "presetup": "npm run engine-check", - "logs": "node ./node_modules/@tycrek/log/socketClient.js", "docker-logs": "docker-compose logs -f --tail=50 --no-log-prefix ass", "docker-update": "git pull && docker-compose up --force-recreate --build -d && docker image prune -f", "docker-resetup": "docker-compose exec ass npm run setup && docker-compose restart" diff --git a/ass.js b/src/ass.js old mode 100755 new mode 100644 similarity index 85% rename from ass.js rename to src/ass.js index 9a28b46..cea0235 --- a/ass.js +++ b/src/ass.js @@ -1,7 +1,7 @@ let doSetup = null; try { // Check if config.json exists - require('./config.json'); + require('../config.json'); } catch (err) { doSetup = require('./setup').doSetup; } @@ -13,7 +13,7 @@ if (doSetup) { } // Load the config -const { host, port, useSsl, isProxied, s3enabled, frontendName, indexFile } = require('./config.json'); +const { host, port, useSsl, isProxied, s3enabled, frontendName, indexFile } = require('../config.json'); //#region Imports const fs = require('fs-extra'); @@ -24,8 +24,8 @@ const marked = require('marked'); const uploadRouter = require('./routers/upload'); const resourceRouter = require('./routers/resource'); const { path, log, getTrueHttp, getTrueDomain } = require('./utils'); -const { CODE_INTERNAL_SERVER_ERROR } = require('./MagicNumbers.json'); -const { name: ASS_NAME, version: ASS_VERSION } = require('./package.json'); +const { CODE_INTERNAL_SERVER_ERROR } = require('../MagicNumbers.json'); +const { name: ASS_NAME, version: ASS_VERSION } = require('../package.json'); //#endregion // Welcome :D @@ -66,7 +66,7 @@ useSsl && app.use(helmet.hsts({ preload: true })); // skipcq: JS-0093 app.use(nofavicon); // Use custom index, otherwise render README.md -const ASS_INDEX = indexFile !== '' && fs.existsSync(`./${indexFile}`) && require(`./${indexFile}`); +const ASS_INDEX = indexFile !== '' && fs.existsSync(`../${indexFile}`) && require(`../${indexFile}`); app.get('/', (req, res, next) => ASS_INDEX // skipcq: JS-0229 ? ASS_INDEX(req, res, next) : fs.readFile(path('README.md')) @@ -79,7 +79,7 @@ app.get('/', (req, res, next) => ASS_INDEX // skipcq: JS-0229 app.use('/', ROUTERS.upload); // Set up custom frontend -const ASS_FRONTEND = fs.existsSync(`./${frontendName}/package.json`) ? (require('submodule'), require(`./${frontendName}`)) : { enabled: false }; +const ASS_FRONTEND = fs.existsSync(path(`./${frontendName}/package.json`)) ? (require('submodule'), require(`../${frontendName}`)) : { enabled: false }; // todo: update with src/ ASS_FRONTEND.enabled && app.use(ASS_FRONTEND.endpoint, ASS_FRONTEND.router); // skipcq: JS-0093 // '/:resouceId' always needs to be LAST since it's a catch-all route diff --git a/auth.js b/src/auth.js similarity index 93% rename from auth.js rename to src/auth.js index 1bb0578..1b1269a 100644 --- a/auth.js +++ b/src/auth.js @@ -5,7 +5,7 @@ const fs = require('fs-extra'); const { log, path, arrayEquals } = require('./utils'); -const users = require('./auth.json').users || {}; +const users = require('../auth.json').users || {}; // Monitor auth.json for changes (triggered by running 'npm run new-token') fs.watch(path('auth.json'), { persistent: false }, diff --git a/checkEngine.js b/src/checkEngine.js similarity index 94% rename from checkEngine.js rename to src/checkEngine.js index dd277fb..0b7150a 100644 --- a/checkEngine.js +++ b/src/checkEngine.js @@ -1,5 +1,5 @@ const check = require("check-node-version"); -const ENGINES = require('./package.json').engines; +const ENGINES = require('../package.json').engines; const TLog = require('@tycrek/log'); const logger = new TLog(); diff --git a/data.js b/src/data.js similarity index 100% rename from data.js rename to src/data.js diff --git a/generators/gfycat.js b/src/generators/gfycat.js similarity index 67% rename from generators/gfycat.js rename to src/generators/gfycat.js index f7ddefc..a7f418d 100644 --- a/generators/gfycat.js +++ b/src/generators/gfycat.js @@ -1,6 +1,4 @@ const fs = require('fs-extra'); -const adjectives = fs.readFileSync('./generators/gfycat/adjectives.txt').toString().split('\n'); -const animals = fs.readFileSync('./generators/gfycat/animals.txt').toString().split('\n'); // Don't trigger circular dependency during setup if (!require.main.filename.includes('setup.js')) @@ -11,6 +9,11 @@ function getWord(list, delim = '') { } function genString(count = MIN_LENGTH) { + // For some reason these 3 lines MUST be inside the function + const { path } = require('../utils'); + const adjectives = fs.readFileSync(path('./gfycat/adjectives.txt')).toString().split('\n'); + const animals = fs.readFileSync(path('./gfycat/animals.txt')).toString().split('\n'); + let gfycat = ''; for (let i = 0; i < (count < MIN_LENGTH ? MIN_LENGTH : count); i++) gfycat += getWord(adjectives, '-'); diff --git a/generators/lengthGen.js b/src/generators/lengthGen.js similarity index 100% rename from generators/lengthGen.js rename to src/generators/lengthGen.js diff --git a/generators/random.js b/src/generators/random.js similarity index 100% rename from generators/random.js rename to src/generators/random.js diff --git a/generators/token.js b/src/generators/token.js similarity index 95% rename from generators/token.js rename to src/generators/token.js index 674eaaf..5581844 100644 --- a/generators/token.js +++ b/src/generators/token.js @@ -12,7 +12,7 @@ module.exports = () => uuid().replace(/-/g, ''); // If directly called on the command line, generate a new token if (require.main === module) { const token = module.exports(); - const authPath = path.join(__dirname, '..', 'auth.json'); + const authPath = path.join(process.cwd(), 'auth.json'); let name = ''; fs.readJson(authPath) diff --git a/generators/zws.js b/src/generators/zws.js similarity index 100% rename from generators/zws.js rename to src/generators/zws.js diff --git a/hash.js b/src/hash.js similarity index 100% rename from hash.js rename to src/hash.js diff --git a/metrics.js b/src/metrics.js similarity index 92% rename from metrics.js rename to src/metrics.js index c304d0b..d101817 100644 --- a/metrics.js +++ b/src/metrics.js @@ -1,6 +1,6 @@ const fs = require('fs-extra'); const path = require('path'); -const { s3enabled } = require('./config.json'); +const { s3enabled } = require('../config.json'); const { formatBytes } = require('./utils'); const { bucketSize } = require('./storage'); @@ -9,7 +9,7 @@ const log = new TLog({ level: 'debug', timestamp: { enabled: false } }); module.exports = () => { const data = require('./data'); - const { users } = fs.readJsonSync(path.join(__dirname, 'auth.json')); + const { users } = fs.readJsonSync(path.join(process.cwd(), 'auth.json')); Object.keys(users).forEach((token) => users[token].count = 0); let totalSize = 0; diff --git a/routers/resource.js b/src/routers/resource.js similarity index 97% rename from routers/resource.js rename to src/routers/resource.js index 5542f8c..7ffd3b4 100644 --- a/routers/resource.js +++ b/src/routers/resource.js @@ -2,9 +2,9 @@ const fs = require('fs-extra'); const escape = require('escape-html'); const fetch = require('node-fetch'); const { deleteS3 } = require('../storage'); -const { diskFilePath, s3enabled, viewDirect } = require('../config.json'); +const { diskFilePath, s3enabled, viewDirect } = require('../../config.json'); const { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } = require('../utils'); -const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, } = require('../MagicNumbers.json'); +const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, } = require('../../MagicNumbers.json'); const data = require('../data'); const users = require('../auth'); diff --git a/routers/upload.js b/src/routers/upload.js similarity index 98% rename from routers/upload.js rename to src/routers/upload.js index 7898865..9bdaf76 100644 --- a/routers/upload.js +++ b/src/routers/upload.js @@ -3,9 +3,9 @@ const fs = require('fs-extra'); const { DateTime } = require('luxon'); const { WebhookClient, MessageEmbed } = require('discord.js'); const { doUpload, processUploaded } = require('../storage'); -const { maxUploadSize, resourceIdSize, gfyIdSize, resourceIdType } = require('../config.json'); +const { maxUploadSize, resourceIdSize, gfyIdSize, resourceIdType } = require('../../config.json'); const { path, log, verify, getTrueHttp, getTrueDomain, generateId, formatBytes } = require('../utils'); -const { CODE_UNAUTHORIZED, CODE_PAYLOAD_TOO_LARGE } = require('../MagicNumbers.json'); +const { CODE_UNAUTHORIZED, CODE_PAYLOAD_TOO_LARGE } = require('../../MagicNumbers.json'); const data = require('../data'); const users = require('../auth'); diff --git a/setup.js b/src/setup.js old mode 100755 new mode 100644 similarity index 98% rename from setup.js rename to src/setup.js index 246f2b8..fafe4e9 --- a/setup.js +++ b/src/setup.js @@ -53,7 +53,7 @@ function getConfirmSchema(description) { // If directly called on the command line, run setup script function doSetup() { - const path = (...paths) => require('path').join(__dirname, ...paths); + const path = (...paths) => require('path').join(process.cwd(), ...paths); const TLog = require('@tycrek/log'); const fs = require('fs-extra'); const prompt = require('prompt'); @@ -64,7 +64,7 @@ function doSetup() { // Override default configs with existing configs to allow migrating configs // Now that's a lot of configs! try { - const existingConfig = require('./config.json'); + const existingConfig = require('../config.json'); Object.entries(existingConfig).forEach(([key, value]) => { Object.prototype.hasOwnProperty.call(config, key) && (config[key] = value); // skipcq: JS-0093 Object.prototype.hasOwnProperty.call(s3config, key) && (s3config[key] = value); // skipcq: JS-0093 diff --git a/storage.js b/src/storage.js similarity index 98% rename from storage.js rename to src/storage.js index 776608e..c396335 100644 --- a/storage.js +++ b/src/storage.js @@ -8,8 +8,8 @@ const Thumbnail = require('./thumbnails'); const Vibrant = require('./vibrant'); const Hash = require('./hash'); const { getDatedDirname, sanitize, generateId, formatBytes, log } = require('./utils'); -const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, saveAsOriginal, maxUploadSize, mediaStrict } = require('./config.json'); -const { CODE_UNSUPPORTED_MEDIA_TYPE } = require('./MagicNumbers.json'); +const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, saveAsOriginal, maxUploadSize, mediaStrict } = require('../config.json'); +const { CODE_UNSUPPORTED_MEDIA_TYPE } = require('../MagicNumbers.json'); const ID_GEN_LENGTH = 32; const ALLOWED_MIMETYPES = /(image)|(video)|(audio)\//; diff --git a/thumbnails.js b/src/thumbnails.js similarity index 98% rename from thumbnails.js rename to src/thumbnails.js index 1648323..22bce7f 100644 --- a/thumbnails.js +++ b/src/thumbnails.js @@ -3,7 +3,7 @@ const Jimp = require('jimp'); const shell = require('any-shell-escape'); const { exec } = require('child_process'); const { isProd, path } = require('./utils'); -const { diskFilePath } = require('./config.json'); +const { diskFilePath } = require('../config.json'); // Thumbnail parameters const THUMBNAIL = { diff --git a/utils.js b/src/utils.js old mode 100755 new mode 100644 similarity index 90% rename from utils.js rename to src/utils.js index 15f9629..50771b0 --- a/utils.js +++ b/src/utils.js @@ -8,11 +8,11 @@ const token = require('./generators/token'); const zwsGen = require('./generators/zws'); const randomGen = require('./generators/random'); const gfyGen = require('./generators/gfycat'); -const { HTTP, HTTPS, KILOBYTES } = require('./MagicNumbers.json'); +const { HTTP, HTTPS, KILOBYTES } = require('../MagicNumbers.json'); // Catch config.json not existing when running setup script try { - var { useSsl, port, domain, isProxied, diskFilePath, saveWithDate, s3bucket, s3endpoint, s3usePathStyle } = require('./config.json'); // skipcq: JS-0239, JS-0102 + var { useSsl, port, domain, isProxied, diskFilePath, saveWithDate, s3bucket, s3endpoint, s3usePathStyle } = require('../config.json'); // skipcq: JS-0239, JS-0102 } catch (ex) { if (ex.code !== 'MODULE_NOT_FOUND') console.error(ex); } @@ -74,7 +74,7 @@ function getDatedDirname() { } // Set up pathing & the logger -const path = (...paths) => Path.join(process.cwd(), ...paths); +const path = (...paths) => Path.join(process.cwd(), ...paths); // '..' was added to make it easier to run files after moving the project to src/ const logger = new TLog({ level: process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'info' : 'debug'), timestamp: { @@ -85,11 +85,7 @@ const logger = new TLog({ }); // Enable the Express logger -logger - .env('ASS_ENV') - //.enable.process({ uncaughtException: false }).debug('Plugin enabled', 'Process') - .enable.express({ handle500: false }).debug('Plugin enabled', 'Express') - .enable.socket().debug('Plugin enabled', 'Socket'); +logger.enable.express({ handle500: false }).debug('Plugin enabled', 'Express'); const idModes = { zws: 'zws', // Zero-width spaces (see: https://zws.im/) diff --git a/vibrant.js b/src/vibrant.js similarity index 100% rename from vibrant.js rename to src/vibrant.js From 81bf01d5507ca5625dd6e9e44177dfaf55d4c4ab Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 7 Sep 2021 20:22:06 -0600 Subject: [PATCH 03/32] started TS migration, so far so good --- ass-x | 2 +- package-lock.json | 1586 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 17 +- tsconfig.json | 16 + 4 files changed, 1604 insertions(+), 17 deletions(-) create mode 100644 tsconfig.json diff --git a/ass-x b/ass-x index 7c7eb2a..fff0f47 160000 --- a/ass-x +++ b/ass-x @@ -1 +1 @@ -Subproject commit 7c7eb2a5b3b8e644f2a6b8caf7e8041cf7b5e42e +Subproject commit fff0f471cd19c20ef6ba47545993f037732f5f01 diff --git a/package-lock.json b/package-lock.json index a0b58fa..df3988e 100755 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,12 @@ "version": "0.8.6", "license": "ISC", "dependencies": { + "@tsconfig/node14": "^1.0.1", "@tycrek/ass-storage-engine": "^0.2.7", "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", "check-node-version": "^4.1.0", @@ -35,6 +37,7 @@ "sanitize-filename": "^1.6.3", "stream-to-array": "^2.3.0", "submodule": "^1.2.1", + "ts": "^0.2.2", "uuid": "^8.3.2" }, "engines": { @@ -46,6 +49,18 @@ "url": "https://patreon.com/tycrek" } }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "optional": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { "version": "7.14.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", @@ -54,6 +69,82 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "optional": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/parser": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", @@ -564,6 +655,11 @@ "regenerator-runtime": "^0.13.3" } }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, "node_modules/@tycrek/ass-storage-engine": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@tycrek/ass-storage-engine/-/ass-storage-engine-0.2.7.tgz", @@ -631,6 +727,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vibrant/color": { "version": "3.2.1-alpha.1", "resolved": "https://registry.npmjs.org/@vibrant/color/-/color-3.2.1-alpha.1.tgz", @@ -914,11 +1018,36 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "optional": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -976,6 +1105,16 @@ "uuid": "bin/uuid" } }, + "node_modules/axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "dependencies": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, "node_modules/babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -987,6 +1126,11 @@ "node": ">= 10.0.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base32-encode": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", @@ -1072,6 +1216,15 @@ "node": ">=8" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -1095,6 +1248,15 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/busboy": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", @@ -1134,6 +1296,27 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dependencies": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "engines": { + "node": ">=4" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1364,6 +1547,17 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -1458,6 +1652,17 @@ "node": ">=8" } }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -1482,6 +1687,26 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1522,6 +1747,15 @@ "node": ">=4.5.0" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/discord.js": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", @@ -1590,6 +1824,14 @@ "node": ">=6" } }, + "node_modules/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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1603,6 +1845,19 @@ "node": ">=0.8.0" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1717,6 +1972,17 @@ "node": ">=10" } }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/file-type": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", @@ -1742,6 +2008,11 @@ "node": ">= 0.8" } }, + "node_modules/find-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", + "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" + }, "node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -1761,6 +2032,25 @@ "imul": "^1.0.0" } }, + "node_modules/follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dependencies": { + "debug": "=3.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/follow-redirects/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1799,6 +2089,11 @@ "random-path": "^0.1.0" } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1842,6 +2137,25 @@ "omggif": "^1.0.10" } }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -1913,6 +2227,11 @@ "node": ">=10.0.0" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "node_modules/http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -2006,6 +2325,23 @@ "node": ">=0.10.0" } }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2027,6 +2363,33 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -2060,6 +2423,14 @@ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -2133,6 +2504,30 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "optional": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "optional": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2144,6 +2539,14 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonfile-updater": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonfile-updater/-/jsonfile-updater-3.1.0.tgz", + "integrity": "sha512-G6DB55KX4Cc5t0Zpg4kfy2b3N592fahyoUJz5rk4VmS8lccXskgUbjUEX51iXMc6gh6sE7urmXWJsW6EqDozVQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -2179,6 +2582,28 @@ "xtend": "^4.0.0" } }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2191,6 +2616,18 @@ "node": ">=6" } }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/luxon": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", @@ -2210,6 +2647,14 @@ "node": ">=6" } }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "engines": { + "node": ">=4" + } + }, "node_modules/map-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", @@ -2247,17 +2692,52 @@ "node": ">=6" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=6" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dependencies": { + "camelcase": "^4.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" } }, "node_modules/mime": { @@ -2306,11 +2786,34 @@ "dom-walk": "^0.1.0" } }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -2406,6 +2909,25 @@ "querystring": "0.2.0" } }, + "node_modules/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==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2566,6 +3088,18 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz", "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==" }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2582,6 +3116,14 @@ "node": ">=4" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -2600,6 +3142,25 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, "node_modules/phin": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", @@ -2878,6 +3439,14 @@ } ] }, + "node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "engines": { + "node": ">=4" + } + }, "node_modules/random-path": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", @@ -2920,6 +3489,84 @@ "node": ">=0.8" } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -2934,6 +3581,18 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -3111,6 +3770,40 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/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==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "optional": true + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -3208,6 +3901,14 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -3216,6 +3917,14 @@ "node": ">=0.10.0" } }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "engines": { + "node": ">=4" + } + }, "node_modules/submodule": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/submodule/-/submodule-1.2.1.tgz", @@ -3312,6 +4021,14 @@ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "engines": { + "node": ">=4" + } + }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -3320,6 +4037,147 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/ts": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ts/-/ts-0.2.2.tgz", + "integrity": "sha512-cftcjXvrxBi6TJxwXjKZXm9g8eNClLQuEN+Yt90o0baDCpRDCCYsDEz3Uhpc5D2Wx1IZE1G1B4M8GY3OLsczzQ==", + "dependencies": { + "axios": "^0.18.0", + "figures": "^2.0.0", + "find-package-json": "^1.1.0", + "glob": "^7.1.3", + "jsonfile-updater": "^3.1.0", + "meow": "^5.0.0" + }, + "bin": { + "ts": "dist/cli.js" + }, + "optionalDependencies": { + "tslint": "5.*" + }, + "peerDependencies": { + "typescript": "2.* || 3.*" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "node_modules/tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "optional": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev" + } + }, + "node_modules/tslint/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tslint/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "optional": true + }, + "node_modules/tslint/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "optional": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -3350,6 +4208,19 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "node_modules/typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -3421,6 +4292,15 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3702,11 +4582,83 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "optional": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, "@babel/helper-validator-identifier": { "version": "7.14.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "optional": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "optional": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "@babel/parser": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", @@ -4087,6 +5039,11 @@ "regenerator-runtime": "^0.13.3" } }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==" + }, "@tycrek/ass-storage-engine": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/@tycrek/ass-storage-engine/-/ass-storage-engine-0.2.7.tgz", @@ -4133,6 +5090,14 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "requires": { + "@types/node": "*" + } + }, "@vibrant/color": { "version": "3.2.1-alpha.1", "resolved": "https://registry.npmjs.org/@vibrant/color/-/color-3.2.1-alpha.1.tgz", @@ -4366,11 +5331,30 @@ "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "optional": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4419,6 +5403,15 @@ } } }, + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, "babel-walk": { "version": "3.0.0-canary-5", "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", @@ -4427,6 +5420,11 @@ "@babel/types": "^7.9.6" } }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "base32-encode": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", @@ -4488,6 +5486,15 @@ } } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -4508,6 +5515,12 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "optional": true + }, "busboy": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", @@ -4535,6 +5548,23 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -4714,6 +5744,17 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -4789,6 +5830,14 @@ "type-fest": "^0.8.1" } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -4807,6 +5856,22 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -4835,6 +5900,12 @@ "streamsearch": "0.1.2" } }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true + }, "discord.js": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", @@ -4893,6 +5964,14 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, + "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", @@ -4903,6 +5982,12 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "optional": true + }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -4995,6 +6080,14 @@ "progress": "^2.0.3" } }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, "file-type": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", @@ -5014,6 +6107,11 @@ "unpipe": "~1.0.0" } }, + "find-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", + "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -5030,6 +6128,24 @@ "imul": "^1.0.0" } }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + }, + "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" + } + } + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5059,6 +6175,11 @@ "random-path": "^0.1.0" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5096,6 +6217,19 @@ "omggif": "^1.0.10" } }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -5146,6 +6280,11 @@ "resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz", "integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==" }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -5220,6 +6359,20 @@ "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=" }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -5235,6 +6388,16 @@ "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-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -5262,6 +6425,11 @@ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -5323,6 +6491,27 @@ "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "optional": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "optional": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, "jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -5332,6 +6521,11 @@ "universalify": "^2.0.0" } }, + "jsonfile-updater": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsonfile-updater/-/jsonfile-updater-3.1.0.tgz", + "integrity": "sha512-G6DB55KX4Cc5t0Zpg4kfy2b3N592fahyoUJz5rk4VmS8lccXskgUbjUEX51iXMc6gh6sE7urmXWJsW6EqDozVQ==" + }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -5364,6 +6558,24 @@ "xtend": "^4.0.0" } }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -5373,6 +6585,15 @@ "path-exists": "^3.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "luxon": { "version": "1.28.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.0.tgz", @@ -5386,6 +6607,11 @@ "p-defer": "^1.0.0" } }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + }, "map-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", @@ -5411,6 +6637,37 @@ "p-is-promise": "^2.0.0" } }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -5452,11 +6709,28 @@ "dom-walk": "^0.1.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -5542,6 +6816,24 @@ } } }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -5666,6 +6958,15 @@ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.4.tgz", "integrity": "sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==" }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -5676,6 +6977,11 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5691,6 +6997,21 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, "phin": { "version": "2.9.3", "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", @@ -5905,6 +7226,11 @@ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + }, "random-path": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", @@ -5938,6 +7264,65 @@ "mute-stream": "~0.0.4" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -5952,6 +7337,15 @@ "util-deprecate": "~1.0.1" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -6093,6 +7487,40 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, + "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.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "optional": true + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -6168,11 +7596,21 @@ "ansi-regex": "^5.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, "submodule": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/submodule/-/submodule-1.2.1.tgz", @@ -6242,6 +7680,11 @@ "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=" }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", @@ -6250,6 +7693,114 @@ "utf8-byte-length": "^1.0.1" } }, + "ts": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ts/-/ts-0.2.2.tgz", + "integrity": "sha512-cftcjXvrxBi6TJxwXjKZXm9g8eNClLQuEN+Yt90o0baDCpRDCCYsDEz3Uhpc5D2Wx1IZE1G1B4M8GY3OLsczzQ==", + "requires": { + "axios": "^0.18.0", + "figures": "^2.0.0", + "find-package-json": "^1.1.0", + "glob": "^7.1.3", + "jsonfile-updater": "^3.1.0", + "meow": "^5.0.0", + "tslint": "5.*" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "optional": true + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "optional": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "optional": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "optional": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "optional": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", @@ -6274,6 +7825,12 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", + "peer": true + }, "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -6329,6 +7886,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "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", diff --git a/package.json b/package.json index fe9739e..5717fc3 100755 --- a/package.json +++ b/package.json @@ -8,12 +8,14 @@ "npm": ">=7.x.x" }, "scripts": { - "start": "node src/ass.js", - "setup": "node src/setup.js", - "metrics": "node src/metrics.js", - "new-token": "node src/generators/token.js", + "dev": "npm run build && npm start", + "build": "ts", + "start": "node dist/ass.js", + "setup": "node dist/setup.js", + "metrics": "node dist/metrics.js", + "new-token": "node dist/generators/token.js", "restart": "systemctl restart ass.service", - "engine-check": "node src/checkEngine.js", + "engine-check": "node dist/checkEngine.js", "prestart": "npm run engine-check", "presetup": "npm run engine-check", "docker-logs": "docker-compose logs -f --tail=50 --no-log-prefix ass", @@ -34,10 +36,12 @@ "url": "https://patreon.com/tycrek" }, "dependencies": { + "@tsconfig/node14": "^1.0.1", "@tycrek/ass-storage-engine": "^0.2.7", "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", "check-node-version": "^4.1.0", @@ -60,6 +64,7 @@ "sanitize-filename": "^1.6.3", "stream-to-array": "^2.3.0", "submodule": "^1.2.1", + "ts": "^0.2.2", "uuid": "^8.3.2" } -} \ No newline at end of file +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..62b2949 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node14/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "lib": [ + "ES2020", + "DOM" + ] + }, + "include": [ + "src/**/*.js" + ], + "exclude": [ + "ass-x" + ] +} \ No newline at end of file From e1032588c52d460fe3870b1b2f00560e280408bb Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 7 Sep 2021 20:50:32 -0600 Subject: [PATCH 04/32] migrated generators to TS!! --- package-lock.json | 52 ++++++++++++++++++++++--- package.json | 4 +- src/generators/{gfycat.js => gfycat.ts} | 8 ++-- src/generators/lengthGen.js | 2 - src/generators/lengthGen.ts | 2 + src/generators/random.js | 2 - src/generators/random.ts | 2 + src/generators/{token.js => token.ts} | 4 +- src/generators/{zws.js => zws.ts} | 2 +- tsconfig.json | 8 ++-- 10 files changed, 65 insertions(+), 21 deletions(-) rename src/generators/{gfycat.js => gfycat.ts} (75%) delete mode 100644 src/generators/lengthGen.js create mode 100644 src/generators/lengthGen.ts delete mode 100644 src/generators/random.js create mode 100644 src/generators/random.ts rename src/generators/{token.js => token.ts} (90%) rename src/generators/{zws.js => zws.ts} (54%) diff --git a/package-lock.json b/package-lock.json index df3988e..48a033a 100755 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,8 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/fs-extra": "^9.0.12", + "@types/node": "^14.17.15", "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", @@ -722,10 +724,18 @@ "url": "https://patreon.com/tycrek" } }, + "node_modules/@types/fs-extra": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", + "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + "version": "14.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", + "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -2260,6 +2270,11 @@ "@types/node": "^10.0.3" } }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -2900,6 +2915,11 @@ "url": "^0.11.0" } }, + "node_modules/node-vibrant/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, "node_modules/node-vibrant/node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -5085,10 +5105,18 @@ "use-climate-change-reminder": "^0.0.7" } }, + "@types/fs-extra": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", + "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "requires": { + "@types/node": "*" + } + }, "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + "version": "14.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", + "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" }, "@types/ws": { "version": "7.4.7", @@ -6310,6 +6338,13 @@ "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "requires": { "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } } }, "https-proxy-agent": { @@ -6805,6 +6840,11 @@ "url": "^0.11.0" }, "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", diff --git a/package.json b/package.json index 5717fc3..0acb411 100755 --- a/package.json +++ b/package.json @@ -41,6 +41,8 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/fs-extra": "^9.0.12", + "@types/node": "^14.17.15", "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", @@ -67,4 +69,4 @@ "ts": "^0.2.2", "uuid": "^8.3.2" } -} +} \ No newline at end of file diff --git a/src/generators/gfycat.js b/src/generators/gfycat.ts similarity index 75% rename from src/generators/gfycat.js rename to src/generators/gfycat.ts index a7f418d..a9caf2a 100644 --- a/src/generators/gfycat.js +++ b/src/generators/gfycat.ts @@ -1,10 +1,10 @@ -const fs = require('fs-extra'); +import fs from 'fs-extra'; // Don't trigger circular dependency during setup -if (!require.main.filename.includes('setup.js')) +if (require !== undefined && !require?.main?.filename.includes('setup.js')) var MIN_LENGTH = require('../setup').gfyIdSize; // skipcq: JS-0239, JS-0102 -function getWord(list, delim = '') { +function getWord(list: string[], delim = '') { return list[Math.floor(Math.random() * list.length)].concat(delim); } @@ -20,4 +20,4 @@ function genString(count = MIN_LENGTH) { return gfycat.concat(getWord(animals)); }; -module.exports = ({ gfyLength }) => genString(gfyLength); +module.exports = ({ gfyLength }: { gfyLength: number }) => genString(gfyLength); diff --git a/src/generators/lengthGen.js b/src/generators/lengthGen.js deleted file mode 100644 index 825ae93..0000000 --- a/src/generators/lengthGen.js +++ /dev/null @@ -1,2 +0,0 @@ -const { randomBytes } = require('crypto'); -module.exports = (length, charset) => [...randomBytes(length)].map((byte) => charset[Number(byte) % charset.length]).join('').slice(1).concat(charset[0]); \ No newline at end of file diff --git a/src/generators/lengthGen.ts b/src/generators/lengthGen.ts new file mode 100644 index 0000000..54a5797 --- /dev/null +++ b/src/generators/lengthGen.ts @@ -0,0 +1,2 @@ +import { randomBytes } from 'crypto'; +module.exports = (length: number, charset: string[]): string => [...randomBytes(length)].map((byte) => charset[Number(byte) % charset.length]).join('').slice(1).concat(charset[0]); \ No newline at end of file diff --git a/src/generators/random.js b/src/generators/random.js deleted file mode 100644 index 398919b..0000000 --- a/src/generators/random.js +++ /dev/null @@ -1,2 +0,0 @@ -const cryptoRandomString = require('crypto-random-string'); -module.exports = ({ length }) => cryptoRandomString({ length, type: 'alphanumeric' }); diff --git a/src/generators/random.ts b/src/generators/random.ts new file mode 100644 index 0000000..9d32ffd --- /dev/null +++ b/src/generators/random.ts @@ -0,0 +1,2 @@ +import cryptoRandomString from 'crypto-random-string'; +module.exports = ({ length }: { length: number }) => cryptoRandomString({ length, type: 'alphanumeric' }); diff --git a/src/generators/token.js b/src/generators/token.ts similarity index 90% rename from src/generators/token.js rename to src/generators/token.ts index 5581844..8b8bd2b 100644 --- a/src/generators/token.js +++ b/src/generators/token.ts @@ -1,5 +1,5 @@ const uuid = require('uuid').v4; -const fs = require('fs-extra'); +import fs from 'fs-extra'; const path = require('path'); const randomGen = require('./random'); const TLog = require('@tycrek/log'); @@ -20,7 +20,7 @@ if (require.main === module) { // Generate the user const username = process.argv[2] ? process.argv[2].replace(/[^\da-z_]/gi, '').substring(0, MAX_USERNAME) : randomGen({ length: 20 }); // skipcq: JS-0074 if (!auth.users) auth.users = {}; - if (Object.values(auth.users).findIndex((user) => user.username === username) !== -1) { + if (Object.values(auth.users).findIndex((user: any) => user.username === username) !== -1) { log.error('Username already exists', username); process.exit(1); } diff --git a/src/generators/zws.js b/src/generators/zws.ts similarity index 54% rename from src/generators/zws.js rename to src/generators/zws.ts index 77d5a28..a64cf28 100644 --- a/src/generators/zws.js +++ b/src/generators/zws.ts @@ -1,3 +1,3 @@ const lengthGen = require('./lengthGen'); const zeroWidthChars = ['\u200B', '\u200C', '\u200D', '\u2060']; -module.exports = ({ length }) => lengthGen(length, zeroWidthChars); +module.exports = ({ length }: { length: number }) => lengthGen(length, zeroWidthChars); diff --git a/tsconfig.json b/tsconfig.json index 62b2949..5f09385 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,14 +1,16 @@ { "extends": "@tsconfig/node14/tsconfig.json", "compilerOptions": { - "allowJs": true, "lib": [ "ES2020", "DOM" - ] + ], + "allowJs": true, + "downlevelIteration": true }, "include": [ - "src/**/*.js" + "src/**/*.js", + "src/**/*.ts" ], "exclude": [ "ass-x" From 5bd5f258a390b855467db3a72ad5f65760031c5b Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 8 Sep 2021 16:48:26 -0600 Subject: [PATCH 05/32] Fixed repeated "cannot write file" errors --- tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tsconfig.json b/tsconfig.json index 5f09385..aac1aca 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "@tsconfig/node14/tsconfig.json", "compilerOptions": { + "outDir": "./dist", "lib": [ "ES2020", "DOM" From 5d9d749062d564bc96915629ae2e0dadbe2b13fa Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 8 Sep 2021 17:41:41 -0600 Subject: [PATCH 06/32] migrated Resource router to TS; added some type definitions --- package-lock.json | 214 ++++++++++++++++++++++- package.json | 9 +- src/definitions.d.ts | 49 ++++++ src/routers/{resource.js => resource.ts} | 60 ++++--- 4 files changed, 294 insertions(+), 38 deletions(-) create mode 100644 src/definitions.d.ts rename src/routers/{resource.js => resource.ts} (66%) diff --git a/package-lock.json b/package-lock.json index 48a033a..6d4fbfb 100755 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/escape-html": "^1.0.1", "@types/fs-extra": "^9.0.12", "@types/node": "^14.17.15", "@types/ws": "^7.4.7", @@ -32,7 +33,7 @@ "luxon": "^1.26.0", "marked": "^2.0.7", "multer": "2.0.0-rc.2", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.2", "node-vibrant": "*", "prompt": "^1.1.0", "pug": "^3.0.2", @@ -42,6 +43,10 @@ "ts": "^0.2.2", "uuid": "^8.3.2" }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/node-fetch": "^2.5.12" + }, "engines": { "node": ">=14.7.x <16", "npm": ">=7.x.x" @@ -724,6 +729,53 @@ "url": "https://patreon.com/tycrek" } }, + "node_modules/@types/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==" + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "node_modules/@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -732,11 +784,49 @@ "@types/node": "*" } }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/node": { "version": "14.17.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" }, + "node_modules/@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -2061,6 +2151,20 @@ "ms": "2.0.0" } }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2894,9 +2998,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", "engines": { "node": "4.x || >=6.0.0" } @@ -5105,6 +5209,53 @@ "use-climate-change-reminder": "^0.0.7" } }, + "@types/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==" + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, "@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -5113,11 +5264,49 @@ "@types/node": "*" } }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/node": { "version": "14.17.15", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" }, + "@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -6174,6 +6363,17 @@ } } }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6822,9 +7022,9 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" }, "node-vibrant": { "version": "3.2.1-alpha.1", diff --git a/package.json b/package.json index 0acb411..66fd71f 100755 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", + "@types/escape-html": "^1.0.1", "@types/fs-extra": "^9.0.12", "@types/node": "^14.17.15", "@types/ws": "^7.4.7", @@ -59,7 +60,7 @@ "luxon": "^1.26.0", "marked": "^2.0.7", "multer": "2.0.0-rc.2", - "node-fetch": "^2.6.1", + "node-fetch": "^2.6.2", "node-vibrant": "*", "prompt": "^1.1.0", "pug": "^3.0.2", @@ -68,5 +69,9 @@ "submodule": "^1.2.1", "ts": "^0.2.2", "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/node-fetch": "^2.5.12" } -} \ No newline at end of file +} diff --git a/src/definitions.d.ts b/src/definitions.d.ts new file mode 100644 index 0000000..5eea687 --- /dev/null +++ b/src/definitions.d.ts @@ -0,0 +1,49 @@ +import { Request, Response } from "express"; + +export interface FileData { + // Data from Multer file object + path: string + size: number + mimetype: string + ext: string + originalname: string + + // Data from ass + randomId: string + deleteId: string + is: IsPossible, + thumbnail: string + vibrant: string + sha1: string + domain: string + timestamp: number + token: string + opengraph: OpenGraphData +} + +export interface IsPossible { + image: boolean + video: boolean + audio: boolean + other: boolean +} + +export interface OpenGraphData { + title?: string + description?: string + author?: string + authorUrl?: string + provider?: string + providerUrl?: string + color?: string +} + +export interface AssRequest extends Request { + resourceId?: string + ass?: { resourceId: string } + +} + +export interface AssResponse extends Response { + +} \ No newline at end of file diff --git a/src/routers/resource.js b/src/routers/resource.ts similarity index 66% rename from src/routers/resource.js rename to src/routers/resource.ts index 7ffd3b4..0d8b565 100644 --- a/src/routers/resource.js +++ b/src/routers/resource.ts @@ -1,6 +1,8 @@ -const fs = require('fs-extra'); -const escape = require('escape-html'); -const fetch = require('node-fetch'); +import { FileData, IsPossible, AssRequest, AssResponse } from '../definitions'; + +import fs from 'fs-extra'; +import escape from 'escape-html'; +import fetch, { Response } from 'node-fetch'; const { deleteS3 } = require('../storage'); const { diskFilePath, s3enabled, viewDirect } = require('../../config.json'); const { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } = require('../utils'); @@ -8,23 +10,23 @@ const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, } = require('../../MagicNumbers.json' const data = require('../data'); const users = require('../auth'); -const express = require('express'); +import express from 'express'; const router = express.Router(); // Middleware for parsing the resource ID and handling 404 -router.use((req, res, next) => { +router.use((req: AssRequest, res: AssResponse, next) => { // Parse the resource ID req.ass = { resourceId: escape(req.resourceId || '').split('.')[0] }; // If the ID is invalid, return 404. Otherwise, continue normally data.has(req.ass.resourceId) - .then((has) => has ? next() : res.sendStatus(CODE_NOT_FOUND)) // skipcq: JS-0229 + .then((has: boolean) => has ? next() : res.sendStatus(CODE_NOT_FOUND)) // skipcq: JS-0229 .catch(next); }); // View file -router.get('/', (req, res, next) => data.get(req.ass.resourceId).then((fileData) => { - const { resourceId } = req.ass; +router.get('/', (req: AssRequest, res: AssResponse, next) => data.get(req.ass?.resourceId).then((fileData: FileData) => { + const resourceId = req.ass?.resourceId; // Build OpenGraph meta tags const og = fileData.opengraph, ogs = ['']; @@ -53,19 +55,19 @@ router.get('/', (req, res, next) => data.get(req.ass.resourceId).then((fileData) }).catch(next)); // Direct resource -router.get('/direct*', (req, res, next) => data.get(req.ass.resourceId).then((fileData) => { +router.get('/direct*', (req: AssRequest, res: AssResponse, next) => data.get(req.ass?.resourceId).then((fileData: FileData) => { // Send file as an attachement for downloads if (req.query.download) res.header('Content-Disposition', `attachment; filename="${fileData.originalname}"`); // Return the file differently depending on what storage option was used const uploaders = { - s3: () => fetch(getS3url(fileData.randomId, fileData.ext)).then((file) => { + s3: () => fetch(getS3url(fileData.randomId, fileData.ext)).then((file: Response) => { file.headers.forEach((value, header) => res.setHeader(header, value)); - file.body.pipe(res); + file.body?.pipe(res); }), local: () => { - res.header('Accept-Ranges', 'bytes').header('Content-Length', fileData.size).type(fileData.mimetype); + res.header('Accept-Ranges', 'bytes').header('Content-Length', `${fileData.size}`).type(fileData.mimetype); fs.createReadStream(fileData.path).pipe(res); } }; @@ -74,33 +76,33 @@ router.get('/direct*', (req, res, next) => data.get(req.ass.resourceId).then((fi }).catch(next)); // Thumbnail response -router.get('/thumbnail', (req, res, next) => - data.get(req.ass.resourceId) - .then(({ is, thumbnail }) => fs.readFile((!is || (is.image || is.video)) ? path(diskFilePath, 'thumbnails/', thumbnail) : is.audio ? 'views/ass-audio-icon.png' : 'views/ass-file-icon.png')) - .then((fileData) => res.type('jpg').send(fileData)) +router.get('/thumbnail', (req: AssRequest, res: AssResponse, next) => + data.get(req.ass?.resourceId) + .then(({ is, thumbnail }: { is: IsPossible, thumbnail: string }) => fs.readFile((!is || (is.image || is.video)) ? path(diskFilePath, 'thumbnails/', thumbnail) : is.audio ? 'views/ass-audio-icon.png' : 'views/ass-file-icon.png')) + .then((fileData: Buffer) => res.type('jpg').send(fileData)) .catch(next)); // oEmbed response for clickable authors/providers // https://oembed.com/ // https://old.reddit.com/r/discordapp/comments/82p8i6/a_basic_tutorial_on_how_to_get_the_most_out_of/ -router.get('/oembed', (req, res, next) => - data.get(req.ass.resourceId) - .then(({ opengraph, is, size, timestamp, originalname }) => +router.get('/oembed', (req: AssRequest, res: AssResponse, next) => + data.get(req.ass?.resourceId) + .then((fileData: FileData) => res.type('json').send({ version: '1.0', - type: is.video ? 'video' : is.image ? 'photo' : 'link', - author_url: opengraph.authorUrl, - provider_url: opengraph.providerUrl, - author_name: replaceholder(opengraph.author || '', size, timestamp, originalname), - provider_name: replaceholder(opengraph.provider || '', size, timestamp, originalname) + type: fileData.is.video ? 'video' : fileData.is.image ? 'photo' : 'link', + author_url: fileData.opengraph.authorUrl, + provider_url: fileData.opengraph.providerUrl, + author_name: replaceholder(fileData.opengraph.author || '', fileData.size, fileData.timestamp, fileData.originalname), + provider_name: replaceholder(fileData.opengraph.provider || '', fileData.size, fileData.timestamp, fileData.originalname) })) .catch(next)); // Delete file -router.get('/delete/:deleteId', (req, res, next) => { - let oldName, oldType; // skipcq: JS-0119 - data.get(req.ass.resourceId) - .then((fileData) => { +router.get('/delete/:deleteId', (req: AssRequest, res: AssResponse, next) => { + let oldName: string, oldType: string; // skipcq: JS-0119 + data.get(req.ass?.resourceId) + .then((fileData: FileData) => { // Extract info for logs oldName = fileData.originalname; oldType = fileData.mimetype; @@ -117,7 +119,7 @@ router.get('/delete/:deleteId', (req, res, next) => { (!fileData.is || (fileData.is.image || fileData.is.video)) && fs.existsSync(path(diskFilePath, 'thumbnails/', fileData.thumbnail)) ? fs.rmSync(path(diskFilePath, 'thumbnails/', fileData.thumbnail)) : () => Promise.resolve()]); }) - .then(() => data.del(req.ass.resourceId)) + .then(() => data.del(req.ass?.resourceId)) .then(() => (log.success('Deleted', oldName, oldType), res.type('text').send('File has been deleted!'))) // skipcq: JS-0090 .catch(next); }); From b77e0a7c05cb962cf536642493ef02eadbdb5ad9 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 8 Sep 2021 17:43:13 -0600 Subject: [PATCH 07/32] moved all @types to `devDependencies` --- package-lock.json | 34 +++++++++++++++++++++------------- package.json | 10 +++++----- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d4fbfb..93db542 100755 --- a/package-lock.json +++ b/package-lock.json @@ -14,10 +14,6 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", - "@types/escape-html": "^1.0.1", - "@types/fs-extra": "^9.0.12", - "@types/node": "^14.17.15", - "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", "check-node-version": "^4.1.0", @@ -44,8 +40,12 @@ "uuid": "^8.3.2" }, "devDependencies": { + "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", - "@types/node-fetch": "^2.5.12" + "@types/fs-extra": "^9.0.12", + "@types/node": "^16.9.0", + "@types/node-fetch": "^2.5.12", + "@types/ws": "^7.4.7" }, "engines": { "node": ">=14.7.x <16", @@ -751,7 +751,8 @@ "node_modules/@types/escape-html": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", - "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==" + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.13", @@ -780,6 +781,7 @@ "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -791,9 +793,10 @@ "dev": true }, "node_modules/@types/node": { - "version": "14.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", - "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", + "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", + "dev": true }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -831,6 +834,7 @@ "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -5231,7 +5235,8 @@ "@types/escape-html": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", - "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==" + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true }, "@types/express": { "version": "4.17.13", @@ -5260,6 +5265,7 @@ "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "dev": true, "requires": { "@types/node": "*" } @@ -5271,9 +5277,10 @@ "dev": true }, "@types/node": { - "version": "14.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", - "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", + "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", + "dev": true }, "@types/node-fetch": { "version": "2.5.12", @@ -5311,6 +5318,7 @@ "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dev": true, "requires": { "@types/node": "*" } diff --git a/package.json b/package.json index 66fd71f..7839b5a 100755 --- a/package.json +++ b/package.json @@ -41,10 +41,6 @@ "@tycrek/express-nofavicon": "^1.0.2", "@tycrek/isprod": "^2.0.2", "@tycrek/log": ">=0.5.x", - "@types/escape-html": "^1.0.1", - "@types/fs-extra": "^9.0.12", - "@types/node": "^14.17.15", - "@types/ws": "^7.4.7", "any-shell-escape": "^0.1.1", "aws-sdk": "^2.930.0", "check-node-version": "^4.1.0", @@ -71,7 +67,11 @@ "uuid": "^8.3.2" }, "devDependencies": { + "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", - "@types/node-fetch": "^2.5.12" + "@types/fs-extra": "^9.0.12", + "@types/node": "^16.9.0", + "@types/node-fetch": "^2.5.12", + "@types/ws": "^7.4.7" } } From f5896e0031e78ba0e250f59de1f25453aaf8648d Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 8 Sep 2021 19:13:34 -0600 Subject: [PATCH 08/32] holy shit it's working (migrated `upload.js` to `upload.ts`) --- src/definitions.d.ts | 30 +++++++++++------ src/routers/{upload.js => upload.ts} | 50 ++++++++++++++++------------ 2 files changed, 48 insertions(+), 32 deletions(-) rename src/routers/{upload.js => upload.ts} (71%) diff --git a/src/definitions.d.ts b/src/definitions.d.ts index 5eea687..e6946a7 100644 --- a/src/definitions.d.ts +++ b/src/definitions.d.ts @@ -1,5 +1,10 @@ import { Request, Response } from "express"; +export interface User { + token: string + username: string +} + export interface FileData { // Data from Multer file object path: string @@ -11,7 +16,7 @@ export interface FileData { // Data from ass randomId: string deleteId: string - is: IsPossible, + is: IsPossible thumbnail: string vibrant: string sha1: string @@ -29,21 +34,26 @@ export interface IsPossible { } export interface OpenGraphData { - title?: string - description?: string - author?: string - authorUrl?: string - provider?: string - providerUrl?: string - color?: string + title?: string | string[] + description?: string | string[] + author?: string | string[] + authorUrl?: string | string[] + provider?: string | string[] + providerUrl?: string | string[] + color?: string | string[] } export interface AssRequest extends Request { resourceId?: string ass?: { resourceId: string } - + token?: string + file?: FileData } export interface AssResponse extends Response { -} \ No newline at end of file +} + +export interface ErrWrap extends Error { + code?: number | string +} diff --git a/src/routers/upload.js b/src/routers/upload.ts similarity index 71% rename from src/routers/upload.js rename to src/routers/upload.ts index 9bdaf76..68bc232 100644 --- a/src/routers/upload.js +++ b/src/routers/upload.ts @@ -1,3 +1,5 @@ +import { FileData, AssRequest, AssResponse, ErrWrap, User } from "../definitions"; + const fs = require('fs-extra'); //const rateLimit = require('express-rate-limit'); const { DateTime } = require('luxon'); @@ -10,7 +12,7 @@ const data = require('../data'); const users = require('../auth'); const ASS_LOGO = 'https://cdn.discordapp.com/icons/848274994375294986/8d339d4a2f3f54b2295e5e0ff62bd9e6.png?size=1024'; -const express = require('express'); +import express from 'express'; const router = express.Router(); // Rate limit middleware @@ -20,7 +22,7 @@ const router = express.Router(); })); */ // Block unauthorized requests and attempt token sanitization -router.post('/', (req, res, next) => { +router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { req.headers.authorization = req.headers.authorization || ''; req.token = req.headers.authorization.replace(/[^\da-z]/gi, ''); // Strip anything that isn't a digit or ASCII letter !verify(req, users) ? log.warn('Upload blocked', 'Unauthorized').callback(() => res.sendStatus(CODE_UNAUTHORIZED)) : next(); // skipcq: JS-0093 @@ -28,30 +30,30 @@ router.post('/', (req, res, next) => { // Upload file //router.post('/', doUpload, processUploaded, ({ next }) => next()); -router.post('/', (req, res, next) => doUpload(req, res, (err) => { +router.post('/', (req: AssRequest, res: AssResponse, next: Function) => doUpload(req, res, (err: Error) => { log.express().Header(req, 'Content-Type'); (err) ? log.error(`Multer encountered an ${!(err.toString().includes('MulterError')) ? 'unknown ' : ''}error`, err).callback(next, err) : log.debug('Multer', 'File saved in temp dir').callback(next); -}), processUploaded, ({ next }) => next()); +}), processUploaded, ({ next }: { next: Function }) => next()); -router.use('/', (err, _req, res, next) => err.code && err.code === 'LIMIT_FILE_SIZE' ? log.warn('Upload blocked', 'File too large').callback(() => res.status(CODE_PAYLOAD_TOO_LARGE).send(`Max upload size: ${maxUploadSize}MB`)) : next(err)); // skipcq: JS-0229 +router.use('/', (err: ErrWrap, _req: AssRequest, res: AssResponse, next: Function) => err.code && err.code === 'LIMIT_FILE_SIZE' ? log.warn('Upload blocked', 'File too large').callback(() => res.status(CODE_PAYLOAD_TOO_LARGE).send(`Max upload size: ${maxUploadSize}MB`)) : next(err)); // skipcq: JS-0229 // Process uploaded file -router.post('/', (req, res, next) => { +router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { // Load overrides const trueDomain = getTrueDomain(req.headers['x-ass-domain']); const generator = req.headers['x-ass-access'] || resourceIdType; // Save domain with file - req.file.domain = `${getTrueHttp()}${trueDomain}`; + req.file!.domain = `${getTrueHttp()}${trueDomain}`; // Get the uploaded time in milliseconds - req.file.timestamp = DateTime.now().toMillis(); + req.file!.timestamp = DateTime.now().toMillis(); // Keep track of the token that uploaded the resource - req.file.token = req.token; + req.file!.token = req.token ?? ''; // Attach any embed overrides, if necessary - req.file.opengraph = { + req.file!.opengraph = { title: req.headers['x-ass-og-title'], description: req.headers['x-ass-og-description'], author: req.headers['x-ass-og-author'], @@ -62,17 +64,17 @@ router.post('/', (req, res, next) => { }; // Save the file information - const resourceId = generateId(generator, resourceIdSize, req.headers['x-ass-gfycat'] || gfyIdSize, req.file.originalname); + const resourceId = generateId(generator, resourceIdSize, req.headers['x-ass-gfycat'] || gfyIdSize, req.file!.originalname); log.debug('Saving data', data.name); data.put(resourceId.split('.')[0], req.file).then(() => { // Log the upload - const logInfo = `${req.file.originalname} (${req.file.mimetype}, ${formatBytes(req.file.size)})`; - log.success('File uploaded', logInfo, `uploaded by ${users[req.token] ? users[req.token].username : ''}`); + const logInfo = `${req.file!.originalname} (${req.file!.mimetype}, ${formatBytes(req.file!.size)})`; + log.success('File uploaded', logInfo, `uploaded by ${users[req.token ?? ''] ? users[req.token ?? ''].username : ''}`); // Build the URLs const resourceUrl = `${getTrueHttp()}${trueDomain}/${resourceId}`; const thumbnailUrl = `${getTrueHttp()}${trueDomain}/${resourceId}/thumbnail`; - const deleteUrl = `${getTrueHttp()}${trueDomain}/${resourceId}/delete/${req.file.deleteId}`; + const deleteUrl = `${getTrueHttp()}${trueDomain}/${resourceId}/delete/${req.file!.deleteId}`; // Send the response res.type('json').send({ resource: resourceUrl, thumbnail: thumbnailUrl, delete: deleteUrl }) @@ -88,10 +90,10 @@ router.post('/', (req, res, next) => { const embed = new MessageEmbed() .setTitle(logInfo) .setURL(resourceUrl) - .setDescription(`**Size:** \`${formatBytes(req.file.size)}\`\n**[Delete](${deleteUrl})**`) + .setDescription(`**Size:** \`${formatBytes(req.file!.size)}\`\n**[Delete](${deleteUrl})**`) .setThumbnail(thumbnailUrl) - .setColor(req.file.vibrant) - .setTimestamp(req.file.timestamp); + .setColor(req.file!.vibrant) + .setTimestamp(req.file!.timestamp); // Send the embed to the webhook, then delete the client after to free resources log.debug('Sending webhook to client', client); @@ -103,14 +105,18 @@ router.post('/', (req, res, next) => { } // Also update the users upload count - if (!users[req.token]) { + if (!users[req.token ?? '']) { const generateUsername = () => generateId('random', 20, null); // skipcq: JS-0074 - let username = generateUsername(); - while (Object.values(users).findIndex((user) => user.username === username) !== -1) // skipcq: JS-0073 + let username: string = generateUsername(); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + while (Object.values(users).findIndex((user: User) => user.username === username) !== -1) // skipcq: JS-0073 username = generateUsername(); - users[req.token] = { username, count: 0 }; + + users[req.token ?? ''] = { username, count: 0 }; } - users[req.token].count += 1; + users[req.token ?? ''].count += 1; fs.writeJsonSync(path('auth.json'), { users }, { spaces: 4 }); log.debug('Upload request flow completed', ''); From a16478f990d15771918399a3ae6595de27d5c5f6 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 8 Sep 2021 19:15:12 -0600 Subject: [PATCH 09/32] Ass TypeScript Beta 1 (version `0.9.0-rc.1`) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 93db542..a5d811d 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ass", - "version": "0.8.6", + "version": "0.9.0-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ass", - "version": "0.8.6", + "version": "0.9.0-rc.1", "license": "ISC", "dependencies": { "@tsconfig/node14": "^1.0.1", diff --git a/package.json b/package.json index 7839b5a..eea8085 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ass", - "version": "0.8.6", + "version": "0.9.0-rc.1", "description": "The superior self-hosted ShareX server", "main": "ass.js", "engines": { From 2521ec6cf0f50f82503fa326c76ea1c0fe087ca6 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sat, 11 Sep 2021 17:02:26 -0600 Subject: [PATCH 10/32] Migrated more files (expand for details) - `auth.js` - `data.js` - `hash.js` - `thumbnail.js` - `vibrant.js` --- package-lock.json | 32 ++++++++++++++++++++++++++++ package.json | 2 ++ src/{auth.js => auth.ts} | 9 ++++---- src/{data.js => data.ts} | 0 src/hash.js | 17 --------------- src/hash.ts | 18 ++++++++++++++++ src/{thumbnails.js => thumbnails.ts} | 26 +++++++++++----------- src/{vibrant.js => vibrant.ts} | 13 +++++------ 8 files changed, 78 insertions(+), 39 deletions(-) rename src/{auth.js => auth.ts} (73%) rename src/{data.js => data.ts} (100%) delete mode 100644 src/hash.js create mode 100644 src/hash.ts rename src/{thumbnails.js => thumbnails.ts} (80%) rename src/{vibrant.js => vibrant.ts} (59%) diff --git a/package-lock.json b/package-lock.json index a5d811d..f0f2e66 100755 --- a/package-lock.json +++ b/package-lock.json @@ -42,9 +42,11 @@ "devDependencies": { "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", + "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", + "@types/stream-to-array": "^2.3.0", "@types/ws": "^7.4.7" }, "engines": { @@ -777,6 +779,12 @@ "@types/range-parser": "*" } }, + "node_modules/@types/ffmpeg-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-3.0.0.tgz", + "integrity": "sha512-JTwV8fFQYUgp8VLUKLd8zHfhFOoTTszMlofnWINAZYWSd/iR2ZZHJsWanUhBG4+c8QPfWE8P7t3nAjSxTNjevQ==", + "dev": true + }, "node_modules/@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -830,6 +838,15 @@ "@types/node": "*" } }, + "node_modules/@types/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -5261,6 +5278,12 @@ "@types/range-parser": "*" } }, + "@types/ffmpeg-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-3.0.0.tgz", + "integrity": "sha512-JTwV8fFQYUgp8VLUKLd8zHfhFOoTTszMlofnWINAZYWSd/iR2ZZHJsWanUhBG4+c8QPfWE8P7t3nAjSxTNjevQ==", + "dev": true + }, "@types/fs-extra": { "version": "9.0.12", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", @@ -5314,6 +5337,15 @@ "@types/node": "*" } }, + "@types/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@types/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha512-s8Y6/EV1LPn9fDlJKSlD8r+14hWXVDn+wPAGwWRzTUq/4MqdoQNEzQxP6Jq91qvFYxR3OlFAPXcv6ToplnAgFQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", diff --git a/package.json b/package.json index eea8085..c9e53e1 100755 --- a/package.json +++ b/package.json @@ -69,9 +69,11 @@ "devDependencies": { "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", + "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", + "@types/stream-to-array": "^2.3.0", "@types/ws": "^7.4.7" } } diff --git a/src/auth.js b/src/auth.ts similarity index 73% rename from src/auth.js rename to src/auth.ts index 1b1269a..dd3d813 100644 --- a/src/auth.js +++ b/src/auth.ts @@ -2,16 +2,17 @@ * Used for global auth management */ -const fs = require('fs-extra'); -const { log, path, arrayEquals } = require('./utils'); +import fs from 'fs-extra'; +import { log, path, arrayEquals } from './utils'; const users = require('../auth.json').users || {}; // Monitor auth.json for changes (triggered by running 'npm run new-token') fs.watch(path('auth.json'), { persistent: false }, - (eventType) => eventType === 'change' && fs.readJson(path('auth.json')) - .then((json) => { + (eventType: String) => eventType === 'change' && fs.readJson(path('auth.json')) + .then((json: { users: JSON[] }) => { if (!(arrayEquals(Object.keys(users), Object.keys(json.users)))) { + // @ts-ignore Object.keys(json.users).forEach((token) => (!Object.prototype.hasOwnProperty.call(users, token)) && (users[token] = json.users[token])); log.info('New token added', Object.keys(users)[Object.keys(users).length - 1] || 'No new token'); } diff --git a/src/data.js b/src/data.ts similarity index 100% rename from src/data.js rename to src/data.ts diff --git a/src/hash.js b/src/hash.js deleted file mode 100644 index 3610048..0000000 --- a/src/hash.js +++ /dev/null @@ -1,17 +0,0 @@ -const fs = require('fs-extra'); -const crypto = require('crypto'); -const toArray = require('stream-to-array'); -const { log } = require('./utils'); - -/** - * Generates a SHA1 hash for the provided file - * @param {*} file The file to hash - * @returns The SHA1 hash - */ -module.exports = (file) => - new Promise((resolve, reject) => - toArray((fs.createReadStream(file.path))) - .then((parts) => Buffer.concat(parts.map((part) => (Buffer.isBuffer(part) ? part : Buffer.from(part))))) - .then((buf) => crypto.createHash('sha1').update(buf).digest('hex')) // skipcq: JS-D003 - .then((hash) => log.debug(`Hash for ${file.originalname}`, hash, 'SHA1, hex').callback(resolve, hash)) - .catch(reject)); diff --git a/src/hash.ts b/src/hash.ts new file mode 100644 index 0000000..998bd63 --- /dev/null +++ b/src/hash.ts @@ -0,0 +1,18 @@ +import { FileData } from './definitions'; +import fs from 'fs-extra'; +import crypto from 'crypto'; +import toArray from 'stream-to-array'; +import { log } from './utils'; + +/** + * Generates a SHA1 hash for the provided file + * @param {*} file The file to hash + * @returns The SHA1 hash + */ +module.exports = (file: FileData) => + new Promise((resolve, reject) => + toArray((fs.createReadStream(file.path))) + .then((parts: any[]) => Buffer.concat(parts.map((part: any) => (Buffer.isBuffer(part) ? part : Buffer.from(part))))) + .then((buf: Buffer) => crypto.createHash('sha1').update(buf).digest('hex')) // skipcq: JS-D003 + .then((hash: String) => log.debug(`Hash for ${file.originalname}`, hash, 'SHA1, hex').callback(resolve, hash)) + .catch(reject)); diff --git a/src/thumbnails.js b/src/thumbnails.ts similarity index 80% rename from src/thumbnails.js rename to src/thumbnails.ts index 22bce7f..0253a78 100644 --- a/src/thumbnails.js +++ b/src/thumbnails.ts @@ -1,8 +1,9 @@ -const ffmpeg = require('ffmpeg-static'); -const Jimp = require('jimp'); +import { FileData } from "./definitions"; +import ffmpeg from 'ffmpeg-static'; +import Jimp from 'jimp'; const shell = require('any-shell-escape'); -const { exec } = require('child_process'); -const { isProd, path } = require('./utils'); +import { exec } from 'child_process'; +import { isProd, path } from './utils'; const { diskFilePath } = require('../config.json'); // Thumbnail parameters @@ -18,7 +19,7 @@ const THUMBNAIL = { * @param {String} dest Path of the output file * @returns {String} The command to execute */ -function getCommand(src, dest) { +function getCommand(src: String, dest: String) { return shell([ ffmpeg, '-y', '-v', (isProd ? 'error' : 'debug'), // Log level @@ -35,7 +36,7 @@ function getCommand(src, dest) { * @param {String} oldName The original filename * @returns {String} The filename for the thumbnail */ -function getNewName(oldName) { +function getNewName(oldName: String) { return oldName.concat('.thumbnail.jpg'); } @@ -44,7 +45,7 @@ function getNewName(oldName) { * @param {String} oldName The original filename * @returns {String} The path to the thumbnail */ -function getNewNamePath(oldName) { +function getNewNamePath(oldName: String) { return path(diskFilePath, 'thumbnails/', getNewName(oldName)); } @@ -52,10 +53,11 @@ function getNewNamePath(oldName) { * Extracts an image from a video file to use as a thumbnail, using ffmpeg * @param {*} file The video file to pull a frame from */ -function getVideoThumbnail(file) { - return new Promise((resolve, reject) => exec( +function getVideoThumbnail(file: FileData) { + return new Promise((resolve: Function, reject: Function) => exec( getCommand(file.path, getNewNamePath(file.randomId)), - (err) => (err ? reject(err) : resolve()) + // @ts-ignore + (err: Error) => (err ? reject(err) : resolve()) )); } @@ -63,7 +65,7 @@ function getVideoThumbnail(file) { * Generates a thumbnail for the provided image * @param {*} file The file to generate a thumbnail for */ -function getImageThumbnail(file) { +function getImageThumbnail(file: FileData) { return new Promise((resolve, reject) => Jimp.read(file.path) .then((image) => image @@ -79,7 +81,7 @@ function getImageThumbnail(file) { * @param {*} file The file to generate a thumbnail for * @returns The thumbnail filename (NOT the path) */ -module.exports = (file) => +module.exports = (file: FileData) => new Promise((resolve, reject) => (file.is.video ? getVideoThumbnail : file.is.image ? getImageThumbnail : () => Promise.resolve())(file) .then(() => resolve((file.is.video || file.is.image) ? getNewName(file.randomId) : file.is.audio ? 'views/ass-audio-icon.png' : 'views/ass-file-icon.png')) diff --git a/src/vibrant.js b/src/vibrant.ts similarity index 59% rename from src/vibrant.js rename to src/vibrant.ts index 6079786..38f539d 100644 --- a/src/vibrant.js +++ b/src/vibrant.ts @@ -1,5 +1,6 @@ -const Vibrant = require('node-vibrant'); -const { randomHexColour } = require('./utils'); +import { FileData } from './definitions'; +import Vibrant from 'node-vibrant'; +import { randomHexColour } from './utils'; // Vibrant parameters const COLOR_COUNT = 256; @@ -11,13 +12,13 @@ const QUALITY = 3; * @param {*} resolve Runs if Promise was successful * @param {*} reject Runs if Promise failed */ -function getVibrant(file, resolve, reject) { +function getVibrant(file: FileData, resolve: Function, reject: Function) { Vibrant.from(file.path) .maxColorCount(COLOR_COUNT) .quality(QUALITY) .getPalette() - .then((palettes) => resolve(palettes[Object.keys(palettes).sort((a, b) => palettes[b].population - palettes[a].population)[0]].hex)) - .catch(reject); + .then((palettes) => resolve(palettes[Object.keys(palettes).sort((a, b) => palettes[b]!.population - palettes[a]!.population)[0]]!.hex)) + .catch(() => reject); } /** @@ -25,4 +26,4 @@ function getVibrant(file, resolve, reject) { * @param {*} file The file to get a colour from * @returns The Vibrant colour as a Hex value (or random Hex value for videos) */ -module.exports = (file) => new Promise((resolve, reject) => !file.is.image ? resolve(randomHexColour()) : getVibrant(file, resolve, reject)); // skipcq: JS-0229 +module.exports = (file: FileData) => new Promise((resolve, reject) => !file.is.image ? resolve(randomHexColour()) : getVibrant(file, resolve, reject)); // skipcq: JS-0229 From 759fcd17291d3f6bab4d980f3ade9b603707064f Mon Sep 17 00:00:00 2001 From: tycrek Date: Sat, 11 Sep 2021 17:39:15 -0600 Subject: [PATCH 11/32] fixed exports --- src/hash.ts | 2 +- src/thumbnails.ts | 2 +- src/vibrant.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hash.ts b/src/hash.ts index 998bd63..3b7113d 100644 --- a/src/hash.ts +++ b/src/hash.ts @@ -9,7 +9,7 @@ import { log } from './utils'; * @param {*} file The file to hash * @returns The SHA1 hash */ -module.exports = (file: FileData) => +export default (file: FileData) => new Promise((resolve, reject) => toArray((fs.createReadStream(file.path))) .then((parts: any[]) => Buffer.concat(parts.map((part: any) => (Buffer.isBuffer(part) ? part : Buffer.from(part))))) diff --git a/src/thumbnails.ts b/src/thumbnails.ts index 0253a78..586c542 100644 --- a/src/thumbnails.ts +++ b/src/thumbnails.ts @@ -81,7 +81,7 @@ function getImageThumbnail(file: FileData) { * @param {*} file The file to generate a thumbnail for * @returns The thumbnail filename (NOT the path) */ -module.exports = (file: FileData) => +export default (file: FileData) => new Promise((resolve, reject) => (file.is.video ? getVideoThumbnail : file.is.image ? getImageThumbnail : () => Promise.resolve())(file) .then(() => resolve((file.is.video || file.is.image) ? getNewName(file.randomId) : file.is.audio ? 'views/ass-audio-icon.png' : 'views/ass-file-icon.png')) diff --git a/src/vibrant.ts b/src/vibrant.ts index 38f539d..6a75454 100644 --- a/src/vibrant.ts +++ b/src/vibrant.ts @@ -18,7 +18,7 @@ function getVibrant(file: FileData, resolve: Function, reject: Function) { .quality(QUALITY) .getPalette() .then((palettes) => resolve(palettes[Object.keys(palettes).sort((a, b) => palettes[b]!.population - palettes[a]!.population)[0]]!.hex)) - .catch(() => reject); + .catch((err) => reject(err)); } /** @@ -26,4 +26,4 @@ function getVibrant(file: FileData, resolve: Function, reject: Function) { * @param {*} file The file to get a colour from * @returns The Vibrant colour as a Hex value (or random Hex value for videos) */ -module.exports = (file: FileData) => new Promise((resolve, reject) => !file.is.image ? resolve(randomHexColour()) : getVibrant(file, resolve, reject)); // skipcq: JS-0229 +export default (file: FileData) => new Promise((resolve, reject) => !file.is.image ? resolve(randomHexColour()) : getVibrant(file, resolve, reject)); // skipcq: JS-0229 From 0de3dcce34d0de51544f714e0a2abf8c18ea022b Mon Sep 17 00:00:00 2001 From: tycrek Date: Sat, 11 Sep 2021 18:41:16 -0600 Subject: [PATCH 12/32] updated packages --- package-lock.json | 548 ++++++++++++++++++++++++++++------------------ 1 file changed, 340 insertions(+), 208 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0951e06..efa5ea2 100755 --- a/package-lock.json +++ b/package-lock.json @@ -731,10 +731,79 @@ "node": ">=12" } }, + "node_modules/@types/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/ffmpeg-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-3.0.0.tgz", + "integrity": "sha512-JTwV8fFQYUgp8VLUKLd8zHfhFOoTTszMlofnWINAZYWSd/iR2ZZHJsWanUhBG4+c8QPfWE8P7t3nAjSxTNjevQ==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", + "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "node_modules/@types/node": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", - "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", "dev": true }, "node_modules/@types/node-fetch": { @@ -1256,6 +1325,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/boxen/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, "node_modules/boxen/node_modules/chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -1341,11 +1418,11 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/camelcase-keys": { @@ -1361,14 +1438,6 @@ "node": ">=4" } }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "engines": { - "node": ">=4" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2066,14 +2135,14 @@ "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" }, "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/fmix": { @@ -2676,15 +2745,15 @@ } }, "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dependencies": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/loud-rejection": { @@ -2782,22 +2851,6 @@ "node": ">=6" } }, - "node_modules/meow/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dependencies": { - "camelcase": "^4.1.0" - } - }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3098,36 +3151,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/pako": { @@ -3590,59 +3640,6 @@ "node": ">=4" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -4609,12 +4606,11 @@ } }, "node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" } }, "node_modules/yargs/node_modules/ansi-regex": { @@ -4625,6 +4621,25 @@ "node": ">=4" } }, + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -4633,6 +4648,51 @@ "node": ">=4" } }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/yargs/node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -4655,6 +4715,15 @@ "engines": { "node": ">=4" } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } }, "dependencies": { @@ -5161,10 +5230,79 @@ } } }, + "@types/body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha512-4mI1FuUUZiuT95fSVqvZxp/ssQK9zsa86S43h9x3zPOSU9BBJ+BfDkXwuaU7BfsD+e7U0/cUUfJFk3iW2M4okA==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", + "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/ffmpeg-static": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-3.0.0.tgz", + "integrity": "sha512-JTwV8fFQYUgp8VLUKLd8zHfhFOoTTszMlofnWINAZYWSd/iR2ZZHJsWanUhBG4+c8QPfWE8P7t3nAjSxTNjevQ==", + "dev": true + }, + "@types/fs-extra": { + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", + "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, "@types/node": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", - "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==", "dev": true }, "@types/node-fetch": { @@ -5594,6 +5732,11 @@ "widest-line": "^3.1.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", @@ -5663,9 +5806,9 @@ } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-keys": { "version": "4.2.0", @@ -5675,13 +5818,6 @@ "camelcase": "^4.1.0", "map-obj": "^2.0.0", "quick-lru": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } } }, "caseless": { @@ -6232,11 +6368,11 @@ "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "^3.0.0" + "locate-path": "^2.0.0" } }, "fmix": { @@ -6714,11 +6850,11 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "^3.0.0", + "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, @@ -6788,21 +6924,6 @@ "redent": "^2.0.0", "trim-newlines": "^2.0.0", "yargs-parser": "^10.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "requires": { - "camelcase": "^4.1.0" - } - } } }, "merge-descriptors": { @@ -7046,25 +7167,25 @@ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "p-try": "^2.0.0" + "p-try": "^1.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "^2.0.0" + "p-limit": "^1.1.0" } }, "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.11", @@ -7423,46 +7544,6 @@ "requires": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - } } }, "readable-stream": { @@ -8221,11 +8302,54 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -8242,16 +8366,24 @@ "requires": { "ansi-regex": "^3.0.0" } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "^4.1.0" } } } From 9b45bc21fe414dc037542568e6a9464a6329d1a8 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 12 Sep 2021 19:27:27 -0600 Subject: [PATCH 13/32] migrated `utils.js` to `utils.ts`, goddam! --- package-lock.json | 13 +++++++ package.json | 1 + src/definitions.d.ts | 3 ++ src/generators/gfycat.ts | 2 +- src/generators/random.ts | 2 +- src/generators/token.ts | 2 +- src/generators/zws.ts | 2 +- src/logger.ts | 22 +++++++++++ src/storage.js | 6 +-- src/{utils.js => utils.ts} | 79 ++++++++++++++++++-------------------- 10 files changed, 84 insertions(+), 48 deletions(-) create mode 100644 src/logger.ts rename src/{utils.js => utils.ts} (56%) diff --git a/package-lock.json b/package-lock.json index efa5ea2..c9c2c6d 100755 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "@types/express": "^4.17.13", "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", + "@types/luxon": "^2.0.3", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", @@ -794,6 +795,12 @@ "@types/node": "*" } }, + "node_modules/@types/luxon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.3.tgz", + "integrity": "sha512-qhyivlWLuSnQa6EMx7W2oPiMUD4/F9BLuQynZe3jBgmfCS6Xr+Ock1+ZotN6xEkdJvdckyX+z1r5fyvi31GV5Q==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -5293,6 +5300,12 @@ "@types/node": "*" } }, + "@types/luxon": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.3.tgz", + "integrity": "sha512-qhyivlWLuSnQa6EMx7W2oPiMUD4/F9BLuQynZe3jBgmfCS6Xr+Ock1+ZotN6xEkdJvdckyX+z1r5fyvi31GV5Q==", + "dev": true + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", diff --git a/package.json b/package.json index 582877c..22cd0cb 100755 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "@types/express": "^4.17.13", "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", + "@types/luxon": "^2.0.3", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", diff --git a/src/definitions.d.ts b/src/definitions.d.ts index e6946a7..8c70b8c 100644 --- a/src/definitions.d.ts +++ b/src/definitions.d.ts @@ -24,6 +24,9 @@ export interface FileData { timestamp: number token: string opengraph: OpenGraphData + + // I found this in utils and idk where it comes from + destination: string } export interface IsPossible { diff --git a/src/generators/gfycat.ts b/src/generators/gfycat.ts index a9caf2a..4e70570 100644 --- a/src/generators/gfycat.ts +++ b/src/generators/gfycat.ts @@ -20,4 +20,4 @@ function genString(count = MIN_LENGTH) { return gfycat.concat(getWord(animals)); }; -module.exports = ({ gfyLength }: { gfyLength: number }) => genString(gfyLength); +export default ({ gfyLength }: { gfyLength: number }) => genString(gfyLength); diff --git a/src/generators/random.ts b/src/generators/random.ts index 9d32ffd..6c62522 100644 --- a/src/generators/random.ts +++ b/src/generators/random.ts @@ -1,2 +1,2 @@ import cryptoRandomString from 'crypto-random-string'; -module.exports = ({ length }: { length: number }) => cryptoRandomString({ length, type: 'alphanumeric' }); +export default ({ length }: { length: number }) => cryptoRandomString({ length, type: 'alphanumeric' }); diff --git a/src/generators/token.ts b/src/generators/token.ts index 8b8bd2b..546f0f8 100644 --- a/src/generators/token.ts +++ b/src/generators/token.ts @@ -7,7 +7,7 @@ const log = new TLog(); const MAX_USERNAME = 20; -module.exports = () => uuid().replace(/-/g, ''); +export default () => uuid().replace(/-/g, ''); // If directly called on the command line, generate a new token if (require.main === module) { diff --git a/src/generators/zws.ts b/src/generators/zws.ts index a64cf28..7618080 100644 --- a/src/generators/zws.ts +++ b/src/generators/zws.ts @@ -1,3 +1,3 @@ const lengthGen = require('./lengthGen'); const zeroWidthChars = ['\u200B', '\u200C', '\u200D', '\u2060']; -module.exports = ({ length }: { length: number }) => lengthGen(length, zeroWidthChars); +export default ({ length }: { length: number }) => lengthGen(length, zeroWidthChars); diff --git a/src/logger.ts b/src/logger.ts new file mode 100644 index 0000000..502b9a8 --- /dev/null +++ b/src/logger.ts @@ -0,0 +1,22 @@ +const TLog = require('@tycrek/log'); + +// Set up logging +const logger = new TLog({ + level: process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'info' : 'debug'), + timestamp: { + enabled: true, + colour: 'grey', + preset: 'DATETIME_MED' + }, +}); + +// Enable the Express logger +logger.enable.express({ handle500: false }).debug('Plugin enabled', 'Express'); + +/** + * @type {TLog} + */ +// yeet + + +export default logger; \ No newline at end of file diff --git a/src/storage.js b/src/storage.js index c396335..b228d25 100644 --- a/src/storage.js +++ b/src/storage.js @@ -4,9 +4,9 @@ const fs = require('fs-extra'); const aws = require('aws-sdk'); const multer = require('multer'); -const Thumbnail = require('./thumbnails'); -const Vibrant = require('./vibrant'); -const Hash = require('./hash'); +const Thumbnail = require('./thumbnails').default; +const Vibrant = require('./vibrant').default; +const Hash = require('./hash').default; const { getDatedDirname, sanitize, generateId, formatBytes, log } = require('./utils'); const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, saveAsOriginal, maxUploadSize, mediaStrict } = require('../config.json'); const { CODE_UNSUPPORTED_MEDIA_TYPE } = require('../MagicNumbers.json'); diff --git a/src/utils.js b/src/utils.ts similarity index 56% rename from src/utils.js rename to src/utils.ts index 50771b0..6693ec4 100644 --- a/src/utils.js +++ b/src/utils.ts @@ -1,39 +1,41 @@ -const fs = require('fs-extra'); -const Path = require('path'); -const TLog = require('@tycrek/log'); -const fetch = require('node-fetch'); -const sanitize = require('sanitize-filename'); -const { DateTime } = require('luxon'); -const token = require('./generators/token'); -const zwsGen = require('./generators/zws'); -const randomGen = require('./generators/random'); -const gfyGen = require('./generators/gfycat'); +import { AssRequest, FileData } from './definitions'; +import fs from 'fs-extra'; +import Path from 'path'; +import fetch from 'node-fetch'; +import sanitize from 'sanitize-filename'; +import { DateTime } from 'luxon'; +import token from './generators/token'; +import zwsGen from './generators/zws'; +import randomGen from './generators/random'; +import gfyGen from './generators/gfycat'; +import logger from './logger'; const { HTTP, HTTPS, KILOBYTES } = require('../MagicNumbers.json'); // Catch config.json not existing when running setup script try { var { useSsl, port, domain, isProxied, diskFilePath, saveWithDate, s3bucket, s3endpoint, s3usePathStyle } = require('../config.json'); // skipcq: JS-0239, JS-0102 } catch (ex) { + // @ts-ignore if (ex.code !== 'MODULE_NOT_FOUND') console.error(ex); } -function getTrueHttp() { +export function getTrueHttp() { return ('http').concat(useSsl ? 's' : '').concat('://'); } -function getTrueDomain(d = domain) { +export function getTrueDomain(d = domain) { return d.concat((port === HTTP || port === HTTPS || isProxied) ? '' : `:${port}`); } -function getS3url(s3key, ext) { +export function getS3url(s3key: string, ext: string) { return `https://${s3usePathStyle ? `${s3endpoint}/${s3bucket}` : `${s3bucket}.${s3endpoint}`}/${s3key}${ext}`; } -function getDirectUrl(resourceId) { +export function getDirectUrl(resourceId: string) { return `${getTrueHttp()}${getTrueDomain()}/${resourceId}/direct`; } -function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-generate-random-hex-codes-color/ +export function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-generate-random-hex-codes-color/ const letters = '0123456789ABCDEF'; let colour = '#'; for (let i = 0; i < 6; i++) // skipcq: JS-0074 @@ -41,29 +43,29 @@ function randomHexColour() { // From: https://www.geeksforgeeks.org/javascript-g return colour; } -function getResourceColor(colorValue, vibrantValue) { +export function getResourceColor(colorValue: string, vibrantValue: string) { return colorValue === '&random' ? randomHexColour() : colorValue === '&vibrant' ? vibrantValue : colorValue; } -function formatTimestamp(timestamp) { +export function formatTimestamp(timestamp: number) { return DateTime.fromMillis(timestamp).toLocaleString(DateTime.DATETIME_MED); } -function formatBytes(bytes, decimals = 2) { // skipcq: JS-0074 +export function formatBytes(bytes: number, decimals = 2) { // skipcq: JS-0074 if (bytes === 0) return '0 Bytes'; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(KILOBYTES)); return parseFloat((bytes / Math.pow(KILOBYTES, i)).toFixed(decimals < 0 ? 0 : decimals)).toString().concat(` ${sizes[i]}`); } -function replaceholder(data, size, timestamp, originalname) { +export function replaceholder(data: string, size: number, timestamp: number, originalname: string) { return data .replace(/&size/g, formatBytes(size)) .replace(/&filename/g, originalname) .replace(/×tamp/g, formatTimestamp(timestamp)); } -function getDatedDirname() { +export function getDatedDirname() { if (!saveWithDate) return diskFilePath; // Get current month and year @@ -73,19 +75,13 @@ function getDatedDirname() { return `${diskFilePath}${diskFilePath.endsWith('/') ? '' : '/'}${year}-${`0${month}`.slice(-2)}`; // skipcq: JS-0074 } -// Set up pathing & the logger -const path = (...paths) => Path.join(process.cwd(), ...paths); // '..' was added to make it easier to run files after moving the project to src/ -const logger = new TLog({ - level: process.env.LOG_LEVEL || (process.env.NODE_ENV === 'production' ? 'info' : 'debug'), - timestamp: { - enabled: true, - colour: 'grey', - preset: 'DATETIME_MED' - }, -}); +export function arrayEquals(arr1: any[], arr2: any[]) { + return arr1.length === arr2.length && arr1.slice().sort().every((value: string, index: number) => value === arr2.slice().sort()[index]) +}; + -// Enable the Express logger -logger.enable.express({ handle500: false }).debug('Plugin enabled', 'Express'); +// Set up pathing +export const path = (...paths: string[]) => Path.join(process.cwd(), ...paths); // '..' was added to make it easier to run files after moving the project to src/ const idModes = { zws: 'zws', // Zero-width spaces (see: https://zws.im/) @@ -99,8 +95,8 @@ GENERATORS.set(idModes.zws, zwsGen); GENERATORS.set(idModes.r, randomGen); GENERATORS.set(idModes.gfy, gfyGen); +export const isProd = require('@tycrek/isprod')(); module.exports = { - isProd: require('@tycrek/isprod')(), path, getTrueHttp, getTrueDomain, @@ -113,26 +109,27 @@ module.exports = { getDatedDirname, randomHexColour, sanitize, - verify: (req, users) => req.headers.authorization && Object.prototype.hasOwnProperty.call(users, req.headers.authorization), - renameFile: (req, newName) => new Promise((resolve, reject) => { + verify: (req: AssRequest, users: JSON) => req.headers.authorization && Object.prototype.hasOwnProperty.call(users, req.headers.authorization), + renameFile: (req: AssRequest, newName: string) => new Promise((resolve: Function, reject) => { try { - const paths = [req.file.destination, newName]; - fs.rename(path(req.file.path), path(...paths)); - req.file.path = Path.join(...paths); + const paths = [req.file!.destination, newName]; + fs.rename(path(req.file!.path), path(...paths)); + req.file!.path = Path.join(...paths); resolve(); } catch (err) { reject(err); } }), generateToken: () => token(), - generateId: (mode, length, gfyLength, originalName) => (GENERATORS.has(mode) ? GENERATORS.get(mode)({ length, gfyLength }) : originalName), - arrayEquals: (arr1, arr2) => arr1.length === arr2.length && arr1.slice().sort().every((value, index) => value === arr2.slice().sort()[index]), - downloadTempS3: (file) => new Promise((resolve, reject) => + generateId: (mode: string, length: number, gfyLength: number, originalName: string) => (GENERATORS.has(mode) ? GENERATORS.get(mode)({ length, gfyLength }) : originalName), + arrayEquals, + downloadTempS3: (file: FileData) => new Promise((resolve: Function, reject) => fetch(getS3url(file.randomId, file.ext)) .then((f2) => f2.body.pipe(fs.createWriteStream(Path.join(__dirname, diskFilePath, sanitize(file.originalname))).on('close', () => resolve()))) .catch(reject)), } +export const log = logger; /** * @type {TLog} */ From 11ce9c228e2b723d4781b5f29a28d52125da7507 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 12 Sep 2021 19:28:14 -0600 Subject: [PATCH 14/32] ass-x catchup --- ass-x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ass-x b/ass-x index fff0f47..5810858 160000 --- a/ass-x +++ b/ass-x @@ -1 +1 @@ -Subproject commit fff0f471cd19c20ef6ba47545993f037732f5f01 +Subproject commit 58108589fc6b2bfc5c43cb96557fe280bb6d48a4 From 589c85d7e5ebb2a32eb40f2de273bbd811af8e61 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 12 Sep 2021 19:37:51 -0600 Subject: [PATCH 15/32] migrated `ass.js` to `ass.ts`, why tf was this the easy one to migrate?! --- package-lock.json | 13 +++++++++++++ package.json | 1 + src/{ass.js => ass.ts} | 27 +++++++++++++-------------- src/routers/resource.ts | 2 +- src/routers/upload.ts | 2 +- src/setup.js | 2 +- 6 files changed, 30 insertions(+), 17 deletions(-) rename src/{ass.js => ass.ts} (79%) diff --git a/package-lock.json b/package-lock.json index c9c2c6d..6ba8e68 100755 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/luxon": "^2.0.3", + "@types/marked": "^3.0.0", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", @@ -801,6 +802,12 @@ "integrity": "sha512-qhyivlWLuSnQa6EMx7W2oPiMUD4/F9BLuQynZe3jBgmfCS6Xr+Ock1+ZotN6xEkdJvdckyX+z1r5fyvi31GV5Q==", "dev": true }, + "node_modules/@types/marked": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-3.0.0.tgz", + "integrity": "sha512-vof90OIWT+Tzq3MBRXgV9fsH8PC3WZ4OQg9Qa04vOtP0TcyiNfl7BTonYCmTapHZ5lRZh6ihUYkAy7St1hmk/A==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -5306,6 +5313,12 @@ "integrity": "sha512-qhyivlWLuSnQa6EMx7W2oPiMUD4/F9BLuQynZe3jBgmfCS6Xr+Ock1+ZotN6xEkdJvdckyX+z1r5fyvi31GV5Q==", "dev": true }, + "@types/marked": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-3.0.0.tgz", + "integrity": "sha512-vof90OIWT+Tzq3MBRXgV9fsH8PC3WZ4OQg9Qa04vOtP0TcyiNfl7BTonYCmTapHZ5lRZh6ihUYkAy7St1hmk/A==", + "dev": true + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", diff --git a/package.json b/package.json index 22cd0cb..3307a32 100755 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/luxon": "^2.0.3", + "@types/marked": "^3.0.0", "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", diff --git a/src/ass.js b/src/ass.ts similarity index 79% rename from src/ass.js rename to src/ass.ts index d7b9cf4..206b5d9 100644 --- a/src/ass.js +++ b/src/ass.ts @@ -1,3 +1,5 @@ +import { AssRequest, AssResponse, ErrWrap } from './definitions'; + let doSetup = null; try { // Check if config.json exists @@ -7,23 +9,20 @@ try { } // Run first time setup if using Docker (pseudo-process, setup will be run with docker exec) -if (doSetup) { - doSetup(); - return; -} +if (doSetup) doSetup(); // Load the config const { host, port, useSsl, isProxied, s3enabled, frontendName, indexFile } = require('../config.json'); //#region Imports -const fs = require('fs-extra'); -const express = require('express'); +import fs from 'fs-extra'; +import express from 'express'; const nofavicon = require('@tycrek/express-nofavicon'); -const helmet = require('helmet'); -const marked = require('marked'); -const uploadRouter = require('./routers/upload'); -const resourceRouter = require('./routers/resource'); -const { path, log, getTrueHttp, getTrueDomain } = require('./utils'); +import helmet from 'helmet'; +import marked from 'marked'; +import uploadRouter from './routers/upload'; +import resourceRouter from './routers/resource'; +import { path, log, getTrueHttp, getTrueDomain } from './utils'; const { CODE_INTERNAL_SERVER_ERROR } = require('../MagicNumbers.json'); const { name: ASS_NAME, version: ASS_VERSION } = require('../package.json'); //#endregion @@ -71,7 +70,7 @@ app.get('/', (req, res, next) => ASS_INDEX // skipcq: JS-0229 ? ASS_INDEX(req, res, next) : fs.readFile(path('README.md')) .then((bytes) => bytes.toString()) - .then(marked) + .then((data) => marked(data)) .then((d) => res.render('index', { data: d })) .catch(next)); @@ -83,10 +82,10 @@ const ASS_FRONTEND = fs.existsSync(path(`./${frontendName}/package.json`)) ? (re ASS_FRONTEND.enabled && app.use(ASS_FRONTEND.endpoint, ASS_FRONTEND.router); // skipcq: JS-0093 // '/:resouceId' always needs to be LAST since it's a catch-all route -app.use('/:resourceId', (req, _res, next) => (req.resourceId = req.params.resourceId, next()), ROUTERS.resource); // skipcq: JS-0086, JS-0090 +app.use('/:resourceId', (req: AssRequest, _res, next) => (req.resourceId = req.params.resourceId, next()), ROUTERS.resource); // skipcq: JS-0086, JS-0090 // Error handler -app.use((err, _req, res, _next) => log.error(err).err(err).callback(() => res.sendStatus(CODE_INTERNAL_SERVER_ERROR))); // skipcq: JS-0128 +app.use((err: ErrWrap, _req: AssRequest, res: AssResponse, _next: Function) => log.error(err).err(err).callback(() => res.sendStatus(CODE_INTERNAL_SERVER_ERROR))); // skipcq: JS-0128 // Host the server log diff --git a/src/routers/resource.ts b/src/routers/resource.ts index 0d8b565..55e4c94 100644 --- a/src/routers/resource.ts +++ b/src/routers/resource.ts @@ -124,4 +124,4 @@ router.get('/delete/:deleteId', (req: AssRequest, res: AssResponse, next) => { .catch(next); }); -module.exports = router; +export default router; diff --git a/src/routers/upload.ts b/src/routers/upload.ts index 68bc232..34b45f4 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -124,4 +124,4 @@ router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { }).catch(next); }); -module.exports = router; +export default router; diff --git a/src/setup.js b/src/setup.js index fafe4e9..85dbc41 100644 --- a/src/setup.js +++ b/src/setup.js @@ -262,7 +262,7 @@ function doSetup() { // Complete & exit .then(() => log.blank().success('Setup complete').callback(() => process.exit(0))) - .catch((err) => log.blank().error(err)); + .catch((err) => log.blank().error(err).callback(() => process.exit(1))); } module.exports = { From c188a7dacd87c9213b89b7a6e148a298a24a16b6 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 12 Sep 2021 19:42:58 -0600 Subject: [PATCH 16/32] fixed setup flow --- src/ass.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ass.ts b/src/ass.ts index 206b5d9..66be5c4 100644 --- a/src/ass.ts +++ b/src/ass.ts @@ -9,7 +9,11 @@ try { } // Run first time setup if using Docker (pseudo-process, setup will be run with docker exec) -if (doSetup) doSetup(); +if (doSetup) { + doSetup(); + // @ts-ignore + return; +} // Load the config const { host, port, useSsl, isProxied, s3enabled, frontendName, indexFile } = require('../config.json'); From de1358cfc8ab555baef7380aceb35db1ef326d89 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 15 Sep 2021 10:41:02 -0600 Subject: [PATCH 17/32] moved `verify()` and `generateId()` to TS exports --- src/routers/resource.ts | 12 ++++++++++-- src/routers/upload.ts | 4 ++-- src/utils.ts | 11 +++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/routers/resource.ts b/src/routers/resource.ts index 55e4c94..8d2d827 100644 --- a/src/routers/resource.ts +++ b/src/routers/resource.ts @@ -5,7 +5,7 @@ import escape from 'escape-html'; import fetch, { Response } from 'node-fetch'; const { deleteS3 } = require('../storage'); const { diskFilePath, s3enabled, viewDirect } = require('../../config.json'); -const { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } = require('../utils'); +import { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } from '../utils'; const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, } = require('../../MagicNumbers.json'); const data = require('../data'); const users = require('../auth'); @@ -26,12 +26,14 @@ router.use((req: AssRequest, res: AssResponse, next) => { // View file router.get('/', (req: AssRequest, res: AssResponse, next) => data.get(req.ass?.resourceId).then((fileData: FileData) => { - const resourceId = req.ass?.resourceId; + const resourceId = req.ass!.resourceId; // Build OpenGraph meta tags const og = fileData.opengraph, ogs = ['']; og.title && (ogs.push(``)); // skipcq: JS-0093 og.description && (ogs.push(``)); // skipcq: JS-0093 + // todo: figure out how to not ignore this + // @ts-ignore og.color && (ogs.push(``)); // skipcq: JS-0093 !fileData.is.video && (ogs.push(``)); // skipcq: JS-0093 @@ -43,6 +45,8 @@ router.get('/', (req: AssRequest, res: AssResponse, next) => data.get(req.ass?.r uploader: users[fileData.token].username, timestamp: formatTimestamp(fileData.timestamp), size: formatBytes(fileData.size), + // todo: figure out how to not ignore this + // @ts-ignore color: getResourceColor(fileData.opengraph.color || null, fileData.vibrant), resourceAttr: { src: getDirectUrl(resourceId) }, discordUrl: `${getDirectUrl(resourceId)}${fileData.ext}`, @@ -93,7 +97,11 @@ router.get('/oembed', (req: AssRequest, res: AssResponse, next) => type: fileData.is.video ? 'video' : fileData.is.image ? 'photo' : 'link', author_url: fileData.opengraph.authorUrl, provider_url: fileData.opengraph.providerUrl, + // todo: figure out how to not ignore this + // @ts-ignore author_name: replaceholder(fileData.opengraph.author || '', fileData.size, fileData.timestamp, fileData.originalname), + // todo: figure out how to not ignore this + // @ts-ignore provider_name: replaceholder(fileData.opengraph.provider || '', fileData.size, fileData.timestamp, fileData.originalname) })) .catch(next)); diff --git a/src/routers/upload.ts b/src/routers/upload.ts index 34b45f4..cf22222 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -6,7 +6,7 @@ const { DateTime } = require('luxon'); const { WebhookClient, MessageEmbed } = require('discord.js'); const { doUpload, processUploaded } = require('../storage'); const { maxUploadSize, resourceIdSize, gfyIdSize, resourceIdType } = require('../../config.json'); -const { path, log, verify, getTrueHttp, getTrueDomain, generateId, formatBytes } = require('../utils'); +import { path, log, verify, getTrueHttp, getTrueDomain, generateId, formatBytes } from '../utils'; const { CODE_UNAUTHORIZED, CODE_PAYLOAD_TOO_LARGE } = require('../../MagicNumbers.json'); const data = require('../data'); const users = require('../auth'); @@ -106,7 +106,7 @@ router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { // Also update the users upload count if (!users[req.token ?? '']) { - const generateUsername = () => generateId('random', 20, null); // skipcq: JS-0074 + const generateUsername = () => generateId('random', 20, 0, req.file!.size.toString()); // skipcq: JS-0074 let username: string = generateUsername(); // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/src/utils.ts b/src/utils.ts index 6693ec4..8638816 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -79,6 +79,13 @@ export function arrayEquals(arr1: any[], arr2: any[]) { return arr1.length === arr2.length && arr1.slice().sort().every((value: string, index: number) => value === arr2.slice().sort()[index]) }; +export function verify(req: AssRequest, users: JSON) { + return req.headers.authorization && Object.prototype.hasOwnProperty.call(users, req.headers.authorization); +} + +export function generateId(mode: string, length: number, gfyLength: number, originalName: string) { + return (GENERATORS.has(mode) ? GENERATORS.get(mode)({ length, gfyLength }) : originalName); +} // Set up pathing export const path = (...paths: string[]) => Path.join(process.cwd(), ...paths); // '..' was added to make it easier to run files after moving the project to src/ @@ -109,7 +116,7 @@ module.exports = { getDatedDirname, randomHexColour, sanitize, - verify: (req: AssRequest, users: JSON) => req.headers.authorization && Object.prototype.hasOwnProperty.call(users, req.headers.authorization), + verify, renameFile: (req: AssRequest, newName: string) => new Promise((resolve: Function, reject) => { try { const paths = [req.file!.destination, newName]; @@ -121,7 +128,7 @@ module.exports = { } }), generateToken: () => token(), - generateId: (mode: string, length: number, gfyLength: number, originalName: string) => (GENERATORS.has(mode) ? GENERATORS.get(mode)({ length, gfyLength }) : originalName), + generateId, arrayEquals, downloadTempS3: (file: FileData) => new Promise((resolve: Function, reject) => fetch(getS3url(file.randomId, file.ext)) From 9b80ae6ff19b205faa2f8d73c64c7e927b0f984d Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 15 Sep 2021 10:43:54 -0600 Subject: [PATCH 18/32] converted a ton of `module.exports` to `export` and `require` to `import` --- package-lock.json | 13 +++++++++++++ package.json | 1 + src/ass.ts | 4 ++-- src/auth.ts | 4 +--- src/data.ts | 3 +-- src/generators/lengthGen.ts | 2 +- src/generators/token.ts | 6 +++--- src/generators/zws.ts | 2 +- src/routers/resource.ts | 6 +++--- src/routers/upload.ts | 10 +++++----- src/thumbnails.ts | 3 ++- 11 files changed, 33 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ba8e68..b188fa5 100755 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,7 @@ "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", + "@types/uuid": "^8.3.1", "@types/ws": "^7.4.7" }, "engines": { @@ -861,6 +862,12 @@ "@types/node": "*" } }, + "node_modules/@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "dev": true + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -5372,6 +5379,12 @@ "@types/node": "*" } }, + "@types/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", + "dev": true + }, "@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", diff --git a/package.json b/package.json index 3307a32..9f826c5 100755 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "@types/node": "^16.9.0", "@types/node-fetch": "^2.5.12", "@types/stream-to-array": "^2.3.0", + "@types/uuid": "^8.3.1", "@types/ws": "^7.4.7" } } diff --git a/src/ass.ts b/src/ass.ts index 66be5c4..bd91059 100644 --- a/src/ass.ts +++ b/src/ass.ts @@ -42,8 +42,8 @@ const ROUTERS = { }; // Read users and data -const users = require('./auth'); -const data = require('./data'); +import { users } from './auth'; +import { data } from './data'; //#endregion // Enable/disable Express features diff --git a/src/auth.ts b/src/auth.ts index dd3d813..7b628b7 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -5,7 +5,7 @@ import fs from 'fs-extra'; import { log, path, arrayEquals } from './utils'; -const users = require('../auth.json').users || {}; +export const users = require('../auth.json').users || {}; // Monitor auth.json for changes (triggered by running 'npm run new-token') fs.watch(path('auth.json'), { persistent: false }, @@ -18,5 +18,3 @@ fs.watch(path('auth.json'), { persistent: false }, } }) .catch(log.c.error)); - -module.exports = users; diff --git a/src/data.ts b/src/data.ts index 8ba1ff5..c7e45e4 100644 --- a/src/data.ts +++ b/src/data.ts @@ -3,5 +3,4 @@ */ const { JsonDataEngine } = require('@tycrek/papito'); -const data = new JsonDataEngine(); -module.exports = data; +export const data = new JsonDataEngine(); diff --git a/src/generators/lengthGen.ts b/src/generators/lengthGen.ts index 54a5797..37a8451 100644 --- a/src/generators/lengthGen.ts +++ b/src/generators/lengthGen.ts @@ -1,2 +1,2 @@ import { randomBytes } from 'crypto'; -module.exports = (length: number, charset: string[]): string => [...randomBytes(length)].map((byte) => charset[Number(byte) % charset.length]).join('').slice(1).concat(charset[0]); \ No newline at end of file +export default (length: number, charset: string[]): string => [...randomBytes(length)].map((byte) => charset[Number(byte) % charset.length]).join('').slice(1).concat(charset[0]); \ No newline at end of file diff --git a/src/generators/token.ts b/src/generators/token.ts index 546f0f8..e80636d 100644 --- a/src/generators/token.ts +++ b/src/generators/token.ts @@ -1,7 +1,7 @@ -const uuid = require('uuid').v4; +import { v4 as uuid } from 'uuid'; import fs from 'fs-extra'; -const path = require('path'); -const randomGen = require('./random'); +import path from 'path'; +import randomGen from './random'; const TLog = require('@tycrek/log'); const log = new TLog(); diff --git a/src/generators/zws.ts b/src/generators/zws.ts index 7618080..9f54cbe 100644 --- a/src/generators/zws.ts +++ b/src/generators/zws.ts @@ -1,3 +1,3 @@ -const lengthGen = require('./lengthGen'); +import lengthGen from './lengthGen'; const zeroWidthChars = ['\u200B', '\u200C', '\u200D', '\u2060']; export default ({ length }: { length: number }) => lengthGen(length, zeroWidthChars); diff --git a/src/routers/resource.ts b/src/routers/resource.ts index 8d2d827..9d8feb1 100644 --- a/src/routers/resource.ts +++ b/src/routers/resource.ts @@ -3,12 +3,12 @@ import { FileData, IsPossible, AssRequest, AssResponse } from '../definitions'; import fs from 'fs-extra'; import escape from 'escape-html'; import fetch, { Response } from 'node-fetch'; -const { deleteS3 } = require('../storage'); +import { deleteS3 } from '../storage'; const { diskFilePath, s3enabled, viewDirect } = require('../../config.json'); import { path, log, getTrueHttp, getTrueDomain, formatBytes, formatTimestamp, getS3url, getDirectUrl, getResourceColor, replaceholder } from '../utils'; const { CODE_UNAUTHORIZED, CODE_NOT_FOUND, } = require('../../MagicNumbers.json'); -const data = require('../data'); -const users = require('../auth'); +import { data } from '../data'; +import { users } from '../auth'; import express from 'express'; const router = express.Router(); diff --git a/src/routers/upload.ts b/src/routers/upload.ts index cf22222..ff193af 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -1,15 +1,15 @@ import { FileData, AssRequest, AssResponse, ErrWrap, User } from "../definitions"; -const fs = require('fs-extra'); +import fs from 'fs-extra'; //const rateLimit = require('express-rate-limit'); -const { DateTime } = require('luxon'); +import { DateTime } from 'luxon'; const { WebhookClient, MessageEmbed } = require('discord.js'); -const { doUpload, processUploaded } = require('../storage'); +import { doUpload, processUploaded } from '../storage'; const { maxUploadSize, resourceIdSize, gfyIdSize, resourceIdType } = require('../../config.json'); import { path, log, verify, getTrueHttp, getTrueDomain, generateId, formatBytes } from '../utils'; const { CODE_UNAUTHORIZED, CODE_PAYLOAD_TOO_LARGE } = require('../../MagicNumbers.json'); -const data = require('../data'); -const users = require('../auth'); +import { data } from '../data'; +import { users } from '../auth'; const ASS_LOGO = 'https://cdn.discordapp.com/icons/848274994375294986/8d339d4a2f3f54b2295e5e0ff62bd9e6.png?size=1024'; import express from 'express'; diff --git a/src/thumbnails.ts b/src/thumbnails.ts index 586c542..851a43b 100644 --- a/src/thumbnails.ts +++ b/src/thumbnails.ts @@ -1,7 +1,8 @@ import { FileData } from "./definitions"; import ffmpeg from 'ffmpeg-static'; import Jimp from 'jimp'; -const shell = require('any-shell-escape'); +// @ts-ignore +import shell from 'any-shell-escape'; import { exec } from 'child_process'; import { isProd, path } from './utils'; const { diskFilePath } = require('../config.json'); From 2db8a33d2f81708ea760d6be8368f2fc304272bb Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 15 Sep 2021 11:10:18 -0600 Subject: [PATCH 19/32] `spaceReplace` fixed for TS --- src/routers/upload.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routers/upload.ts b/src/routers/upload.ts index 6d5fca4..0868655 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -64,7 +64,7 @@ router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { }; // Fix spaces in originalname - req.file.originalname = req.file.originalname.replace(/\s/g, spaceReplace === '!' ? '' : spaceReplace); + req.file!.originalname = req.file!.originalname.replace(/\s/g, spaceReplace === '!' ? '' : spaceReplace); // Save the file information const resourceId = generateId(generator, resourceIdSize, req.headers['x-ass-gfycat'] || gfyIdSize, req.file!.originalname); From f201792193536ad7a06d3b2f62da9bab94ec1597 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 3 Oct 2021 20:19:11 -0600 Subject: [PATCH 20/32] Fixed incorrect path check for custom index --- src/ass.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ass.ts b/src/ass.ts index 8272b68..6b5e530 100644 --- a/src/ass.ts +++ b/src/ass.ts @@ -69,7 +69,7 @@ useSsl && app.use(helmet.hsts({ preload: true })); // skipcq: JS-0093 app.use(nofavicon); // Use custom index, otherwise render README.md -const ASS_INDEX = indexFile !== '' && fs.existsSync(`../${indexFile}`) && require(`../${indexFile}`); +const ASS_INDEX = indexFile !== '' && fs.existsSync(path(`${indexFile}`)) && require(`../${indexFile}`); const ASS_INDEX_ENABLED = typeof ASS_INDEX === typeof Function; app.get('/', (req, res, next) => ASS_INDEX_ENABLED // skipcq: JS-0229 ? ASS_INDEX(req, res, next) From 16803fb672eaaba62caa4dfe465b7596aad5e344 Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 3 Oct 2021 20:42:07 -0600 Subject: [PATCH 21/32] ass TypeScript Beta 2 (version `0.9.0-rc.2`) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index c10839c..908c7b8 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ass", - "version": "0.9.0-rc.1", + "version": "0.9.0-rc.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ass", - "version": "0.9.0-rc.1", + "version": "0.9.0-rc.2", "license": "ISC", "dependencies": { "@tsconfig/node14": "^1.0.1", diff --git a/package.json b/package.json index da3f42e..b9d823a 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ass", - "version": "0.9.0-rc.1", + "version": "0.9.0-rc.2", "description": "The superior self-hosted ShareX server", "main": "ass.js", "engines": { From 7980c4c80a65b91c8172a912c5ff6f9d91f6882b Mon Sep 17 00:00:00 2001 From: tycrek Date: Sun, 3 Oct 2021 21:40:18 -0600 Subject: [PATCH 22/32] Update ass-x to work with 0.9.0-rc.2 --- ass-x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ass-x b/ass-x index 5810858..2b14313 160000 --- a/ass-x +++ b/ass-x @@ -1 +1 @@ -Subproject commit 58108589fc6b2bfc5c43cb96557fe280bb6d48a4 +Subproject commit 2b143138ef2cb7790117709882e429f5e7680d75 From ddb5413cc9aa7158bf22a19024ce3ce284d67898 Mon Sep 17 00:00:00 2001 From: tycrek Date: Mon, 11 Oct 2021 21:27:06 -0600 Subject: [PATCH 23/32] Fixed token generation (`npm run new-token `) --- src/generators/token.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/generators/token.ts b/src/generators/token.ts index e80636d..db57e33 100644 --- a/src/generators/token.ts +++ b/src/generators/token.ts @@ -8,6 +8,7 @@ const log = new TLog(); const MAX_USERNAME = 20; export default () => uuid().replace(/-/g, ''); +module.exports = () => uuid().replace(/-/g, ''); // If directly called on the command line, generate a new token if (require.main === module) { From b38a403bc95431c2bb1bbb16c2dc9b9d94212e11 Mon Sep 17 00:00:00 2001 From: tycrek Date: Mon, 11 Oct 2021 21:38:46 -0600 Subject: [PATCH 24/32] Fixed timeoffset breaking TS compilation --- src/definitions.d.ts | 1 + src/routers/upload.ts | 2 +- src/utils.ts | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/definitions.d.ts b/src/definitions.d.ts index 8c70b8c..6f716b7 100644 --- a/src/definitions.d.ts +++ b/src/definitions.d.ts @@ -22,6 +22,7 @@ export interface FileData { sha1: string domain: string timestamp: number + timeoffset: string token: string opengraph: OpenGraphData diff --git a/src/routers/upload.ts b/src/routers/upload.ts index da5485e..b744853 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -50,7 +50,7 @@ router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { req.file!.timestamp = DateTime.now().toMillis(); // Save the timezone offset - req.file.timeoffset = req.headers['x-ass-timeoffset'] || 'UTC+0'; + req.file!.timeoffset = req.headers['x-ass-timeoffset']?.toString() || 'UTC+0'; // Keep track of the token that uploaded the resource req.file!.token = req.token ?? ''; diff --git a/src/utils.ts b/src/utils.ts index 411c901..abaafde 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -47,7 +47,7 @@ export function getResourceColor(colorValue: string, vibrantValue: string) { return colorValue === '&random' ? randomHexColour() : colorValue === '&vibrant' ? vibrantValue : colorValue; } -export function formatTimestamp(timestamp: number, timeoffset) { +export function formatTimestamp(timestamp: number, timeoffset: string) { return DateTime.fromMillis(timestamp).setZone(timeoffset).toLocaleString(DateTime.DATETIME_MED); } @@ -58,7 +58,7 @@ export function formatBytes(bytes: number, decimals = 2) { // skipcq: JS-0074 return parseFloat((bytes / Math.pow(KILOBYTES, i)).toFixed(decimals < 0 ? 0 : decimals)).toString().concat(` ${sizes[i]}`); } -export function replaceholder(data: string, size: number, timestamp: number, timeoffset, originalname: string) { +export function replaceholder(data: string, size: number, timestamp: number, timeoffset: string, originalname: string) { return data .replace(/&size/g, formatBytes(size)) .replace(/&filename/g, originalname) From 3237f4882bed84d93c4e2d6d0e1c05eba0808ed6 Mon Sep 17 00:00:00 2001 From: tycrek Date: Mon, 11 Oct 2021 21:38:57 -0600 Subject: [PATCH 25/32] Fixed metrics script --- src/metrics.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/metrics.js b/src/metrics.js index d101817..071fe97 100644 --- a/src/metrics.js +++ b/src/metrics.js @@ -8,7 +8,7 @@ const TLog = require('@tycrek/log'); const log = new TLog({ level: 'debug', timestamp: { enabled: false } }); module.exports = () => { - const data = require('./data'); + const data = require('./data').data; const { users } = fs.readJsonSync(path.join(process.cwd(), 'auth.json')); Object.keys(users).forEach((token) => users[token].count = 0); From c1447e2d36d02b16f368f7d09ad87b251af9c3b6 Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 12 Oct 2021 17:10:41 -0600 Subject: [PATCH 26/32] Squash branch 'master' into ts-attempt-over-9000 --- package-lock.json | 430 ++++++++++++++++-------------------------- package.json | 2 +- src/ass.ts | 6 +- src/routers/upload.ts | 19 +- src/storage.js | 67 +++---- 5 files changed, 206 insertions(+), 318 deletions(-) diff --git a/package-lock.json b/package-lock.json index 908c7b8..138f4f2 100755 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "discord-webhook-node": "^1.1.8", "escape-html": "^1.0.3", "express": "^4.17.1", + "express-busboy": "^8.0.0", "express-rate-limit": "^5.2.6", "ffmpeg-static": "^4.3.0", "fs-extra": "^9.1.0", @@ -28,7 +29,6 @@ "jimp": "^0.16.1", "luxon": "^1.26.0", "marked": "^2.0.7", - "multer": "2.0.0-rc.2", "node-fetch": "^2.6.2", "node-vibrant": "*", "prompt": "^1.1.0", @@ -158,9 +158,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1081,11 +1081,6 @@ "resolved": "https://registry.npmjs.org/any-shell-escape/-/any-shell-escape-0.1.1.tgz", "integrity": "sha1-1Vq5ciRMcaml4asIefML8RCAaVk=" }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1145,9 +1140,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.999.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.999.0.tgz", - "integrity": "sha512-OcnD7m+HCZv2qDzmS7TgABGf26mVPfIyah0Dgz7hHAxBtx78qFWi/s9U6BDxVBKWLg7OKWVHf0opiMG4ujteqg==", + "version": "2.1006.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1006.0.tgz", + "integrity": "sha512-lwXAy706+1HVQqMnHaahdeBZZbdu6TWrtTY0ydeG0qanwldTFNMLczwnETTZWYsqNAU+wjl1VzmFdMO4gePLNQ==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -1199,14 +1194,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base32-encode": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", - "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", - "dependencies": { - "to-data-view": "^1.1.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1231,6 +1218,17 @@ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, "node_modules/body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1251,6 +1249,28 @@ "node": ">= 0.8" } }, + "node_modules/body/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + }, + "node_modules/body/node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -1640,6 +1660,17 @@ "typedarray": "^0.0.6" } }, + "node_modules/connect-busboy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", + "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", + "dependencies": { + "busboy": "*" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -1668,6 +1699,11 @@ "node": ">= 0.6" } }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=" + }, "node_modules/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -1853,11 +1889,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -1994,10 +2025,28 @@ "node": ">= 0.10.0" } }, + "node_modules/express-busboy": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/express-busboy/-/express-busboy-8.0.0.tgz", + "integrity": "sha512-BrNjpjio/A3mr1P83ZwvYK+7ClJC98KHN9io+ybo58Gx2mO7TDFR/Ol1uwR/dWOAWzIFT3OnSxq1m0PFIvDo/w==", + "dependencies": { + "body": "~5.1.0", + "connect-busboy": "~0.0.1", + "mkdirp": "~0.5.0", + "qs": "^6.4.0", + "uuid": "~1.4.1" + } + }, + "node_modules/express-busboy/node_modules/uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, "node_modules/express-rate-limit": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.4.0.tgz", - "integrity": "sha512-sT+rk1wvj06+0MpEiij7y3kGdB4hoMyQ+a5zcESUpDMLhbLXoYIQI6JfsvLBz1wOhmfF//ALG/Q59FKMI0x2Eg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.0.tgz", + "integrity": "sha512-/1mrKggjXMxd1/ghPub5N3d36u5VlK8KjbQFQLxYub09BWSSgSXMQbXgFiIW0BYxjM49YCj8bkihONZR2U4+mQ==" }, "node_modules/eyes": { "version": "0.1.8", @@ -2074,14 +2123,6 @@ "node": ">=4" } }, - "node_modules/fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", - "dependencies": { - "imul": "^1.0.0" - } - }, "node_modules/follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -2144,14 +2185,6 @@ "node": ">=10" } }, - "node_modules/fs-temp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", - "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", - "dependencies": { - "random-path": "^0.1.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2252,11 +2285,6 @@ "node": ">=8" } }, - "node_modules/has-own-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-own-property/-/has-own-property-1.0.0.tgz", - "integrity": "sha1-PpjMHStfPagNPq/SjMZfyt2pZdo=" - }, "node_modules/has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", @@ -2385,14 +2413,6 @@ "node": ">=0.9.0" } }, - "node_modules/imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -2882,36 +2902,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/multer": { - "version": "2.0.0-rc.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.0-rc.2.tgz", - "integrity": "sha512-IjQe1wZoANXrZ0A7cED1dxUny3BFezp6jajZ2FDjP6Rjfxib20WPbWYIPe2mjq0enipuIqz7XLdAkbqO6+oqzQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^0.3.1", - "bytes": "^3.1.0", - "fs-temp": "^1.1.1", - "has-own-property": "^1.0.0", - "on-finished": "^2.3.0", - "pify": "^5.0.0", - "pump": "^3.0.0", - "stream-file-type": "^0.4.0", - "type-is": "^1.6.18" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/murmur-32": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", - "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", - "dependencies": { - "encode-utf8": "^1.0.3", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -3223,17 +3213,6 @@ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -3479,15 +3458,6 @@ "node": ">=4" } }, - "node_modules/random-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", - "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", - "dependencies": { - "base32-encode": "^0.1.0 || ^1.0.0", - "murmur-32": "^0.1.0 || ^0.2.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3642,6 +3612,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=" + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3794,39 +3769,6 @@ "node": ">= 0.6" } }, - "node_modules/stream-file-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/stream-file-type/-/stream-file-type-0.4.0.tgz", - "integrity": "sha512-Nj1pls0XYICU1yWqH1Qi4le/IY8b8vMtW9z4Jk0G/Fd/5p851w/kLXW94Lbv/r4CZA2eXIj4/EHNTaPnUxT8Og==", - "dependencies": { - "file-type": "^12.0.0", - "readable-stream": "^3.0.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stream-file-type/node_modules/file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stream-file-type/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -3969,11 +3911,6 @@ "node": "*" } }, - "node_modules/to-data-view": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==" - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -4700,9 +4637,9 @@ } }, "@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==" + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" }, "@babel/runtime": { "version": "7.15.4", @@ -5438,11 +5375,6 @@ "resolved": "https://registry.npmjs.org/any-shell-escape/-/any-shell-escape-0.1.1.tgz", "integrity": "sha1-1Vq5ciRMcaml4asIefML8RCAaVk=" }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5493,9 +5425,9 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "aws-sdk": { - "version": "2.999.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.999.0.tgz", - "integrity": "sha512-OcnD7m+HCZv2qDzmS7TgABGf26mVPfIyah0Dgz7hHAxBtx78qFWi/s9U6BDxVBKWLg7OKWVHf0opiMG4ujteqg==", + "version": "2.1006.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1006.0.tgz", + "integrity": "sha512-lwXAy706+1HVQqMnHaahdeBZZbdu6TWrtTY0ydeG0qanwldTFNMLczwnETTZWYsqNAU+wjl1VzmFdMO4gePLNQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -5537,14 +5469,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "base32-encode": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/base32-encode/-/base32-encode-1.2.0.tgz", - "integrity": "sha512-cHFU8XeRyx0GgmoWi5qHMCVRiqU6J3MHWxVgun7jggCBUpVzm1Ir7M9dYr2whjSNc3tFeXfQ/oZjQu/4u55h9A==", - "requires": { - "to-data-view": "^1.1.0" - } - }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -5555,6 +5479,38 @@ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", + "requires": { + "bytes": "1", + "string_decoder": "0.10" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -5876,6 +5832,14 @@ "typedarray": "^0.0.6" } }, + "connect-busboy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", + "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", + "requires": { + "busboy": "*" + } + }, "constantinople": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", @@ -5898,6 +5862,11 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=" + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -6045,11 +6014,6 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -6158,10 +6122,29 @@ "vary": "~1.1.2" } }, + "express-busboy": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/express-busboy/-/express-busboy-8.0.0.tgz", + "integrity": "sha512-BrNjpjio/A3mr1P83ZwvYK+7ClJC98KHN9io+ybo58Gx2mO7TDFR/Ol1uwR/dWOAWzIFT3OnSxq1m0PFIvDo/w==", + "requires": { + "body": "~5.1.0", + "connect-busboy": "~0.0.1", + "mkdirp": "~0.5.0", + "qs": "^6.4.0", + "uuid": "~1.4.1" + }, + "dependencies": { + "uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-1.4.2.tgz", + "integrity": "sha1-RTAZ9oaWam34PNxSROfJkOzDMvw=" + } + } + }, "express-rate-limit": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.4.0.tgz", - "integrity": "sha512-sT+rk1wvj06+0MpEiij7y3kGdB4hoMyQ+a5zcESUpDMLhbLXoYIQI6JfsvLBz1wOhmfF//ALG/Q59FKMI0x2Eg==" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.5.0.tgz", + "integrity": "sha512-/1mrKggjXMxd1/ghPub5N3d36u5VlK8KjbQFQLxYub09BWSSgSXMQbXgFiIW0BYxjM49YCj8bkihONZR2U4+mQ==" }, "eyes": { "version": "0.1.8", @@ -6219,14 +6202,6 @@ "locate-path": "^2.0.0" } }, - "fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw=", - "requires": { - "imul": "^1.0.0" - } - }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -6276,14 +6251,6 @@ "universalify": "^2.0.0" } }, - "fs-temp": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fs-temp/-/fs-temp-1.2.1.tgz", - "integrity": "sha512-okTwLB7/Qsq82G6iN5zZJFsOfZtx2/pqrA7Hk/9fvy+c+eJS9CvgGXT2uNxwnI14BDY9L/jQPkaBgSvlKfSW9w==", - "requires": { - "random-path": "^0.1.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6366,11 +6333,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "has-own-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-own-property/-/has-own-property-1.0.0.tgz", - "integrity": "sha1-PpjMHStfPagNPq/SjMZfyt2pZdo=" - }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", @@ -6470,11 +6432,6 @@ "resolved": "https://registry.npmjs.org/image-q/-/image-q-1.1.1.tgz", "integrity": "sha1-/IQJlmRGC5DKhi2TALa/u7+/gFY=" }, - "imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk=" - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -6845,33 +6802,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "multer": { - "version": "2.0.0-rc.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.0-rc.2.tgz", - "integrity": "sha512-IjQe1wZoANXrZ0A7cED1dxUny3BFezp6jajZ2FDjP6Rjfxib20WPbWYIPe2mjq0enipuIqz7XLdAkbqO6+oqzQ==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^0.3.1", - "bytes": "^3.1.0", - "fs-temp": "^1.1.1", - "has-own-property": "^1.0.0", - "on-finished": "^2.3.0", - "pify": "^5.0.0", - "pump": "^3.0.0", - "stream-file-type": "^0.4.0", - "type-is": "^1.6.18" - } - }, - "murmur-32": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/murmur-32/-/murmur-32-0.2.0.tgz", - "integrity": "sha512-ZkcWZudylwF+ir3Ld1n7gL6bI2mQAzXvSobPwVtu8aYi2sbXeipeSkdcanRLzIofLcM5F53lGaKm2dk7orBi7Q==", - "requires": { - "encode-utf8": "^1.0.3", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -7126,11 +7056,6 @@ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" - }, "pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -7334,15 +7259,6 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" }, - "random-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/random-path/-/random-path-0.1.2.tgz", - "integrity": "sha512-4jY0yoEaQ5v9StCl5kZbNIQlg1QheIDBrdkDn53EynpPb9FgO6//p3X/tgMnrC45XN6QZCzU1Xz/+pSSsJBpRw==", - "requires": { - "base32-encode": "^0.1.0 || ^1.0.0", - "murmur-32": "^0.1.0 || ^0.2.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -7456,6 +7372,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=" + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7589,32 +7510,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stream-file-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/stream-file-type/-/stream-file-type-0.4.0.tgz", - "integrity": "sha512-Nj1pls0XYICU1yWqH1Qi4le/IY8b8vMtW9z4Jk0G/Fd/5p851w/kLXW94Lbv/r4CZA2eXIj4/EHNTaPnUxT8Og==", - "requires": { - "file-type": "^12.0.0", - "readable-stream": "^3.0.6" - }, - "dependencies": { - "file-type": { - "version": "12.4.2", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", - "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -7718,11 +7613,6 @@ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz", "integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==" }, - "to-data-view": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", - "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==" - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/package.json b/package.json index b9d823a..7915e5a 100755 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "discord-webhook-node": "^1.1.8", "escape-html": "^1.0.3", "express": "^4.17.1", + "express-busboy": "^8.0.0", "express-rate-limit": "^5.2.6", "ffmpeg-static": "^4.3.0", "fs-extra": "^9.1.0", @@ -55,7 +56,6 @@ "jimp": "^0.16.1", "luxon": "^1.26.0", "marked": "^2.0.7", - "multer": "2.0.0-rc.2", "node-fetch": "^2.6.2", "node-vibrant": "*", "prompt": "^1.1.0", diff --git a/src/ass.ts b/src/ass.ts index ff8265d..79a1a8e 100644 --- a/src/ass.ts +++ b/src/ass.ts @@ -79,13 +79,13 @@ app.get('/', (req, res, next) => ASS_INDEX_ENABLED // skipcq: JS-0229 .then((d) => res.render('index', { data: d })) .catch(next)); -// Upload router -app.use('/', ROUTERS.upload); - // Set up custom frontend const ASS_FRONTEND = fs.existsSync(path(`./${frontendName}/package.json`)) ? (require('submodule'), require(`../${frontendName}`)) : { enabled: false }; // todo: update with src/ ASS_FRONTEND.enabled && app.use(ASS_FRONTEND.endpoint, ASS_FRONTEND.router); // skipcq: JS-0093 +// Upload router (has to come after custom frontends as express-busboy interferes with all POST calls) +app.use('/', ROUTERS.upload); + // '/:resouceId' always needs to be LAST since it's a catch-all route app.use('/:resourceId', (req: AssRequest, _res, next) => (req.resourceId = req.params.resourceId, next()), ROUTERS.resource); // skipcq: JS-0086, JS-0090 diff --git a/src/routers/upload.ts b/src/routers/upload.ts index b744853..03882d7 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -1,10 +1,11 @@ import { FileData, AssRequest, AssResponse, ErrWrap, User } from "../definitions"; import fs from 'fs-extra'; +const bb = require('express-busboy'); //const rateLimit = require('express-rate-limit'); import { DateTime } from 'luxon'; import { Webhook, MessageBuilder } from 'discord-webhook-node'; -import { doUpload, processUploaded } from '../storage'; +import { processUploaded } from '../storage'; const { maxUploadSize, resourceIdSize, gfyIdSize, resourceIdType, spaceReplace } = require('../../config.json'); import { path, log, verify, getTrueHttp, getTrueDomain, generateId, formatBytes } from '../utils'; const { CODE_UNAUTHORIZED, CODE_PAYLOAD_TOO_LARGE } = require('../../MagicNumbers.json'); @@ -15,6 +16,13 @@ const ASS_LOGO = 'https://cdn.discordapp.com/icons/848274994375294986/8d339d4a2f import express from 'express'; const router = express.Router(); +// Set up express-busboy +bb.extend(router, { + upload: true, + restrictMultiple: true, + allowedPath: (url: string) => url === '/', +}); + // Rate limit middleware /* router.use('/', rateLimit({ windowMs: 1000 * 60, // 60 seconds // skipcq: JS-0074 @@ -29,13 +37,10 @@ router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { }); // Upload file -//router.post('/', doUpload, processUploaded, ({ next }) => next()); -router.post('/', (req: AssRequest, res: AssResponse, next: Function) => doUpload(req, res, (err: Error) => { - log.express().Header(req, 'Content-Type'); - (err) ? log.error(`Multer encountered an ${!(err.toString().includes('MulterError')) ? 'unknown ' : ''}error`, err).callback(next, err) : log.debug('Multer', 'File saved in temp dir').callback(next); -}), processUploaded, ({ next }: { next: Function }) => next()); +router.post('/', processUploaded); -router.use('/', (err: ErrWrap, _req: AssRequest, res: AssResponse, next: Function) => err.code && err.code === 'LIMIT_FILE_SIZE' ? log.warn('Upload blocked', 'File too large').callback(() => res.status(CODE_PAYLOAD_TOO_LARGE).send(`Max upload size: ${maxUploadSize}MB`)) : next(err)); // skipcq: JS-0229 +// Max upload size error handling +router.use('/', (err: ErrWrap, _req: AssRequest, res: AssResponse, next: Function) => err.message === 'LIMIT_FILE_SIZE' ? log.warn('Upload blocked', 'File too large').callback(() => res.status(CODE_PAYLOAD_TOO_LARGE).send(`Max upload size: ${maxUploadSize}MB`)) : next(err)); // skipcq: JS-0229 // Process uploaded file router.post('/', (req: AssRequest, res: AssResponse, next: Function) => { diff --git a/src/storage.js b/src/storage.js index b228d25..5377932 100644 --- a/src/storage.js +++ b/src/storage.js @@ -3,12 +3,11 @@ const fs = require('fs-extra'); const aws = require('aws-sdk'); -const multer = require('multer'); const Thumbnail = require('./thumbnails').default; const Vibrant = require('./vibrant').default; const Hash = require('./hash').default; -const { getDatedDirname, sanitize, generateId, formatBytes, log } = require('./utils'); -const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, saveAsOriginal, maxUploadSize, mediaStrict } = require('../config.json'); +const { getDatedDirname, generateId, log } = require('./utils'); +const { s3enabled, s3endpoint, s3bucket, s3usePathStyle, s3accessKey, s3secretKey, saveAsOriginal, mediaStrict, maxUploadSize } = require('../config.json'); const { CODE_UNSUPPORTED_MEDIA_TYPE } = require('../MagicNumbers.json'); const ID_GEN_LENGTH = 32; @@ -20,25 +19,18 @@ const s3 = new aws.S3({ credentials: new aws.Credentials({ accessKeyId: s3accessKey, secretAccessKey: s3secretKey }) }); -function saveFile(req) { - log.null(req.file, 'Unable to save req.file!') - .debug('Temp file saving'); - return new Promise((resolve, reject) => - fs.ensureDir(getDatedDirname()) - .then(() => fs.createWriteStream(req.file.path.concat('.temp'))) - .then((stream) => req.file.stream.pipe(stream).on('finish', () => log.debug('Temp file saved', req.file.path, formatBytes(req.file.size)).callback(resolve)).on('error', reject)) - .catch(reject)); -} - function getLocalFilename(req) { return `${getDatedDirname()}/${saveAsOriginal ? req.file.originalname : req.file.sha1}`; } -function processUploaded(req, res, next) { - // Fixes - req.file.mimetype = req.file.detectedMimeType || req.file.clientReportedMimeType; - req.file.ext = req.file.detectedFileExtension || req.file.clientReportedFileExtension; - req.file.originalname = sanitize(req.file.originalName); +function processUploaded(req, res, next) { // skipcq: JS-0045 + // Fix file object + req.file = req.files.file; + + // Other fixes + req.file.ext = '.'.concat(req.file.filename.split('.').pop()); + req.file.originalname = req.file.filename; + req.file.path = req.file.file; req.file.randomId = generateId('random', ID_GEN_LENGTH, null, null); req.file.deleteId = generateId('random', ID_GEN_LENGTH, null, null); @@ -55,39 +47,41 @@ function processUploaded(req, res, next) { req.file.is[isType] = true; // Block the resource if the mimetype is not an image or video - if (mediaStrict && !ALLOWED_MIMETYPES.test(req.file.mimetype)) { + if (mediaStrict && !ALLOWED_MIMETYPES.test(req.file.mimetype)) return log .warn('Upload blocked', req.file.originalname, req.file.mimetype) .warn('Strict media mode', 'only images, videos, & audio are file permitted') .callback(() => - fs.remove(req.file.path.concat('.temp')) + fs.remove(req.file.path) .then(() => log .debug('Temp file', 'deleted') .callback(() => res.sendStatus(CODE_UNSUPPORTED_MEDIA_TYPE))) .catch((err) => log .error('Temp file could not be deleted', err) .callback(next, err))); - } // Remove unwanted fields - delete req.file.fieldName; - delete req.file.originalName; - delete req.file.clientReportedMimeType; - delete req.file.clientReportedFileExtension; - delete req.file.detectedMimeType; - delete req.file.detectedFileExtension; + delete req.file.uuid; + delete req.file.field; + delete req.file.file; + delete req.file.filename; + delete req.file.truncated; + delete req.file.done; // Operations - saveFile(req) - .then(() => req.file.path = req.file.path.concat('.temp')) // skipcq: JS-0086 - .then(() => Promise.all([Thumbnail(req.file), Vibrant(req.file), Hash(req.file)])) + Promise.all([Thumbnail(req.file), Vibrant(req.file), Hash(req.file), fs.stat(req.file.path)]) // skipcq: JS-0086 - .then(([thumbnail, vibrant, sha1]) => ( + .then(([thumbnail, vibrant, sha1, stat]) => ( req.file.thumbnail = thumbnail, // skipcq: JS-0090 req.file.vibrant = vibrant, // skipcq: JS-0090 - req.file.sha1 = sha1 // skipcq: JS-0090 + req.file.sha1 = sha1, // skipcq: JS-0090 + req.file.size = stat.size // skipcq: JS-0090 )) + // Check if file size is too big + .then(() => { if (req.file.size / Math.pow(1024, 2) > maxUploadSize) throw new Error('LIMIT_FILE_SIZE'); }) + + // Save file .then(() => log.debug('Saving file', req.file.originalname, s3enabled ? 'in S3' : 'on disk')) .then(() => // skipcq: JS-0229 @@ -109,12 +103,12 @@ function processUploaded(req, res, next) { .catch(reject) )) .then(() => log.debug('File saved', req.file.originalname, s3enabled ? 'in S3' : 'on disk')) - .then(() => fs.remove(req.file.path)) - .then(() => log.debug('Temp file', 'deleted')) .then(() => !s3enabled && (req.file.path = getLocalFilename(req))) // skipcq: JS-0090 - .then(() => delete req.file.stream) .then(() => next()) - .catch(next); + .catch(next) + .finally(() => fs.remove(req.file.path)) + .then(() => log.debug('Temp file', 'deleted')) + .catch((err) => log.err(err)); } function deleteS3(file) { @@ -137,7 +131,6 @@ function bucketSize() { } module.exports = { - doUpload: multer({ limits: { fileSize: `${maxUploadSize}MB` } }).single('file'), processUploaded, deleteS3, bucketSize From eaa6bbf33dbc116b6c9b3d371590f58a17380a07 Mon Sep 17 00:00:00 2001 From: tycrek Date: Tue, 12 Oct 2021 17:17:01 -0600 Subject: [PATCH 27/32] Pre-release v`0.9.0-rc.3` --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 138f4f2..7761003 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ass", - "version": "0.9.0-rc.2", + "version": "0.9.0-rc.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ass", - "version": "0.9.0-rc.2", + "version": "0.9.0-rc.3", "license": "ISC", "dependencies": { "@tsconfig/node14": "^1.0.1", diff --git a/package.json b/package.json index 7915e5a..b9027fd 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ass", - "version": "0.9.0-rc.2", + "version": "0.9.0-rc.3", "description": "The superior self-hosted ShareX server", "main": "ass.js", "engines": { @@ -79,4 +79,4 @@ "@types/uuid": "^8.3.1", "@types/ws": "^7.4.7" } -} +} \ No newline at end of file From 285fbd75029878a74625f8c47e3bda88a7032679 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 13 Oct 2021 20:41:46 -0600 Subject: [PATCH 28/32] Added/Removed/Improved some npm scripts --- .github/README.md | 8 +++++--- package.json | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/README.md b/.github/README.md index 4003260..7f2dc12 100644 --- a/.github/README.md +++ b/.github/README.md @@ -351,14 +351,16 @@ ass has a number of pre-made npm scripts for you to use. **All** of these script | Script | Description | | ------ | ----------- | | **`start`** | Starts the ass server. This is the default script & is run with **`npm start`**. | +| `build` | Compiles the TypeScript files into JavaScript. | +| `dev` | Chains the `build` and `compile` scripts together. | | `setup` | Starts the easy setup process. Should be run after any updates that introduce new config options. | | `metrics` | Runs the metrics script. This is a simple script that outputs basic resource statistics. | | `new-token` | Generates a new API token. Accepts one parameter for specifying a username, like `npm run new-token `. ass automatically detects the new token & reloads it, so there's no need to restart the server. | -| `restart` | Restarts the ass server using `systemctl`. More info soon (should work fine if you have an existing `ass.service` file) | | `engine-check` | Ensures your environment meets the minimum Node & npm version requirements. | -| `logs` | Uses the [tlog Socket plugin] to stream logs from the ass server to your terminal, with full colour support (Remember to set [`FORCE_COLOR`] if you're using Systemd) | | `docker-logs` | Alias for `docker-compose logs -f --tail=50 --no-log-prefix ass` | -| `docker-update` | Alias for `git pull && docker-compose up --force-recreate --build -d && docker image prune -f` | +| `docker-update` | Calls `git pull` then runs the `docker-uplite` script. | +| `docker-uplite` | Alias for `docker-compose up --force-recreate --build -d && docker image prune -f` | +| `docker-upfull` | Alias for `npm run docker-update && npm run docker-resetup` | | `docker-resetup` | Alias for `docker-compose exec ass npm run setup && docker-compose restart` | [tlog Socket plugin]: https://github.com/tycrek/tlog#socket diff --git a/package.json b/package.json index b9027fd..5e630e3 100755 --- a/package.json +++ b/package.json @@ -14,12 +14,13 @@ "setup": "node dist/setup.js", "metrics": "node dist/metrics.js", "new-token": "node dist/generators/token.js", - "restart": "systemctl restart ass.service", "engine-check": "node dist/checkEngine.js", "prestart": "npm run engine-check", "presetup": "npm run engine-check", "docker-logs": "docker-compose logs -f --tail=50 --no-log-prefix ass", - "docker-update": "git pull && docker-compose up --force-recreate --build -d && docker image prune -f", + "docker-update": "git pull && npm run docker-uplite", + "docker-uplite": "docker-compose up --force-recreate --build -d && docker image prune -f", + "docker-upfull": "npm run docker-update && npm run docker-resetup", "docker-resetup": "docker-compose exec ass npm run setup && docker-compose restart" }, "repository": "github:tycrek/ass", From b25b90fd89538d1876d2f2fe84aa3408d2305ff4 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 13 Oct 2021 20:49:08 -0600 Subject: [PATCH 29/32] Improved Docker files --- Dockerfile | 11 +++++------ compose.yaml | 3 +-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index dfb1148..006d47b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -# ass Dockerfile v0.1.0 +# ass Dockerfile v0.2.0 # authors: # - tycrek (https://tycrek.com/) # - Zusier (https://github.com/Zusier) @@ -12,11 +12,10 @@ WORKDIR /opt/ass/ # Copy directory files (config.json, source files etc.) COPY . ./ -# Update npm to at least v7.x.x -RUN npm i -g npm@>=7 - -# Install dependencies -RUN npm i +# Update npm to at least v7.x.x, +# then install dependencies +RUN npm i -g npm@>=7 typescript && \ + npm i --save-dev # Ensure these directories & files exist for compose volumes RUN mkdir -p /opt/ass/uploads/thumbnails/ && \ diff --git a/compose.yaml b/compose.yaml index 6ffaac5..5ecfe03 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,4 +1,4 @@ -# ass Docker compose.yaml v0.1.0 +# ass Docker compose.yaml v0.1.1 # authors: # - tycrek (https://tycrek.com/) # - Zusier (https://github.com/Zusier) @@ -11,7 +11,6 @@ services: restart: unless-stopped ports: - "40115:40115" - - "45375:45375" volumes: - ./uploads:/opt/ass/uploads - ./share:/opt/ass/share From 093e59ccbaed9d506e239562ea3498689c063103 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 13 Oct 2021 20:52:40 -0600 Subject: [PATCH 30/32] Fixed express-busboy on TypeScript --- package-lock.json | 59 +++++++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- src/routers/upload.ts | 3 ++- 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7761003..276efbe 100755 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "devDependencies": { "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", + "@types/express-busboy": "^8.0.0", "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/luxon": "^2.0.3", @@ -726,6 +727,15 @@ "@types/node": "*" } }, + "node_modules/@types/busboy": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-0.2.4.tgz", + "integrity": "sha512-f+ZCVjlcN8JW/zf3iR0GqO4gjOUlltMTtZjn+YR1mlK+MVu6esTiIecO0/GQlmYQPQLdBnc7+5vG3Xb+SkvFLw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -735,6 +745,16 @@ "@types/node": "*" } }, + "node_modules/@types/connect-busboy": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/connect-busboy/-/connect-busboy-0.0.3.tgz", + "integrity": "sha512-7tatHmmeXY1HnK2TM8UIWxuag2hxFq4PmLXoo2D8mnXhsXgbpgx9bS8JM02rJl2feTlqh3BS+HvEaVGpdM/t9g==", + "dev": true, + "dependencies": { + "@types/busboy": "*", + "@types/express": "*" + } + }, "node_modules/@types/escape-html": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", @@ -753,6 +773,16 @@ "@types/serve-static": "*" } }, + "node_modules/@types/express-busboy": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/express-busboy/-/express-busboy-8.0.0.tgz", + "integrity": "sha512-fsMmcffnf3wSNRLrUIFIgYDl2ogHdP6wVwraRrmRFRsy2IPmaz0fWz+0RRq+XzQliahKV5C7UxGzZb8fXOE9SQ==", + "dev": true, + "dependencies": { + "@types/connect-busboy": "*", + "@types/express": "*" + } + }, "node_modules/@types/express-serve-static-core": { "version": "4.17.24", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", @@ -5057,6 +5087,15 @@ "@types/node": "*" } }, + "@types/busboy": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@types/busboy/-/busboy-0.2.4.tgz", + "integrity": "sha512-f+ZCVjlcN8JW/zf3iR0GqO4gjOUlltMTtZjn+YR1mlK+MVu6esTiIecO0/GQlmYQPQLdBnc7+5vG3Xb+SkvFLw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -5066,6 +5105,16 @@ "@types/node": "*" } }, + "@types/connect-busboy": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/connect-busboy/-/connect-busboy-0.0.3.tgz", + "integrity": "sha512-7tatHmmeXY1HnK2TM8UIWxuag2hxFq4PmLXoo2D8mnXhsXgbpgx9bS8JM02rJl2feTlqh3BS+HvEaVGpdM/t9g==", + "dev": true, + "requires": { + "@types/busboy": "*", + "@types/express": "*" + } + }, "@types/escape-html": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.1.tgz", @@ -5084,6 +5133,16 @@ "@types/serve-static": "*" } }, + "@types/express-busboy": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/express-busboy/-/express-busboy-8.0.0.tgz", + "integrity": "sha512-fsMmcffnf3wSNRLrUIFIgYDl2ogHdP6wVwraRrmRFRsy2IPmaz0fWz+0RRq+XzQliahKV5C7UxGzZb8fXOE9SQ==", + "dev": true, + "requires": { + "@types/connect-busboy": "*", + "@types/express": "*" + } + }, "@types/express-serve-static-core": { "version": "4.17.24", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", diff --git a/package.json b/package.json index 5e630e3..22a2420 100755 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "devDependencies": { "@types/escape-html": "^1.0.1", "@types/express": "^4.17.13", + "@types/express-busboy": "^8.0.0", "@types/ffmpeg-static": "^3.0.0", "@types/fs-extra": "^9.0.12", "@types/luxon": "^2.0.3", @@ -80,4 +81,4 @@ "@types/uuid": "^8.3.1", "@types/ws": "^7.4.7" } -} \ No newline at end of file +} diff --git a/src/routers/upload.ts b/src/routers/upload.ts index 03882d7..944a393 100644 --- a/src/routers/upload.ts +++ b/src/routers/upload.ts @@ -1,7 +1,7 @@ import { FileData, AssRequest, AssResponse, ErrWrap, User } from "../definitions"; import fs from 'fs-extra'; -const bb = require('express-busboy'); +import bb from 'express-busboy'; //const rateLimit = require('express-rate-limit'); import { DateTime } from 'luxon'; import { Webhook, MessageBuilder } from 'discord-webhook-node'; @@ -17,6 +17,7 @@ import express from 'express'; const router = express.Router(); // Set up express-busboy +// @ts-ignore bb.extend(router, { upload: true, restrictMultiple: true, From 9e2c3fab18da1d42ac025cbc7f64565936335319 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 13 Oct 2021 20:58:48 -0600 Subject: [PATCH 31/32] Updated packages --- package-lock.json | 113 +++++++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index 276efbe..cef64ba 100755 --- a/package-lock.json +++ b/package-lock.json @@ -63,9 +63,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "optional": true, "dependencies": { "@babel/highlight": "^7.14.5" @@ -810,9 +810,9 @@ } }, "node_modules/@types/luxon": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.4.tgz", - "integrity": "sha512-l3xuhmyF2kBldy15SeY6d6HbK2BacEcSK1qTF1ISPtPHr29JH0C1fndz9ExXLKpGl0J6pZi+dGp1i5xesMt60Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.5.tgz", + "integrity": "sha512-GKrG5v16BOs9XGpouu33hOkAFaiSDi3ZaDXG9F2yAoyzHRBtksZnI60VWY5aM/yAENCccBejrxw8jDY+9OVlxw==", "dev": true }, "node_modules/@types/marked": { @@ -828,9 +828,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.9.tgz", + "integrity": "sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw==", "dev": true }, "node_modules/@types/node-fetch": { @@ -1170,9 +1170,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1006.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1006.0.tgz", - "integrity": "sha512-lwXAy706+1HVQqMnHaahdeBZZbdu6TWrtTY0ydeG0qanwldTFNMLczwnETTZWYsqNAU+wjl1VzmFdMO4gePLNQ==", + "version": "2.1007.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1007.0.tgz", + "integrity": "sha512-I/o2R7RTh6NGRilsBrJHg7r9WprU9EavozZ43qMQcppaLAeZrECBbGfpfRyhfrj7885+KS+WOu1SGn6bsSd2VQ==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -1943,6 +1943,14 @@ "node": ">=6" } }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dependencies": { + "string-template": "~0.2.1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2714,14 +2722,6 @@ "node": ">=4" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "engines": { - "node": ">=4" - } - }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -3230,7 +3230,12 @@ "node": ">=4" } }, - "node_modules/path-type/node_modules/pify": { + "node_modules/phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" + }, + "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", @@ -3238,11 +3243,6 @@ "node": ">=4" } }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, "node_modules/pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -3823,6 +3823,11 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -4590,9 +4595,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "optional": true, "requires": { "@babel/highlight": "^7.14.5" @@ -5170,9 +5175,9 @@ } }, "@types/luxon": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.4.tgz", - "integrity": "sha512-l3xuhmyF2kBldy15SeY6d6HbK2BacEcSK1qTF1ISPtPHr29JH0C1fndz9ExXLKpGl0J6pZi+dGp1i5xesMt60Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-2.0.5.tgz", + "integrity": "sha512-GKrG5v16BOs9XGpouu33hOkAFaiSDi3ZaDXG9F2yAoyzHRBtksZnI60VWY5aM/yAENCccBejrxw8jDY+9OVlxw==", "dev": true }, "@types/marked": { @@ -5188,9 +5193,9 @@ "dev": true }, "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.9.tgz", + "integrity": "sha512-H9ReOt+yqIJPCutkTYjFjlyK6WEMQYT9hLZMlWtOjFQY2ItppsWZ6RJf8Aw+jz5qTYceuHvFgPIaKOHtLAEWBw==", "dev": true }, "@types/node-fetch": { @@ -5484,9 +5489,9 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "aws-sdk": { - "version": "2.1006.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1006.0.tgz", - "integrity": "sha512-lwXAy706+1HVQqMnHaahdeBZZbdu6TWrtTY0ydeG0qanwldTFNMLczwnETTZWYsqNAU+wjl1VzmFdMO4gePLNQ==", + "version": "2.1007.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1007.0.tgz", + "integrity": "sha512-I/o2R7RTh6NGRilsBrJHg7r9WprU9EavozZ43qMQcppaLAeZrECBbGfpfRyhfrj7885+KS+WOu1SGn6bsSd2VQ==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -6091,6 +6096,14 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "requires": { + "string-template": "~0.2.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6699,13 +6712,6 @@ "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "locate-path": { @@ -7101,13 +7107,6 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - } } }, "phin": { @@ -7115,6 +7114,11 @@ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, "pixelmatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", @@ -7590,6 +7594,11 @@ "safe-buffer": "~5.1.0" } }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", From 297ac8bd80678834815de129dfe593f3330db8b0 Mon Sep 17 00:00:00 2001 From: tycrek Date: Wed, 13 Oct 2021 21:02:25 -0600 Subject: [PATCH 32/32] Version 0.9.0 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cef64ba..03d072e 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ass", - "version": "0.9.0-rc.3", + "version": "0.9.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ass", - "version": "0.9.0-rc.3", + "version": "0.9.0", "license": "ISC", "dependencies": { "@tsconfig/node14": "^1.0.1", diff --git a/package.json b/package.json index 22a2420..6603bca 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ass", - "version": "0.9.0-rc.3", + "version": "0.9.0", "description": "The superior self-hosted ShareX server", "main": "ass.js", "engines": {