Add cache interface

This commit is contained in:
Alice Gaudon 2020-07-19 11:57:47 +02:00
parent e9a20c82ed
commit 197b963e4c
8 changed files with 177 additions and 88 deletions

View File

@ -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 <alice@gaudon.pro>",

View File

@ -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<any> } = {};
private readonly components: ApplicationComponent<any>[] = [];
private cacheProvider?: CacheProvider;
private ready: boolean = false;
@ -34,16 +37,21 @@ export default abstract class Application {
protected abstract async init(): Promise<void>;
protected use(thing: Controller | WebSocketListener | ApplicationComponent<any>) {
protected use(thing: Controller | WebSocketListener<this> | ApplicationComponent<any>) {
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<any> } {
return this.webSocketListeners;
}
public getCache(): CacheProvider | undefined {
return this.cacheProvider;
}
}

14
src/CacheProvider.ts Normal file
View File

@ -0,0 +1,14 @@
export default interface CacheProvider {
get(key: string, defaultValue?: string): Promise<string | null>;
has(key: string): Promise<boolean>;
forget(key: string): Promise<void>;
/**
* @param key
* @param value
* @param ttl in ms
*/
remember(key: string, value: string, ttl: number): Promise<void>;
}

View File

@ -1,7 +1,14 @@
import WebSocket from "ws";
import {IncomingMessage} from "http";
import Application from "./Application";
export default abstract class WebSocketListener<T extends Application> {
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<void>;

View File

@ -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<any> {
private static readonly connections: { [p: string]: (() => void)[] } = {};
public static refreshMagicLink(sessionID: string) {

View File

@ -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<void> {
export default class RedisComponent extends ApplicationComponent<void> implements CacheProvider {
private redisClient?: RedisClient;
private store?: Store;
@ -39,4 +40,60 @@ export default class RedisComponent extends ApplicationComponent<void> {
public canServe(): boolean {
return this.redisClient !== undefined && this.redisClient.connected;
}
public async get(key: string, defaultValue?: string): Promise<string | null> {
return new Promise<string | null>((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<boolean> {
return await this.get(key) !== null;
}
public async forget(key: string): Promise<void> {
return new Promise<void>((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<void> {
return new Promise<void>((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();
});
});
}
}

View File

@ -25,7 +25,7 @@ export default class WebSocketServerComponent extends ApplicationComponent<void>
}
public async start(app: Express): Promise<void> {
const listeners: { [p: string]: WebSocketListener } = this.application.getWebSocketListeners();
const listeners: { [p: string]: WebSocketListener<any> } = this.application.getWebSocketListeners();
this.wss = new WebSocketServer({
server: this.expressAppComponent.getServer(),
}, () => {

153
yarn.lock
View File

@ -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"