diff --git a/lib/shortener/_all.js b/lib/shortener/_all.ts similarity index 100% rename from lib/shortener/_all.js rename to lib/shortener/_all.ts diff --git a/lib/shortener/base.js b/lib/shortener/base.ts similarity index 82% rename from lib/shortener/base.js rename to lib/shortener/base.ts index 381802851d3..4e80ba23d95 100644 --- a/lib/shortener/base.js +++ b/lib/shortener/base.ts @@ -22,11 +22,17 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. -export class BaseShortener { - constructor(storageHandler) { - this.storageHandler = storageHandler; - } +import * as express from 'express'; + +import {StorageBase} from '../storage'; + +export abstract class BaseShortener { + constructor(protected storageHandler: StorageBase) {} // eslint-disable-next-line no-unused-vars - handle(req, res) {} + abstract handle(req: express.Request, res: express.Response); + + static get key(): string { + throw 'get key() must be overridden'; + } } diff --git a/lib/shortener/default.js b/lib/shortener/default.ts similarity index 92% rename from lib/shortener/default.js rename to lib/shortener/default.ts index c16634d7b18..fc9097e6301 100644 --- a/lib/shortener/default.js +++ b/lib/shortener/default.ts @@ -22,14 +22,16 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import * as express from 'express'; + import {BaseShortener} from './base'; export class DefaultShortener extends BaseShortener { - static get key() { - return 'default'; + override handle(req: express.Request, res: express.Response) { + return this.storageHandler.handler(req, res); } - handle(req, res) { - return this.storageHandler.handler(req, res); + static override get key() { + return 'default'; } } diff --git a/lib/shortener/google.js b/lib/shortener/google.ts similarity index 98% rename from lib/shortener/google.js rename to lib/shortener/google.ts index 59f8ee8a0b5..832157e56b7 100644 --- a/lib/shortener/google.js +++ b/lib/shortener/google.ts @@ -25,7 +25,7 @@ import request from 'request'; export class ShortLinkResolver { - resolve(url) { + resolve(url: string) { return new Promise((resolve, reject) => { request({method: 'HEAD', uri: url, followRedirect: false}, (err, res) => { if (err !== null) { diff --git a/lib/shortener/index.js b/lib/shortener/index.ts similarity index 100% rename from lib/shortener/index.js rename to lib/shortener/index.ts diff --git a/lib/shortener/tinyurl.js b/lib/shortener/tinyurl.ts similarity index 88% rename from lib/shortener/tinyurl.js rename to lib/shortener/tinyurl.ts index cd75ac28740..46c6eccb15a 100644 --- a/lib/shortener/tinyurl.js +++ b/lib/shortener/tinyurl.ts @@ -22,28 +22,29 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import * as express from 'express'; import request from 'request'; import {BaseShortener} from './base'; export class TinyUrlShortener extends BaseShortener { - static get key() { - return 'tinyurl'; - } - - handle(req, res) { + override handle(req: express.Request, res: express.Response) { const url = `${req.protocol}://${req.get('host')}#${req.body.config}`; const options = { url: 'https://tinyurl.com/api-create.php?url=' + encodeURIComponent(url), method: 'GET', }; - const callback = (err, resp, body) => { + const callback = (err, resp: request.Response, body) => { if (!err && resp.statusCode === 200) { res.send({url: body}); } else { - res.status(resp.statusCode).send(resp.error); + res.status(resp.statusCode).send('Tinyurl error'); } }; request.post(options, callback); } + + static override get key() { + return 'tinyurl'; + } } diff --git a/package-lock.json b/package-lock.json index 3ad3bd47389..4535f25936f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@sentry/browser": "^6.16.1", "@sentry/node": "^6.16.1", "@types/file-saver": "^2.0.5", + "@types/request": "^2.48.8", "aws-sdk": "^2.1048.0", "big-integer": "^1.6.51", "body-parser": "^1.19.1", @@ -1709,6 +1710,11 @@ "@popperjs/core": "^2.9.2" } }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, "node_modules/@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", @@ -1863,6 +1869,30 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "node_modules/@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -1950,6 +1980,11 @@ "@types/node": "*" } }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, "node_modules/@types/underscore": { "version": "1.11.4", "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", @@ -16449,6 +16484,11 @@ "@popperjs/core": "^2.9.2" } }, + "@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" + }, "@types/chai": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", @@ -16603,6 +16643,29 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, + "@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "requires": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } + } + }, "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -16690,6 +16753,11 @@ "@types/node": "*" } }, + "@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, "@types/underscore": { "version": "1.11.4", "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.4.tgz", diff --git a/package.json b/package.json index 48e2a54113a..7d4ca4cac07 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@sentry/browser": "^6.16.1", "@sentry/node": "^6.16.1", "@types/file-saver": "^2.0.5", + "@types/request": "^2.48.8", "aws-sdk": "^2.1048.0", "big-integer": "^1.6.51", "body-parser": "^1.19.1",