diff --git a/.eslintrc b/.eslintrc index eef7c04d72..1d12ab0bf5 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,13 +2,24 @@ "env": { "node": true }, - "extends": ["airbnb-base", "prettier"], + "extends": [ + "airbnb-typescript/base", + "prettier" + + ], + "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 2019 + "ecmaVersion": 2019, + "project": "./tsconfig.json" }, - "plugins": ["prettier"], + "plugins": ["prettier","@typescript-eslint"], "root": true, "rules": { + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/indent": 0, + "@typescript-eslint/naming-convention": 0, + "@typescript-eslint/space-before-function-paren": 0, + "import/no-unresolved": 0, "class-methods-use-this": [0], "prettier/prettier": ["error"], "func-names": "off", @@ -28,5 +39,17 @@ } ] }, + "overrides": [ + { + // enable the rule specifically for TypeScript files + "files": ["*.ts", "*.tsx"], + "rules": { + "@typescript-eslint/explicit-module-boundary-types": ["error"], + "@typescript-eslint/indent": ["error"], + "@typescript-eslint/naming-convention": ["error"], + "@typescript-eslint/space-before-function-paren": ["error"] + } + } + ], "ignorePatterns": ["**/docs/api/oas/"] } diff --git a/.nycrc b/.nycrc new file mode 100644 index 0000000000..51e185bf56 --- /dev/null +++ b/.nycrc @@ -0,0 +1,4 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "all": true +} diff --git a/package.json b/package.json index aa1dbd2abc..8268092e6a 100644 --- a/package.json +++ b/package.json @@ -100,14 +100,18 @@ "yargs": "^16.0.3" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", "@passport-next/passport": "^3.1.0", "@passport-next/passport-google-oauth2": "^1.0.0", "@types/express": "^4.17.11", "@types/node": "^14.0.0", + "@typescript-eslint/eslint-plugin": "^4.15.2", + "@typescript-eslint/parser": "^4.15.2", "ava": "^3.7.0", "coveralls": "^3.1.0", "eslint": "^6.8.0", "eslint-config-airbnb-base": "^14.1.0", + "eslint-config-airbnb-typescript": "^12.3.1", "eslint-config-prettier": "^6.10.1", "eslint-plugin-import": "^2.20.2", "eslint-plugin-prettier": "^3.1.3", @@ -121,9 +125,11 @@ "passport-google-auth": "^1.0.2", "prettier": "^1.19.1", "proxyquire": "^2.1.3", + "source-map-support": "^0.5.19", "sinon": "^9.2.4", "superagent": "^6.1.0", "supertest": "^5.0.0", + "ts-node": "^9.1.1", "tsc-watch": "^4.2.9", "typescript": "^4.1.5" }, diff --git a/src/lib/addons/jira-comment.js b/src/lib/addons/jira-comment.js index c20d0f733f..4ae4ad6ce2 100644 --- a/src/lib/addons/jira-comment.js +++ b/src/lib/addons/jira-comment.js @@ -86,7 +86,7 @@ class JiraAddon extends Addon { content: [ { type: 'text', - text: `To see what happened visit Unleash`, + text: 'To see what happened visit Unleash', marks: [ { type: 'link', diff --git a/src/lib/app.js b/src/lib/app.ts similarity index 94% rename from src/lib/app.js rename to src/lib/app.ts index 335db93ad0..6a8f9eb9c9 100644 --- a/src/lib/app.js +++ b/src/lib/app.ts @@ -1,5 +1,3 @@ -'use strict'; - const express = require('express'); const compression = require('compression'); @@ -9,7 +7,7 @@ const path = require('path'); const errorHandler = require('errorhandler'); const IndexRouter = require('./routes'); const unleashDbSession = require('./middleware/session-db'); -const responseTime = require('./middleware/response-time'); +import { responseTimeMetrics } from './middleware/response-time-metrics'; const requestLogger = require('./middleware/request-logger'); const simpleAuthentication = require('./middleware/simple-authentication'); const noAuthentication = require('./middleware/no-authentication'); @@ -33,7 +31,7 @@ module.exports = function(config, services = {}) { app.use(cookieParser()); app.use(express.json({ strict: false })); app.use(unleashDbSession(config)); - app.use(responseTime(config)); + app.use(responseTimeMetrics(config)); app.use(requestLogger(config)); app.use(secureHeaders(config)); app.use(express.urlencoded({ extended: true })); diff --git a/src/lib/error/db-error.js b/src/lib/error/db-error.js deleted file mode 100644 index 1795f7639f..0000000000 --- a/src/lib/error/db-error.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - UNIQUE_CONSTRAINT_VIOLATION: '23505', -}; diff --git a/src/lib/error/db-error.ts b/src/lib/error/db-error.ts new file mode 100644 index 0000000000..936dc02132 --- /dev/null +++ b/src/lib/error/db-error.ts @@ -0,0 +1,3 @@ +const UNIQUE_CONSTRAINT_VIOLATION = '23505'; + +export {UNIQUE_CONSTRAINT_VIOLATION}; diff --git a/src/lib/error/feature-has-tag-error.js b/src/lib/error/feature-has-tag-error.js index 05b35d623d..720245c026 100644 --- a/src/lib/error/feature-has-tag-error.js +++ b/src/lib/error/feature-has-tag-error.js @@ -1,5 +1,3 @@ -'use strict'; - class FeatureHasTagError extends Error { constructor(message) { super(); @@ -22,5 +20,4 @@ class FeatureHasTagError extends Error { return obj; } } - module.exports = FeatureHasTagError; diff --git a/src/lib/events.js b/src/lib/events.js deleted file mode 100644 index 905b90b5af..0000000000 --- a/src/lib/events.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -module.exports = { - REQUEST_TIME: 'request_time', - DB_TIME: 'db_time', -}; diff --git a/src/lib/events.ts b/src/lib/events.ts new file mode 100644 index 0000000000..0c84c45021 --- /dev/null +++ b/src/lib/events.ts @@ -0,0 +1,4 @@ +const REQUEST_TIME = 'request_time'; +const DB_TIME = 'db_time'; + +export {REQUEST_TIME, DB_TIME}; diff --git a/src/lib/metrics.js b/src/lib/metrics.ts similarity index 93% rename from src/lib/metrics.js rename to src/lib/metrics.ts index 3bc493f40b..8b5c85acd6 100644 --- a/src/lib/metrics.js +++ b/src/lib/metrics.ts @@ -1,19 +1,19 @@ -'use strict'; - -const client = require('prom-client'); -const events = require('./events'); -const { +import client from 'prom-client'; +import * as events from './events'; +import { FEATURE_CREATED, FEATURE_UPDATED, FEATURE_ARCHIVED, FEATURE_REVIVED, DB_POOL_UPDATE, -} = require('./event-type'); +} from'./event-type'; const THREE_HOURS = 3 * 60 * 60 * 1000; const ONE_MINUTE = 60 * 1000; class MetricsMonitor { + timer: any; + constructor() { this.timer = null; } @@ -98,16 +98,15 @@ class MetricsMonitor { }); clientMetricsStore.on('metrics', m => { - // eslint-disable-next-line no-restricted-syntax - for (const [feature, { yes, no }] of Object.entries( + for (const entry of Object.entries( m.bucket.toggles, )) { featureToggleUsageTotal - .labels(feature, true, m.appName) - .inc(yes); + .labels(entry[0], 'true', m.appName) + .inc(entry[1]['yes']); featureToggleUsageTotal - .labels(feature, false, m.appName) - .inc(no); + .labels(entry[0], 'false', m.appName) + .inc(entry[1]['no']); } }); diff --git a/src/lib/middleware/response-time.js b/src/lib/middleware/response-time-metrics.ts similarity index 59% rename from src/lib/middleware/response-time.js rename to src/lib/middleware/response-time-metrics.ts index 49bcfc2d8e..c24dd18dfe 100644 --- a/src/lib/middleware/response-time.js +++ b/src/lib/middleware/response-time-metrics.ts @@ -1,10 +1,10 @@ -'use strict'; +import * as responseTime from 'response-time'; +import { REQUEST_TIME } from '../events'; -const responseTime = require('response-time'); -const { REQUEST_TIME } = require('../events'); +var _responseTime = responseTime.default -module.exports = function(config) { - return responseTime((req, res, time) => { +export function responseTimeMetrics(config) { + return _responseTime((req, res, time) => { const { statusCode } = res; const pathname = req.route ? req.baseUrl + req.route.path : '(hidden)'; diff --git a/src/lib/options.js b/src/lib/options.js index aad4ab2146..6666482be3 100644 --- a/src/lib/options.js +++ b/src/lib/options.js @@ -119,7 +119,7 @@ module.exports = { if (!options.db.host) { throw new Error( - `Unleash requires database details to start. See https://unleash.github.io/docs/getting_started`, + 'Unleash requires database details to start. See https://unleash.github.io/docs/getting_started', ); } diff --git a/src/lib/routes/admin-api/metrics.test.js b/src/lib/routes/admin-api/metrics.test.js index 7291f8ac30..47f1a311b1 100644 --- a/src/lib/routes/admin-api/metrics.test.js +++ b/src/lib/routes/admin-api/metrics.test.js @@ -124,7 +124,7 @@ test('should return applications', t => { stores.clientApplicationsStore.upsert({ appName }); return request - .get(`/api/admin/metrics/applications/`) + .get('/api/admin/metrics/applications/') .expect(200) .expect(res => { const metrics = res.body; diff --git a/src/lib/routes/admin-api/strategy.test.js b/src/lib/routes/admin-api/strategy.test.js index 1a9d9b2a62..39bb9eb46c 100644 --- a/src/lib/routes/admin-api/strategy.test.js +++ b/src/lib/routes/admin-api/strategy.test.js @@ -252,7 +252,7 @@ test('reactivating a non-existent strategy yields 404', t => { .set('Content-Type', 'application/json') .expect(404); }); -test(`deprecating 'default' strategy will yield 403`, t => { +test("deprecating 'default' strategy will yield 403", t => { t.plan(0); const { request, base, perms } = getSetup(); perms.withPermissions(UPDATE_STRATEGY); diff --git a/src/lib/routes/backstage.js b/src/lib/routes/backstage.ts similarity index 71% rename from src/lib/routes/backstage.js rename to src/lib/routes/backstage.ts index 8d6cba43b3..a3bad14005 100644 --- a/src/lib/routes/backstage.js +++ b/src/lib/routes/backstage.ts @@ -1,9 +1,9 @@ -'use strict'; - -const { register: prometheusRegister } = require('prom-client'); -const Controller = require('./controller'); +import { register as prometheusRegister } from 'prom-client'; +import Controller from './controller'; class BackstageController extends Controller { + logger: any; + constructor(config) { super(); @@ -18,4 +18,4 @@ class BackstageController extends Controller { } } -module.exports = BackstageController; +export { BackstageController }; diff --git a/src/lib/routes/index.js b/src/lib/routes/index.ts similarity index 89% rename from src/lib/routes/index.js rename to src/lib/routes/index.ts index c8b018299d..e29e5d7bf0 100644 --- a/src/lib/routes/index.js +++ b/src/lib/routes/index.ts @@ -6,7 +6,7 @@ const FeatureController = require('./client-api/feature.js'); const Controller = require('./controller'); const HealthCheckController = require('./health-check'); -const BackstageCTR = require('./backstage.js'); +import { BackstageController } from './backstage'; const LogoutController = require('./logout'); const api = require('./api-def'); @@ -14,7 +14,7 @@ class IndexRouter extends Controller { constructor(config, services) { super(); this.use('/health', new HealthCheckController(config).router); - this.use('/internal-backstage', new BackstageCTR(config).router); + this.use('/internal-backstage', new BackstageController(config).router); this.use('/logout', new LogoutController(config).router); this.get(api.uri, this.index); this.use(api.links.admin.uri, new AdminApi(config, services).router); diff --git a/src/lib/services/state-service.js b/src/lib/services/state-service.js index df26e0c3fe..bdf6589557 100644 --- a/src/lib/services/state-service.js +++ b/src/lib/services/state-service.js @@ -63,7 +63,7 @@ class StateService { : await this.toggleStore.getFeatures(); if (dropBeforeImport) { - this.logger.info(`Dropping existing feature toggles`); + this.logger.info('Dropping existing feature toggles'); await this.toggleStore.dropFeatures(); await this.eventStore.store({ type: DROP_FEATURES, @@ -100,7 +100,7 @@ class StateService { : await this.strategyStore.getStrategies(); if (dropBeforeImport) { - this.logger.info(`Dropping existing strategies`); + this.logger.info('Dropping existing strategies'); await this.strategyStore.dropStrategies(); await this.eventStore.store({ type: DROP_STRATEGIES, diff --git a/src/migrations/20190123204125-add-variants-to-features.js b/src/migrations/20190123204125-add-variants-to-features.js index 594bdc258e..f55ac57cc7 100644 --- a/src/migrations/20190123204125-add-variants-to-features.js +++ b/src/migrations/20190123204125-add-variants-to-features.js @@ -11,5 +11,5 @@ exports.up = function(db, callback) { }; exports.down = function(db, callback) { - db.runSql(`ALTER TABLE features DROP COLUMN "variants";`, callback); + db.runSql('ALTER TABLE features DROP COLUMN "variants";', callback); }; diff --git a/src/migrations/20210119084617-add-addon-table.js b/src/migrations/20210119084617-add-addon-table.js index 0b149b9760..d802d61202 100644 --- a/src/migrations/20210119084617-add-addon-table.js +++ b/src/migrations/20210119084617-add-addon-table.js @@ -16,5 +16,5 @@ exports.up = function(db, cb) { }; exports.down = function(db, cb) { - db.runSql(`DROP TABLE addons;`, cb); + db.runSql('DROP TABLE addons;', cb); }; diff --git a/src/migrations/20210121115438-add-deprecated-column-to-strategies.js b/src/migrations/20210121115438-add-deprecated-column-to-strategies.js index 313a5fc279..3f22836e74 100644 --- a/src/migrations/20210121115438-add-deprecated-column-to-strategies.js +++ b/src/migrations/20210121115438-add-deprecated-column-to-strategies.js @@ -10,7 +10,7 @@ exports.up = function(db, cb) { }; exports.down = function(db, cb) { - db.runSql(`ALTER TABLE strategies DROP COLUMN deprecated`, cb); + db.runSql('ALTER TABLE strategies DROP COLUMN deprecated', cb); }; exports._meta = { diff --git a/src/test/e2e/api/admin/addon.e2e.test.js b/src/test/e2e/api/admin/addon.e2e.test.js index ebab5d14d7..4aa10d45bc 100644 --- a/src/test/e2e/api/admin/addon.e2e.test.js +++ b/src/test/e2e/api/admin/addon.e2e.test.js @@ -146,7 +146,7 @@ test.serial('should not update with invalid addon configuration', async t => { }; await request - .put(`/api/admin/addons/1`) + .put('/api/admin/addons/1') .send(config) .expect(400); }); @@ -166,7 +166,7 @@ test.serial('should not update unknown addon configuration', async t => { }; await request - .put(`/api/admin/addons/123123`) + .put('/api/admin/addons/123123') .send(config) .expect(404); }); @@ -209,7 +209,7 @@ test.serial('should not get unknown addon configuration', async t => { t.plan(0); const request = await setupApp(stores); - await request.get(`/api/admin/addons/445`).expect(404); + await request.get('/api/admin/addons/445').expect(404); }); test.serial('should not delete unknown addon configuration', async t => { diff --git a/src/test/e2e/api/admin/feature.custom-auth.e2e.test.js b/src/test/e2e/api/admin/feature.custom-auth.e2e.test.js index e67b7b43f1..e45232de1f 100644 --- a/src/test/e2e/api/admin/feature.custom-auth.e2e.test.js +++ b/src/test/e2e/api/admin/feature.custom-auth.e2e.test.js @@ -29,7 +29,7 @@ test.serial('should require authenticated user', async t => { new AuthenticationRequired({ path: '/api/admin/login', type: 'custom', - message: `You have to identify yourself.`, + message: 'You have to identify yourself.', }), ) .end(), diff --git a/yarn.lock b/yarn.lock index 96bef06b47..12f6c7d3e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -378,6 +378,13 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" +"@istanbuljs/nyc-config-typescript@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz#55172f5663b3635586add21b14d42ca94a163d58" + integrity sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ== + dependencies: + "@istanbuljs/schema" "^0.1.2" + "@istanbuljs/schema@^0.1.2": version "0.1.2" resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz" @@ -543,6 +550,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@^7.0.3": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" @@ -591,6 +603,76 @@ "@types/mime" "^1" "@types/node" "*" +"@typescript-eslint/eslint-plugin@^4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.15.2.tgz#981b26b4076c62a5a55873fbef3fe98f83360c61" + integrity sha512-uiQQeu9tWl3f1+oK0yoAv9lt/KXO24iafxgQTkIYO/kitruILGx3uH+QtIAHqxFV+yIsdnJH+alel9KuE3J15Q== + dependencies: + "@typescript-eslint/experimental-utils" "4.15.2" + "@typescript-eslint/scope-manager" "4.15.2" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + lodash "^4.17.15" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.15.2.tgz#5efd12355bd5b535e1831282e6cf465b9a71cf36" + integrity sha512-Fxoshw8+R5X3/Vmqwsjc8nRO/7iTysRtDqx6rlfLZ7HbT8TZhPeQqbPjTyk2RheH3L8afumecTQnUc9EeXxohQ== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4.15.2", "@typescript-eslint/parser@^4.4.1": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.15.2.tgz#c804474321ef76a3955aec03664808f0d6e7872e" + integrity sha512-SHeF8xbsC6z2FKXsaTb1tBCf0QZsjJ94H6Bo51Y1aVEZ4XAefaw5ZAilMoDPlGghe+qtq7XdTiDlGfVTOmvA+Q== + dependencies: + "@typescript-eslint/scope-manager" "4.15.2" + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/typescript-estree" "4.15.2" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.15.2.tgz#5725bda656995960ae1d004bfd1cd70320f37f4f" + integrity sha512-Zm0tf/MSKuX6aeJmuXexgdVyxT9/oJJhaCkijv0DvJVT3ui4zY6XYd6iwIo/8GEZGy43cd7w1rFMiCLHbRzAPQ== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + +"@typescript-eslint/types@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.15.2.tgz#04acf3a2dc8001a88985291744241e732ef22c60" + integrity sha512-r7lW7HFkAarfUylJ2tKndyO9njwSyoy6cpfDKWPX6/ctZA+QyaYscAHXVAfJqtnY6aaTwDYrOhp+ginlbc7HfQ== + +"@typescript-eslint/typescript-estree@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.15.2.tgz#c2f7a1e94f3428d229d5ecff3ead6581ee9b62fa" + integrity sha512-cGR8C2g5SPtHTQvAymEODeqx90pJHadWsgTtx6GbnTWKqsg7yp6Eaya9nFzUd4KrKhxdYTTFBiYeTPQaz/l8bw== + dependencies: + "@typescript-eslint/types" "4.15.2" + "@typescript-eslint/visitor-keys" "4.15.2" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.15.2": + version "4.15.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.15.2.tgz#3d1c7979ce75bf6acf9691109bd0d6b5706192b9" + integrity sha512-TME1VgSb7wTwgENN5KVj4Nqg25hP8DisXxNBojM4Nn31rYaNDIocNm5cmjOFfh42n7NVERxWrDFoETO/76ePyg== + dependencies: + "@typescript-eslint/types" "4.15.2" + eslint-visitor-keys "^2.0.0" + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -720,6 +802,11 @@ archy@^1.0.0: resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" @@ -1121,6 +1208,14 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0, callsites@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" @@ -1428,6 +1523,11 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" +confusing-browser-globals@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz#30d1e7f3d1b882b25ec4933d1d1adac353d20a59" + integrity sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA== + confusing-browser-globals@^1.0.9: version "1.0.9" resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz" @@ -1548,6 +1648,11 @@ coveralls@^3.1.0: minimist "^1.2.5" request "^2.88.2" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -1837,7 +1942,7 @@ dicer@0.2.5: readable-stream "1.1.x" streamsearch "0.1.2" -diff@^4.0.2: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -2078,6 +2183,33 @@ eslint-config-airbnb-base@^14.1.0: object.assign "^4.1.0" object.entries "^1.1.2" +eslint-config-airbnb-base@^14.2.0, eslint-config-airbnb-base@^14.2.1: + version "14.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" + integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.2" + +eslint-config-airbnb-typescript@^12.3.1: + version "12.3.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-12.3.1.tgz#83ab40d76402c208eb08516260d1d6fac8f8acbc" + integrity sha512-ql/Pe6/hppYuRp4m3iPaHJqkBB7dgeEmGPQ6X0UNmrQOfTF+dXw29/ZjU2kQ6RDoLxaxOA+Xqv07Vbef6oVTWw== + dependencies: + "@typescript-eslint/parser" "^4.4.1" + eslint-config-airbnb "^18.2.0" + eslint-config-airbnb-base "^14.2.0" + +eslint-config-airbnb@^18.2.0: + version "18.2.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz#b7fe2b42f9f8173e825b73c8014b592e449c98d9" + integrity sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg== + dependencies: + eslint-config-airbnb-base "^14.2.1" + object.assign "^4.1.2" + object.entries "^1.1.2" + eslint-config-prettier@^6.10.1: version "6.11.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz" @@ -2142,11 +2274,23 @@ eslint-utils@^1.4.3: dependencies: eslint-visitor-keys "^1.1.0" +eslint-utils@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.1.0: version "1.3.0" resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== +eslint-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + eslint@^6.8.0: version "6.8.0" resolved "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz" @@ -2754,6 +2898,15 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" @@ -4037,6 +4190,11 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-iterator@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" @@ -4470,6 +4628,16 @@ object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" @@ -5249,6 +5417,11 @@ regexpp@^2.0.1: resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpp@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + registry-auth-token@^4.0.0: version "4.2.0" resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz" @@ -5682,7 +5855,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.19: +source-map-support@^0.5.17, source-map-support@^0.5.19: version "0.5.19" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -6157,6 +6330,18 @@ trim-off-newlines@^1.0.1: resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +ts-node@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tsc-watch@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-4.2.9.tgz#d93fc74233ca4ef7ee6b12d08c0fe6aca3e19044" @@ -6178,6 +6363,11 @@ tsconfig-paths@^3.9.0: minimist "^1.2.0" strip-bom "^3.0.0" +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + tslib@^1.9.0: version "1.13.0" resolved "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz" @@ -6188,6 +6378,13 @@ tsscmp@1.0.6: resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== +tsutils@^3.17.1: + version "3.20.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" + integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== + dependencies: + tslib "^1.8.1" + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" @@ -6634,3 +6831,8 @@ yargs@^16.0.3: string-width "^4.2.0" y18n "^5.0.1" yargs-parser "^20.0.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==