diff --git a/.env b/.env index c309990..5ad24bd 100644 --- a/.env +++ b/.env @@ -1,2 +1,15 @@ PORT = 3002 HTTPS = TRUE + +TYPEORM_CONNECTION = sqlite +TYPEORM_HOST = localhost +TYPEORM_USERNAME = root +TYPEORM_PASSWORD = admin +TYPEORM_DATABASE = database/lol-stalker.db +TYPEORM_PORT = 3000 +TYPEORM_SYNCHRONIZE = false +TYPEORM_ENTITIES = **/entities/*.js +TYPEORM_MIGRATIONS_DIR = migration +TYPEORM_MIGRATIONS = migration/*.js + +TYPEORM_LOGGING = true \ No newline at end of file diff --git a/.gitignore b/.gitignore index d04044f..b53a4e7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,6 @@ yarn-error.log* *.tgz *.db-journal -lol-stalker.db.dev -*/prismaClient +database/** selectedFriends.json \ No newline at end of file diff --git a/README.md b/README.md index 101202a..f791dae 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,10 @@ Clone this repo and install all dependencies `yarn` or `npm install` +## First start + +`yarn init:db` + ## Development `yarn dev` or `npm run dev` diff --git a/base.db b/base.db new file mode 100644 index 0000000..d753674 Binary files /dev/null and b/base.db differ diff --git a/database/lol-stalker.db b/database/lol-stalker.db new file mode 100644 index 0000000..9889cd8 Binary files /dev/null and b/database/lol-stalker.db differ diff --git a/electron/LCU/lcu.ts b/electron/LCU/lcu.ts index 461b07b..1fad81f 100644 --- a/electron/LCU/lcu.ts +++ b/electron/LCU/lcu.ts @@ -2,10 +2,10 @@ import { pick } from "@pastable/core"; import axios, { AxiosInstance } from "axios"; import https from "https"; import LCUConnector from "lcu-connector"; -import { Prisma } from "../prismaClient"; +import { Friend } from "../entities/Friend"; import { sendInvalidate } from "../routes"; import { addOrUpdateFriends } from "../routes/friends"; -import { sendToClient } from "../utils"; +import { sendToClient, Tier } from "../utils"; import { CurrentSummoner, FriendDto, MatchDto, Queue, RankedStats } from "./types"; const httpsAgent = new https.Agent({ rejectUnauthorized: false }); @@ -45,6 +45,7 @@ const theoPuuid = "4ab5d4e7-0e24-54ac-b8e7-2a72c8483712"; const getTheoSoloQRank = () => getSoloQRankedStats(theoPuuid); export interface FriendChange extends FriendStats { oldFriend: FriendStats; + toNotify: boolean; } export const compareFriends = (oldFriends: FriendStats[], newFriends: FriendStats[]) => { const changes: FriendChange[] = []; @@ -56,15 +57,15 @@ export const compareFriends = (oldFriends: FriendStats[], newFriends: FriendStat newFriend.tier !== oldFriend.tier || newFriend.leaguePoints !== oldFriend.leaguePoints ) { - changes.push({ ...newFriend, oldFriend }); + changes.push({ ...newFriend, oldFriend, toNotify: !!oldFriend.division }); } }); return changes; }; -type FriendStats = Pick & - Pick; +type FriendStats = Pick & + Pick; export const checkFriendList = async () => { const friends = await getFriends(); @@ -73,6 +74,18 @@ export const checkFriendList = async () => { return stats; }; +export const getAllApexLeague = async () => { + const tiers: Tier[] = ["MASTER", "GRANDMASTER", "CHALLENGER"]; + const payload: Partial> = {}; + for (const tier of tiers) { + payload[tier] = (await getApexLeague(tier)).divisions[0].standings[0].leaguePoints; + } + + return payload; +}; +export const getApexLeague = (tier: RankedStats["queues"][0]["tier"]) => + request(`/lol-ranked/v1/apex-leagues/RANKED_SOLO_5x5/${tier}`); + ///lol-ranked-stats/v1/stats/{summonerId} export const getHelp = () => request("/help?format=Console"); export const getBuild = () => request("/system/v1/builds"); @@ -92,7 +105,7 @@ export const getSoloQRankedStats = async (puuid: string) => export const getMatchHistoryBySummonerPuuid = (puuid: string) => request(`/lol-match-history/v1/products/lol/${puuid}/matches`); export const getMultipleSummonerSoloQStats = async ( - summoners: Pick[] + summoners: Pick[] ) => { const summonersRanks = []; for (const summoner of summoners) { @@ -102,7 +115,14 @@ export const getMultipleSummonerSoloQStats = async ( throw "no rank"; } summonersRanks.push({ - ...pick(rank, ["division", "tier", "leaguePoints", "wins", "losses"]), + ...pick(rank, [ + "division", + "tier", + "leaguePoints", + "wins", + "losses", + "miniSeriesProgress", + ]), ...pick(summoner, ["name", "puuid"]), }); } catch (e) { diff --git a/electron/LCU/types.ts b/electron/LCU/types.ts index 8fd8e6c..cb0f2fd 100644 --- a/electron/LCU/types.ts +++ b/electron/LCU/types.ts @@ -1,5 +1,6 @@ -import { Prisma } from "../prismaClient"; -export interface FriendDto extends Prisma.FriendCreateInput { +import { Friend } from "../entities/Friend"; + +export interface FriendDto extends Friend { availability: string; displayGroupId: number; displayGroupName: string; diff --git a/electron/db.ts b/electron/db.ts index 9a7b2ae..16870e6 100644 --- a/electron/db.ts +++ b/electron/db.ts @@ -1,16 +1,16 @@ import isDev from "electron-is-dev"; import path from "path"; import sqlite3 from "sqlite3"; -import { PrismaClient } from "./prismaClient"; -const dbUrl = isDev ? "lol-stalker.db.dev" : "lol-stalker.db"; -export const db = new sqlite3.Database(dbUrl); +import { createConnection } from "typeorm"; +const dbUrl = path.join(__dirname, "database", "lol-stalker.db"); +// export const db = new sqlite3.Database(dbUrl); -export const prisma = isDev - ? new PrismaClient({ - datasources: { - db: { url: `file://${path.join(__dirname, "../" + dbUrl).replace("C:\\", "")}` }, - }, - // log: ["query", "info", "warn", "error"], - }) - : new PrismaClient(); +export const makeDb = () => + isDev + ? createConnection() + : createConnection({ + type: "sqlite", + database: dbUrl, + entities: [path.join(__dirname, "entities/*")], + }); diff --git a/electron/entities/Friend.ts b/electron/entities/Friend.ts new file mode 100644 index 0000000..7db6009 --- /dev/null +++ b/electron/entities/Friend.ts @@ -0,0 +1,49 @@ +import { Column, Entity, OneToMany } from "typeorm"; +import { Ranking } from "./Ranking"; +import { FriendName } from "./FriendName"; +import { Notification } from "./Notification"; + +@Entity("Friend") +export class Friend { + @Column("text", { primary: true, name: "puuid", unique: true }) + puuid: string; + + @Column("text", { name: "id", nullable: true }) + id: string | null; + + @Column("text", { name: "gameName" }) + gameName: string; + + @Column("text", { name: "gameTag", nullable: true }) + gameTag: string | null; + + @Column("integer", { name: "groupId", default: () => "0" }) + groupId: number; + + @Column("text", { name: "groupName", default: () => "'NONE'" }) + groupName: string; + + @Column("text", { name: "name" }) + name: string; + + @Column("integer", { name: "summonerId" }) + summonerId: number; + + @Column("integer", { name: "icon" }) + icon: number; + + @Column("datetime", { name: "createdAt", default: () => "CURRENT_TIMESTAMP" }) + createdAt: Date; + + @Column("boolean", { name: "isCurrentSummoner", default: () => "false" }) + isCurrentSummoner: boolean; + + @OneToMany(() => Ranking, (ranking) => ranking.friend) + rankings: Ranking[]; + + @OneToMany(() => FriendName, (friendName) => friendName.friend) + friendNames: FriendName[]; + + @OneToMany(() => Notification, (notification) => notification.friend) + notifications: Notification[]; +} diff --git a/electron/entities/FriendName.ts b/electron/entities/FriendName.ts new file mode 100644 index 0000000..ba8afc0 --- /dev/null +++ b/electron/entities/FriendName.ts @@ -0,0 +1,21 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { Friend } from "./Friend"; + +@Entity("FriendName") +export class FriendName { + @PrimaryGeneratedColumn({ type: "integer", name: "id" }) + id: number; + + @Column("text", { name: "name", default: () => "''" }) + name: string; + + @Column("datetime", { name: "createdAt", default: () => "CURRENT_TIMESTAMP" }) + createdAt: Date; + + @ManyToOne(() => Friend, (friend) => friend.friendNames, { + onDelete: "RESTRICT", + onUpdate: "CASCADE", + }) + @JoinColumn([{ name: "puuid", referencedColumnName: "puuid" }]) + friend: Friend; +} diff --git a/electron/entities/Notification.ts b/electron/entities/Notification.ts new file mode 100644 index 0000000..92ebd9f --- /dev/null +++ b/electron/entities/Notification.ts @@ -0,0 +1,33 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { Friend } from "./Friend"; + +@Entity("Notification") +export class Notification { + @PrimaryGeneratedColumn({ type: "integer", name: "id" }) + id: number; + + @Column("text", { name: "type", default: () => "''" }) + type: string; + + @Column("text", { name: "from" }) + from: string; + + @Column("text", { name: "to" }) + to: string; + + @Column("text", { name: "content" }) + content: string; + + @Column("datetime", { name: "createdAt", default: () => "CURRENT_TIMESTAMP" }) + createdAt: Date; + + @Column("boolean", { name: "isNew", default: () => "true" }) + isNew: boolean; + + @ManyToOne(() => Friend, (friend) => friend.notifications, { + onDelete: "RESTRICT", + onUpdate: "CASCADE", + }) + @JoinColumn([{ name: "puuid", referencedColumnName: "puuid" }]) + friend: Friend; +} diff --git a/electron/entities/Ranking.ts b/electron/entities/Ranking.ts new file mode 100644 index 0000000..0d7c069 --- /dev/null +++ b/electron/entities/Ranking.ts @@ -0,0 +1,36 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from "typeorm"; +import { Friend } from "./Friend"; + +@Entity("Ranking") +export class Ranking { + @PrimaryGeneratedColumn({ type: "integer", name: "id" }) + id: number; + + @Column("text", { name: "division" }) + division: string; + + @Column("text", { name: "tier" }) + tier: string; + + @Column("integer", { name: "leaguePoints" }) + leaguePoints: number; + + @Column("integer", { name: "wins" }) + wins: number; + + @Column("integer", { name: "losses" }) + losses: number; + + @Column("text", { name: "miniSeriesProgress", default: () => "''" }) + miniSeriesProgress: string; + + @Column("datetime", { name: "createdAt", default: () => "CURRENT_TIMESTAMP" }) + createdAt: Date; + + @ManyToOne(() => Friend, (friend) => friend.rankings, { + onDelete: "RESTRICT", + onUpdate: "CASCADE", + }) + @JoinColumn([{ name: "puuid", referencedColumnName: "puuid" }]) + friend: Friend; +} diff --git a/electron/index.ts b/electron/index.ts index 90e57e0..1ead7ec 100644 --- a/electron/index.ts +++ b/electron/index.ts @@ -3,16 +3,16 @@ dotenv.config(); import { app, BrowserWindow, ipcMain, shell } from "electron"; import isDev from "electron-is-dev"; import path, { join } from "path"; -import { prisma } from "./db"; +import { makeDb } from "./db"; import { startCheckCurrentSummonerRank } from "./jobs/currentSummonerRank"; import { startCheckFriendListJob } from "./jobs/friendListJob"; import { connector, sendConnectorStatus } from "./LCU/lcu"; import { receiveToggleSelectFriends, + sendApex, sendCursoredNotifications, sendFriendList, sendFriendListWithRankings, - sendFriendNotifications, sendFriendRank, sendMatches, sendNbNewNotifications, @@ -52,6 +52,7 @@ export function makeWindow() { return window; } app.whenReady().then(async () => { + const db = await makeDb(); connector.start(); await loadSelectedFriends(); makeWindow(); @@ -63,7 +64,6 @@ app.whenReady().then(async () => { if (BrowserWindow.getAllWindows().length === 0) makeWindow(); }); app.on("window-all-closed", () => { - prisma.$disconnect(); app.quit(); process.exit(0); }); @@ -78,13 +78,14 @@ ipcMain.on("friendList/ranks", sendFriendListWithRankings); ipcMain.on("friendList/select", receiveToggleSelectFriends); ipcMain.on("friendList/select-all", sendSelectAllFriends); ipcMain.on("friendList/selected", () => sendSelected()); -ipcMain.on("notifications/friend", sendFriendNotifications); ipcMain.on("notifications/all", sendCursoredNotifications); ipcMain.on("notifications/nb-new", sendNbNewNotifications); ipcMain.on("friend/matches", sendMatches); +ipcMain.on("config/apex", sendApex); + ipcMain.on("config/dl-db", () => { - const url = path.join(__dirname, isDev ? "../lol-stalker.db" : "lol-stalker.db"); + const url = path.join(__dirname, isDev ? "../database/lol-stalker.db" : "lol-stalker.db"); shell.showItemInFolder(url); sendToClient("config/dl-db", "ok"); }); diff --git a/electron/jobs/currentSummonerRank.ts b/electron/jobs/currentSummonerRank.ts index ca7e14c..54f5ae1 100644 --- a/electron/jobs/currentSummonerRank.ts +++ b/electron/jobs/currentSummonerRank.ts @@ -1,62 +1,55 @@ import { pick } from "@pastable/core"; -import { prisma } from "../db"; import { getCurrentSummoner, getSoloQRankedStats } from "../LCU/lcu"; -import { Prisma } from "../prismaClient"; export const startCheckCurrentSummonerRank = async () => { - try { - const currentSummonerFromLCU = await getCurrentSummoner(); - const currentSummoner: Prisma.FriendCreateInput = { - puuid: currentSummonerFromLCU.puuid, - summonerId: currentSummonerFromLCU.summonerId, - gameName: currentSummonerFromLCU.displayName, - name: currentSummonerFromLCU.displayName, - icon: currentSummonerFromLCU.profileIconId, - isCurrentSummoner: true, - }; - const currentSummonerInDb = await prisma.friend.findUnique({ - where: { puuid: currentSummoner.puuid }, - }); - - if (!currentSummonerInDb) { - console.log("Creating new current summoner in db"); - await prisma.friend.create({ data: currentSummoner }); - } - const summonerRank = await getSoloQRankedStats(currentSummoner.puuid); - - if (!summonerRank) throw `Couldn't find last rank for summoner ${currentSummoner.name}`; - - const lastRankFromDb = await prisma.ranking.findFirst({ - where: { puuid: currentSummoner.puuid }, - orderBy: { createdAt: "desc" }, - }); - - if ( - !lastRankFromDb || - lastRankFromDb.tier === summonerRank.tier || - lastRankFromDb.division === summonerRank.division || - lastRankFromDb.leaguePoints === summonerRank.leaguePoints - ) { - console.log("Last rank from db is different than the new one, inserting new rank..."); - await prisma.ranking.create({ - data: { - ...pick(summonerRank, [ - "division", - "tier", - "leaguePoints", - "wins", - "losses", - "miniSeriesProgress", - ]), - puuid: currentSummoner.puuid, - }, - }); - console.log("done!"); - } else console.log("No change in current summoner rank"); - - setTimeout(() => startCheckCurrentSummonerRank(), 1000 * 60 * 15); - } catch (e) { - console.log("something went wrong, retrying in 5s"); - setTimeout(() => startCheckCurrentSummonerRank(), 5000); - } + // try { + // const currentSummonerFromLCU = await getCurrentSummoner(); + // const currentSummoner: Prisma.FriendCreateInput = { + // puuid: currentSummonerFromLCU.puuid, + // summonerId: currentSummonerFromLCU.summonerId, + // gameName: currentSummonerFromLCU.displayName, + // name: currentSummonerFromLCU.displayName, + // icon: currentSummonerFromLCU.profileIconId, + // isCurrentSummoner: true, + // }; + // const currentSummonerInDb = await prisma.friend.findUnique({ + // where: { puuid: currentSummoner.puuid }, + // }); + // if (!currentSummonerInDb) { + // console.log("Creating new current summoner in db"); + // await prisma.friend.create({ data: currentSummoner }); + // } + // const summonerRank = await getSoloQRankedStats(currentSummoner.puuid); + // if (!summonerRank) throw `Couldn't find last rank for summoner ${currentSummoner.name}`; + // const lastRankFromDb = await prisma.ranking.findFirst({ + // where: { puuid: currentSummoner.puuid }, + // orderBy: { createdAt: "desc" }, + // }); + // if ( + // !lastRankFromDb || + // lastRankFromDb.tier === summonerRank.tier || + // lastRankFromDb.division === summonerRank.division || + // lastRankFromDb.leaguePoints === summonerRank.leaguePoints + // ) { + // console.log("Last rank from db is different than the new one, inserting new rank..."); + // await prisma.ranking.create({ + // data: { + // ...pick(summonerRank, [ + // "division", + // "tier", + // "leaguePoints", + // "wins", + // "losses", + // "miniSeriesProgress", + // ]), + // puuid: currentSummoner.puuid, + // }, + // }); + // console.log("done!"); + // } else console.log("No change in current summoner rank"); + // setTimeout(() => startCheckCurrentSummonerRank(), 1000 * 60 * 15); + // } catch (e) { + // console.log("something went wrong, retrying in 5s"); + // setTimeout(() => startCheckCurrentSummonerRank(), 5000); + // } }; diff --git a/electron/jobs/friendListJob.ts b/electron/jobs/friendListJob.ts index 083a808..eedac05 100644 --- a/electron/jobs/friendListJob.ts +++ b/electron/jobs/friendListJob.ts @@ -1,3 +1,4 @@ +import { Friend } from "../entities/Friend"; import { checkFriendList, compareFriends, connectorStatus } from "../LCU/lcu"; import { addRanking, getFriendsAndLastRankingFromDb } from "../routes/friends"; import { addNotification } from "../routes/notifications"; @@ -26,9 +27,17 @@ export const startCheckFriendListJob = async () => { `${changes.length} change${changes.length > 1 ? "s" : ""} found in friendList` ); for (const change of changes) { - await addRanking(change, change.puuid); - const notification = getRankDifference(change.oldFriend as any, change as any); - await addNotification({ ...notification, puuid: change.puuid }); + await addRanking(change as any, change.puuid); + + if (change.toNotify) { + const notification = getRankDifference( + change.oldFriend as any, + change as any + ); + const friend = new Friend(); + friend.puuid = change.puuid; + await addNotification({ ...notification, friend }); + } } sendToClient("invalidate", "notifications/nb-new"); } else { diff --git a/electron/routes/friends.ts b/electron/routes/friends.ts index 75da7e6..3bf49fb 100644 --- a/electron/routes/friends.ts +++ b/electron/routes/friends.ts @@ -1,11 +1,13 @@ import { pick } from "@pastable/core"; import debug from "debug"; -import { prisma } from "../db"; -import { Prisma } from "../prismaClient"; +import { getManager } from "typeorm"; +import { Friend } from "../entities/Friend"; +import { FriendName } from "../entities/FriendName"; +import { Ranking } from "../entities/Ranking"; +import { FriendDto } from "../LCU/types"; import { editSelectedFriends, persistSelectedFriends, selectedFriends } from "../selection"; -import { formatRank } from "../utils"; -const friendFields: (keyof Omit)[] = [ +const friendFields: (keyof FriendDto)[] = [ "gameName", "gameTag", "icon", @@ -15,8 +17,9 @@ const friendFields: (keyof Omit)[] = [ +export const rankingFields: (keyof Ranking)[] = [ "division", "tier", "leaguePoints", @@ -25,42 +28,40 @@ export const rankingFields: (keyof Omit)[] "miniSeriesProgress", ]; -export const getFriendsFromDb = () => - prisma.friend.findMany({ where: { isCurrentSummoner: { equals: false } } }); +export const getFriendsFromDb = () => { + const manager = getManager(); + return manager.find(Friend, { where: { isCurrentSummoner: false } }); +}; -export const getFriendsAndRankingsFromDb = () => - prisma.friend.findMany({ - where: { isCurrentSummoner: { equals: false } }, - include: { ranks: true }, +export const getFriendsAndRankingsFromDb = () => { + const manager = getManager(); + return manager.find(Friend, { + relations: ["rankings"], + where: { isCurrentSummoner: false }, }); +}; -export const getFriendAndRankingsFromDb = (puuid: Prisma.FriendCreateInput["puuid"]) => - prisma.friend.findUnique({ +export const getFriendAndRankingsFromDb = (puuid: Friend["puuid"]) => + getManager().findOne(Friend, { where: { puuid }, - include: { - ranks: { orderBy: { createdAt: "desc" } }, - oldNames: { orderBy: { createdAt: "desc" } }, - }, + relations: ["rankings", "friendNames", "notifications"], }); - export const getFriendsAndLastRankingFromDb = async () => { const friends = await getFriendsAndRankingsFromDb(); return friends.map((friend) => { - const lastRank = friend.ranks.sort( - (a, b) => b.createdAt.getTime() - a.createdAt.getTime() + const lastRank = friend.rankings.sort( + //@ts-ignore + (a, b) => b.createdAt - a.createdAt )[0]; return { - ...pick(friend, friendFields), + ...pick(friend, friendFields as any), ...(lastRank ? pick(lastRank, rankingFields) : {}), }; }); }; export const getSelectedFriends = async () => Array.from(selectedFriends.current!); -export const toggleSelectFriends = async ( - puuids: Prisma.FriendCreateInput["puuid"][], - newState: boolean -) => +export const toggleSelectFriends = async (puuids: Friend["puuid"][], newState: boolean) => editSelectedFriends(() => puuids.forEach((puuid) => selectedFriends.current?.[newState ? "add" : "delete"](puuid)) ); @@ -73,9 +74,27 @@ export const selectAllFriends = async (select: boolean) => { ); }; -export const addOrUpdateFriends = async (friends: Prisma.FriendCreateInput[]) => { - const existingFriends = await getFriendsFromDb(); +const friendDtoToFriend = (friendDto: FriendDto): Friend => { + return getManager().create(Friend, { + isCurrentSummoner: false, + + ...pick(friendDto, [ + "puuid", + "id", + "gameName", + "gameTag", + "groupId", + "groupName", + "name", + "summonerId", + "icon", + ]), + }); +}; +export const addOrUpdateFriends = async (friends: FriendDto[]) => { + const existingFriends = await getFriendsFromDb(); + const manager = getManager(); for (const friend of friends) { const friendDto = pick(friend, friendFields); const existingFriend = existingFriends.find((ef) => ef.puuid === friend.puuid); @@ -86,39 +105,34 @@ export const addOrUpdateFriends = async (friends: Prisma.FriendCreateInput[]) => friendDto.groupName !== existingFriend.groupName ) { if (friendDto.gameName !== existingFriend.gameName) { - await prisma.friendName.create({ - data: { - puuid: friendDto.puuid, - name: existingFriend.name, - }, - }); + await manager.save( + //@ts-ignore + manager.create(FriendName, { + name: existingFriend.gameName, + friend: friendDto.puuid, + }) + ); } - await prisma.friend.update({ - where: { puuid: friend.puuid }, - data: friendDto, - }); + await manager.update( + Friend, + { friend: friend.puuid }, + { ...friendDtoToFriend(friendDto) } + ); } } else { - await prisma.friend.create({ - data: friendDto, - }); + await manager.save(friendDtoToFriend(friendDto)); selectedFriends.current?.add(friendDto.puuid); } } await persistSelectedFriends(); debug("add or update ended"); }; -export const addRanking = async ( - ranking: Omit, - puuid: Prisma.FriendCreateInput["puuid"] -) => { - return prisma.ranking.create({ - data: { - ...pick(ranking, rankingFields), - puuid, - }, - }); +export const addRanking = async (ranking: Ranking, puuid: Friend["puuid"]) => { + return getManager().save( + //@ts-ignore + getManager().create(Ranking, { ...pick(ranking, rankingFields), friend: puuid }) + ); }; export const friendsApi = { diff --git a/electron/routes/index.ts b/electron/routes/index.ts index 4222377..fd17398 100644 --- a/electron/routes/index.ts +++ b/electron/routes/index.ts @@ -1,5 +1,5 @@ -import { getMatchHistoryBySummonerPuuid } from "../LCU/lcu"; -import { Prisma } from "../prismaClient"; +import { Friend } from "../entities/Friend"; +import { getAllApexLeague, getMatchHistoryBySummonerPuuid } from "../LCU/lcu"; import { sendToClient } from "../utils"; import { getFriendAndRankingsFromDb, @@ -24,7 +24,7 @@ export const sendFriendList = async () => { export const sendInvalidate = async (queryName: string) => sendToClient("invalidate", queryName); -export const sendFriendRank = async (_: any, puuid: Prisma.FriendCreateInput["puuid"]) => { +export const sendFriendRank = async (_: any, puuid: Friend["puuid"]) => { const groups = await getFriendAndRankingsFromDb(puuid); sendToClient("friendList/friend", groups); }; @@ -34,11 +34,6 @@ export const sendFriendListWithRankings = async () => { sendToClient("friendList/lastRank", groups); }; -export const sendFriendNotifications = async (_: any, puuid: Prisma.FriendCreateInput["puuid"]) => { - const groups = await getFriendNotifications(puuid); - sendToClient("notifications/friend", groups); -}; - export const sendCursoredNotifications = async (_: any, filters: NotificationFilters) => { const payload = await getCursoredNotifications(filters); sendToClient("notifications/all", payload); @@ -63,7 +58,7 @@ export const sendSelectAllFriends = async (_: any, select: boolean) => { sendSelected(); }; -export const sendMatches = async (_: any, puuid: Prisma.FriendCreateInput["puuid"]) => { +export const sendMatches = async (_: any, puuid: Friend["puuid"]) => { const matches = await getMatchHistoryBySummonerPuuid(puuid); sendToClient("friend/matches", matches); }; @@ -73,7 +68,7 @@ export const receiveToggleSelectFriends = async ( _: any, data: { type: SelectEventType; - puuids: Prisma.FriendCreateInput["puuid"] | Prisma.FriendCreateInput["puuid"][]; + puuids: Friend["puuid"] | Friend["puuid"][]; } ) => { const { type, puuids } = data; @@ -82,3 +77,8 @@ export const receiveToggleSelectFriends = async ( await toggleSelectFriends(payload, type === "add"); sendSelected(); }; + +export const sendApex = async () => { + const payload = await getAllApexLeague(); + sendToClient("config/apex", payload); +}; diff --git a/electron/routes/notifications.ts b/electron/routes/notifications.ts index f66a643..b38f1ce 100644 --- a/electron/routes/notifications.ts +++ b/electron/routes/notifications.ts @@ -1,56 +1,77 @@ import { last } from "@pastable/core"; -import { prisma } from "../db"; -import { Prisma } from "../prismaClient"; +import { getManager, In, LessThan, MoreThan, SelectQueryBuilder } from "typeorm"; +import { Friend } from "../entities/Friend"; +import { Notification } from "../entities/Notification"; import { selectedFriends } from "../selection"; -export const addNotification = (data: Prisma.NotificationUncheckedCreateInput) => - prisma.notification.create({ data }); +export const addNotification = (data: Partial) => + getManager().save(getManager().create(Notification, data)); -export const getFriendNotifications = (puuid: Prisma.FriendCreateInput["puuid"]) => - prisma.notification.findMany({ - where: { puuid }, - orderBy: { createdAt: "desc" }, - include: { friend: { select: { name: true, icon: true } } }, +export const getFriendNotifications = (puuid: Friend["puuid"]) => + getManager().find(Notification, { + where: { friend: puuid }, + order: { createdAt: "DESC" }, + relations: ["friend"], }); -export const setNotificationIsNew = (notificationsIds?: number[]) => - prisma.notification.updateMany({ - where: { - isNew: { equals: true }, - ...(notificationsIds && { id: { in: notificationsIds } }), - }, - data: { isNew: { set: false } }, - }); - +export const setNotificationIsNew = (notificationsIds?: number[]) => { + const query = getManager().createQueryBuilder().update(Notification).set({ isNew: false }); + if (notificationsIds) query.where("id IN (:...ids)", { ids: notificationsIds }); + return query.execute(); +}; export interface NotificationFilters { cursor?: number; selected?: boolean; types?: string[]; + currentMaxId?: number; } -const makeWhereFromFilters = ({ types, selected }: NotificationFilters) => ({ - puuid: { - ...(selected && - selectedFriends.current && { in: Array.from(selectedFriends.current.values()) }), - }, - ...(types?.length && { type: { in: types } }), -}); -export const getCursoredNotifications = async ({ cursor, ...filters }: NotificationFilters) => { - const content = await prisma.notification.findMany({ - take: 20, - orderBy: { createdAt: "desc" }, - include: { friend: { select: { name: true, icon: true } } }, - ...(cursor && { cursor: { id: cursor }, skip: 1 }), - where: makeWhereFromFilters(filters), - }); + +const applyFilters = (query: SelectQueryBuilder, filters: NotificationFilters) => { + const whereClauses: any[] = []; + const payload: Record = {}; + if (filters.cursor) { + whereClauses.push("notification.id < :cursor"); + payload.cursor = filters.cursor; + } + if (filters.currentMaxId) { + whereClauses.push("notification.id > :currentMaxId"); + payload.currentMaxId = filters.currentMaxId; + } + if (filters.selected && selectedFriends.current) { + whereClauses.push("friend.puuid IN (:...puuids)"); + payload.puuids = Array.from(selectedFriends.current?.values()); + } + if (filters.types?.length) { + whereClauses.push("notification.type IN (:...types)"); + payload.types = filters.types; + } + + return query + .orderBy("notification.createdAt", "DESC") + .orderBy("notification.id", "DESC") + .where(whereClauses.join(" AND "), payload); +}; + +const makeNotificationQuery = (filters: NotificationFilters) => + applyFilters( + getManager() + .createQueryBuilder(Notification, "notification") + .leftJoinAndSelect("notification.friend", "friend"), + filters + ); + +export const getCursoredNotifications = async (filters: NotificationFilters) => { + const query = makeNotificationQuery(filters).take(20); + + const content = await query.getMany(); + return { nextCursor: last(content)?.id, content }; }; -export const getNbNewNotifications = async ({ - currentMaxId, - ...filters -}: { currentMaxId: number } & NotificationFilters) => - isFinite(currentMaxId) && - prisma.notification.count({ - where: { id: { gt: currentMaxId }, ...makeWhereFromFilters(filters) }, - }); +export const getNbNewNotifications = async (filters: NotificationFilters) => { + if (!filters.currentMaxId || !isFinite(filters.currentMaxId)) return null; + const query = makeNotificationQuery(filters); + + return query.getCount(); +}; export const notificationsApi = { addNotification, diff --git a/electron/utils.ts b/electron/utils.ts index 3bd9c94..6d57f86 100644 --- a/electron/utils.ts +++ b/electron/utils.ts @@ -1,6 +1,6 @@ import debug from "debug"; import { BrowserWindow } from "electron"; -import { Prisma } from "./prismaClient"; +import { Ranking } from "./entities/Ranking"; export const sendToClient = (channel: string, ...args: any[]) => console.log(channel)! || BrowserWindow.getAllWindows()?.[0]?.webContents.send(channel, ...args); @@ -8,9 +8,7 @@ export const sendToClient = (channel: string, ...args: any[]) => export const makeDataDragonUrl = (buildVersion: string) => `https://ddragon.leagueoflegends.com/cdn/dragontail-${buildVersion}.tgz`; -export const formatRank = ( - ranking: Pick -) => +export const formatRank = (ranking: Pick) => `${ranking.tier}${ranking.division !== "NA" ? ` ${ranking.division}` : ""} - ${ ranking.leaguePoints } LPs`; @@ -47,7 +45,7 @@ export const ranks: Rank[] = [ leaguePoints: 100, }, ]; -type Tier = +export type Tier = | "IRON" | "SILVER" | "GOLD" diff --git a/lol-stalker.db b/lol-stalker.db index d11ee6d..e69de29 100644 Binary files a/lol-stalker.db and b/lol-stalker.db differ diff --git a/lol-stalking.db-journal b/lol-stalking.db-journal deleted file mode 100644 index 915c49c..0000000 Binary files a/lol-stalking.db-journal and /dev/null differ diff --git a/migration/1643628930993-dist.js b/migration/1643628930993-dist.js new file mode 100644 index 0000000..42db292 --- /dev/null +++ b/migration/1643628930993-dist.js @@ -0,0 +1,43 @@ +const { MigrationInterface, QueryRunner } = require("typeorm"); + +module.exports = class dist1643628930993 { + name = 'dist1643628930993' + + async up(queryRunner) { + await queryRunner.query(`CREATE TABLE "Ranking" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "division" text NOT NULL, "tier" text NOT NULL, "leaguePoints" integer NOT NULL, "wins" integer NOT NULL, "losses" integer NOT NULL, "miniSeriesProgress" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text)`); + await queryRunner.query(`CREATE TABLE "FriendName" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text)`); + await queryRunner.query(`CREATE TABLE "Notification" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" text NOT NULL DEFAULT (''), "from" text NOT NULL, "to" text NOT NULL, "content" text NOT NULL, "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "isNew" boolean NOT NULL DEFAULT (true), "puuid" text)`); + await queryRunner.query(`CREATE TABLE "Friend" ("puuid" text PRIMARY KEY NOT NULL, "id" text, "gameName" text NOT NULL, "gameTag" text, "groupId" integer NOT NULL DEFAULT (0), "groupName" text NOT NULL DEFAULT ('NONE'), "name" text NOT NULL, "summonerId" integer NOT NULL, "icon" integer NOT NULL, "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "isCurrentSummoner" boolean NOT NULL DEFAULT (false), CONSTRAINT "UQ_d43f820728c018eb58f22be74c6" UNIQUE ("puuid"))`); + await queryRunner.query(`CREATE TABLE "temporary_Ranking" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "division" text NOT NULL, "tier" text NOT NULL, "leaguePoints" integer NOT NULL, "wins" integer NOT NULL, "losses" integer NOT NULL, "miniSeriesProgress" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text, CONSTRAINT "FK_07dd2b585b204c4f5d9f7e458bf" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE)`); + await queryRunner.query(`INSERT INTO "temporary_Ranking"("id", "division", "tier", "leaguePoints", "wins", "losses", "miniSeriesProgress", "createdAt", "puuid") SELECT "id", "division", "tier", "leaguePoints", "wins", "losses", "miniSeriesProgress", "createdAt", "puuid" FROM "Ranking"`); + await queryRunner.query(`DROP TABLE "Ranking"`); + await queryRunner.query(`ALTER TABLE "temporary_Ranking" RENAME TO "Ranking"`); + await queryRunner.query(`CREATE TABLE "temporary_FriendName" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text, CONSTRAINT "FK_0a11f58ef016f91c3917d0620bb" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE)`); + await queryRunner.query(`INSERT INTO "temporary_FriendName"("id", "name", "createdAt", "puuid") SELECT "id", "name", "createdAt", "puuid" FROM "FriendName"`); + await queryRunner.query(`DROP TABLE "FriendName"`); + await queryRunner.query(`ALTER TABLE "temporary_FriendName" RENAME TO "FriendName"`); + await queryRunner.query(`CREATE TABLE "temporary_Notification" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" text NOT NULL DEFAULT (''), "from" text NOT NULL, "to" text NOT NULL, "content" text NOT NULL, "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "isNew" boolean NOT NULL DEFAULT (true), "puuid" text, CONSTRAINT "FK_a0f86a7dba20e7f0d9c708a65a5" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE)`); + await queryRunner.query(`INSERT INTO "temporary_Notification"("id", "type", "from", "to", "content", "createdAt", "isNew", "puuid") SELECT "id", "type", "from", "to", "content", "createdAt", "isNew", "puuid" FROM "Notification"`); + await queryRunner.query(`DROP TABLE "Notification"`); + await queryRunner.query(`ALTER TABLE "temporary_Notification" RENAME TO "Notification"`); + } + + async down(queryRunner) { + await queryRunner.query(`ALTER TABLE "Notification" RENAME TO "temporary_Notification"`); + await queryRunner.query(`CREATE TABLE "Notification" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "type" text NOT NULL DEFAULT (''), "from" text NOT NULL, "to" text NOT NULL, "content" text NOT NULL, "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "isNew" boolean NOT NULL DEFAULT (true), "puuid" text)`); + await queryRunner.query(`INSERT INTO "Notification"("id", "type", "from", "to", "content", "createdAt", "isNew", "puuid") SELECT "id", "type", "from", "to", "content", "createdAt", "isNew", "puuid" FROM "temporary_Notification"`); + await queryRunner.query(`DROP TABLE "temporary_Notification"`); + await queryRunner.query(`ALTER TABLE "FriendName" RENAME TO "temporary_FriendName"`); + await queryRunner.query(`CREATE TABLE "FriendName" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "name" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text)`); + await queryRunner.query(`INSERT INTO "FriendName"("id", "name", "createdAt", "puuid") SELECT "id", "name", "createdAt", "puuid" FROM "temporary_FriendName"`); + await queryRunner.query(`DROP TABLE "temporary_FriendName"`); + await queryRunner.query(`ALTER TABLE "Ranking" RENAME TO "temporary_Ranking"`); + await queryRunner.query(`CREATE TABLE "Ranking" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "division" text NOT NULL, "tier" text NOT NULL, "leaguePoints" integer NOT NULL, "wins" integer NOT NULL, "losses" integer NOT NULL, "miniSeriesProgress" text NOT NULL DEFAULT (''), "createdAt" datetime NOT NULL DEFAULT (CURRENT_TIMESTAMP), "puuid" text)`); + await queryRunner.query(`INSERT INTO "Ranking"("id", "division", "tier", "leaguePoints", "wins", "losses", "miniSeriesProgress", "createdAt", "puuid") SELECT "id", "division", "tier", "leaguePoints", "wins", "losses", "miniSeriesProgress", "createdAt", "puuid" FROM "temporary_Ranking"`); + await queryRunner.query(`DROP TABLE "temporary_Ranking"`); + await queryRunner.query(`DROP TABLE "Friend"`); + await queryRunner.query(`DROP TABLE "Notification"`); + await queryRunner.query(`DROP TABLE "FriendName"`); + await queryRunner.query(`DROP TABLE "Ranking"`); + } +} diff --git a/package.json b/package.json index e3b321c..8a72e21 100644 --- a/package.json +++ b/package.json @@ -18,19 +18,20 @@ }, "productName": "LoL Stalker", "scripts": { - "dev": "concurrently \"yarn dev:vite --port 3002\" \" yarn dev:electron\"", + "dev": "yarn migration:up && concurrently \"yarn dev:vite --port 3002\" \" yarn dev:electron\"", "dev:vite": "vite --https", "dev:electron": "npm run build:electron && electron .", - "build": "yarn clean && yarn migrate && npm run build:vite && npm run build:electron", + "build": "yarn clean && yarn init:db && npm run build:vite && npm run build:electron && yarn migration:up", "build:vite": "vite build", "build:electron": "tsc -p electron", "dist": "npm run build && electron-builder", "pack": "npm run build && electron-builder --dir", - "clean": "rimraf dist main src/out", + "clean": "rimraf dist main src/out database", "type-check": "tsc", + "init:db": "copyfiles ./base.db ./database && move-cli ./database/base.db ./database/lol-stalker.db", "migrate": "yarn migration:create && yarn migration:up", - "migration:create": "yarn prisma migrate dev", - "migration:up": "yarn prisma generate" + "migration:create": "yarn typeorm migration:generate -o -n dist", + "migration:up": "yarn typeorm migration:run" }, "dependencies": { "@chakra-ui/icons": "^1.1.1", @@ -38,7 +39,6 @@ "@emotion/react": "^11", "@emotion/styled": "^11", "@pastable/core": "^0.1.14", - "@prisma/client": "^3.8.0", "axios": "^0.24.0", "bull": "^4.2.1", "classnames": "^2.3.1", @@ -53,7 +53,9 @@ "react-icons": "^4.3.1", "react-query": "^3.34.8", "react-router-dom": "6", + "recharts": "^2.1.8", "sqlite3": "^5.0.2", + "typeorm": "^0.2.41", "yenv": "^3.0.1" }, "devDependencies": { @@ -67,10 +69,13 @@ "@vitejs/plugin-react-refresh": "^1.3.1", "autoprefixer": "^10.3.1", "concurrently": "^6.0.0", + "copyfiles": "^2.4.1", + "cpy-cli": "^3.1.1", "electron": "^13.1.7", "electron-builder": "^22.10.5", + "move-cli": "^2.0.0", "postcss": "^8.3.5", - "prisma": "^3.8.0", + "sqlite3-cli": "^1.0.0", "typescript": "^4.2.3", "vite": "^2.1.2" }, @@ -80,18 +85,11 @@ "main", "src/out", { - "from": "./", - "to": "main/", + "from": "./database/", + "to": "main/database/", "filter": [ "*.db" ] - }, - { - "from": "electron/prismaClient", - "to": "main/prismaClient", - "filter": [ - "*.prisma" - ] } ], "directories": { diff --git a/prisma/migrations/20220112214856_initialize/migration.sql b/prisma/migrations/20220112214856_initialize/migration.sql deleted file mode 100644 index 8bd8a0d..0000000 --- a/prisma/migrations/20220112214856_initialize/migration.sql +++ /dev/null @@ -1,22 +0,0 @@ --- CreateTable -CREATE TABLE "Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTa" TEXT NOT NULL, - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL -); - --- CreateTable -CREATE TABLE "Ranking" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "division" TEXT NOT NULL, - "tier" TEXT NOT NULL, - "leaguePoints" INTEGER NOT NULL, - "wins" INTEGER NOT NULL, - "losses" INTEGER NOT NULL, - "puuid" TEXT NOT NULL, - CONSTRAINT "Ranking_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); diff --git a/prisma/migrations/20220112215424_fix_game_tag/migration.sql b/prisma/migrations/20220112215424_fix_game_tag/migration.sql deleted file mode 100644 index fa632dd..0000000 --- a/prisma/migrations/20220112215424_fix_game_tag/migration.sql +++ /dev/null @@ -1,23 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `gameTa` on the `Friend` table. All the data in the column will be lost. - - Added the required column `gameTag` to the `Friend` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL -); -INSERT INTO "new_Friend" ("gameName", "icon", "id", "name", "puuid", "summonerId") SELECT "gameName", "icon", "id", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220112215717_feat_created_at/migration.sql b/prisma/migrations/20220112215717_feat_created_at/migration.sql deleted file mode 100644 index 63127b1..0000000 --- a/prisma/migrations/20220112215717_feat_created_at/migration.sql +++ /dev/null @@ -1,31 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); -INSERT INTO "new_Friend" ("gameName", "gameTag", "icon", "id", "name", "puuid", "summonerId") SELECT "gameName", "gameTag", "icon", "id", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -CREATE TABLE "new_Ranking" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "division" TEXT NOT NULL, - "tier" TEXT NOT NULL, - "leaguePoints" INTEGER NOT NULL, - "wins" INTEGER NOT NULL, - "losses" INTEGER NOT NULL, - "puuid" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "Ranking_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Ranking" ("division", "id", "leaguePoints", "losses", "puuid", "tier", "wins") SELECT "division", "id", "leaguePoints", "losses", "puuid", "tier", "wins" FROM "Ranking"; -DROP TABLE "Ranking"; -ALTER TABLE "new_Ranking" RENAME TO "Ranking"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220113105756_feat_groupid_series/migration.sql b/prisma/migrations/20220113105756_feat_groupid_series/migration.sql deleted file mode 100644 index 728de0c..0000000 --- a/prisma/migrations/20220113105756_feat_groupid_series/migration.sql +++ /dev/null @@ -1,33 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "groupId" INTEGER NOT NULL DEFAULT 0, - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "icon", "id", "name", "puuid", "summonerId") SELECT "createdAt", "gameName", "gameTag", "icon", "id", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -CREATE TABLE "new_Ranking" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "division" TEXT NOT NULL, - "tier" TEXT NOT NULL, - "leaguePoints" INTEGER NOT NULL, - "wins" INTEGER NOT NULL, - "losses" INTEGER NOT NULL, - "miniSeriesProgress" TEXT NOT NULL DEFAULT '', - "puuid" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "Ranking_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Ranking" ("createdAt", "division", "id", "leaguePoints", "losses", "puuid", "tier", "wins") SELECT "createdAt", "division", "id", "leaguePoints", "losses", "puuid", "tier", "wins" FROM "Ranking"; -DROP TABLE "Ranking"; -ALTER TABLE "new_Ranking" RENAME TO "Ranking"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220113110000_feat_groupname/migration.sql b/prisma/migrations/20220113110000_feat_groupname/migration.sql deleted file mode 100644 index 19c35f6..0000000 --- a/prisma/migrations/20220113110000_feat_groupname/migration.sql +++ /dev/null @@ -1,19 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "groupId" INTEGER NOT NULL DEFAULT 0, - "groupName" TEXT NOT NULL DEFAULT 'NONE', - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "groupId", "icon", "id", "name", "puuid", "summonerId") SELECT "createdAt", "gameName", "gameTag", "groupId", "icon", "id", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220113133844_feat_friend_selected/migration.sql b/prisma/migrations/20220113133844_feat_friend_selected/migration.sql deleted file mode 100644 index 596a3be..0000000 --- a/prisma/migrations/20220113133844_feat_friend_selected/migration.sql +++ /dev/null @@ -1,20 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "groupId" INTEGER NOT NULL DEFAULT 0, - "groupName" TEXT NOT NULL DEFAULT 'NONE', - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "selected" BOOLEAN NOT NULL DEFAULT true -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "name", "puuid", "summonerId") SELECT "createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220113155153_feat_game_name/migration.sql b/prisma/migrations/20220113155153_feat_game_name/migration.sql deleted file mode 100644 index 9220012..0000000 --- a/prisma/migrations/20220113155153_feat_game_name/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- CreateTable -CREATE TABLE "FriendName" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "puuid" TEXT NOT NULL, - CONSTRAINT "FriendName_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); diff --git a/prisma/migrations/20220113155320_fix_friend_name/migration.sql b/prisma/migrations/20220113155320_fix_friend_name/migration.sql deleted file mode 100644 index 17e1777..0000000 --- a/prisma/migrations/20220113155320_fix_friend_name/migration.sql +++ /dev/null @@ -1,14 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_FriendName" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "name" TEXT NOT NULL DEFAULT '', - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "puuid" TEXT NOT NULL, - CONSTRAINT "FriendName_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_FriendName" ("createdAt", "id", "puuid") SELECT "createdAt", "id", "puuid" FROM "FriendName"; -DROP TABLE "FriendName"; -ALTER TABLE "new_FriendName" RENAME TO "FriendName"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220113192041_feat_notifications/migration.sql b/prisma/migrations/20220113192041_feat_notifications/migration.sql deleted file mode 100644 index d26a616..0000000 --- a/prisma/migrations/20220113192041_feat_notifications/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ --- CreateTable -CREATE TABLE "Notification" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "content" TEXT NOT NULL, - "puuid" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "Notification_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); diff --git a/prisma/migrations/20220114114017_refactor_notifications/migration.sql b/prisma/migrations/20220114114017_refactor_notifications/migration.sql deleted file mode 100644 index f8abb72..0000000 --- a/prisma/migrations/20220114114017_refactor_notifications/migration.sql +++ /dev/null @@ -1,24 +0,0 @@ -/* - Warnings: - - - Added the required column `from` to the `Notification` table without a default value. This is not possible if the table is not empty. - - Added the required column `to` to the `Notification` table without a default value. This is not possible if the table is not empty. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Notification" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "type" TEXT NOT NULL DEFAULT '', - "from" TEXT NOT NULL, - "to" TEXT NOT NULL, - "content" TEXT NOT NULL, - "puuid" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "Notification_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Notification" ("content", "createdAt", "id", "puuid") SELECT "content", "createdAt", "id", "puuid" FROM "Notification"; -DROP TABLE "Notification"; -ALTER TABLE "new_Notification" RENAME TO "Notification"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220124185154_feat_notification_new/migration.sql b/prisma/migrations/20220124185154_feat_notification_new/migration.sql deleted file mode 100644 index a839681..0000000 --- a/prisma/migrations/20220124185154_feat_notification_new/migration.sql +++ /dev/null @@ -1,18 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Notification" ( - "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - "type" TEXT NOT NULL DEFAULT '', - "from" TEXT NOT NULL, - "to" TEXT NOT NULL, - "content" TEXT NOT NULL, - "puuid" TEXT NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "isNew" BOOLEAN NOT NULL DEFAULT true, - CONSTRAINT "Notification_puuid_fkey" FOREIGN KEY ("puuid") REFERENCES "Friend" ("puuid") ON DELETE RESTRICT ON UPDATE CASCADE -); -INSERT INTO "new_Notification" ("content", "createdAt", "from", "id", "puuid", "to", "type") SELECT "content", "createdAt", "from", "id", "puuid", "to", "type" FROM "Notification"; -DROP TABLE "Notification"; -ALTER TABLE "new_Notification" RENAME TO "Notification"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220125232502_current_summoner_rank/migration.sql b/prisma/migrations/20220125232502_current_summoner_rank/migration.sql deleted file mode 100644 index f1d7844..0000000 --- a/prisma/migrations/20220125232502_current_summoner_rank/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT NOT NULL, - "gameName" TEXT NOT NULL, - "gameTag" TEXT NOT NULL, - "groupId" INTEGER NOT NULL DEFAULT 0, - "groupName" TEXT NOT NULL DEFAULT 'NONE', - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "selected" BOOLEAN NOT NULL DEFAULT true, - "isCurrentSummoner" BOOLEAN NOT NULL DEFAULT false -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "name", "puuid", "selected", "summonerId") SELECT "createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "name", "puuid", "selected", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220125234136_optionnal_friend_fields/migration.sql b/prisma/migrations/20220125234136_optionnal_friend_fields/migration.sql deleted file mode 100644 index 2717149..0000000 --- a/prisma/migrations/20220125234136_optionnal_friend_fields/migration.sql +++ /dev/null @@ -1,21 +0,0 @@ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT, - "gameName" TEXT NOT NULL, - "gameTag" TEXT, - "groupId" INTEGER NOT NULL DEFAULT 0, - "groupName" TEXT NOT NULL DEFAULT 'NONE', - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "selected" BOOLEAN NOT NULL DEFAULT true, - "isCurrentSummoner" BOOLEAN NOT NULL DEFAULT false -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "isCurrentSummoner", "name", "puuid", "selected", "summonerId") SELECT "createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "isCurrentSummoner", "name", "puuid", "selected", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/20220128130124_remove_selected_from_db/migration.sql b/prisma/migrations/20220128130124_remove_selected_from_db/migration.sql deleted file mode 100644 index ed5f828..0000000 --- a/prisma/migrations/20220128130124_remove_selected_from_db/migration.sql +++ /dev/null @@ -1,26 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `selected` on the `Friend` table. All the data in the column will be lost. - -*/ --- RedefineTables -PRAGMA foreign_keys=OFF; -CREATE TABLE "new_Friend" ( - "puuid" TEXT NOT NULL PRIMARY KEY, - "id" TEXT, - "gameName" TEXT NOT NULL, - "gameTag" TEXT, - "groupId" INTEGER NOT NULL DEFAULT 0, - "groupName" TEXT NOT NULL DEFAULT 'NONE', - "name" TEXT NOT NULL, - "summonerId" INTEGER NOT NULL, - "icon" INTEGER NOT NULL, - "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "isCurrentSummoner" BOOLEAN NOT NULL DEFAULT false -); -INSERT INTO "new_Friend" ("createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "isCurrentSummoner", "name", "puuid", "summonerId") SELECT "createdAt", "gameName", "gameTag", "groupId", "groupName", "icon", "id", "isCurrentSummoner", "name", "puuid", "summonerId" FROM "Friend"; -DROP TABLE "Friend"; -ALTER TABLE "new_Friend" RENAME TO "Friend"; -PRAGMA foreign_key_check; -PRAGMA foreign_keys=ON; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index e5e5c47..0000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) -provider = "sqlite" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma deleted file mode 100644 index cd8e74c..0000000 --- a/prisma/schema.prisma +++ /dev/null @@ -1,63 +0,0 @@ -// This is your Prisma schema file, -// learn more about it in the docs: https://pris.ly/d/prisma-schema - -generator client { - provider = "prisma-client-js" - output = "../electron/prismaClient" - binaryTargets = ["native"] -} - -datasource db { - provider = "sqlite" - url = "file:../lol-stalker.db" -} - -model Friend { - puuid String @id - id String? - gameName String - gameTag String? - groupId Int @default(0) - groupName String @default("NONE") - name String - summonerId Int - icon Int - ranks Ranking[] - oldNames FriendName[] - notifications Notification[] - createdAt DateTime @default(now()) - isCurrentSummoner Boolean @default(false) -} - -model Ranking { - id Int @id @default(autoincrement()) - division String - tier String - leaguePoints Int - wins Int - losses Int - miniSeriesProgress String @default("") - puuid String - friend Friend @relation(fields: [puuid], references: [puuid]) - createdAt DateTime @default(now()) -} - -model FriendName { - id Int @id @default(autoincrement()) - name String @default("") - createdAt DateTime @default(now()) - puuid String - friend Friend @relation(fields: [puuid], references: [puuid]) -} - -model Notification { - id Int @id @default(autoincrement()) - type String @default("") - from String - to String - content String - puuid String - friend Friend @relation(fields: [puuid], references: [puuid]) - createdAt DateTime @default(now()) - isNew Boolean @default(true) -} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index a451c58..1dedb5d 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,7 +1,19 @@ -import { Box, Stack, StackProps } from "@chakra-ui/react"; -import { NavLink, NavLinkProps, useLocation } from "react-router-dom"; +import { ChevronRightIcon } from "@chakra-ui/icons"; +import { Box, Center, Stack, StackProps } from "@chakra-ui/react"; +import { NavLink, NavLinkProps, useLocation, useParams } from "react-router-dom"; export const navbarHeight = 60; + +const regex = /\/friend\/[a-z0-9-]*/g; +const testRegex = (str: string) => { + const match = str.match(regex); + return match && str === match[0]; +}; export const Navbar = (props: StackProps) => { + const location = useLocation(); + const hasSubMenu = testRegex(location.pathname); + + const puuid = hasSubMenu && location.pathname.replace("/friend/", ""); + return ( <> { zIndex="10" height={`${navbarHeight}px`} bgColor="blackAlpha.700" + userSelect="none" {...props} > Notifications Friendlist Options + {hasSubMenu && ( +
+ + friend + + {puuid} + +
+ )}
); diff --git a/src/features/FriendDetails/FriendDetails.tsx b/src/features/FriendDetails/FriendDetails.tsx index cf53fc2..473d52f 100644 --- a/src/features/FriendDetails/FriendDetails.tsx +++ b/src/features/FriendDetails/FriendDetails.tsx @@ -2,13 +2,21 @@ import { ArrowBackIcon } from "@chakra-ui/icons"; import { Box, Center, Flex, Spinner, Stack } from "@chakra-ui/react"; import { useState } from "react"; import { useQuery } from "react-query"; -import { useNavigate, useParams } from "react-router-dom"; +import { + useInRouterContext, + useLocation, + useNavigate, + useNavigationType, + useParams, +} from "react-router-dom"; +import { CartesianGrid } from "recharts"; import { FriendAllRanksDto, FriendDto, RankDto } from "../../types"; import { electronRequest } from "../../utils"; -import { ProfileIcon } from "../DataDragon/Profileicon"; import { FriendMatches } from "./FriendMatches"; import { FriendNotifications } from "./FriendNotifications"; import { FriendOldNames } from "./FriendOldNames"; +import { FriendRankingGraph } from "./FriendRankingGraph"; +import { Profile } from "./Profile"; import { StateTabs } from "./StateTabs"; export const formatRank = (ranking: Pick) => @@ -19,13 +27,15 @@ export const formatRank = (ranking: Pick electronRequest("friendList/friend", puuid); -type FriendDetailsState = "notifications" | "match-history"; +type FriendDetailsState = "notifications" | "match-history" | "graph" | "old-names"; export const FriendDetails = () => { const { puuid } = useParams<{ puuid: string }>(); - const [state, setState] = useState("match-history"); + const [state, setState] = useState("graph"); const navigate = useNavigate(); - const friendQuery = useQuery(["friend", puuid], () => getFriendRanks(puuid!)); + const navigationType = useNavigationType(); + + const canGoBack = navigationType === "PUSH"; if (friendQuery.isLoading) return ( @@ -44,22 +54,17 @@ export const FriendDetails = () => { return ( - navigate(-1)} /> + navigate(canGoBack ? -1 : "/")} + /> - - - - - {friend.name} - - - #{friend.gameTag} - - - - + { }; const renderComponentByState = { - notifications: (friend: FriendDto) => , + graph: (friend: FriendDto) => , + notifications: (friend: FriendDto) => , "match-history": (friend: FriendDto) => , "old-names": (friend: FriendDto) => , }; diff --git a/src/features/FriendDetails/FriendMatches.tsx b/src/features/FriendDetails/FriendMatches.tsx index d3f9871..22f1e73 100644 --- a/src/features/FriendDetails/FriendMatches.tsx +++ b/src/features/FriendDetails/FriendMatches.tsx @@ -33,14 +33,14 @@ export const FriendMatches = ({ puuid }: Pick) => { return (
- {query.isLoading ? ( - - ) : ( + {games.length ? ( {games.map((game) => ( ))} + ) : ( + <>No game )}
); diff --git a/src/features/FriendDetails/FriendNotifications.tsx b/src/features/FriendDetails/FriendNotifications.tsx index d60b3fe..ccf059f 100644 --- a/src/features/FriendDetails/FriendNotifications.tsx +++ b/src/features/FriendDetails/FriendNotifications.tsx @@ -1,24 +1,21 @@ -import { Box, Center, Spinner, Stack } from "@chakra-ui/react"; -import { useQuery } from "react-query"; -import { FriendDto, NotificationDto } from "../../types"; -import { electronRequest } from "../../utils"; +import { Box, Center } from "@chakra-ui/react"; +import { FriendDto } from "../../types"; import { NotificationItem } from "../Notifications/NotificationItem"; -const getFriendsNotifications = (puuid: FriendDto["puuid"]) => - electronRequest("notifications/friend", puuid); - -export const FriendNotifications = ({ puuid }: Pick) => { - const query = useQuery(["friendNotifications", puuid], () => getFriendsNotifications(puuid)); - - if (query.isLoading) return ; - if (query.isError) return An error has occured; - - const notifications = query.data!; +export const FriendNotifications = ({ friend }: { friend: FriendDto }) => { + const { notifications } = friend; + if (!notifications?.length) + return ( +
+ No notification +
+ ); return ( -
+
{notifications.map((notif) => ( { return !friend.oldNames?.length ? (
- No old names + No old name
) : (
diff --git a/src/features/FriendDetails/FriendRankingGraph.tsx b/src/features/FriendDetails/FriendRankingGraph.tsx new file mode 100644 index 0000000..a330c52 --- /dev/null +++ b/src/features/FriendDetails/FriendRankingGraph.tsx @@ -0,0 +1,98 @@ +import { Box, Center, Spinner } from "@chakra-ui/react"; +import { useMemo, useRef } from "react"; +import { useQuery } from "react-query"; +import { + LineChart, + XAxis, + YAxis, + Line, + ReferenceLine, + ResponsiveContainer, + Tooltip, + TooltipProps, +} from "recharts"; +import { NameType, ValueType } from "recharts/types/component/DefaultTooltipContent"; +import { FriendDto } from "../../types"; +import { + electronRequest, + getTotalLpFromRank, + LeagueApex, + makeTierData, + makeTierLps, + Tier, + TierData, +} from "../../utils"; +import { formatRank } from "./FriendDetails"; + +export const FriendRankingGraph = ({ friend }: { friend: FriendDto }) => { + const tierDataRef = useRef(null as any); + const query = useQuery("config/apex", () => electronRequest("config/apex")); + const data = useMemo(() => { + if (!query.data) return []; + tierDataRef.current = makeTierData(query.data); + return friend.rankings.map((rank) => ({ + ...rank, + totalLp: getTotalLpFromRank(rank, tierDataRef.current), + })); + }, [friend.rankings, query.data]); + + const tierLps = useMemo(() => query.data && makeTierLps(query.data), [query.data]); + if (query.isLoading) { + return ( +
+ +
+ ); + } + if (!data?.length) { + return ( +
+ No elo data +
+ ); + } + return ( + + + + } + /> + {tierLps && + Object.entries(tierLps).map(([key, val]) => ( + + ))} + + value.toLocaleDateString()} + /> + + + ); +}; +const GraphTooltip = (props: TooltipProps) => { + if (props.payload?.[0] != null) { + return {formatRank(props.payload[0].payload)}; + } + return null; +}; +const tierColors: Record = { + IRON: "#0E1720", + BRONZE: "#5F3F3C", + SILVER: "#ABB9C8", + GOLD: "#865B30", + PLATINUM: "#205B4D", + DIAMOND: "#736AB6", + MASTER: "#AF709D", + GRANDMASTER: "#A32923", + CHALLENGER: "#070D17", +}; diff --git a/src/features/FriendDetails/Profile.tsx b/src/features/FriendDetails/Profile.tsx new file mode 100644 index 0000000..873b18a --- /dev/null +++ b/src/features/FriendDetails/Profile.tsx @@ -0,0 +1,26 @@ +import { Box, chakra, Flex } from "@chakra-ui/react"; +import { last } from "@pastable/core"; +import { FriendDto } from "../../types"; +import { ProfileIcon } from "../DataDragon/Profileicon"; +import { formatRank } from "./FriendDetails"; + +export const Profile = ({ friend }: { friend: FriendDto }) => { + const lastRanking = last(friend.rankings); + return ( + + + + + + {friend.name} #{friend.gameTag} + + {lastRanking && ( + + {formatRank(lastRanking)} + + )} + + + + ); +}; diff --git a/src/features/FriendDetails/StateTabs.tsx b/src/features/FriendDetails/StateTabs.tsx index 303ff78..a8068ee 100644 --- a/src/features/FriendDetails/StateTabs.tsx +++ b/src/features/FriendDetails/StateTabs.tsx @@ -44,6 +44,7 @@ const SwitchStateButton = ({ textAlign="center" fontSize="16px" onClick={() => setState(stateName)} + userSelect="none" {...props} /> ); diff --git a/src/features/FriendList/FriendGroup.tsx b/src/features/FriendList/FriendGroup.tsx index 603d8e6..4c03078 100644 --- a/src/features/FriendList/FriendGroup.tsx +++ b/src/features/FriendList/FriendGroup.tsx @@ -84,6 +84,7 @@ export const FriendGroupRow = ({ group }: { group: FriendGroup }) => { key={friend.puuid} friend={friend} isChecked={selectedFriends.includes(friend.puuid)} + mb="10px" /> ))} @@ -107,7 +108,7 @@ export const FriendRow = ({ }; return ( - + { const { friendGroups } = useFriendList(); + console.log(friendGroups); if (!friendGroups?.length) return (
- + No friend. You can try refreshing the page (CTRL-R)
); return ( diff --git a/src/features/Notifications/NotificationItem.tsx b/src/features/Notifications/NotificationItem.tsx index e15cae8..ab588c4 100644 --- a/src/features/Notifications/NotificationItem.tsx +++ b/src/features/Notifications/NotificationItem.tsx @@ -1,6 +1,6 @@ import { Box, BoxProps, Flex } from "@chakra-ui/react"; import { useNavigate } from "react-router-dom"; -import { NotificationDto } from "../../types"; +import { FriendDto, NotificationDto } from "../../types"; import { ProfileIcon } from "../DataDragon/Profileicon"; import { formatTooltipLabel } from "./Notifications"; @@ -8,15 +8,16 @@ export const NotificationItem = ({ notification, isClickable = true, withIcon = true, + friend, }: { notification: NotificationDto; isClickable?: boolean; withIcon?: boolean; + friend?: FriendDto; }) => { const navigate = useNavigate(); const isRed = ["LOSS", "DEMOTION"].includes(notification.type); - return ( {withIcon && } @@ -29,12 +30,14 @@ export const NotificationItem = ({ textDecoration: isClickable ? "underline" : "initial", }} cursor={isClickable ? "pointer" : "initial"} - onClick={() => isClickable && navigate(`/friend/${notification.puuid}`)} + onClick={() => + isClickable && navigate(`/friend/${notification.friend.puuid}`) + } > {notification.isNew && withIcon && ( )} - {notification.friend.name} + {friend?.name || notification.friend.name} {formatNotification(notification)} @@ -44,8 +47,8 @@ export const NotificationItem = ({ {formatTooltipLabel(notification)} - {notification.createdAt?.toLocaleDateString()}{" "} - {notification.createdAt?.toLocaleTimeString()} + {new Date(notification.createdAt).toLocaleDateString()}{" "} + {new Date(notification.createdAt).toLocaleTimeString()}
diff --git a/src/features/Notifications/Notifications.tsx b/src/features/Notifications/Notifications.tsx index a6843d8..2177a7e 100644 --- a/src/features/Notifications/Notifications.tsx +++ b/src/features/Notifications/Notifications.tsx @@ -10,8 +10,9 @@ export const Notifications = () => { if (notificationsQuery.isError) return An error has occured; const notificationPages = notificationsQuery.data?.pages; - const hasData = notificationPages?.every((arr) => !!arr.nextCursor); + const hasData = notificationPages?.some((arr) => !!arr.nextCursor); + console.log(notificationPages); return ( diff --git a/src/types.ts b/src/types.ts index f986ecc..ce7fcfb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,6 +10,8 @@ export interface FriendDto { puuid: string; selected: boolean; oldNames: OldNames[]; + notifications: NotificationDto[]; + rankings: RankDto[]; } export interface OldNames { id: number; @@ -45,8 +47,8 @@ export interface NotificationDto { to: string; content: string; puuid: string; - createdAt: Date; - friend: Pick; + createdAt: number; + friend: Pick; isNew: boolean; } diff --git a/src/utils.ts b/src/utils.ts index be92760..c405c05 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -16,6 +16,7 @@ export function electronRequest(event: string, data?: any) { const tiers = [ "IRON", + "BRONZE", "SILVER", "GOLD", "PLATINUM", @@ -24,8 +25,58 @@ const tiers = [ "GRANDMASTER", "CHALLENGER", ]; +export type Tier = typeof tiers[0]; const divisions = ["IV", "III", "II", "I"]; export type MinimalRank = Pick; +export type LeagueApex = { MASTER: number; GRANDMASTER: number; CHALLENGER: number }; +export type TierData = Record; + +export const makeTierLps = (apex: LeagueApex): Record => ({ + IRON: 0, + BRONZE: 400, + SILVER: 800, + GOLD: 1200, + PLATINUM: 1600, + DIAMOND: 2000, + MASTER: 2400, + GRANDMASTER: 2400 + apex.MASTER, + CHALLENGER: 2400 + apex.MASTER + apex.GRANDMASTER, +}); + +export const makeTierData = (apex: LeagueApex) => { + return { + ...tiers.reduce( + (obj, current, index) => ({ ...obj, [current]: { nbDivision: 4, lpMax: 100 } }), + {} + ), + ...Object.entries(apex).reduce( + (obj, [key, val]) => ({ ...obj, [key]: { nbDivision: 1, lpMax: val } }), + {} + ), + } as TierData; +}; + +export const getTotalLpFromRank = (rank: RankDto, tierData: TierData) => { + let totalLp = 0; + console.log(rank); + + const tierIndex = tiers.findIndex((tier) => tier === rank.tier); + totalLp += rank.leaguePoints; + totalLp += tiers + .filter((_, index) => index < tierIndex) + .reduce((acc, tier) => acc + tierData[tier].nbDivision * tierData[tier].lpMax, 0); + + if (["MASTER", "GRANDMASTER", "CHALLENGER"].includes(rank.tier)) { + return totalLp; + } + + const divisionIndex = divisions.findIndex((division) => division === rank.division); + totalLp += divisions + .filter((_, index) => index < divisionIndex) + .reduce((acc) => acc + tierData[rank.tier].lpMax, 0); + + return totalLp; +}; export const getRankDifference = (oldRank: MinimalRank, newRank: MinimalRank) => { const sameTier = oldRank.tier === newRank.tier; const sameDivision = oldRank.division === newRank.division; diff --git a/vite.config.ts b/vite.config.ts index 138d435..8672669 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -32,8 +32,8 @@ export default ({ command }: ConfigEnv): UserConfig => { // PROD else { return { - base: `${__dirname}/src/out/`, - publicDir: `${__dirname}/public`, + base: `./`, + publicDir: `./public`, plugins: [], alias: { "/@": srcRoot, diff --git a/yarn.lock b/yarn.lock index d5a9dcb..0834d37 100644 --- a/yarn.lock +++ b/yarn.lock @@ -420,7 +420,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.6": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.6": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== @@ -1236,6 +1236,19 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@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" + integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g== + dependencies: + call-me-maybe "^1.0.1" + glob-to-regexp "^0.3.0" + +"@nodelib/fs.stat@^1.1.2": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" + integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== + "@pastable/core@^0.1.14": version "0.1.14" resolved "https://registry.yarnpkg.com/@pastable/core/-/core-0.1.14.tgz#a9bb4ef057034324fab6ab02adb35585bde2aded" @@ -1271,23 +1284,6 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.4.tgz#11d5db19bd178936ec89cd84519c4de439574398" integrity sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg== -"@prisma/client@^3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-3.8.0.tgz#b92ad9e91e8a82139e0ea1d4f3266a926d1ea97f" - integrity sha512-odYAbzfGvVWpDxhk2Yb03DlcCg6zKgJjt5admcp4xtr7u0f76B2NppC4TSGxvdQUGzPI6G37afu2oZCb/uwGfg== - dependencies: - "@prisma/engines-version" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" - -"@prisma/engines-version@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": - version "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz#4c8d9744b5e54650a8ba5fde0a711399d6adba24" - integrity sha512-G2JH6yWt6ixGKmsRmVgaQYahfwMopim0u/XLIZUo2o/mZ5jdu7+BL+2V5lZr7XiG1axhyrpvlyqE/c0OgYSl3g== - -"@prisma/engines@3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f": - version "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f.tgz#4479099b99f6a082ce5843ee7208943ccedd127f" - integrity sha512-bHYubuItSN/DGYo36aDu7xJiJmK52JOSHs4MK+KbceAtwS20BCWadRgtpQ3iZ2EXfN/B1T0iCXlNraaNwnpU2w== - "@reach/alert@0.13.2": version "0.13.2" resolved "https://registry.yarnpkg.com/@reach/alert/-/alert-0.13.2.tgz#71c4a848d51341f1d6d9eaae060975391c224870" @@ -1336,6 +1332,11 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== +"@sqltools/formatter@^1.2.2": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.3.tgz#1185726610acc37317ddab11c3c7f9066966bd20" + integrity sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg== + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1351,6 +1352,42 @@ "@types/ioredis" "*" "@types/redis" "^2.8.0" +"@types/d3-color@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82" + integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w== + +"@types/d3-interpolate@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0" + integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw== + dependencies: + "@types/d3-color" "^2" + +"@types/d3-path@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.1.tgz#ca03dfa8b94d8add97ad0cd97e96e2006b4763cb" + integrity sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw== + +"@types/d3-scale@^3.0.0": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" + integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== + dependencies: + "@types/d3-time" "^2" + +"@types/d3-shape@^2.0.0": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" + integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== + dependencies: + "@types/d3-path" "^2" + +"@types/d3-time@^2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" + integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== + "@types/debug@^4.1.5": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.6.tgz#0b7018723084918a865eff99249c490505df2163" @@ -1395,6 +1432,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + "@types/node@*", "@types/node@^16.3.3": version "16.3.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.3.3.tgz#0c30adff37bbbc7a50eb9b58fae2a504d0d88038" @@ -1467,6 +1509,11 @@ dependencies: "@types/node" "*" +"@types/resize-observer-browser@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz#d8e6c2f830e2650dc06fe74464472ff64b54a302" + integrity sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg== + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -1506,6 +1553,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/zen-observable@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.3.tgz#781d360c282436494b32fe7d9f7f8e64b3118aa3" + integrity sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw== + "@vitejs/plugin-react-refresh@^1.3.1": version "1.3.5" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react-refresh/-/plugin-react-refresh-1.3.5.tgz#be47e56d9965423968c8a6b2d62e5014e1e24478" @@ -1536,6 +1588,14 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-keywords@^3.4.1: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" @@ -1597,6 +1657,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -1639,6 +1704,11 @@ app-builder-lib@22.11.7: semver "^7.3.5" temp-file "^3.4.0" +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -1679,11 +1749,33 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +array-union@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asar@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" @@ -1811,6 +1903,14 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +better-sqlite3@^5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-5.4.3.tgz#2cb843ce14c56de9e9c0ca6b89844b7d4b5794b8" + integrity sha512-fPp+8f363qQIhuhLyjI4bu657J/FfMtgiiHKfaTsj3RWDkHlWC1yT7c6kHZDnBxzQVoAINuzg553qKmZ4F1rEw== + dependencies: + integer "^2.1.0" + tar "^4.4.10" + big-integer@^1.6.16: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" @@ -1949,6 +2049,14 @@ buffer@^5.1.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + builder-util-runtime@8.7.6: version "8.7.6" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz#4b43c96db2bd494ced7694bcd7674934655e8324" @@ -2035,11 +2143,30 @@ call-bind@^1.0.0: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-me-maybe@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" + integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + camelcase@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" @@ -2069,6 +2196,14 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" @@ -2126,16 +2261,33 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.3.1: +classnames@^2.2.5, classnames@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cli-highlight@^2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" + integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== + dependencies: + chalk "^4.0.0" + highlight.js "^10.7.1" + mz "^2.4.0" + parse5 "^5.1.1" + parse5-htmlparser2-tree-adapter "^6.0.0" + yargs "^16.0.0" + cli-truncate@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-1.1.0.tgz#2b2dfd83c53cfd3572b87fc4d430a808afb04086" @@ -2144,6 +2296,15 @@ cli-truncate@^1.1.0: slice-ansi "^1.0.0" string-width "^2.0.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -2320,6 +2481,19 @@ copy-to-clipboard@3.3.1: dependencies: toggle-selection "^1.0.6" +copyfiles@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + core-js@^3.6.5: version "3.15.2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61" @@ -2341,6 +2515,39 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +cp-file@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-7.0.0.tgz#b9454cfd07fe3b974ab9ea0e5f29655791a9b8cd" + integrity sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw== + dependencies: + graceful-fs "^4.1.2" + make-dir "^3.0.0" + nested-error-stacks "^2.0.0" + p-event "^4.1.0" + +cpy-cli@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/cpy-cli/-/cpy-cli-3.1.1.tgz#2adb06544102c948ce098e522d5b8ddcf4f7c0b4" + integrity sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg== + dependencies: + cpy "^8.0.0" + meow "^6.1.1" + +cpy@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/cpy/-/cpy-8.1.2.tgz#e339ea54797ad23f8e3919a5cffd37bfc3f25935" + integrity sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg== + dependencies: + arrify "^2.0.1" + cp-file "^7.0.0" + globby "^9.2.0" + has-glob "^1.0.0" + junk "^3.1.0" + nested-error-stacks "^2.1.0" + p-all "^2.1.0" + p-filter "^2.1.0" + p-map "^3.0.0" + crc@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" @@ -2377,6 +2584,11 @@ css-box-model@1.2.1: dependencies: tiny-invariant "^1.0.6" +css-unit-converter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.2.tgz#4c77f5a1954e6dbff60695ecb214e3270436ab21" + integrity sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA== + csstype@^3.0.2: version "3.0.8" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" @@ -2387,6 +2599,67 @@ csstype@^3.0.6: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== +d3-array@2, d3-array@^2.3.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-color@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" + integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== + +"d3-format@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" + integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== + +"d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" + integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== + dependencies: + d3-color "1 - 2" + +"d3-path@1 - 2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" + integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== + +d3-scale@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== + dependencies: + d3-array "^2.3.0" + d3-format "1 - 2" + d3-interpolate "1.2.0 - 2" + d3-time "^2.1.1" + d3-time-format "2 - 3" + +d3-shape@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f" + integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA== + dependencies: + d3-path "1 - 2" + +"d3-time-format@2 - 3": + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + dependencies: + d3-time "1 - 2" + +"d3-time@1 - 2", d3-time@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2432,6 +2705,24 @@ debuglog@^1.0.0: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= +decamelize-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js-light@^2.4.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2523,6 +2814,13 @@ dir-compare@^2.4.0: commander "2.9.0" minimatch "3.0.4" +dir-glob@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + dependencies: + path-type "^3.0.0" + dmg-builder@22.11.7: version "22.11.7" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-22.11.7.tgz#5956008c18d40ee72c0ea01ffea9590dbf51df89" @@ -2552,6 +2850,13 @@ dmg-license@^1.0.9: smart-buffer "^4.0.2" verror "^1.10.0" +dom-helpers@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" + integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== + dependencies: + "@babel/runtime" "^7.1.2" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -2569,6 +2874,11 @@ dotenv@^14.3.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + dotenv@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" @@ -2718,6 +3028,11 @@ estree-walker@^2.0.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +eventemitter3@^4.0.1: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -2790,6 +3105,23 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-equals@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-2.0.4.tgz#3add9410585e2d7364c2deeb6a707beadb24b927" + integrity sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w== + +fast-glob@^2.2.6: + version "2.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" + integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== + dependencies: + "@mrmlnc/readdir-enhanced" "^2.2.1" + "@nodelib/fs.stat" "^1.1.2" + glob-parent "^3.1.0" + is-glob "^4.0.0" + merge2 "^1.2.3" + micromatch "^3.1.10" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -2829,6 +3161,14 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + focus-lock@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.8.1.tgz#bb36968abf77a2063fa173cb6c47b12ac8599d33" @@ -2988,7 +3328,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -3046,7 +3386,23 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob@^7.0.3: +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= + +glob@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.3, glob@^7.0.5: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -3112,6 +3468,20 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" +globby@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" + integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^1.0.2" + dir-glob "^2.2.2" + fast-glob "^2.2.6" + glob "^7.1.3" + ignore "^4.0.3" + pify "^4.0.1" + slash "^2.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -3157,6 +3527,11 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3167,6 +3542,13 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-glob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-glob/-/has-glob-1.0.0.tgz#9aaa9eedbffb1ba3990a7b0010fb678ee0081207" + integrity sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc= + dependencies: + is-glob "^3.0.0" + has-symbols@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" @@ -3225,6 +3607,11 @@ hey-listen@^1.0.8: resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== +highlight.js@^10.7.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + history@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/history/-/history-5.2.0.tgz#7cdd31cf9bac3c5d31f09c231c9928fad0007b7c" @@ -3287,7 +3674,7 @@ iconv-lite@^0.6.2: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3299,6 +3686,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^4.0.3: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + import-fresh@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -3317,6 +3709,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3325,7 +3722,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, 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== @@ -3340,6 +3737,16 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +integer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/integer/-/integer-2.1.0.tgz#29134ea2f7ba3362ed4dbe6bcca992b1f18ff276" + integrity sha512-vBtiSgrEiNocWvvZX1RVfeOKa2mCHLZQ2p9nkQkQZ/BvEiY+6CcUz0eyjvIiewjJoeNidzg2I+tpPJvpyspL1w== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -3482,7 +3889,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.1.0: +is-glob@^3.0.0, is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= @@ -3534,6 +3941,11 @@ is-path-inside@^3.0.2: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -3556,6 +3968,11 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -3618,7 +4035,7 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^4.1.0: +js-yaml@^4.0.0, js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -3693,6 +4110,11 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" +junk@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" + integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== + keyblade@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/keyblade/-/keyblade-0.3.2.tgz#1e657f47746596807d6b591c53476bea9a1ac2d4" @@ -3724,7 +4146,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -3755,6 +4177,13 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -3775,7 +4204,7 @@ lodash.mergewith@4.6.2: resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== -lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.21: +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3823,6 +4252,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -3845,6 +4284,28 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" +meow@^6.0.0, meow@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" + +merge2@^1.2.3: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" @@ -3891,13 +4352,27 @@ mimic-response@^1.0.0, mimic-response@^1.0.1: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== -minimatch@3.0.4, minimatch@^3.0.4: +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -3926,13 +4401,18 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5: +"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + moment-timezone@^0.5.31: version "0.5.34" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" @@ -3945,6 +4425,14 @@ moment-timezone@^0.5.31: resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +move-cli@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/move-cli/-/move-cli-2.0.0.tgz#8228083707b9f3be4818821c2536efcc6cf63c93" + integrity sha512-/YUsTv5Gwemt9Iv2YkyVJvqphssA97I5fc2fr1Ak+Buh4pSDIPCTunx+wespnsEK3m31xVYwj8btzmdfUM90Dw== + dependencies: + meow "^6.0.0" + mv "^2.1.1" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3960,6 +4448,24 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +mv@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" + integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= + dependencies: + mkdirp "~0.5.1" + ncp "~2.0.0" + rimraf "~2.4.0" + +mz@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nan@^2.12.1: version "2.15.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" @@ -3994,6 +4500,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +ncp@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" + integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= + needle@^2.2.1: version "2.9.1" resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" @@ -4003,6 +4514,11 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" +nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz#0fbdcf3e13fe4994781280524f8b96b0cdff9c61" + integrity sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug== + node-addon-api@^1.6.3: version "1.7.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" @@ -4057,6 +4573,14 @@ node-releases@^2.0.1: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha1-2o69nzr51nYJGbJ9nNyAkqczKFk= + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + "nopt@2 || 3": version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -4153,7 +4677,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -4216,28 +4740,75 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-all@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-all/-/p-all-2.1.0.tgz#91419be56b7dee8fe4c5db875d55e0da084244a0" + integrity sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA== + dependencies: + p-map "^2.0.0" + p-cancelable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== +p-event@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.2.0.tgz#af4b049c8acd91ae81083ebd1e6f5cae2044c1b5" + integrity sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ== + dependencies: + p-timeout "^3.1.0" + +p-filter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-2.1.0.tgz#1b1472562ae7a0f742f0f3d3d3718ea66ff9c09c" + integrity sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw== + dependencies: + p-map "^2.0.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-map@^2.1.0: +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0, p-map@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== -p-timeout@^3.2.0: +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-timeout@^3.1.0, p-timeout@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== dependencies: p-finally "^1.0.0" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -4265,6 +4836,23 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5-htmlparser2-tree-adapter@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -4275,6 +4863,11 @@ path-dirname@^1.0.0: resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4290,6 +4883,13 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -4320,6 +4920,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + plist@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.2.tgz#74bbf011124b90421c22d15779cee60060ba95bc" @@ -4344,6 +4949,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" @@ -4363,13 +4973,6 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prisma@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-3.8.0.tgz#6aecfee801133d63467e1b6e17416251d5ea6e2e" - integrity sha512-xLmVyO/L6C4ZdHzHqiJVq3ZfDWSym29x75JcwJx746ps61UcNEg4ozSwN9ud7UjXLntdXe1xDLNOUO1lc7LN5g== - dependencies: - "@prisma/engines" "3.8.0-43.34df67547cf5598f5a6cd3eb45f14ee70c3fb86f" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -4424,6 +5027,18 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +raf@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4472,11 +5087,16 @@ react-icons@*, react-icons@^4.3.1: resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== -react-is@^16.7.0, react-is@^16.8.1: +react-is@^16.10.2, react-is@^16.7.0, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + react-query@^3.34.8: version "3.34.8" resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.8.tgz#a3be8523fd95f766b04c32847a1b58d8231db03c" @@ -4515,6 +5135,15 @@ react-remove-scroll@2.4.1: use-callback-ref "^1.2.3" use-sidecar "^1.0.1" +react-resize-detector@^6.6.3: + version "6.7.8" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-6.7.8.tgz#318c85d1335e50f99d4fb8eb9ec34e066db597d0" + integrity sha512-0FaEcUBAbn+pq3PT5a9hHRebUfuS1SRLGLpIw8LydU7zX429I6XJgKerKAMPsJH0qWAl6o5bVKNqFJqr6tGPYw== + dependencies: + "@types/resize-observer-browser" "^0.1.6" + lodash "^4.17.21" + resize-observer-polyfill "^1.5.1" + react-router-dom@6: version "6.2.1" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.2.1.tgz#32ec81829152fbb8a7b045bf593a22eadf019bec" @@ -4530,6 +5159,15 @@ react-router@6.2.1: dependencies: history "^5.2.0" +react-smooth@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.0.tgz#561647b33e498b2e25f449b3c6689b2e9111bf91" + integrity sha512-wK4dBBR6P21otowgMT9toZk+GngMplGS1O5gk+2WSiHEXIrQgDvhR5IIlT74Vtu//qpTcipkgo21dD7a7AUNxw== + dependencies: + fast-equals "^2.0.0" + raf "^3.4.0" + react-transition-group "2.9.0" + react-style-singleton@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.1.tgz#ce7f90b67618be2b6b94902a30aaea152ce52e66" @@ -4539,6 +5177,16 @@ react-style-singleton@^2.1.0: invariant "^2.2.4" tslib "^1.0.0" +react-transition-group@2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" + integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== + dependencies: + dom-helpers "^3.4.0" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react-lifecycles-compat "^3.0.4" + react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -4558,6 +5206,15 @@ read-config-file@6.2.0: json5 "^2.2.0" lazy-val "^1.0.4" +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -4568,7 +5225,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: 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== @@ -4581,6 +5238,16 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -4590,6 +5257,41 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== + dependencies: + decimal.js-light "^2.4.1" + +recharts@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.8.tgz#ca8774fcec5f5d7ec15dedd638db9ee12faf1c09" + integrity sha512-Wi7ufdDGyvy/BPf1za1Ok7VeWB2KtEejaewO9ulmlUhvn5l5RPS4AOkrUfhtMRTTjgJ4K6AbWMDpwtDjczUHJA== + dependencies: + "@types/d3-interpolate" "^2.0.0" + "@types/d3-scale" "^3.0.0" + "@types/d3-shape" "^2.0.0" + classnames "^2.2.5" + d3-interpolate "^2.0.0" + d3-scale "^3.0.0" + d3-shape "^2.0.0" + eventemitter3 "^4.0.1" + lodash "^4.17.19" + react-is "^16.10.2" + react-resize-detector "^6.6.3" + react-smooth "^2.0.0" + recharts-scale "^0.4.4" + reduce-css-calc "^2.1.8" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redis-commands@1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" @@ -4607,6 +5309,19 @@ redis-parser@^3.0.0: dependencies: redis-errors "^1.0.0" +reduce-css-calc@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" + integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== + dependencies: + css-unit-converter "^1.1.1" + postcss-value-parser "^3.3.0" + +reflect-metadata@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -4685,6 +5400,16 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4729,6 +5454,13 @@ rimraf@3.0.2, rimraf@^3.0.0: dependencies: glob "^7.1.3" +rimraf@~2.4.0: + version "2.4.5" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" + integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= + dependencies: + glob "^6.0.1" + roarr@^2.15.3: version "2.15.4" resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" @@ -4784,7 +5516,7 @@ sanitize-filename@^1.6.3: dependencies: truncate-utf8-bytes "^1.0.0" -sax@^1.2.4: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -4838,7 +5570,7 @@ serialize-error@^7.0.1: dependencies: type-fest "^0.13.1" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= @@ -4853,6 +5585,14 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" +sha.js@^2.4.11: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -4875,6 +5615,11 @@ signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slice-ansi@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -4999,6 +5744,14 @@ sprintf-js@^1.1.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== +sqlite3-cli@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sqlite3-cli/-/sqlite3-cli-1.0.0.tgz#96c971c78f9630cb24e49f3b81bf767a739bf27d" + integrity sha512-piiSLV24Q2odtQlyZ7d1i1JreWMVpVVgaqzrlOh3y6+lFU6PPScQ2BOeJArYX43H4L/ThoIblGiPe+xHOA7a+g== + dependencies: + better-sqlite3 "^5.4.3" + yargs "^15.1.0" + sqlite3@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" @@ -5086,6 +5839,11 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -5128,6 +5886,13 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5183,7 +5948,7 @@ tar@^2.0.0: fstream "^1.0.12" inherits "2" -tar@^4: +tar@^4, tar@^4.4.10: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== @@ -5204,6 +5969,28 @@ temp-file@^3.4.0: async-exit-hook "^2.0.1" fs-extra "^10.0.0" +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + tiny-invariant@^1.0.6: version "1.1.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" @@ -5281,6 +6068,11 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + truncate-utf8-bytes@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" @@ -5330,6 +6122,11 @@ type-fest@^0.6.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5342,6 +6139,28 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typeorm@^0.2.41: + version "0.2.41" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.41.tgz#88758101ac158dc0a0a903d70eaacea2974281cc" + integrity sha512-/d8CLJJxKPgsnrZWiMyPI0rz2MFZnBQrnQ5XP3Vu3mswv2WPexb58QM6BEtmRmlTMYN5KFWUz8SKluze+wS9xw== + dependencies: + "@sqltools/formatter" "^1.2.2" + app-root-path "^3.0.0" + buffer "^6.0.3" + chalk "^4.1.0" + cli-highlight "^2.1.11" + debug "^4.3.1" + dotenv "^8.2.0" + glob "^7.1.6" + js-yaml "^4.0.0" + mkdirp "^1.0.4" + reflect-metadata "^0.1.13" + sha.js "^2.4.11" + tslib "^2.1.0" + xml2js "^0.4.23" + yargs "^17.0.1" + zen-observable-ts "^1.0.0" + typescript@^4.2.3: version "4.3.5" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" @@ -5390,6 +6209,11 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + upath@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -5508,6 +6332,11 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + which@1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -5536,6 +6365,15 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -5565,6 +6403,14 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml2js@^0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + xmlbuilder@>=11.0.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" @@ -5575,11 +6421,26 @@ xmlbuilder@^9.0.7: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmldom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.5.0.tgz#193cb96b84aa3486127ea6272c4596354cb4962e" integrity sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA== +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -5600,6 +6461,14 @@ yaml@^1.7.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yargs-parser@^18.1.2, yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -5610,7 +6479,24 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== -yargs@^16.2.0: +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.0.0, yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== @@ -5667,3 +6553,16 @@ yenv@^3.0.1: js-yaml "^4.1.0" keyblade "^0.3.2" yargs "^17.2.1" + +zen-observable-ts@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz#2d1aa9d79b87058e9b75698b92791c1838551f83" + integrity sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA== + dependencies: + "@types/zen-observable" "0.8.3" + zen-observable "0.8.15" + +zen-observable@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==