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", "name": "wms-core",
"version": "0.16.3", "version": "0.17.0",
"description": "Node web framework", "description": "Node web framework",
"repository": "git@gitlab.com:ArisuOngaku/wms-core.git", "repository": "git@gitlab.com:ArisuOngaku/wms-core.git",
"author": "Alice Gaudon <alice@gaudon.pro>", "author": "Alice Gaudon <alice@gaudon.pro>",

View File

@ -14,14 +14,17 @@ import config from "config";
import * as fs from "fs"; import * as fs from "fs";
import SecurityError from "./SecurityError"; import SecurityError from "./SecurityError";
import * as path from "path"; import * as path from "path";
import CacheProvider from "./CacheProvider";
import RedisComponent from "./components/RedisComponent";
import TemplateError = lib.TemplateError; import TemplateError = lib.TemplateError;
export default abstract class Application { export default abstract class Application {
private readonly version: string; private readonly version: string;
private readonly ignoreCommandLine: boolean; private readonly ignoreCommandLine: boolean;
private readonly controllers: Controller[] = []; private readonly controllers: Controller[] = [];
private readonly webSocketListeners: { [p: string]: WebSocketListener } = {}; private readonly webSocketListeners: { [p: string]: WebSocketListener<any> } = {};
private readonly components: ApplicationComponent<any>[] = []; private readonly components: ApplicationComponent<any>[] = [];
private cacheProvider?: CacheProvider;
private ready: boolean = false; private ready: boolean = false;
@ -34,16 +37,21 @@ export default abstract class Application {
protected abstract async init(): Promise<void>; 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) { if (thing instanceof Controller) {
this.controllers.push(thing); this.controllers.push(thing);
} else if (thing instanceof WebSocketListener) { } else if (thing instanceof WebSocketListener) {
const path = thing.path(); const path = thing.path();
this.webSocketListeners[path] = thing; this.webSocketListeners[path] = thing;
thing.init(this);
Logger.info(`Added websocket listener on ${path}`); Logger.info(`Added websocket listener on ${path}`);
} else { } else {
thing.setApp(this); thing.setApp(this);
this.components.push(thing); 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 { public isReady(): boolean {
return this.ready; return this.ready;
} }
@ -242,4 +246,12 @@ export default abstract class Application {
public getVersion(): string { public getVersion(): string {
return this.version; 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 WebSocket from "ws";
import {IncomingMessage} from "http"; 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 path(): string;
public abstract async handle(socket: WebSocket, request: IncomingMessage, session: Express.SessionData): Promise<void>; 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 WebSocketListener from "../../WebSocketListener";
import MagicLink from "../models/MagicLink"; 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)[] } = {}; private static readonly connections: { [p: string]: (() => void)[] } = {};
public static refreshMagicLink(sessionID: string) { public static refreshMagicLink(sessionID: string) {

View File

@ -5,10 +5,11 @@ import config from "config";
import Logger from "../Logger"; import Logger from "../Logger";
import session, {Store} from "express-session"; import session, {Store} from "express-session";
import connect_redis from "connect-redis"; import connect_redis from "connect-redis";
import CacheProvider from "../CacheProvider";
const RedisStore = connect_redis(session); 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 redisClient?: RedisClient;
private store?: Store; private store?: Store;
@ -39,4 +40,60 @@ export default class RedisComponent extends ApplicationComponent<void> {
public canServe(): boolean { public canServe(): boolean {
return this.redisClient !== undefined && this.redisClient.connected; 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> { 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({ this.wss = new WebSocketServer({
server: this.expressAppComponent.getServer(), server: this.expressAppComponent.getServer(),
}, () => { }, () => {

153
yarn.lock
View File

@ -10,35 +10,34 @@
"@babel/highlight" "^7.10.4" "@babel/highlight" "^7.10.4"
"@babel/core@^7.1.0", "@babel/core@^7.7.5": "@babel/core@^7.1.0", "@babel/core@^7.7.5":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fcore/-/core-7.10.4.tgz#780e8b83e496152f8dd7df63892b2e052bf1d51d" resolved "https://registry.toot.party/@babel%2fcore/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330"
integrity sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA== integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==
dependencies: dependencies:
"@babel/code-frame" "^7.10.4" "@babel/code-frame" "^7.10.4"
"@babel/generator" "^7.10.4" "@babel/generator" "^7.10.5"
"@babel/helper-module-transforms" "^7.10.4" "@babel/helper-module-transforms" "^7.10.5"
"@babel/helpers" "^7.10.4" "@babel/helpers" "^7.10.4"
"@babel/parser" "^7.10.4" "@babel/parser" "^7.10.5"
"@babel/template" "^7.10.4" "@babel/template" "^7.10.4"
"@babel/traverse" "^7.10.4" "@babel/traverse" "^7.10.5"
"@babel/types" "^7.10.4" "@babel/types" "^7.10.5"
convert-source-map "^1.7.0" convert-source-map "^1.7.0"
debug "^4.1.0" debug "^4.1.0"
gensync "^1.0.0-beta.1" gensync "^1.0.0-beta.1"
json5 "^2.1.2" json5 "^2.1.2"
lodash "^4.17.13" lodash "^4.17.19"
resolve "^1.3.2" resolve "^1.3.2"
semver "^5.4.1" semver "^5.4.1"
source-map "^0.5.0" source-map "^0.5.0"
"@babel/generator@^7.10.4": "@babel/generator@^7.10.5":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fgenerator/-/generator-7.10.4.tgz#e49eeed9fe114b62fa5b181856a43a5e32f5f243" resolved "https://registry.toot.party/@babel%2fgenerator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
integrity sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng== integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
dependencies: dependencies:
"@babel/types" "^7.10.4" "@babel/types" "^7.10.5"
jsesc "^2.5.1" jsesc "^2.5.1"
lodash "^4.17.13"
source-map "^0.5.0" source-map "^0.5.0"
"@babel/helper-function-name@^7.10.4": "@babel/helper-function-name@^7.10.4":
@ -58,11 +57,11 @@
"@babel/types" "^7.10.4" "@babel/types" "^7.10.4"
"@babel/helper-member-expression-to-functions@^7.10.4": "@babel/helper-member-expression-to-functions@^7.10.4":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fhelper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz#7cd04b57dfcf82fce9aeae7d4e4452fa31b8c7c4" resolved "https://registry.toot.party/@babel%2fhelper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee"
integrity sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A== integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==
dependencies: dependencies:
"@babel/types" "^7.10.4" "@babel/types" "^7.10.5"
"@babel/helper-module-imports@^7.10.4": "@babel/helper-module-imports@^7.10.4":
version "7.10.4" version "7.10.4"
@ -71,18 +70,18 @@
dependencies: dependencies:
"@babel/types" "^7.10.4" "@babel/types" "^7.10.4"
"@babel/helper-module-transforms@^7.10.4": "@babel/helper-module-transforms@^7.10.5":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.10.4.tgz#ca1f01fdb84e48c24d7506bb818c961f1da8805d" resolved "https://registry.toot.party/@babel%2fhelper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6"
integrity sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q== integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==
dependencies: dependencies:
"@babel/helper-module-imports" "^7.10.4" "@babel/helper-module-imports" "^7.10.4"
"@babel/helper-replace-supers" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4"
"@babel/helper-simple-access" "^7.10.4" "@babel/helper-simple-access" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4"
"@babel/template" "^7.10.4" "@babel/template" "^7.10.4"
"@babel/types" "^7.10.4" "@babel/types" "^7.10.5"
lodash "^4.17.13" lodash "^4.17.19"
"@babel/helper-optimise-call-expression@^7.10.4": "@babel/helper-optimise-call-expression@^7.10.4":
version "7.10.4" version "7.10.4"
@ -144,10 +143,10 @@
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.10.4": "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fparser/-/parser-7.10.4.tgz#9eedf27e1998d87739fb5028a5120557c06a1a64" resolved "https://registry.toot.party/@babel%2fparser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b"
integrity sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA== integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==
"@babel/plugin-syntax-async-generators@^7.8.4": "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4" version "7.8.4"
@ -227,9 +226,9 @@
"@babel/helper-plugin-utils" "^7.8.0" "@babel/helper-plugin-utils" "^7.8.0"
"@babel/runtime@^7.8.7": "@babel/runtime@^7.8.7":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2fruntime/-/runtime-7.10.4.tgz#a6724f1a6b8d2f6ea5236dbfe58c7d7ea9c5eb99" resolved "https://registry.toot.party/@babel%2fruntime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
integrity sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw== integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -242,28 +241,28 @@
"@babel/parser" "^7.10.4" "@babel/parser" "^7.10.4"
"@babel/types" "^7.10.4" "@babel/types" "^7.10.4"
"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4": "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5":
version "7.10.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2ftraverse/-/traverse-7.10.4.tgz#e642e5395a3b09cc95c8e74a27432b484b697818" resolved "https://registry.toot.party/@babel%2ftraverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564"
integrity sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q== integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==
dependencies: dependencies:
"@babel/code-frame" "^7.10.4" "@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-function-name" "^7.10.4"
"@babel/helper-split-export-declaration" "^7.10.4" "@babel/helper-split-export-declaration" "^7.10.4"
"@babel/parser" "^7.10.4" "@babel/parser" "^7.10.5"
"@babel/types" "^7.10.4" "@babel/types" "^7.10.5"
debug "^4.1.0" debug "^4.1.0"
globals "^11.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": "@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.4" version "7.10.5"
resolved "https://registry.toot.party/@babel%2ftypes/-/types-7.10.4.tgz#369517188352e18219981efd156bfdb199fff1ee" resolved "https://registry.toot.party/@babel%2ftypes/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
integrity sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg== integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
dependencies: dependencies:
"@babel/helper-validator-identifier" "^7.10.4" "@babel/helper-validator-identifier" "^7.10.4"
lodash "^4.17.13" lodash "^4.17.19"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3": "@bcoe/v8-coverage@^0.2.3":
@ -479,9 +478,9 @@
safe-buffer "^5.1.2" safe-buffer "^5.1.2"
"@sinonjs/commons@^1.7.0": "@sinonjs/commons@^1.7.0":
version "1.8.0" version "1.8.1"
resolved "https://registry.toot.party/@sinonjs%2fcommons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" resolved "https://registry.toot.party/@sinonjs%2fcommons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q== integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==
dependencies: dependencies:
type-detect "4.0.8" type-detect "4.0.8"
@ -666,9 +665,9 @@
"@types/istanbul-lib-report" "*" "@types/istanbul-lib-report" "*"
"@types/jest@^26.0.4": "@types/jest@^26.0.4":
version "26.0.4" version "26.0.5"
resolved "https://registry.toot.party/@types%2fjest/-/jest-26.0.4.tgz#d2e513e85aca16992816f192582b5e67b0b15efb" resolved "https://registry.toot.party/@types%2fjest/-/jest-26.0.5.tgz#23a8eecf4764a770ea8d3a0d1ea16b96c822035d"
integrity sha512-4fQNItvelbNA9+sFgU+fhJo8ZFF+AS4Egk3GWwCW2jFtViukXbnztccafAdLhzE/0EiCogljtQQXP8aQ9J7sFg== integrity sha512-heU+7w8snfwfjtcj2H458aTx3m5unIToOJhx75ebHilBiiQ39OIdA18WkG4LP08YKeAoWAGvWg8s+22w/PeJ6w==
dependencies: dependencies:
jest-diff "^25.2.1" jest-diff "^25.2.1"
pretty-format "^25.2.1" pretty-format "^25.2.1"
@ -684,9 +683,9 @@
integrity sha512-4PhI6iZ1zGXZ9X9W0bbmI7mS2xdxITURueqSWJ/cTeS5+tbAtOUDG1ww/fPbfcffWwR4NeOjyNcZiczafH/yfw== integrity sha512-4PhI6iZ1zGXZ9X9W0bbmI7mS2xdxITURueqSWJ/cTeS5+tbAtOUDG1ww/fPbfcffWwR4NeOjyNcZiczafH/yfw==
"@types/mysql@^2.15.10": "@types/mysql@^2.15.10":
version "2.15.14" version "2.15.15"
resolved "https://registry.toot.party/@types%2fmysql/-/mysql-2.15.14.tgz#df60e7b5f531662a8758e74b7685bed2b0ef1835" resolved "https://registry.toot.party/@types%2fmysql/-/mysql-2.15.15.tgz#af2223d2841091a5a819eabee6dff19567f1cf1f"
integrity sha512-YyNcxZZ4qlb9v41lu8Qfo+quX8eUqz4mr/6Nx7sclc2pUemOvjU7xrpuVave0/sR/VdtDPTXZOWQLC/kthxrHg== integrity sha512-1GJnq7RwuFPRicMHdT53vza5v39nep9OKIbozxNUpFXP04CydcdWrqpZQ+MlVdlLFCisWnnt09xughajjWpFsw==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
@ -699,9 +698,9 @@
form-data "^3.0.0" form-data "^3.0.0"
"@types/node@*": "@types/node@*":
version "14.0.22" version "14.0.23"
resolved "https://registry.toot.party/@types%2fnode/-/node-14.0.22.tgz#23ea4d88189cec7d58f9e6b66f786b215eb61bdc" resolved "https://registry.toot.party/@types%2fnode/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806"
integrity sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g== integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==
"@types/nodemailer@^6.4.0": "@types/nodemailer@^6.4.0":
version "6.4.0" version "6.4.0"
@ -1362,9 +1361,9 @@ cheerio@^0.22.0:
lodash.some "^4.4.0" lodash.some "^4.4.0"
chokidar@^3.0.0, chokidar@^3.3.0: chokidar@^3.0.0, chokidar@^3.3.0:
version "3.4.0" version "3.4.1"
resolved "https://registry.toot.party/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" resolved "https://registry.toot.party/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
dependencies: dependencies:
anymatch "~3.1.1" anymatch "~3.1.1"
braces "~3.0.2" braces "~3.0.2"
@ -3298,7 +3297,7 @@ jest-snapshot@^26.1.0:
pretty-format "^26.1.0" pretty-format "^26.1.0"
semver "^7.3.2" semver "^7.3.2"
jest-util@^26.1.0: jest-util@26.x, jest-util@^26.1.0:
version "26.1.0" version "26.1.0"
resolved "https://registry.toot.party/jest-util/-/jest-util-26.1.0.tgz#80e85d4ba820decacf41a691c2042d5276e5d8d8" resolved "https://registry.toot.party/jest-util/-/jest-util-26.1.0.tgz#80e85d4ba820decacf41a691c2042d5276e5d8d8"
integrity sha512-rNMOwFQevljfNGvbzNQAxdmXQ+NawW/J72dmddsK0E8vgxXCMtwQ/EH0BiWEIxh0hhMcTsxwAxINt7Lh46Uzbg== 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" resolved "https://registry.toot.party/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= 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" version "4.17.19"
resolved "https://registry.toot.party/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" resolved "https://registry.toot.party/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== 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" resolved "https://registry.toot.party/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 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: micromatch@^3.1.4:
version "3.1.10" version "3.1.10"
resolved "https://registry.toot.party/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" resolved "https://registry.toot.party/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@ -3748,6 +3739,14 @@ micromatch@^3.1.4:
snapdragon "^0.8.1" snapdragon "^0.8.1"
to-regex "^3.0.2" 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": mime-db@1.44.0, "mime-db@>= 1.43.0 < 2":
version "1.44.0" version "1.44.0"
resolved "https://registry.toot.party/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 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" punycode "^2.1.1"
ts-jest@^26.1.1: ts-jest@^26.1.1:
version "26.1.1" version "26.1.3"
resolved "https://registry.toot.party/ts-jest/-/ts-jest-26.1.1.tgz#b98569b8a4d4025d966b3d40c81986dd1c510f8d" resolved "https://registry.toot.party/ts-jest/-/ts-jest-26.1.3.tgz#aac928a05fdf13e3e6dfbc8caec3847442667894"
integrity sha512-Lk/357quLg5jJFyBQLnSbhycnB3FPe+e9i7ahxokyXxAYoB0q1pPmqxxRPYr4smJic1Rjcf7MXDBhZWgxlli0A== integrity sha512-beUTSvuqR9SmKQEylewqJdnXWMVGJRFqSz2M8wKJe7GBMmLZ5zw6XXKSJckbHNMxn+zdB3guN2eOucSw2gBMnw==
dependencies: dependencies:
bs-logger "0.x" bs-logger "0.x"
buffer-from "1.x" buffer-from "1.x"
fast-json-stable-stringify "2.x" fast-json-stable-stringify "2.x"
jest-util "26.x"
json5 "2.x" json5 "2.x"
lodash.memoize "4.x" lodash.memoize "4.x"
make-error "1.x" make-error "1.x"
micromatch "4.x"
mkdirp "1.x" mkdirp "1.x"
semver "7.x" semver "7.x"
yargs-parser "18.x" yargs-parser "18.x"
@ -5715,9 +5714,9 @@ typedarray-to-buffer@^3.1.5:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript@^3.8.3: typescript@^3.8.3:
version "3.9.6" version "3.9.7"
resolved "https://registry.toot.party/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" resolved "https://registry.toot.party/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
uglify-js@3.4.x: uglify-js@3.4.x:
version "3.4.10" version "3.4.10"