From 6a195be814a9b97438f74b5f3ce00a170fc62593 Mon Sep 17 00:00:00 2001 From: Alexis Faizeau Date: Mon, 8 Nov 2021 17:44:44 +0100 Subject: [PATCH] Implement logger on back --- back/package.json | 3 +- back/server.ts | 13 +- back/src/Model/GameRoom.ts | 11 +- back/src/RoomManager.ts | 41 ++--- back/src/Server/server/formdata.ts | 3 +- back/src/Services/CpuTracker.ts | 13 +- back/src/Services/Logger.ts | 16 ++ back/src/Services/MapFetcher.ts | 3 +- back/src/Services/MessageHelpers.ts | 11 +- back/src/Services/RedisClient.ts | 3 +- .../Repository/VariablesRepository.ts | 3 +- back/src/Services/SocketManager.ts | 35 ++-- back/src/Services/VariablesManager.ts | 5 +- back/tsconfig.json | 2 +- back/yarn.lock | 164 +++++++++++++++++- package.json | 3 +- yarn.lock | 7 +- 17 files changed, 260 insertions(+), 76 deletions(-) create mode 100644 back/src/Services/Logger.ts diff --git a/back/package.json b/back/package.json index aacd0c96..817295ce 100644 --- a/back/package.json +++ b/back/package.json @@ -55,7 +55,8 @@ "query-string": "^6.13.3", "redis": "^3.1.2", "uWebSockets.js": "uNetworking/uWebSockets.js#v18.5.0", - "uuidv4": "^6.0.7" + "uuidv4": "^6.0.7", + "winston": "^3.3.3" }, "devDependencies": { "@types/busboy": "^0.2.3", diff --git a/back/server.ts b/back/server.ts index 8d761719..1026bc3e 100644 --- a/back/server.ts +++ b/back/server.ts @@ -1,15 +1,16 @@ // lib/server.ts import App from "./src/App"; import grpc from "grpc"; -import {roomManager} from "./src/RoomManager"; -import {IRoomManagerServer, RoomManagerService} from "./src/Messages/generated/messages_grpc_pb"; -import {HTTP_PORT, GRPC_PORT} from "./src/Enum/EnvironmentVariable"; +import { roomManager } from "./src/RoomManager"; +import { IRoomManagerServer, RoomManagerService } from "./src/Messages/generated/messages_grpc_pb"; +import { HTTP_PORT, GRPC_PORT } from "./src/Enum/EnvironmentVariable"; +import log from "./src/Services/Logger"; -App.listen(HTTP_PORT, () => console.log(`WorkAdventure HTTP API starting on port %d!`, HTTP_PORT)) +App.listen(HTTP_PORT, () => log.info(`WorkAdventure HTTP API starting on port %d!`, HTTP_PORT)); const server = new grpc.Server(); server.addService(RoomManagerService, roomManager); -server.bind('0.0.0.0:'+GRPC_PORT, grpc.ServerCredentials.createInsecure()); +server.bind("0.0.0.0:" + GRPC_PORT, grpc.ServerCredentials.createInsecure()); server.start(); -console.log('WorkAdventure HTTP/2 API starting on port %d!', GRPC_PORT); +log.info("WorkAdventure HTTP/2 API starting on port %d!", GRPC_PORT); diff --git a/back/src/Model/GameRoom.ts b/back/src/Model/GameRoom.ts index bd3e6971..a5af7732 100644 --- a/back/src/Model/GameRoom.ts +++ b/back/src/Model/GameRoom.ts @@ -26,6 +26,7 @@ import { VariablesManager } from "../Services/VariablesManager"; import { ADMIN_API_URL } from "../Enum/EnvironmentVariable"; import { LocalUrlError } from "../Services/LocalUrlError"; import { emitErrorOnRoomSocket } from "../Services/MessageHelpers"; +import log from "../Services/Logger"; export type ConnectCallback = (user: User, group: Group) => void; export type DisconnectCallback = (user: User, group: Group) => void; @@ -151,7 +152,7 @@ export class GameRoom { public leave(user: User) { const userObj = this.users.get(user.id); if (userObj === undefined) { - console.warn("User ", user.id, "does not belong to this game room! It should!"); + log.warn("User ", user.id, "does not belong to this game room! It should!"); } if (userObj !== undefined && typeof userObj.group !== "undefined") { this.leaveGroup(userObj); @@ -411,7 +412,7 @@ export class GameRoom { const match = /\/_\/[^/]+\/(.+)/.exec(roomUrlObj.pathname); if (!match) { - console.error("Unexpected room URL", roomUrl); + log.error("Unexpected room URL", roomUrl); throw new Error('Unexpected room URL "' + roomUrl + '"'); } @@ -427,7 +428,7 @@ export class GameRoom { const result = await adminApi.fetchMapDetails(roomUrl); if (!isMapDetailsData(result)) { - console.error("Unexpected room details received from server", result); + log.error("Unexpected room details received from server", result); throw new Error("Unexpected room details received from server"); } return result; @@ -484,7 +485,9 @@ export class GameRoom { for (const roomListener of this.roomListeners) { emitErrorOnRoomSocket( roomListener, - "Your map '"+this.mapUrl+"' does not seem accessible from the WorkAdventure servers. Is it behind a firewall or a proxy? Your map should be accessible from the WorkAdventure servers. If you use the scripting API in this map, please be aware that server-side checks and variable persistence is disabled." + "Your map '" + + this.mapUrl + + "' does not seem accessible from the WorkAdventure servers. Is it behind a firewall or a proxy? Your map should be accessible from the WorkAdventure servers. If you use the scripting API in this map, please be aware that server-side checks and variable persistence is disabled." ); } }, 1000); diff --git a/back/src/RoomManager.ts b/back/src/RoomManager.ts index 8dbde018..65a71e02 100644 --- a/back/src/RoomManager.ts +++ b/back/src/RoomManager.ts @@ -31,6 +31,7 @@ import { User, UserSocket } from "./Model/User"; import { GameRoom } from "./Model/GameRoom"; import Debug from "debug"; import { Admin } from "./Model/Admin"; +import log from "./Services/Logger"; const debug = Debug("roommanager"); @@ -40,7 +41,7 @@ export type RoomSocket = ServerWritableStream { - console.log("joinRoom called"); + log.info("joinRoom called"); let room: GameRoom | null = null; let user: User | null = null; @@ -131,11 +132,11 @@ const roomManager: IRoomManagerServer = { } } } catch (e) { - console.error(e); + log.error(e); emitError(call, e); call.end(); } - })().catch((e) => console.error(e)); + })().catch((e) => log.error(e)); }); call.on("end", () => { @@ -149,7 +150,7 @@ const roomManager: IRoomManagerServer = { }); call.on("error", (err: Error) => { - console.error("An error occurred in joinRoom stream:", err); + log.error("An error occurred in joinRoom stream:", err); }); }, @@ -167,7 +168,7 @@ const roomManager: IRoomManagerServer = { debug("listenZone cancelled"); socketManager .removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); call.end(); }); @@ -175,12 +176,12 @@ const roomManager: IRoomManagerServer = { debug("listenZone connection closed"); socketManager .removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); }).on("error", (e) => { - console.error("An error occurred in listenZone stream:", e); + log.error("An error occurred in listenZone stream:", e); socketManager .removeZoneListener(call, zoneMessage.getRoomid(), zoneMessage.getX(), zoneMessage.getY()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); call.end(); }); }, @@ -195,22 +196,22 @@ const roomManager: IRoomManagerServer = { call.on("cancelled", () => { debug("listenRoom cancelled"); - socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e)); + socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => log.error(e)); call.end(); }); call.on("close", () => { debug("listenRoom connection closed"); - socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e)); + socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => log.error(e)); }).on("error", (e) => { - console.error("An error occurred in listenRoom stream:", e); - socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => console.error(e)); + log.error("An error occurred in listenRoom stream:", e); + socketManager.removeRoomListener(call, roomMessage.getRoomid()).catch((e) => log.error(e)); call.end(); }); }, adminRoom(call: AdminSocket): void { - console.log("adminRoom called"); + log.info("adminRoom called"); const admin = new Admin(call); let room: GameRoom | null = null; @@ -225,7 +226,7 @@ const roomManager: IRoomManagerServer = { .then((gameRoom: GameRoom) => { room = gameRoom; }) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); } else { throw new Error("The first message sent MUST be of type JoinRoomMessage"); } @@ -246,13 +247,13 @@ const roomManager: IRoomManagerServer = { }); call.on("error", (err: Error) => { - console.error("An error occurred in joinAdminRoom stream:", err); + log.error("An error occurred in joinAdminRoom stream:", err); }); }, sendAdminMessage(call: ServerUnaryCall, callback: sendUnaryData): void { socketManager .sendAdminMessage(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); callback(null, new EmptyMessage()); }, @@ -265,7 +266,7 @@ const roomManager: IRoomManagerServer = { // FIXME Work in progress socketManager .banUser(call.request.getRoomid(), call.request.getRecipientuuid(), call.request.getMessage()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); callback(null, new EmptyMessage()); }, @@ -273,7 +274,7 @@ const roomManager: IRoomManagerServer = { // FIXME: we could improve return message by returning a Success|ErrorMessage message socketManager .sendAdminRoomMessage(call.request.getRoomid(), call.request.getMessage(), call.request.getType()) - .catch((e) => console.error(e)); + .catch((e) => log.error(e)); callback(null, new EmptyMessage()); }, sendWorldFullWarningToRoom( @@ -281,7 +282,7 @@ const roomManager: IRoomManagerServer = { callback: sendUnaryData ): void { // FIXME: we could improve return message by returning a Success|ErrorMessage message - socketManager.dispatchWorldFullWarning(call.request.getRoomid()).catch((e) => console.error(e)); + socketManager.dispatchWorldFullWarning(call.request.getRoomid()).catch((e) => log.error(e)); callback(null, new EmptyMessage()); }, sendRefreshRoomPrompt( @@ -289,7 +290,7 @@ const roomManager: IRoomManagerServer = { callback: sendUnaryData ): void { // FIXME: we could improve return message by returning a Success|ErrorMessage message - socketManager.dispatchRoomRefresh(call.request.getRoomid()).catch((e) => console.error(e)); + socketManager.dispatchRoomRefresh(call.request.getRoomid()).catch((e) => log.error(e)); callback(null, new EmptyMessage()); }, }; diff --git a/back/src/Server/server/formdata.ts b/back/src/Server/server/formdata.ts index 0e17de78..a3ef07ee 100644 --- a/back/src/Server/server/formdata.ts +++ b/back/src/Server/server/formdata.ts @@ -2,6 +2,7 @@ import { createWriteStream } from "fs"; import { join, dirname } from "path"; import Busboy from "busboy"; import mkdirp from "mkdirp"; +import log from "../../Services/Logger"; function formData( contType: string, @@ -19,7 +20,7 @@ function formData( filename?: (oldName: string) => string; } = {} ) { - console.log("Enter form data"); + log.info("Enter form data"); options.headers = { "content-type": contType, }; diff --git a/back/src/Services/CpuTracker.ts b/back/src/Services/CpuTracker.ts index 3d06ca70..4ff48eb6 100644 --- a/back/src/Services/CpuTracker.ts +++ b/back/src/Services/CpuTracker.ts @@ -1,4 +1,5 @@ import { CPU_OVERHEAT_THRESHOLD } from "../Enum/EnvironmentVariable"; +import log from "./Logger"; function secNSec2ms(secNSec: Array | number) { if (Array.isArray(secNSec)) { @@ -28,16 +29,16 @@ class CpuTracker { if (!this.overHeating && this.cpuPercent > CPU_OVERHEAT_THRESHOLD) { this.overHeating = true; - console.warn('CPU high threshold alert. Going in "overheat" mode'); + log.warn('CPU high threshold alert. Going in "overheat" mode'); } else if (this.overHeating && this.cpuPercent <= CPU_OVERHEAT_THRESHOLD) { this.overHeating = false; - console.log('CPU is back to normal. Canceling "overheat" mode'); + log.info('CPU is back to normal. Canceling "overheat" mode'); } - /*console.log('elapsed time ms: ', elapTimeMS) - console.log('elapsed user ms: ', elapUserMS) - console.log('elapsed system ms:', elapSystMS) - console.log('cpu percent: ', this.cpuPercent)*/ + /*log.info('elapsed time ms: ', elapTimeMS) + log.info('elapsed user ms: ', elapUserMS) + log.info('elapsed system ms:', elapSystMS) + log.info('cpu percent: ', this.cpuPercent)*/ }, 100); } diff --git a/back/src/Services/Logger.ts b/back/src/Services/Logger.ts new file mode 100644 index 00000000..e19f60d1 --- /dev/null +++ b/back/src/Services/Logger.ts @@ -0,0 +1,16 @@ +import * as winston from "winston"; + +const logger = winston.createLogger({ + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.timestamp(), + winston.format.align(), + winston.format.printf((info) => `${info.timestamp} ${info.level}: ${info.message}`) + ), + }), + ], +}); + +export default logger; diff --git a/back/src/Services/MapFetcher.ts b/back/src/Services/MapFetcher.ts index a17f722a..5d8bb9ef 100644 --- a/back/src/Services/MapFetcher.ts +++ b/back/src/Services/MapFetcher.ts @@ -5,6 +5,7 @@ import { promisify } from "util"; import { LocalUrlError } from "./LocalUrlError"; import { ITiledMap } from "@workadventure/tiled-map-type-guard"; import { isTiledMap } from "@workadventure/tiled-map-type-guard/dist"; +import log from "./Logger"; class MapFetcher { async fetchMap(mapUrl: string): Promise { @@ -29,7 +30,7 @@ class MapFetcher { if (!isTiledMap(res.data)) { //TODO fixme //throw new Error("Invalid map format for map " + mapUrl); - console.error("Invalid map format for map " + mapUrl); + log.error("Invalid map format for map " + mapUrl); } return res.data; diff --git a/back/src/Services/MessageHelpers.ts b/back/src/Services/MessageHelpers.ts index 606374be..9068881c 100644 --- a/back/src/Services/MessageHelpers.ts +++ b/back/src/Services/MessageHelpers.ts @@ -9,6 +9,7 @@ import { } from "../Messages/generated/messages_pb"; import { UserSocket } from "_Model/User"; import { RoomSocket, ZoneSocket } from "../RoomManager"; +import log from "./Logger"; export function emitError(Client: UserSocket, message: string): void { const errorMessage = new ErrorMessage(); @@ -20,11 +21,11 @@ export function emitError(Client: UserSocket, message: string): void { //if (!Client.disconnecting) { Client.write(serverToClientMessage); //} - console.warn(message); + log.warn(message); } export function emitErrorOnRoomSocket(Client: RoomSocket, message: string): void { - console.error(message); + log.error(message); const errorMessage = new ErrorMessage(); errorMessage.setMessage(message); @@ -38,11 +39,11 @@ export function emitErrorOnRoomSocket(Client: RoomSocket, message: string): void //if (!Client.disconnecting) { Client.write(batchToPusherMessage); //} - console.warn(message); + log.warn(message); } export function emitErrorOnZoneSocket(Client: ZoneSocket, message: string): void { - console.error(message); + log.error(message); const errorMessage = new ErrorMessage(); errorMessage.setMessage(message); @@ -56,5 +57,5 @@ export function emitErrorOnZoneSocket(Client: ZoneSocket, message: string): void //if (!Client.disconnecting) { Client.write(batchToPusherMessage); //} - console.warn(message); + log.warn(message); } diff --git a/back/src/Services/RedisClient.ts b/back/src/Services/RedisClient.ts index 1f8c1ecd..4737f21e 100644 --- a/back/src/Services/RedisClient.ts +++ b/back/src/Services/RedisClient.ts @@ -1,5 +1,6 @@ import { ClientOpts, createClient, RedisClient } from "redis"; import { REDIS_HOST, REDIS_PASSWORD, REDIS_PORT } from "../Enum/EnvironmentVariable"; +import log from "./Logger"; let redisClient: RedisClient | null = null; @@ -16,7 +17,7 @@ if (REDIS_HOST !== undefined) { redisClient = createClient(config); redisClient.on("error", (err) => { - console.error("Error connecting to Redis:", err); + log.error("Error connecting to Redis:", err); }); } diff --git a/back/src/Services/Repository/VariablesRepository.ts b/back/src/Services/Repository/VariablesRepository.ts index 9f668bcf..89bac288 100644 --- a/back/src/Services/Repository/VariablesRepository.ts +++ b/back/src/Services/Repository/VariablesRepository.ts @@ -2,10 +2,11 @@ import { RedisVariablesRepository } from "./RedisVariablesRepository"; import { redisClient } from "../RedisClient"; import { VoidVariablesRepository } from "./VoidVariablesRepository"; import { VariablesRepositoryInterface } from "./VariablesRepositoryInterface"; +import log from "../../Services/Logger"; let variablesRepository: VariablesRepositoryInterface; if (!redisClient) { - console.warn("WARNING: Redis isnot configured. No variables will be persisted."); + log.warn("WARNING: Redis isnot configured. No variables will be persisted."); variablesRepository = new VoidVariablesRepository(); } else { variablesRepository = new RedisVariablesRepository(redisClient); diff --git a/back/src/Services/SocketManager.ts b/back/src/Services/SocketManager.ts index 3e8baf61..910dc26a 100644 --- a/back/src/Services/SocketManager.ts +++ b/back/src/Services/SocketManager.ts @@ -56,6 +56,7 @@ import { Zone } from "_Model/Zone"; import Debug from "debug"; import { Admin } from "_Model/Admin"; import crypto from "crypto"; +import log from "./Logger"; const debug = Debug("sockermanager"); @@ -89,7 +90,7 @@ export class SocketManager { const { room, user } = await this.joinRoom(socket, joinRoomMessage); if (!socket.writable) { - console.warn("Socket was aborted"); + log.warn("Socket was aborted"); return { room, user, @@ -156,7 +157,7 @@ export class SocketManager { name: playerDetailsMessage.getName(), characterLayers: playerDetailsMessage.getCharacterlayersList() }; - //console.log(SocketIoEvent.SET_PLAYER_DETAILS, playerDetails); + //log.info(SocketIoEvent.SET_PLAYER_DETAILS, playerDetails); if (!isSetPlayerDetailsMessage(playerDetails)) { emitError(client, 'Invalid SET_PLAYER_DETAILS message received: '); return; @@ -192,7 +193,7 @@ export class SocketManager { //send only at user const remoteUser = room.getUsers().get(data.getReceiverid()); if (remoteUser === undefined) { - console.warn( + log.warn( "While exchanging a WebRTC signal: client with id ", data.getReceiverid(), " does not exist. This might be a race condition." @@ -222,7 +223,7 @@ export class SocketManager { //send only at user const remoteUser = room.getUsers().get(data.getReceiverid()); if (remoteUser === undefined) { - console.warn( + log.warn( "While exchanging a WEBRTC_SCREEN_SHARING signal: client with id ", data.getReceiverid(), " does not exist. This might be a race condition." @@ -260,7 +261,7 @@ export class SocketManager { } } finally { clientEventsEmitter.emitClientLeave(user.uuid, room.roomUrl); - console.log("A user left"); + log.info("A user left"); } } @@ -308,7 +309,7 @@ export class SocketManager { const user = room.join(socket, joinRoomMessage); clientEventsEmitter.emitClientJoin(user.uuid, roomId); - console.log(new Date().toISOString() + " user '"+user.uuid+"' joined room '"+roomId+"'"); + log.info(new Date().toISOString() + " user '" + user.uuid + "' joined room '" + roomId + "'"); return { room, user }; } @@ -337,7 +338,7 @@ export class SocketManager { } else if (thing instanceof Group) { this.emitCreateUpdateGroupEvent(listener, fromZone, thing); } else { - console.error("Unexpected type for Movable."); + log.error("Unexpected type for Movable."); } } @@ -352,11 +353,11 @@ export class SocketManager { emitZoneMessage(subMessage, listener); //listener.emitInBatch(subMessage); - //console.log("Sending USER_MOVED event"); + //log.info("Sending USER_MOVED event"); } else if (thing instanceof Group) { this.emitCreateUpdateGroupEvent(listener, null, thing); } else { - console.error("Unexpected type for Movable."); + log.error("Unexpected type for Movable."); } } @@ -366,7 +367,7 @@ export class SocketManager { } else if (thing instanceof Group) { this.emitDeleteGroupEvent(listener, thing.getId(), newZone); } else { - console.error("Unexpected type for Movable."); + log.error("Unexpected type for Movable."); } } @@ -635,7 +636,7 @@ export class SocketManager { batchMessage.addPayload(subMessage); } else { - console.error("Unexpected type for Movable returned by setViewport"); + log.error("Unexpected type for Movable returned by setViewport"); } } @@ -693,7 +694,7 @@ export class SocketManager { public async sendAdminMessage(roomId: string, recipientUuid: string, message: string): Promise { const room = await this.roomsPromises.get(roomId); if (!room) { - console.error( + log.error( "In sendAdminMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?" @@ -703,7 +704,7 @@ export class SocketManager { const recipients = room.getUsersByUuid(recipientUuid); if (recipients.length === 0) { - console.error( + log.error( "In sendAdminMessage, could not find user with id '" + recipientUuid + "'. Maybe the user left the room a few milliseconds ago and there was a race condition?" @@ -726,7 +727,7 @@ export class SocketManager { public async banUser(roomId: string, recipientUuid: string, message: string): Promise { const room = await this.roomsPromises.get(roomId); if (!room) { - console.error( + log.error( "In banUser, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?" @@ -736,7 +737,7 @@ export class SocketManager { const recipients = room.getUsersByUuid(recipientUuid); if (recipients.length === 0) { - console.error( + log.error( "In banUser, could not find user with id '" + recipientUuid + "'. Maybe the user left the room a few milliseconds ago and there was a race condition?" @@ -765,7 +766,7 @@ export class SocketManager { const room = await this.roomsPromises.get(roomId); if (!room) { //todo: this should cause the http call to return a 500 - console.error( + log.error( "In sendAdminRoomMessage, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?" @@ -789,7 +790,7 @@ export class SocketManager { const room = await this.roomsPromises.get(roomId); if (!room) { //todo: this should cause the http call to return a 500 - console.error( + log.error( "In dispatchWorldFullWarning, could not find room with id '" + roomId + "'. Maybe the room was closed a few milliseconds ago and there was a race condition?" diff --git a/back/src/Services/VariablesManager.ts b/back/src/Services/VariablesManager.ts index 915c6c05..1759a117 100644 --- a/back/src/Services/VariablesManager.ts +++ b/back/src/Services/VariablesManager.ts @@ -10,6 +10,7 @@ import { import { User } from "_Model/User"; import { variablesRepository } from "./Repository/VariablesRepository"; import { redisClient } from "./RedisClient"; +import log from "./Logger"; interface Variable { defaultValue?: string; @@ -98,7 +99,7 @@ export class VariablesManager { for (const object of layer.objects) { if (object.type === "variable") { if (object.template) { - console.warn( + log.warn( 'Warning, a variable object is using a Tiled "template". WorkAdventure does not support objects generated from Tiled templates.' ); continue; @@ -204,7 +205,7 @@ export class VariablesManager { if (variableObject !== undefined && variableObject.persist) { variablesRepository .saveVariable(this.roomUrl, name, value) - .catch((e) => console.error("Error while saving variable in Redis:", e)); + .catch((e) => log.error("Error while saving variable in Redis:", e)); } return readableBy; diff --git a/back/tsconfig.json b/back/tsconfig.json index e149d304..cb55d5c1 100644 --- a/back/tsconfig.json +++ b/back/tsconfig.json @@ -46,7 +46,7 @@ "paths": { "_Controller/*": ["src/Controller/*"], "_Model/*": ["src/Model/*"], - "_Enum/*": ["src/Enum/*"] + "_Enum/*": ["src/Enum/*"], }, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ diff --git a/back/yarn.lock b/back/yarn.lock index ff9cb180..9946289c 100644 --- a/back/yarn.lock +++ b/back/yarn.lock @@ -23,6 +23,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@dabh/diagnostics@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" + integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -376,6 +385,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd" + integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g== + atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -621,7 +635,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -640,16 +654,45 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colors@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + colour@~0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/colour/-/colour-0.7.1.tgz#9cb169917ec5d12c0736d3e8685746df1cadf778" @@ -864,6 +907,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -1089,6 +1137,11 @@ fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fecha@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.1.tgz#0a83ad8f86ef62a091e22bb5a039cd03d23eecce" + integrity sha512-MMMQ0ludy/nBs1/o0zVOiKTpG7qMbonKUzjJgQFEuvq6INZ1OraKPRAWkBq5vlKLOUMpmNYG1JoN3oDPUQ9m3Q== + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -1142,6 +1195,11 @@ flatted@^2.0.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + follow-redirects@^1.14.0: version "1.14.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" @@ -1407,7 +1465,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1465,6 +1523,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1731,6 +1794,11 @@ kind-of@^6.0.0, kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -1864,6 +1932,17 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +logform@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.3.0.tgz#a3997a05985de2ebd325ae0d166dffc9c6fe6b57" + integrity sha512-graeoWUH2knKbGthMtuG1EfaSPMZFZBIrhuJHhkS5ZseFBrc7DupCzihOQAzsK/qIKPQaPJ/lFQFctILUY5ARQ== + dependencies: + colors "^1.2.1" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^1.1.0" + triple-beam "^1.3.0" + long@~3: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" @@ -2177,6 +2256,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -2425,7 +2511,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.6: +readable-stream@^2.0.6, readable-stream@^2.3.7: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -2438,6 +2524,15 @@ readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" @@ -2578,7 +2673,7 @@ rxjs@^6.6.7: dependencies: tslib "^1.9.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2595,6 +2690,11 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" +safe-stable-stringify@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2669,6 +2769,13 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -2803,6 +2910,11 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -2870,6 +2982,13 @@ string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2992,6 +3111,11 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.1" +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -3051,6 +3175,11 @@ trim-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +triple-beam@^1.2.0, triple-beam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" + integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== + ts-node-dev@^1.0.0-pre.44: version "1.0.0-pre.63" resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.63.tgz#0e69df26cef35a728362d93348f13caa2cb2c512" @@ -3167,7 +3296,7 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -3224,6 +3353,29 @@ window-size@^0.1.4: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= +winston-transport@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" + integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== + dependencies: + readable-stream "^2.3.7" + triple-beam "^1.2.0" + +winston@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" + integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== + dependencies: + "@dabh/diagnostics" "^2.0.2" + async "^3.1.0" + is-stream "^2.0.0" + logform "^2.2.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.4.0" + word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" diff --git a/package.json b/package.json index 038edf2c..ff6c2a33 100644 --- a/package.json +++ b/package.json @@ -4,5 +4,6 @@ }, "scripts": { "prepare": "husky install" - } + }, + "dependencies": {} } diff --git a/yarn.lock b/yarn.lock index b9698f61..adbed748 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,7 @@ # yarn lockfile v1 -"husky@^6.0.0": - "resolved" "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz" - "version" "6.0.0" +husky@^7.0.1: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==