From 197b963e4c569cdfd3cab863cda48345f79d49a2 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Sun, 19 Jul 2020 11:57:47 +0200 Subject: [PATCH] Add cache interface --- package.json | 2 +- src/Application.ts | 24 ++- src/CacheProvider.ts | 14 ++ src/WebSocketListener.ts | 9 +- .../magic_link/MagicLinkWebSocketListener.ts | 2 +- src/components/RedisComponent.ts | 59 ++++++- src/components/WebSocketServerComponent.ts | 2 +- yarn.lock | 153 +++++++++--------- 8 files changed, 177 insertions(+), 88 deletions(-) create mode 100644 src/CacheProvider.ts diff --git a/package.json b/package.json index 935102d..0c73943 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wms-core", - "version": "0.16.3", + "version": "0.17.0", "description": "Node web framework", "repository": "git@gitlab.com:ArisuOngaku/wms-core.git", "author": "Alice Gaudon ", diff --git a/src/Application.ts b/src/Application.ts index 889ef73..bfa586f 100644 --- a/src/Application.ts +++ b/src/Application.ts @@ -14,14 +14,17 @@ import config from "config"; import * as fs from "fs"; import SecurityError from "./SecurityError"; import * as path from "path"; +import CacheProvider from "./CacheProvider"; +import RedisComponent from "./components/RedisComponent"; import TemplateError = lib.TemplateError; export default abstract class Application { private readonly version: string; private readonly ignoreCommandLine: boolean; private readonly controllers: Controller[] = []; - private readonly webSocketListeners: { [p: string]: WebSocketListener } = {}; + private readonly webSocketListeners: { [p: string]: WebSocketListener } = {}; private readonly components: ApplicationComponent[] = []; + private cacheProvider?: CacheProvider; private ready: boolean = false; @@ -34,16 +37,21 @@ export default abstract class Application { protected abstract async init(): Promise; - protected use(thing: Controller | WebSocketListener | ApplicationComponent) { + protected use(thing: Controller | WebSocketListener | ApplicationComponent) { if (thing instanceof Controller) { this.controllers.push(thing); } else if (thing instanceof WebSocketListener) { const path = thing.path(); this.webSocketListeners[path] = thing; + thing.init(this); Logger.info(`Added websocket listener on ${path}`); } else { thing.setApp(this); this.components.push(thing); + + if (thing instanceof RedisComponent) { + this.cacheProvider = thing; + } } } @@ -231,10 +239,6 @@ export default abstract class Application { }); } - public getWebSocketListeners(): { [p: string]: WebSocketListener } { - return this.webSocketListeners; - } - public isReady(): boolean { return this.ready; } @@ -242,4 +246,12 @@ export default abstract class Application { public getVersion(): string { return this.version; } + + public getWebSocketListeners(): { [p: string]: WebSocketListener } { + return this.webSocketListeners; + } + + public getCache(): CacheProvider | undefined { + return this.cacheProvider; + } } \ No newline at end of file diff --git a/src/CacheProvider.ts b/src/CacheProvider.ts new file mode 100644 index 0000000..fad5b74 --- /dev/null +++ b/src/CacheProvider.ts @@ -0,0 +1,14 @@ +export default interface CacheProvider { + get(key: string, defaultValue?: string): Promise; + + has(key: string): Promise; + + forget(key: string): Promise; + + /** + * @param key + * @param value + * @param ttl in ms + */ + remember(key: string, value: string, ttl: number): Promise; +} \ No newline at end of file diff --git a/src/WebSocketListener.ts b/src/WebSocketListener.ts index abe1ef9..c80b419 100644 --- a/src/WebSocketListener.ts +++ b/src/WebSocketListener.ts @@ -1,7 +1,14 @@ import WebSocket from "ws"; import {IncomingMessage} from "http"; +import Application from "./Application"; + +export default abstract class WebSocketListener { + private app!: T; + + public init(app: T): void { + this.app = app; + } -export default abstract class WebSocketListener { public abstract path(): string; public abstract async handle(socket: WebSocket, request: IncomingMessage, session: Express.SessionData): Promise; diff --git a/src/auth/magic_link/MagicLinkWebSocketListener.ts b/src/auth/magic_link/MagicLinkWebSocketListener.ts index beb7fa9..22aa198 100644 --- a/src/auth/magic_link/MagicLinkWebSocketListener.ts +++ b/src/auth/magic_link/MagicLinkWebSocketListener.ts @@ -3,7 +3,7 @@ import {IncomingMessage} from "http"; import WebSocketListener from "../../WebSocketListener"; import MagicLink from "../models/MagicLink"; -export default class MagicLinkWebSocketListener extends WebSocketListener { +export default class MagicLinkWebSocketListener extends WebSocketListener { private static readonly connections: { [p: string]: (() => void)[] } = {}; public static refreshMagicLink(sessionID: string) { diff --git a/src/components/RedisComponent.ts b/src/components/RedisComponent.ts index 1523267..c8594e0 100644 --- a/src/components/RedisComponent.ts +++ b/src/components/RedisComponent.ts @@ -5,10 +5,11 @@ import config from "config"; import Logger from "../Logger"; import session, {Store} from "express-session"; import connect_redis from "connect-redis"; +import CacheProvider from "../CacheProvider"; const RedisStore = connect_redis(session); -export default class RedisComponent extends ApplicationComponent { +export default class RedisComponent extends ApplicationComponent implements CacheProvider { private redisClient?: RedisClient; private store?: Store; @@ -39,4 +40,60 @@ export default class RedisComponent extends ApplicationComponent { public canServe(): boolean { return this.redisClient !== undefined && this.redisClient.connected; } + + public async get(key: string, defaultValue?: string): Promise { + return new Promise((resolve, reject) => { + if (!this.redisClient) { + reject(`Redis store was not initialized.`); + return; + } + + this.redisClient.get(key, (err, val) => { + if (err) { + reject(err); + return; + } + resolve(val !== null ? val : (defaultValue !== undefined ? defaultValue : null)); + }); + }); + } + + public async has(key: string): Promise { + return await this.get(key) !== null; + } + + public async forget(key: string): Promise { + return new Promise((resolve, reject) => { + if (!this.redisClient) { + reject(`Redis store was not initialized.`); + return; + } + + this.redisClient.del(key, (err) => { + if (err) { + reject(err); + return; + } + + resolve(); + }); + }); + } + + public async remember(key: string, value: string, ttl: number): Promise { + return new Promise((resolve, reject) => { + if (!this.redisClient) { + reject(`Redis store was not initialized.`); + return; + } + + this.redisClient.psetex(key, ttl, value, (err) => { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + } } \ No newline at end of file diff --git a/src/components/WebSocketServerComponent.ts b/src/components/WebSocketServerComponent.ts index 92b7940..52d22b0 100644 --- a/src/components/WebSocketServerComponent.ts +++ b/src/components/WebSocketServerComponent.ts @@ -25,7 +25,7 @@ export default class WebSocketServerComponent extends ApplicationComponent } public async start(app: Express): Promise { - const listeners: { [p: string]: WebSocketListener } = this.application.getWebSocketListeners(); + const listeners: { [p: string]: WebSocketListener } = this.application.getWebSocketListeners(); this.wss = new WebSocketServer({ server: this.expressAppComponent.getServer(), }, () => { diff --git a/yarn.lock b/yarn.lock index dfd74ed..4d8e335 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,35 +10,34 @@ "@babel/highlight" "^7.10.4" "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fcore/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" - integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fcore/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330" + integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.4" - "@babel/helper-module-transforms" "^7.10.4" + "@babel/generator" "^7.10.5" + "@babel/helper-module-transforms" "^7.10.5" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.10.4" + "@babel/parser" "^7.10.5" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/traverse" "^7.10.5" + "@babel/types" "^7.10.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" json5 "^2.1.2" - lodash "^4.17.13" + lodash "^4.17.19" resolve "^1.3.2" semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.4": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fgenerator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" - integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== +"@babel/generator@^7.10.5": + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fgenerator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" + integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.10.5" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" "@babel/helper-function-name@^7.10.4": @@ -58,11 +57,11 @@ "@babel/types" "^7.10.4" "@babel/helper-member-expression-to-functions@^7.10.4": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fhelper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" - integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fhelper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee" + integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.10.5" "@babel/helper-module-imports@^7.10.4": version "7.10.4" @@ -71,18 +70,18 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.10.4": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" - integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== +"@babel/helper-module-transforms@^7.10.5": + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6" + integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA== dependencies: "@babel/helper-module-imports" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-simple-access" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" "@babel/template" "^7.10.4" - "@babel/types" "^7.10.4" - lodash "^4.17.13" + "@babel/types" "^7.10.5" + lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": version "7.10.4" @@ -144,10 +143,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.10.4": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fparser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" - integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5": + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fparser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" + integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -227,9 +226,9 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/runtime@^7.8.7": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2fruntime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" - integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== + version "7.10.5" + resolved "https://registry.toot.party/@babel%2fruntime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c" + integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg== dependencies: regenerator-runtime "^0.13.4" @@ -242,28 +241,28 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2ftraverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" - integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5": + version "7.10.5" + resolved "https://registry.toot.party/@babel%2ftraverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" + integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.4" + "@babel/generator" "^7.10.5" "@babel/helper-function-name" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/parser" "^7.10.5" + "@babel/types" "^7.10.5" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" + lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.10.4" - resolved "https://registry.toot.party/@babel%2ftypes/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" - integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.10.5" + resolved "https://registry.toot.party/@babel%2ftypes/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" + integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== dependencies: "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.13" + lodash "^4.17.19" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -479,9 +478,9 @@ safe-buffer "^5.1.2" "@sinonjs/commons@^1.7.0": - version "1.8.0" - resolved "https://registry.toot.party/@sinonjs%2fcommons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" - integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== + version "1.8.1" + resolved "https://registry.toot.party/@sinonjs%2fcommons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== dependencies: type-detect "4.0.8" @@ -666,9 +665,9 @@ "@types/istanbul-lib-report" "*" "@types/jest@^26.0.4": - version "26.0.4" - resolved "https://registry.toot.party/@types%2fjest/-/jest-26.0.4.tgz#d2e513e85aca16992816f192582b5e67b0b15efb" - integrity sha512-4fQNItvelbNA9+sFgU+fhJo8ZFF+AS4Egk3GWwCW2jFtViukXbnztccafAdLhzE/0EiCogljtQQXP8aQ9J7sFg== + version "26.0.5" + resolved "https://registry.toot.party/@types%2fjest/-/jest-26.0.5.tgz#23a8eecf4764a770ea8d3a0d1ea16b96c822035d" + integrity sha512-heU+7w8snfwfjtcj2H458aTx3m5unIToOJhx75ebHilBiiQ39OIdA18WkG4LP08YKeAoWAGvWg8s+22w/PeJ6w== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -684,9 +683,9 @@ integrity sha512-4PhI6iZ1zGXZ9X9W0bbmI7mS2xdxITURueqSWJ/cTeS5+tbAtOUDG1ww/fPbfcffWwR4NeOjyNcZiczafH/yfw== "@types/mysql@^2.15.10": - version "2.15.14" - resolved "https://registry.toot.party/@types%2fmysql/-/mysql-2.15.14.tgz#df60e7b5f531662a8758e74b7685bed2b0ef1835" - integrity sha512-YyNcxZZ4qlb9v41lu8Qfo+quX8eUqz4mr/6Nx7sclc2pUemOvjU7xrpuVave0/sR/VdtDPTXZOWQLC/kthxrHg== + version "2.15.15" + resolved "https://registry.toot.party/@types%2fmysql/-/mysql-2.15.15.tgz#af2223d2841091a5a819eabee6dff19567f1cf1f" + integrity sha512-1GJnq7RwuFPRicMHdT53vza5v39nep9OKIbozxNUpFXP04CydcdWrqpZQ+MlVdlLFCisWnnt09xughajjWpFsw== dependencies: "@types/node" "*" @@ -699,9 +698,9 @@ form-data "^3.0.0" "@types/node@*": - version "14.0.22" - resolved "https://registry.toot.party/@types%2fnode/-/node-14.0.22.tgz#23ea4d88189cec7d58f9e6b66f786b215eb61bdc" - integrity sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g== + version "14.0.23" + resolved "https://registry.toot.party/@types%2fnode/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" + integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== "@types/nodemailer@^6.4.0": version "6.4.0" @@ -1362,9 +1361,9 @@ cheerio@^0.22.0: lodash.some "^4.4.0" chokidar@^3.0.0, chokidar@^3.3.0: - version "3.4.0" - resolved "https://registry.toot.party/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" - integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + version "3.4.1" + resolved "https://registry.toot.party/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" + integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -3298,7 +3297,7 @@ jest-snapshot@^26.1.0: pretty-format "^26.1.0" semver "^7.3.2" -jest-util@^26.1.0: +jest-util@26.x, jest-util@^26.1.0: version "26.1.0" resolved "https://registry.toot.party/jest-util/-/jest-util-26.1.0.tgz#80e85d4ba820decacf41a691c2042d5276e5d8d8" integrity sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg== @@ -3613,7 +3612,7 @@ lodash.unescape@^4.0.1: resolved "https://registry.toot.party/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= -lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: version "4.17.19" resolved "https://registry.toot.party/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -3721,14 +3720,6 @@ methods@~1.1.2: resolved "https://registry.toot.party/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@4.x, micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.toot.party/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - micromatch@^3.1.4: version "3.1.10" resolved "https://registry.toot.party/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3748,6 +3739,14 @@ micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.toot.party/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": version "1.44.0" resolved "https://registry.toot.party/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" @@ -5634,17 +5633,17 @@ tr46@^2.0.2: punycode "^2.1.1" ts-jest@^26.1.1: - version "26.1.1" - resolved "https://registry.toot.party/ts-jest/-/ts-jest-26.1.1.tgz#b98569b8a4d4025d966b3d40c81986dd1c510f8d" - integrity sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A== + version "26.1.3" + resolved "https://registry.toot.party/ts-jest/-/ts-jest-26.1.3.tgz#aac928a05fdf13e3e6dfbc8caec3847442667894" + integrity sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw== dependencies: bs-logger "0.x" buffer-from "1.x" fast-json-stable-stringify "2.x" + jest-util "26.x" json5 "2.x" lodash.memoize "4.x" make-error "1.x" - micromatch "4.x" mkdirp "1.x" semver "7.x" yargs-parser "18.x" @@ -5715,9 +5714,9 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^3.8.3: - version "3.9.6" - resolved "https://registry.toot.party/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" - integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== + version "3.9.7" + resolved "https://registry.toot.party/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" + integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== uglify-js@3.4.x: version "3.4.10"