From 393da234e457b4f5b850e101b85175ea430bc77c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 16 Nov 2023 12:57:46 -0600 Subject: [PATCH 01/74] feat: tankopedia images --- package.json | 1 + scripts/buildTankopedia.ts | 75 ++++++++++++++++++++++++++++---------- yarn.lock | 5 +++ 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index cc2eefeac..072fa109c 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "vitepress": "^1.0.0-rc.20", "vitepress-plugin-auto-sidebar": "^1.1.0", "xml-js": "^1.6.11", + "yaml": "^2.3.4", "zustand": "^4.4.1" }, "devDependencies": { diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index a028e33b0..78da26c1b 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -1,23 +1,41 @@ -import decompress from 'decompress'; -import { readFile, readdir, rm, writeFile } from 'fs/promises'; +import { cp, mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; import { load } from 'js-yaml'; +import { argv } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; +import { parse } from 'yaml'; import { NATION_IDS } from '../src/constants/nations'; -const REWRITE = false; const VEHICLE_DEFS = 'assets/Data/XML/item_defs/vehicles'; -const APK_FILE = 'temp/blitz.apk'; +const APK_FILE = argv + .find((argument) => argument.startsWith('--file')) + ?.split('=')[1]; const STRINGS = 'assets/Data/Strings'; const LANGUAGE = 'en'; -const DIRECTORIES_OF_INTEREST = [VEHICLE_DEFS, STRINGS]; +const TANK_PARAMETERS = 'assets/Data/3d/Tanks/Parameters'; +const SMALL_ICONS = 'assets/Data/Gfx/UI/BattleScreenHUD/SmallTankIcons'; +const BIG_ICONS = 'assets/Data/Gfx/UI/BigTankIcons'; +const DIRECTORIES_OF_INTEREST = [ + VEHICLE_DEFS, + STRINGS, + TANK_PARAMETERS, + SMALL_ICONS, + BIG_ICONS, +]; -if (REWRITE) { - await rm('temp/blitz', { recursive: true, force: true }); - decompress(APK_FILE, 'temp/blitz', { - filter: (file) => - DIRECTORIES_OF_INTEREST.some((dir) => file.path.startsWith(dir)), - }); -} +if (!APK_FILE) throw new Error('No file specified'); + +// console.log('Removing old Blitz files...'); +// await rm('temp/blitz', { recursive: true, force: true }); +await rm('dist/tankopedia', { recursive: true, force: true }); + +// console.log('Extracting Blitz files...'); +// await decompress(APK_FILE, 'temp/blitz', { +// filter: (file) => +// DIRECTORIES_OF_INTEREST.some((dir) => file.path.startsWith(dir)), +// }); + +console.log('Creating new tankopedia folder'); +await mkdir('dist/tankopedia'); interface BlitzkriegTankopedia { id: number; @@ -37,7 +55,7 @@ const strings = await readFile( const tankopedia: Record = {}; const nations = await readdir(`temp/blitz/${VEHICLE_DEFS}`); -await Promise.all( +Promise.all( nations .filter((nation) => nation !== 'common') .map(async (nation) => { @@ -50,10 +68,7 @@ await Promise.all( await Promise.all( Object.entries(list.root).map( async ([vehicle, vehicleData]) => { - // const vehicleXML = await readFile( - // `temp/blitz/${VEHICLE_DEFS}/${nation}/${vehicle}.xml`, - // 'utf-8', - // ).then((xml) => xml2js(xml, { compact: true }) as ElementCompact); + // Tankopedia const nationVehicleId = parseInt(list.root[vehicle].id._text); const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; // TODO: use userString property instead @@ -77,10 +92,32 @@ await Promise.all( tier, type, }; + + // Tank images + const parameterPath = `temp/blitz/${TANK_PARAMETERS}/${nation}/${vehicle}.yaml`; + const parameterString = await readFile(parameterPath, 'utf-8'); + const { smallIconPath, bigIconPath } = + parse(parameterString).resourcesPath; + + cp( + `temp/blitz/assets/Data/${(smallIconPath as string) + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp`, + `dist/tankopedia/icons/small/${id}.webp`, + ); + cp( + `temp/blitz/assets/Data/${(bigIconPath as string) + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp`, + `dist/tankopedia/icons/big/${id}.webp`, + ); }, ), ); }), +).then(() => + writeFile( + 'dist/tankopedia/tankopedia.json', + JSON.stringify(tankopedia, null, 2), + ), ); - -writeFile('dist/tankopedia.json', JSON.stringify(tankopedia, null, 2)); diff --git a/yarn.lock b/yarn.lock index 5ae1040b1..313664132 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4640,6 +4640,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" + integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== + yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" From 5bf83da726f919d870e3044d40660f0dbc861e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 20 Nov 2023 13:16:44 -0600 Subject: [PATCH 02/74] feat: ratings leaderboard efficiency plot script --- .vscode/settings.json | 1 + package.json | 1 + scripts/buildRatingsPlot.ts | 46 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 scripts/buildRatingsPlot.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 45f0cf251..c157c2994 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -25,6 +25,7 @@ "playerachievements", "playerinfo", "ratingsleaderboard", + "ratingsplot", "Resvg", "roboto", "searchclans", diff --git a/package.json b/package.json index 072fa109c..d23645902 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build:docs": "vitepress build docs", "build:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard", "build:tankopedia": "vite-node --script scripts/buildTankopedia", + "build:ratingsplot": "vite-node --script scripts/buildRatingsPlot", "dev:bot": "yarn build:bot && yarn start:bot", "dev:docs": "vitepress dev docs", "dev:website": "next dev", diff --git a/scripts/buildRatingsPlot.ts b/scripts/buildRatingsPlot.ts new file mode 100644 index 000000000..a0352a9ab --- /dev/null +++ b/scripts/buildRatingsPlot.ts @@ -0,0 +1,46 @@ +import { writeFile } from 'fs/promises'; +import { Region } from '../src/constants/regions'; +import { getRatingsNeighbors } from '../src/core/blitz/getRatingsNeighbors'; + +const REGION: Region = 'com'; +const PLAYER = 1041988373; +const ITERATIONS = 2 ** 4; +const MAX_NEIGHBORS = 2 ** 7; +const data: [number, number][] = []; +let finished = 0; + +for (let index = 0; index < ITERATIONS; index++) { + const neighbors = Math.round((Math.random() * MAX_NEIGHBORS) / 2) * 2; + const start = Date.now(); + + console.log(`🟡 Iteration ${index} with ${neighbors} neighbors`); + + try { + await getRatingsNeighbors(REGION, PLAYER, neighbors); + + finished++; + console.log( + `🟢 (${Math.round( + 100 * (finished / ITERATIONS), + )}%) Iteration ${index} with ${neighbors} neighbors`, + ); + + const end = Date.now(); + const time = end - start; + + data.push([neighbors, time]); + } catch (error) { + console.log( + `🔴 Iteration ${index} with ${neighbors} neighbors\n\n${error}`, + ); + } +} + +console.log('🟢 Done, sorting'); +data.sort(([neighborsA], [neighborsB]) => neighborsA - neighborsB); + +console.log('🟢 Writing'); +writeFile( + 'dist/ratingsPlot.csv', + data.map(([neighbors, time]) => `${neighbors},${time}`).join('\n'), +); From ca463a0f0e312a712834f9665dc0266ef1c31ed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:19:20 -0600 Subject: [PATCH 03/74] fix: removed dist package --- package.dist.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 package.dist.json diff --git a/package.dist.json b/package.dist.json deleted file mode 100644 index 9e205ed74..000000000 --- a/package.dist.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "main": "server.js", - "type": "module", - "scripts": { - "start": "node --enable-source-maps server.cjs" - } -} From 3cf81afc4aa594d0870b41e8f2c77056d1f94d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 27 Nov 2023 12:26:51 -0600 Subject: [PATCH 04/74] feat: tree type --- scripts/buildTankopedia.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index 78da26c1b..daa7d3cec 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -3,6 +3,7 @@ import { load } from 'js-yaml'; import { argv } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; +import { TreeTypeString } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; const VEHICLE_DEFS = 'assets/Data/XML/item_defs/vehicles'; @@ -42,8 +43,7 @@ interface BlitzkriegTankopedia { nation: string; name: string; name_short?: string; - is_premium: boolean; - is_collector: boolean; + tree_type: TreeTypeString; tier: number; type: string; } @@ -74,8 +74,8 @@ Promise.all( // TODO: use userString property instead const name = strings[`#${nation}_vehicles:${vehicle}`]; const name_short = strings[`#${nation}_vehicles:${vehicle}_short`]; - const is_premium = 'gold' in vehicleData.price; - const is_collector = vehicleData.sellPrice + const isPremium = 'gold' in vehicleData.price; + const isCollector = vehicleData.sellPrice ? 'gold' in vehicleData.sellPrice : false; const tier = parseInt(vehicleData.level._text); @@ -87,8 +87,11 @@ Promise.all( name, name_short, nation, - is_premium, - is_collector, + tree_type: isCollector + ? 'collector' + : isPremium + ? 'premium' + : 'tech-tree', tier, type, }; From e23f898c5f65e32e3160df289bc9059e88a95e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 27 Nov 2023 16:52:38 -0600 Subject: [PATCH 05/74] feat: assets writing --- scripts/buildRatingsLeaderboard.ts | 4 +- scripts/buildTankopedia.ts | 117 ++++++++++++++++++++++------- scripts/commitMultipleFiles.ts | 10 ++- 3 files changed, 98 insertions(+), 33 deletions(-) diff --git a/scripts/buildRatingsLeaderboard.ts b/scripts/buildRatingsLeaderboard.ts index cedf7e465..b69df4cc1 100644 --- a/scripts/buildRatingsLeaderboard.ts +++ b/scripts/buildRatingsLeaderboard.ts @@ -132,8 +132,8 @@ if (publish) { 'main', new Date().toString(), [ - { path: infoPath, content: infoJSON }, - { path: leaderboardPath, content: leaderboardJSON }, + { path: infoPath, content: infoJSON, encoding: 'utf-8' }, + { path: leaderboardPath, content: leaderboardJSON, encoding: 'utf-8' }, ], ); } else { diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index daa7d3cec..28cbd490e 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -1,15 +1,21 @@ +import { Octokit } from '@octokit/rest'; +import decompress from 'decompress'; import { cp, mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; import { load } from 'js-yaml'; -import { argv } from 'process'; +import { argv, env } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; import { TreeTypeString } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; +import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; -const VEHICLE_DEFS = 'assets/Data/XML/item_defs/vehicles'; -const APK_FILE = argv +const publish = argv.includes('--publish'); +const apkFile = argv .find((argument) => argument.startsWith('--file')) ?.split('=')[1]; +const noRewrite = argv.includes('--no-rewrite'); + +const VEHICLE_DEFS = 'assets/Data/XML/item_defs/vehicles'; const STRINGS = 'assets/Data/Strings'; const LANGUAGE = 'en'; const TANK_PARAMETERS = 'assets/Data/3d/Tanks/Parameters'; @@ -23,17 +29,20 @@ const DIRECTORIES_OF_INTEREST = [ BIG_ICONS, ]; -if (!APK_FILE) throw new Error('No file specified'); +if (!apkFile) throw new Error('No file specified'); -// console.log('Removing old Blitz files...'); -// await rm('temp/blitz', { recursive: true, force: true }); +console.log('Removing old tankopedia files...'); await rm('dist/tankopedia', { recursive: true, force: true }); +if (!noRewrite) { + console.log('Removing old temp files...'); + await rm('temp/blitz', { recursive: true, force: true }); -// console.log('Extracting Blitz files...'); -// await decompress(APK_FILE, 'temp/blitz', { -// filter: (file) => -// DIRECTORIES_OF_INTEREST.some((dir) => file.path.startsWith(dir)), -// }); + console.log('Extracting Blitz files...'); + await decompress(apkFile, 'temp/blitz', { + filter: (file) => + DIRECTORIES_OF_INTEREST.some((dir) => file.path.startsWith(dir)), + }); +} console.log('Creating new tankopedia folder'); await mkdir('dist/tankopedia'); @@ -53,6 +62,8 @@ const strings = await readFile( 'utf-8', ).then((data) => load(data) as Record); const tankopedia: Record = {}; +const tankIds: number[] = []; +const images: Record = {}; const nations = await readdir(`temp/blitz/${VEHICLE_DEFS}`); Promise.all( @@ -82,6 +93,7 @@ Promise.all( const tags = vehicleData.tags._text.split(' '); const type = tags[0]; + tankIds.push(id); tankopedia[id] = { id, name, @@ -101,26 +113,73 @@ Promise.all( const parameterString = await readFile(parameterPath, 'utf-8'); const { smallIconPath, bigIconPath } = parse(parameterString).resourcesPath; + images[id] = { + small: `temp/blitz/assets/Data/${(smallIconPath as string) + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp`, + big: `temp/blitz/assets/Data/${(bigIconPath as string) + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp`, + }; - cp( - `temp/blitz/assets/Data/${(smallIconPath as string) - .replace(/~res:\//, '') - .replace(/\..+/, '')}.packed.webp`, - `dist/tankopedia/icons/small/${id}.webp`, - ); - cp( - `temp/blitz/assets/Data/${(bigIconPath as string) - .replace(/~res:\//, '') - .replace(/\..+/, '')}.packed.webp`, - `dist/tankopedia/icons/big/${id}.webp`, - ); + if (!publish) { + cp(images[id].small, `dist/tankopedia/icons/small/${id}.webp`); + cp(images[id].big, `dist/tankopedia/icons/big/${id}.webp`); + } }, ), ); }), -).then(() => - writeFile( - 'dist/tankopedia/tankopedia.json', - JSON.stringify(tankopedia, null, 2), - ), -); +).then(async () => { + if (publish) { + const octokit = new Octokit({ auth: env.GH_TOKEN }); + + // console.log('Writing tankopedia.json'); + // commitMultipleFiles( + // octokit, + // 'tresabhi', + // 'blitzkrieg-assets', + // 'main', + // new Date().toString(), + // [ + // { + // content: JSON.stringify(tankopedia), + // path: 'tankopedia.json', + // encoding: 'utf-8', + // }, + // ], + // ); + + console.log('Writing big icons...'); + await commitMultipleFiles( + octokit, + 'tresabhi', + 'blitzkrieg-assets', + 'main', + new Date().toString(), + (await Promise.all( + tankIds.map(async (id) => { + try { + const content = await readFile(images[id].big, { + encoding: 'base64', + }); + + return { + content, + path: `icons/big/${id}.webp`, + encoding: 'base64', + }; + } catch (error) { + console.log(error); + return undefined; + } + }), + )) as FileChange[], + ); + } else { + writeFile( + 'dist/tankopedia/tankopedia.json', + JSON.stringify(tankopedia, null, 2), + ); + } +}); diff --git a/scripts/commitMultipleFiles.ts b/scripts/commitMultipleFiles.ts index f00083554..fe1b73a25 100644 --- a/scripts/commitMultipleFiles.ts +++ b/scripts/commitMultipleFiles.ts @@ -1,12 +1,18 @@ import { Octokit } from '@octokit/rest'; +export interface FileChange { + path: string; + content: string; + encoding: 'utf-8' | 'base64'; +} + export default async function commitMultipleFiles( octokit: Octokit, owner: string, repo: string, branch: string, message: string, - changes: { path: string; content: string }[], + changes: FileChange[], ) { // Get the latest commit SHA on the specified branch const { data: refData } = await octokit.git.getRef({ @@ -31,7 +37,7 @@ export default async function commitMultipleFiles( owner, repo, content: change.content, - encoding: 'utf-8', + encoding: change.encoding, }); return { From 6910f3c95eb68ef7582b858dac30c720ea026521 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 27 Nov 2023 17:50:02 -0600 Subject: [PATCH 06/74] feat: better multiple file handling --- scripts/buildTankopedia.ts | 115 +++++++++++++++++---------------- scripts/commitMultipleFiles.ts | 90 +++++++++++++++++--------- 2 files changed, 119 insertions(+), 86 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index 28cbd490e..d62c1cc24 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -9,38 +9,36 @@ import { TreeTypeString } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; +const LANGUAGE = 'en'; +const TEMP = 'temp/blitz'; + const publish = argv.includes('--publish'); const apkFile = argv .find((argument) => argument.startsWith('--file')) ?.split('=')[1]; const noRewrite = argv.includes('--no-rewrite'); -const VEHICLE_DEFS = 'assets/Data/XML/item_defs/vehicles'; -const STRINGS = 'assets/Data/Strings'; -const LANGUAGE = 'en'; -const TANK_PARAMETERS = 'assets/Data/3d/Tanks/Parameters'; -const SMALL_ICONS = 'assets/Data/Gfx/UI/BattleScreenHUD/SmallTankIcons'; -const BIG_ICONS = 'assets/Data/Gfx/UI/BigTankIcons'; -const DIRECTORIES_OF_INTEREST = [ - VEHICLE_DEFS, - STRINGS, - TANK_PARAMETERS, - SMALL_ICONS, - BIG_ICONS, -]; - if (!apkFile) throw new Error('No file specified'); +const directoriesOfInterest = { + vehicleDefinitions: 'assets/Data/XML/item_defs/vehicles', + strings: 'assets/Data/Strings', + tankParameters: 'assets/Data/3d/Tanks/Parameters', + smallIcons: 'assets/Data/Gfx/UI/BattleScreenHUD/SmallTankIcons', + bigIcons: 'assets/Data/Gfx/UI/BigTankIcons', +}; +const directoriesOfInterestArray = Object.values(directoriesOfInterest); + console.log('Removing old tankopedia files...'); await rm('dist/tankopedia', { recursive: true, force: true }); if (!noRewrite) { console.log('Removing old temp files...'); - await rm('temp/blitz', { recursive: true, force: true }); + await rm(TEMP, { recursive: true, force: true }); console.log('Extracting Blitz files...'); - await decompress(apkFile, 'temp/blitz', { + await decompress(apkFile, TEMP, { filter: (file) => - DIRECTORIES_OF_INTEREST.some((dir) => file.path.startsWith(dir)), + directoriesOfInterestArray.some((dir) => file.path.startsWith(dir)), }); } @@ -58,20 +56,22 @@ interface BlitzkriegTankopedia { } const strings = await readFile( - `temp/blitz/${STRINGS}/${LANGUAGE}.yaml`, + `${TEMP}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml`, 'utf-8', ).then((data) => load(data) as Record); const tankopedia: Record = {}; const tankIds: number[] = []; const images: Record = {}; -const nations = await readdir(`temp/blitz/${VEHICLE_DEFS}`); +const nations = await readdir( + `${TEMP}/${directoriesOfInterest.vehicleDefinitions}`, +); Promise.all( nations .filter((nation) => nation !== 'common') .map(async (nation) => { const listXML = await readFile( - `temp/blitz/${VEHICLE_DEFS}/${nation}/list.xml`, + `${TEMP}/${directoriesOfInterest.vehicleDefinitions}/${nation}/list.xml`, 'utf-8', ); const list = xml2js(listXML, { compact: true }) as ElementCompact; @@ -109,15 +109,15 @@ Promise.all( }; // Tank images - const parameterPath = `temp/blitz/${TANK_PARAMETERS}/${nation}/${vehicle}.yaml`; + const parameterPath = `${TEMP}/${directoriesOfInterest.tankParameters}/${nation}/${vehicle}.yaml`; const parameterString = await readFile(parameterPath, 'utf-8'); const { smallIconPath, bigIconPath } = parse(parameterString).resourcesPath; images[id] = { - small: `temp/blitz/assets/Data/${(smallIconPath as string) + small: `${TEMP}/assets/Data/${(smallIconPath as string) .replace(/~res:\//, '') .replace(/\..+/, '')}.packed.webp`, - big: `temp/blitz/assets/Data/${(bigIconPath as string) + big: `${TEMP}/assets/Data/${(bigIconPath as string) .replace(/~res:\//, '') .replace(/\..+/, '')}.packed.webp`, }; @@ -133,48 +133,49 @@ Promise.all( ).then(async () => { if (publish) { const octokit = new Octokit({ auth: env.GH_TOKEN }); + const tankopediaChange: FileChange = { + content: JSON.stringify(tankopedia), + path: 'tankopedia.json', + encoding: 'utf-8', + }; + const iconsChange = ( + await Promise.all( + tankIds.map(async (id) => { + try { + const [contentSmall, contentBig] = await Promise.all([ + readFile(images[id].small, { encoding: 'base64' }), + readFile(images[id].big, { encoding: 'base64' }), + ]); - // console.log('Writing tankopedia.json'); - // commitMultipleFiles( - // octokit, - // 'tresabhi', - // 'blitzkrieg-assets', - // 'main', - // new Date().toString(), - // [ - // { - // content: JSON.stringify(tankopedia), - // path: 'tankopedia.json', - // encoding: 'utf-8', - // }, - // ], - // ); + return [ + { + content: contentBig, + path: `icons/big/${id}.webp`, + encoding: 'base64', + }, + { + content: contentSmall, + path: `icons/small/${id}.webp`, + encoding: 'base64', + }, + ]; + } catch (error) { + console.log(error); + return undefined; + } + }), + ) + ).flat() as FileChange[]; - console.log('Writing big icons...'); + console.log('Writing files...'); await commitMultipleFiles( octokit, 'tresabhi', 'blitzkrieg-assets', 'main', new Date().toString(), - (await Promise.all( - tankIds.map(async (id) => { - try { - const content = await readFile(images[id].big, { - encoding: 'base64', - }); - - return { - content, - path: `icons/big/${id}.webp`, - encoding: 'base64', - }; - } catch (error) { - console.log(error); - return undefined; - } - }), - )) as FileChange[], + iconsChange, + true, ); } else { writeFile( diff --git a/scripts/commitMultipleFiles.ts b/scripts/commitMultipleFiles.ts index fe1b73a25..d24eb2a42 100644 --- a/scripts/commitMultipleFiles.ts +++ b/scripts/commitMultipleFiles.ts @@ -1,5 +1,7 @@ import { Octokit } from '@octokit/rest'; +const TIME_PER_BLOB = 2 ** 4 * 1000; + export interface FileChange { path: string; content: string; @@ -13,41 +15,71 @@ export default async function commitMultipleFiles( branch: string, message: string, changes: FileChange[], + logBlobCreation = false, ) { // Get the latest commit SHA on the specified branch - const { data: refData } = await octokit.git.getRef({ - owner, - repo, - ref: `heads/${branch}`, - }); - const latestCommitSha = refData.object.sha; + const latestCommitSha = ( + await octokit.git.getRef({ + owner, + repo, + ref: `heads/${branch}`, + }) + ).data.object.sha; // Get the tree SHA for the latest commit - const { data: commitData } = await octokit.git.getCommit({ - owner, - repo, - commit_sha: latestCommitSha, - }); - const treeSha = commitData.tree.sha; + const treeSha = ( + await octokit.git.getCommit({ + owner, + repo, + commit_sha: latestCommitSha, + }) + ).data.tree.sha; - // Create blobs for each file - const blobs = await Promise.all( - changes.map(async (change) => { - const { data: blobData } = await octokit.git.createBlob({ - owner, - repo, - content: change.content, - encoding: change.encoding, - }); + const blobs: { + sha: string; + path: string; + mode: '100644'; + type: 'blob'; + }[] = []; - return { - sha: blobData.sha, - path: change.path, - mode: '100644', - type: 'blob', - } as const; - }), - ); + for (const changeIndexString in changes) { + const changeIndex = parseInt(changeIndexString); + const change = changes[changeIndex]; + let done = false; + + while (!done) { + try { + const { sha } = ( + await octokit.git.createBlob({ + owner, + repo, + content: change.content, + encoding: change.encoding, + }) + ).data; + + blobs.push({ sha, path: change.path, mode: '100644', type: 'blob' }); + done = true; + } catch (error) { + console.warn( + `Failed blob ${changeIndex + 1} / ${ + changes.length + }; retrying in ${TIME_PER_BLOB}ms...`, + ); + + await new Promise((resolve) => setTimeout(resolve, TIME_PER_BLOB)); + } + } + + if (logBlobCreation) { + console.log( + `Created blob ${changeIndex + 1} / ${changes.length} (${( + (100 * (changeIndex + 1)) / + changes.length + ).toFixed(2)}%)`, + ); + } + } // Create a new tree with the new blobs const { data: treeData } = await octokit.git.createTree({ From bdc7132337327cebd59a10509e4dcd5fd1690f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:17:21 -0600 Subject: [PATCH 07/74] feat: use new tankopedia --- scripts/buildTankopedia.ts | 18 ++------ src/app/api/tankopedia/route.ts | 2 +- src/app/embeds/session/page.tsx | 13 +++--- src/commands/breakdown.tsx | 2 +- src/commands/eligible.ts | 2 +- src/commands/ownedTanks.tsx | 25 +++++------ src/commands/searchTanks.ts | 2 +- src/components/Tanks/components/Item.tsx | 2 +- src/components/TierWeights.tsx | 2 +- src/core/blitz/getTreeType.ts | 6 +-- src/core/blitz/resolveTankId.ts | 4 +- src/core/blitz/resolveTankName.ts | 2 +- src/core/blitzkrieg/asset.ts | 3 ++ src/core/blitzkrieg/filtersToDescription.ts | 2 +- src/core/blitzkrieg/tankIcon.ts | 5 +++ .../{blitzstars => blitzkrieg}/tankopedia.ts | 41 +++++++++++-------- src/core/blitzstars/tankAverages.ts | 2 +- src/core/discord/autocompleteTanks.ts | 2 +- src/core/statistics/filterStats.ts | 13 +++--- src/core/statistics/getTierWeights.ts | 4 +- 20 files changed, 78 insertions(+), 74 deletions(-) create mode 100644 src/core/blitzkrieg/asset.ts create mode 100644 src/core/blitzkrieg/tankIcon.ts rename src/core/{blitzstars => blitzkrieg}/tankopedia.ts (72%) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index d62c1cc24..ecbb9dccc 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -5,8 +5,8 @@ import { load } from 'js-yaml'; import { argv, env } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; -import { TreeTypeString } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; +import { BlitzkriegTankopedia, Tier } from '../src/core/blitzkrieg/tankopedia'; import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; const LANGUAGE = 'en'; @@ -45,21 +45,11 @@ if (!noRewrite) { console.log('Creating new tankopedia folder'); await mkdir('dist/tankopedia'); -interface BlitzkriegTankopedia { - id: number; - nation: string; - name: string; - name_short?: string; - tree_type: TreeTypeString; - tier: number; - type: string; -} - const strings = await readFile( `${TEMP}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml`, 'utf-8', ).then((data) => load(data) as Record); -const tankopedia: Record = {}; +const tankopedia: BlitzkriegTankopedia = {}; const tankIds: number[] = []; const images: Record = {}; const nations = await readdir( @@ -89,7 +79,7 @@ Promise.all( const isCollector = vehicleData.sellPrice ? 'gold' in vehicleData.sellPrice : false; - const tier = parseInt(vehicleData.level._text); + const tier = parseInt(vehicleData.level._text) as Tier; const tags = vehicleData.tags._text.split(' '); const type = tags[0]; @@ -174,7 +164,7 @@ Promise.all( 'blitzkrieg-assets', 'main', new Date().toString(), - iconsChange, + [tankopediaChange, ...iconsChange], true, ); } else { diff --git a/src/app/api/tankopedia/route.ts b/src/app/api/tankopedia/route.ts index 1ee08729c..370ba2f7d 100644 --- a/src/app/api/tankopedia/route.ts +++ b/src/app/api/tankopedia/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server'; -import { tankopedia } from '../../../core/blitzstars/tankopedia'; +import { tankopedia } from '../../../core/blitzkrieg/tankopedia'; export async function GET() { return NextResponse.json(await tankopedia); diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 0b75c1617..0b4cc37f9 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -6,11 +6,11 @@ import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import fetchBlitz from '../../../core/blitz/fetchBlitz'; -import { tankAverages } from '../../../core/blitzstars/tankAverages'; import { - TankopediaEntry, + BlitzkriegTankopediaEntry, tankopedia, -} from '../../../core/blitzstars/tankopedia'; +} from '../../../core/blitzkrieg/tankopedia'; +import { tankAverages } from '../../../core/blitzstars/tankAverages'; import calculateWN8 from '../../../core/statistics/calculateWN8'; import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; import getWN8Percentile from '../../../core/statistics/getWN8Percentile'; @@ -30,7 +30,7 @@ export default function SessionPage() { list: { stats: IndividualTankStats; - tankopedia?: TankopediaEntry; + tankopedia?: BlitzkriegTankopediaEntry; career: IndividualTankStats; currentWN8?: number; careerWN8?: number; @@ -299,9 +299,10 @@ export default function SessionPage() { type="tank" tankType={tankopedia?.type} treeType={(() => { - if (tankopedia?.is_collectible) + if (tankopedia?.tree_type === 'collector') return TreeTypeEnum.Collector; - if (tankopedia?.is_premium) return TreeTypeEnum.Premium; + if (tankopedia?.tree_type === 'premium') + return TreeTypeEnum.Premium; })()} stats={session.customColumns.map((customColumn) => { const rowStat = rowStats[customColumn.display]; diff --git a/src/commands/breakdown.tsx b/src/commands/breakdown.tsx index bf17273f8..694eb951e 100644 --- a/src/commands/breakdown.tsx +++ b/src/commands/breakdown.tsx @@ -10,10 +10,10 @@ import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; +import { tankopedia } from '../core/blitzkrieg/tankopedia'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { tankAverages } from '../core/blitzstars/tankAverages'; -import { tankopedia } from '../core/blitzstars/tankopedia'; import addFilterOptions from '../core/discord/addFilterOptions'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteTanks from '../core/discord/autocompleteTanks'; diff --git a/src/commands/eligible.ts b/src/commands/eligible.ts index 9dcf864a2..bb141970a 100644 --- a/src/commands/eligible.ts +++ b/src/commands/eligible.ts @@ -2,9 +2,9 @@ import { SlashCommandBuilder } from 'discord.js'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import getPeriodNow from '../core/blitzkrieg/getPeriodNow'; import getTimeDaysAgo from '../core/blitzkrieg/getTimeDaysAgo'; +import { tankopedia } from '../core/blitzkrieg/tankopedia'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { tankAverages } from '../core/blitzstars/tankAverages'; -import { tankopedia } from '../core/blitzstars/tankopedia'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import embedNegative from '../core/discord/embedNegative'; import embedPositive from '../core/discord/embedPositive'; diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 242429804..007355a03 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -10,12 +10,13 @@ import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; import { tankopediaInfo } from '../core/blitz/tankopediaInfo'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; +import { tankIcon } from '../core/blitzkrieg/tankIcon'; import { + BlitzkriegTankopediaEntry, TIER_ROMAN_NUMERALS, - TankopediaEntry, Tier, tankopedia, -} from '../core/blitzstars/tankopedia'; +} from '../core/blitzkrieg/tankopedia'; import addTierChoices from '../core/discord/addTierChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; @@ -42,12 +43,12 @@ export const ownedTanksCommand: CommandRegistry = { await Promise.all( tankStats.map(async (tankData) => ({ tankopedia: (await tankopedia)[tankData.tank_id]!, - tank_id: tankData.tank_id, + id: tankData.tank_id, })), ) ).filter((tank) => tank.tankopedia?.tier === tier); const clanAccountInfo = await getClanAccountInfo(server, id, ['clan']); - const groupedTanks: Record = {}; + const groupedTanks: Record = {}; const nations: string[] = []; filteredTanks.forEach((tank) => { @@ -94,11 +95,11 @@ export const ownedTanksCommand: CommandRegistry = { {await Promise.all( leftColumn.map(async (tank) => ( )), )} @@ -107,11 +108,11 @@ export const ownedTanksCommand: CommandRegistry = { {await Promise.all( rightColumn.map(async (tank) => ( )), )} diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index 0429c5e56..5eff8444f 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,7 +1,7 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import { TANK_NAMES_DIACRITICS } from '../core/blitzstars/tankopedia'; +import { TANK_NAMES_DIACRITICS } from '../core/blitzkrieg/tankopedia'; import addTankChoices from '../core/discord/addTankChoices'; import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index d9316cbd2..89a60db98 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -2,7 +2,7 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, -} from '../../../core/blitzstars/tankopedia'; +} from '../../../core/blitzkrieg/tankopedia'; import { theme } from '../../../stitches.config'; export enum TreeTypeEnum { diff --git a/src/components/TierWeights.tsx b/src/components/TierWeights.tsx index 61951cb41..355edbce6 100644 --- a/src/components/TierWeights.tsx +++ b/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { Tier } from '../core/blitzstars/tankopedia'; +import { Tier } from '../core/blitzkrieg/tankopedia'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; diff --git a/src/core/blitz/getTreeType.ts b/src/core/blitz/getTreeType.ts index 01db48e26..6f784129d 100644 --- a/src/core/blitz/getTreeType.ts +++ b/src/core/blitz/getTreeType.ts @@ -1,11 +1,11 @@ import { TreeTypeEnum } from '../../components/Tanks'; -import { tankopedia } from '../blitzstars/tankopedia'; +import { tankopedia } from '../blitzkrieg/tankopedia'; export default async function getTreeType(id: number) { const entry = (await tankopedia)[id]; - if (entry?.is_collectible) return TreeTypeEnum.Collector; - if (entry?.is_premium) return TreeTypeEnum.Premium; + if (entry.tree_type === 'collector') return TreeTypeEnum.Collector; + if (entry.tree_type === 'premium') return TreeTypeEnum.Premium; return TreeTypeEnum.TechTree; } diff --git a/src/core/blitz/resolveTankId.ts b/src/core/blitz/resolveTankId.ts index a3748942f..3d9e9a18b 100644 --- a/src/core/blitz/resolveTankId.ts +++ b/src/core/blitz/resolveTankId.ts @@ -1,6 +1,6 @@ import { go } from 'fuzzysort'; +import { TANKS, tankopedia } from '../blitzkrieg/tankopedia'; import { UserError } from '../blitzkrieg/userError'; -import { TANKS, tankopedia } from '../blitzstars/tankopedia'; export default async function resolveTankId(tank: string | number) { const number = typeof tank === 'string' ? parseInt(tank) : tank; @@ -16,7 +16,7 @@ export default async function resolveTankId(tank: string | number) { cause: `Could not find tank by the name "${tank}".`, }); } else { - return searchResult[0].obj.tank_id; + return searchResult[0].obj.id; } } else { if ((await tankopedia)[number]) { diff --git a/src/core/blitz/resolveTankName.ts b/src/core/blitz/resolveTankName.ts index 7954de496..8dfc2ac28 100644 --- a/src/core/blitz/resolveTankName.ts +++ b/src/core/blitz/resolveTankName.ts @@ -1,4 +1,4 @@ -import { tankopedia } from '../blitzstars/tankopedia'; +import { tankopedia } from '../blitzkrieg/tankopedia'; export default async function resolveTankName(tankId: number) { const tankopediaName = (await tankopedia)[tankId]?.name; diff --git a/src/core/blitzkrieg/asset.ts b/src/core/blitzkrieg/asset.ts new file mode 100644 index 000000000..b659a17e4 --- /dev/null +++ b/src/core/blitzkrieg/asset.ts @@ -0,0 +1,3 @@ +export function asset(path: string) { + return `https://raw.githubusercontent.com/tresabhi/blitzkrieg-assets/main/${path}`; +} diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts index 8393ac294..32c5f8ec5 100644 --- a/src/core/blitzkrieg/filtersToDescription.ts +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -1,8 +1,8 @@ import { TREE_TYPE_NAMES } from '../../components/Tanks'; import resolveTankName from '../blitz/resolveTankName'; import { tankopediaInfo } from '../blitz/tankopediaInfo'; -import { TIER_ROMAN_NUMERALS, Tier } from '../blitzstars/tankopedia'; import { StatFilters } from '../statistics/filterStats'; +import { TIER_ROMAN_NUMERALS, Tier } from './tankopedia'; export async function filtersToDescription({ nation, diff --git a/src/core/blitzkrieg/tankIcon.ts b/src/core/blitzkrieg/tankIcon.ts new file mode 100644 index 000000000..8ca97d74f --- /dev/null +++ b/src/core/blitzkrieg/tankIcon.ts @@ -0,0 +1,5 @@ +import { asset } from './asset'; + +export function tankIcon(id: number, size: 'big' | 'small' = 'big') { + return asset(`icons/${size}/${id}.webp`); +} diff --git a/src/core/blitzstars/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts similarity index 72% rename from src/core/blitzstars/tankopedia.ts rename to src/core/blitzkrieg/tankopedia.ts index faf794f6c..d3c5f52ae 100644 --- a/src/core/blitzstars/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -1,5 +1,6 @@ import { deburr } from 'lodash'; -import { context } from '../blitzkrieg/context'; +import { TreeTypeString } from '../../components/Tanks'; +import { asset } from './asset'; export interface TankopediaEntry { name: string; @@ -17,30 +18,36 @@ export interface Tankopedia { [id: number]: TankopediaEntry | undefined; } -export const tankopedia = fetch( - context === 'website' - ? '/api/tankopedia' - : 'https://www.blitzstars.com/bs-tankopedia.json', -) - .then(async (response) => response.json()) - .then((wrapperTankopedia) => - context === 'server' - ? (wrapperTankopedia as { data: Tankopedia }).data - : (wrapperTankopedia as Tankopedia), - ); -const entries = new Promise(async (resolve) => { +export interface BlitzkriegTankopediaEntry { + id: number; + nation: string; + name: string; + name_short?: string; + tree_type: TreeTypeString; + tier: Tier; + type: string; +} + +export type BlitzkriegTankopedia = Record; + +export const tankopedia = fetch(asset('tankopedia.json')).then( + async (response) => response.json() as Promise, +); +const entries = new Promise(async (resolve) => { resolve(Object.entries(await tankopedia).map(([, entry]) => entry)); }); -export const TANKS = new Promise(async (resolve) => { - resolve((await entries).map((entry) => entry)); -}); +export const TANKS = new Promise( + async (resolve) => { + resolve((await entries).map((entry) => entry)); + }, +); export const TANK_NAMES = new Promise(async (resolve) => { resolve((await entries).map(({ name }) => name)); }); export const TANK_NAMES_DIACRITICS = TANK_NAMES.then((tankNames) => Promise.all( tankNames.map(async (tankName, index) => { - const id = (await TANKS)[index].tank_id; + const { id } = (await TANKS)[index]; const name = tankName ?? `Unknown Tank ${id}`; const diacriticless = deburr(name); diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index 6316d7db9..110e1db84 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,6 +1,6 @@ import { AllStats } from '../blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; -import { tankopedia } from './tankopedia'; +import { tankopedia } from '../blitzkrieg/tankopedia'; export interface SpecialStats { winrate: number; diff --git a/src/core/discord/autocompleteTanks.ts b/src/core/discord/autocompleteTanks.ts index de74a907f..1b1c584e8 100644 --- a/src/core/discord/autocompleteTanks.ts +++ b/src/core/discord/autocompleteTanks.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { TANK_NAMES_DIACRITICS } from '../blitzstars/tankopedia'; +import { TANK_NAMES_DIACRITICS } from '../blitzkrieg/tankopedia'; import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX, diff --git a/src/core/statistics/filterStats.ts b/src/core/statistics/filterStats.ts index a0b3ecc55..172aa6ed9 100644 --- a/src/core/statistics/filterStats.ts +++ b/src/core/statistics/filterStats.ts @@ -1,7 +1,7 @@ import { TreeTypeString } from '../../components/Tanks'; +import { tankopedia } from '../blitzkrieg/tankopedia'; import { DiffedTankStats } from '../blitzstars/getStatsInPeriod'; import { tankAverages } from '../blitzstars/tankAverages'; -import { tankopedia } from '../blitzstars/tankopedia'; import calculateWN8 from './calculateWN8'; import sumStats from './sumStats'; @@ -31,14 +31,11 @@ export async function filterStats( (filters.tier === undefined || entry.tier === filters.tier) && (filters.tankType === undefined || entry.type === filters.tankType) && (filters.treeType === undefined || - (filters.treeType === 'collector' && entry.is_collectible) || - (filters.treeType === 'premium' && - entry.is_premium && - !entry.is_collectible) || + (filters.treeType === 'collector' && entry.tree_type === 'collector') || + (filters.treeType === 'premium' && entry.tree_type === 'premium') || (filters.treeType === 'tech-tree' && - !entry.is_collectible && - !entry.is_premium)) && - (filters.tank === undefined || entry.tank_id === filters.tank) + entry.tree_type === 'tech-tree')) && + (filters.tank === undefined || entry.id === filters.tank) ); }); const stats = sumStats(filteredOrder.map((id) => diff[id])); diff --git a/src/core/statistics/getTierWeights.ts b/src/core/statistics/getTierWeights.ts index a31dde982..020ea7e6b 100644 --- a/src/core/statistics/getTierWeights.ts +++ b/src/core/statistics/getTierWeights.ts @@ -1,6 +1,6 @@ import { TierWeightsRecord } from '../../components/TierWeights'; import { AllStats } from '../blitz/getAccountInfo'; -import { tankopedia } from '../blitzstars/tankopedia'; +import { tankopedia } from '../blitzkrieg/tankopedia'; export async function getTierWeights( stats: Record, @@ -9,7 +9,7 @@ export async function getTierWeights( const awaitedTankopedia = await tankopedia; const tierWeights: TierWeightsRecord = {}; - order.map((id) => { + order.forEach((id) => { const entry = awaitedTankopedia[id]; if (!entry) return; From 67e45ada85b0ecf49a8916593652afabbf35aa6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 29 Nov 2023 12:20:59 -0600 Subject: [PATCH 08/74] feat: use short tank name --- src/app/api/tankopedia/route.ts | 6 ------ src/app/embeds/session/page.tsx | 6 +++++- src/core/blitz/resolveTankName.ts | 6 ++++-- 3 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 src/app/api/tankopedia/route.ts diff --git a/src/app/api/tankopedia/route.ts b/src/app/api/tankopedia/route.ts deleted file mode 100644 index 370ba2f7d..000000000 --- a/src/app/api/tankopedia/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NextResponse } from 'next/server'; -import { tankopedia } from '../../../core/blitzkrieg/tankopedia'; - -export async function GET() { - return NextResponse.json(await tankopedia); -} diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 0b4cc37f9..eb679bc74 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -295,7 +295,11 @@ export default function SessionPage() { { diff --git a/src/core/blitz/resolveTankName.ts b/src/core/blitz/resolveTankName.ts index 8dfc2ac28..c0760926a 100644 --- a/src/core/blitz/resolveTankName.ts +++ b/src/core/blitz/resolveTankName.ts @@ -1,6 +1,8 @@ import { tankopedia } from '../blitzkrieg/tankopedia'; export default async function resolveTankName(tankId: number) { - const tankopediaName = (await tankopedia)[tankId]?.name; - return tankopediaName ? tankopediaName : `Unknown Tank ${tankId}`; + const awaitedTankopedia = await tankopedia; + const entry = awaitedTankopedia[tankId]; + + return entry?.name_short ?? entry?.name ?? `Unknown Tank ${tankId}`; } From 818ee1d4473384569beb8d5068f85048fbd8d466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:21:15 -0600 Subject: [PATCH 09/74] feat: use userstring --- scripts/buildTankopedia.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index ecbb9dccc..8bfb9a00b 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -72,9 +72,8 @@ Promise.all( // Tankopedia const nationVehicleId = parseInt(list.root[vehicle].id._text); const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; - // TODO: use userString property instead - const name = strings[`#${nation}_vehicles:${vehicle}`]; - const name_short = strings[`#${nation}_vehicles:${vehicle}_short`]; + const name = strings[vehicleData.userString._text]; + const name_short = strings[vehicleData.shortUserString._text]; const isPremium = 'gold' in vehicleData.price; const isCollector = vehicleData.sellPrice ? 'gold' in vehicleData.sellPrice @@ -83,6 +82,10 @@ Promise.all( const tags = vehicleData.tags._text.split(' '); const type = tags[0]; + // if ((name ?? name_short) === undefined) { + // console.log(vehicleData); + // } + tankIds.push(id); tankopedia[id] = { id, From f3144be382dd4741daac30fa20f766bc5c25c864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:21:20 -0600 Subject: [PATCH 10/74] feat: tankopedia website --- src/app/tools/tankopedia/page.tsx | 64 ++++++++++++++++++++++++ src/commands/searchTanks.ts | 4 +- src/components/Tanks/components/Item.tsx | 1 + src/constants/tools.ts | 1 - src/core/blitz/resolveTankId.ts | 4 +- src/core/blitzkrieg/tankopedia.ts | 12 ++--- src/core/discord/autocompleteTanks.ts | 4 +- 7 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 src/app/tools/tankopedia/page.tsx diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx new file mode 100644 index 000000000..f03653954 --- /dev/null +++ b/src/app/tools/tankopedia/page.tsx @@ -0,0 +1,64 @@ +import { Badge, Card, Flex, Text } from '@radix-ui/themes'; +import PageWrapper from '../../../components/PageWrapper'; +import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; +import { tanks } from '../../../core/blitzkrieg/tankopedia'; + +const sortedTanks = tanks.then((tanks) => + tanks.sort((a, b) => b.tier - a.tier), +); + +export default async function Page() { + const awaitedTanks = await sortedTanks; + + return ( + + {awaitedTanks.map((tank) => ( + + + + + + + {tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}`} + + + + {tank.tree_type !== 'tech-tree' && ( + + {tank.tree_type === 'collector' ? 'Collector' : 'Premium'} + + )} + + {(() => { + if (tank.type === 'AT-SPG') return 'Tank Destroyer'; + if (tank.type === 'lightTank') return 'Light Tank'; + if (tank.type === 'mediumTank') return 'Medium Tank'; + if (tank.type === 'heavyTank') return 'Heavy Tank'; + })()} + + + + + + ))} + + ); +} diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index 5eff8444f..99bc0e113 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,7 +1,7 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import { TANK_NAMES_DIACRITICS } from '../core/blitzkrieg/tankopedia'; +import { tankNamesDiacritics } from '../core/blitzkrieg/tankopedia'; import addTankChoices from '../core/discord/addTankChoices'; import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; @@ -25,7 +25,7 @@ export const searchTanksCommand: CommandRegistry = { async handler(interaction) { const tank = interaction.options.getString('tank')!; const limit = interaction.options.getInteger('limit') ?? 25; - const results = go(tank, await TANK_NAMES_DIACRITICS, { + const results = go(tank, await tankNamesDiacritics, { limit, keys: ['combined'], }).map((result) => result.obj.original); diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index 89a60db98..ce3f5ba35 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -11,6 +11,7 @@ export enum TreeTypeEnum { Collector, } +export type TankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; export type TreeTypeString = 'tech-tree' | 'premium' | 'collector'; export const TREE_TYPE_NAMES: Record = { diff --git a/src/constants/tools.ts b/src/constants/tools.ts index efcaab6a6..0bc0847fe 100644 --- a/src/constants/tools.ts +++ b/src/constants/tools.ts @@ -20,7 +20,6 @@ export const TOOLS: Tool[] = [ id: 'tankopedia', title: 'Tankopedia', description: 'Full Blitz tank encyclopedia', - disabled: true, }, { id: 'inactive', diff --git a/src/core/blitz/resolveTankId.ts b/src/core/blitz/resolveTankId.ts index 3d9e9a18b..a360e2f83 100644 --- a/src/core/blitz/resolveTankId.ts +++ b/src/core/blitz/resolveTankId.ts @@ -1,12 +1,12 @@ import { go } from 'fuzzysort'; -import { TANKS, tankopedia } from '../blitzkrieg/tankopedia'; +import { tankopedia, tanks } from '../blitzkrieg/tankopedia'; import { UserError } from '../blitzkrieg/userError'; export default async function resolveTankId(tank: string | number) { const number = typeof tank === 'string' ? parseInt(tank) : tank; if (Number.isNaN(number)) { - const searchResult = go(`${tank}`, await TANKS, { + const searchResult = go(`${tank}`, await tanks, { keys: ['name'], limit: 1, }); diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts index d3c5f52ae..26a15a04a 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -1,5 +1,5 @@ import { deburr } from 'lodash'; -import { TreeTypeString } from '../../components/Tanks'; +import { TankType, TreeTypeString } from '../../components/Tanks'; import { asset } from './asset'; export interface TankopediaEntry { @@ -25,7 +25,7 @@ export interface BlitzkriegTankopediaEntry { name_short?: string; tree_type: TreeTypeString; tier: Tier; - type: string; + type: TankType; } export type BlitzkriegTankopedia = Record; @@ -36,18 +36,18 @@ export const tankopedia = fetch(asset('tankopedia.json')).then( const entries = new Promise(async (resolve) => { resolve(Object.entries(await tankopedia).map(([, entry]) => entry)); }); -export const TANKS = new Promise( +export const tanks = new Promise( async (resolve) => { resolve((await entries).map((entry) => entry)); }, ); -export const TANK_NAMES = new Promise(async (resolve) => { +export const tankNames = new Promise(async (resolve) => { resolve((await entries).map(({ name }) => name)); }); -export const TANK_NAMES_DIACRITICS = TANK_NAMES.then((tankNames) => +export const tankNamesDiacritics = tankNames.then((tankNames) => Promise.all( tankNames.map(async (tankName, index) => { - const { id } = (await TANKS)[index]; + const { id } = (await tanks)[index]; const name = tankName ?? `Unknown Tank ${id}`; const diacriticless = deburr(name); diff --git a/src/core/discord/autocompleteTanks.ts b/src/core/discord/autocompleteTanks.ts index 1b1c584e8..1765a3bb9 100644 --- a/src/core/discord/autocompleteTanks.ts +++ b/src/core/discord/autocompleteTanks.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { TANK_NAMES_DIACRITICS } from '../blitzkrieg/tankopedia'; +import { tankNamesDiacritics } from '../blitzkrieg/tankopedia'; import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX, @@ -19,7 +19,7 @@ export default async function autocompleteTanks( await interaction.respond( focusedOption.value ? await Promise.all( - go(focusedOption.value, await TANK_NAMES_DIACRITICS, { + go(focusedOption.value, await tankNamesDiacritics, { keys: ['combined'], limit: 10, }).map(async (item) => { From bef362935a12e68b46c8793a21bd79d074f9040f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 30 Nov 2023 12:59:37 -0600 Subject: [PATCH 11/74] feat: flags --- scripts/buildTankopedia.ts | 11 ++++++---- src/app/tools/tankopedia/page.tsx | 35 ++++++++++++++++++++++--------- src/core/blitzkrieg/tankopedia.ts | 6 +++--- 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index 8bfb9a00b..051aec443 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -1,5 +1,6 @@ import { Octokit } from '@octokit/rest'; import decompress from 'decompress'; +import { writeFileSync } from 'fs'; import { cp, mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; import { load } from 'js-yaml'; import { argv, env } from 'process'; @@ -56,6 +57,8 @@ const nations = await readdir( `${TEMP}/${directoriesOfInterest.vehicleDefinitions}`, ); +writeFileSync('test.json', JSON.stringify(strings, null, 2)); + Promise.all( nations .filter((nation) => nation !== 'common') @@ -73,7 +76,7 @@ Promise.all( const nationVehicleId = parseInt(list.root[vehicle].id._text); const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; const name = strings[vehicleData.userString._text]; - const name_short = strings[vehicleData.shortUserString._text]; + const name_short = strings[vehicleData.shortUserString?._text]; const isPremium = 'gold' in vehicleData.price; const isCollector = vehicleData.sellPrice ? 'gold' in vehicleData.sellPrice @@ -82,9 +85,9 @@ Promise.all( const tags = vehicleData.tags._text.split(' '); const type = tags[0]; - // if ((name ?? name_short) === undefined) { - // console.log(vehicleData); - // } + if ((name ?? name_short) === undefined) { + console.log(vehicleData.userString._text); + } tankIds.push(id); tankopedia[id] = { diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index f03653954..a6d95cd13 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -22,22 +22,37 @@ export default async function Page() { }} > - + > + - - + {tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}`} + + {tank.tree_type !== 'tech-tree' && ( ; -export const tankopedia = fetch(asset('tankopedia.json')).then( - async (response) => response.json() as Promise, -); +export const tankopedia = fetch(asset('tankopedia.json'), { + cache: 'no-store', +}).then(async (response) => response.json() as Promise); const entries = new Promise(async (resolve) => { resolve(Object.entries(await tankopedia).map(([, entry]) => entry)); }); From 7ea5e444b345f5802274c7fa2277a2909105df54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 30 Nov 2023 18:00:48 -0600 Subject: [PATCH 12/74] feat: better icons --- src/app/tools/tankopedia/page.css.tsx | 0 src/app/tools/tankopedia/page.tsx | 132 ++++++++++++++++++-------- 2 files changed, 92 insertions(+), 40 deletions(-) create mode 100644 src/app/tools/tankopedia/page.css.tsx diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index a6d95cd13..1bd4b686f 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -1,79 +1,131 @@ -import { Badge, Card, Flex, Text } from '@radix-ui/themes'; +'use client'; + +import { blackA, slateDark } from '@radix-ui/colors'; +import { Card, Inset, Text } from '@radix-ui/themes'; +import { useEffect, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; -import { tanks } from '../../../core/blitzkrieg/tankopedia'; +import { + BlitzkriegTankopediaEntry, + tanks, +} from '../../../core/blitzkrieg/tankopedia'; const sortedTanks = tanks.then((tanks) => tanks.sort((a, b) => b.tier - a.tier), ); -export default async function Page() { - const awaitedTanks = await sortedTanks; +export default function Page() { + const [tanks, setTanks] = useState([]); + + useEffect(() => { + (async () => setTanks(await sortedTanks))(); + }, []); return ( - - {awaitedTanks.map((tank) => ( + + {tanks.map((tank) => ( - -
+ { + // get image width + const target = event.target as HTMLImageElement; + const { naturalWidth } = target; + + if (naturalWidth === 256) { + target.style.transform = 'translateX(25%)'; + } + }} + /> + +
{tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}`} -
- - - - {tank.tree_type !== 'tech-tree' && ( - - {tank.tree_type === 'collector' ? 'Collector' : 'Premium'} - - )} - - {(() => { - if (tank.type === 'AT-SPG') return 'Tank Destroyer'; - if (tank.type === 'lightTank') return 'Light Tank'; - if (tank.type === 'mediumTank') return 'Medium Tank'; - if (tank.type === 'heavyTank') return 'Heavy Tank'; - })()} - - - - +
+ ))} ); } + +{ + /* + + {tank.tree_type !== 'tech-tree' && ( + + {tank.tree_type === 'collector' ? 'Collector' : 'Premium'} + + )} + + {(() => { + if (tank.type === 'AT-SPG') return 'Tank Destroyer'; + if (tank.type === 'lightTank') return 'Light Tank'; + if (tank.type === 'mediumTank') return 'Medium Tank'; + if (tank.type === 'heavyTank') return 'Heavy Tank'; + })()} + + + */ +} From bda0c4ef1b97df115e0e65888b58770030b8b3e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:23:17 -0600 Subject: [PATCH 13/74] feat: animations on hove --- .../tankopedia/components/List/index.css.tsx | 30 ++++ .../tankopedia/components/List/index.tsx | 107 ++++++++++++++ src/app/tools/tankopedia/page.tsx | 131 +----------------- src/components/PageWrapper.tsx | 6 +- 4 files changed, 148 insertions(+), 126 deletions(-) create mode 100644 src/app/tools/tankopedia/components/List/index.css.tsx create mode 100644 src/app/tools/tankopedia/components/List/index.tsx diff --git a/src/app/tools/tankopedia/components/List/index.css.tsx b/src/app/tools/tankopedia/components/List/index.css.tsx new file mode 100644 index 000000000..0d2846c87 --- /dev/null +++ b/src/app/tools/tankopedia/components/List/index.css.tsx @@ -0,0 +1,30 @@ +import { style } from '@vanilla-extract/css'; +import { theme } from '../../../../../stitches.config'; + +export const listing = style({}); + +export const listingShadow = style({ + boxShadow: `inset 0 -128px 128px -128px ${theme.colors.appBackground1}`, + + [`.${listing}:hover &`]: { + boxShadow: `inset 0 0 128px -128px ${theme.colors.appBackground1}`, + }, +}); + +export const listingLabel = style({ + transition: `transform ${theme.durations.regular}`, + transform: 'translateY(0)', + + [`.${listing}:hover &`]: { + transform: 'translateY(200%)', + }, +}); + +export const listingImage = style({ + transition: `transform ${theme.durations.regular}`, + transform: 'translateX(25%) translateY(0)', + + [`.${listing}:hover &`]: { + transform: 'translateX(25%) translateY(10%)', + }, +}); diff --git a/src/app/tools/tankopedia/components/List/index.tsx b/src/app/tools/tankopedia/components/List/index.tsx new file mode 100644 index 000000000..2919b7e37 --- /dev/null +++ b/src/app/tools/tankopedia/components/List/index.tsx @@ -0,0 +1,107 @@ +'use client'; + +import { slateDark } from '@radix-ui/colors'; +import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; +import { Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; +import { use, useRef } from 'react'; +import { Search } from 'react-fuzzysort'; +import { tankIcon } from '../../../../../core/blitzkrieg/tankIcon'; +import { tanks } from '../../../../../core/blitzkrieg/tankopedia'; +import { theme } from '../../../../../stitches.config'; +import * as styles from './index.css'; + +export function List() { + const awaitedTanks = use( + tanks.then((tanks) => tanks.sort((a, b) => b.tier - a.tier)), + ); + const input = useRef(null); + + return ( + <> + + + + + + + + {awaitedTanks.length > 0 && ( + + ({ + node: ( + + + + + +
+ + + {tank.name_short ?? + tank.name ?? + `Unknown tank ${tank.id}`} + + + + + ), + query: `${ + tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}` + } ${tank.tree_type} ${ + tank.type === 'AT-SPG' ? 'tank destroyer' : tank.type + } ${tank.id}`, + }))} + /> + + )} + + ); +} diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 1bd4b686f..ca38f7641 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -1,131 +1,14 @@ -'use client'; - -import { blackA, slateDark } from '@radix-ui/colors'; -import { Card, Inset, Text } from '@radix-ui/themes'; -import { useEffect, useState } from 'react'; +import { Text } from '@radix-ui/themes'; +import { Suspense } from 'react'; import PageWrapper from '../../../components/PageWrapper'; -import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; -import { - BlitzkriegTankopediaEntry, - tanks, -} from '../../../core/blitzkrieg/tankopedia'; - -const sortedTanks = tanks.then((tanks) => - tanks.sort((a, b) => b.tier - a.tier), -); +import { List } from './components/List'; export default function Page() { - const [tanks, setTanks] = useState([]); - - useEffect(() => { - (async () => setTanks(await sortedTanks))(); - }, []); - return ( - - {tanks.map((tank) => ( - - - - { - // get image width - const target = event.target as HTMLImageElement; - const { naturalWidth } = target; - - if (naturalWidth === 256) { - target.style.transform = 'translateX(25%)'; - } - }} - /> - -
- - - {tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}`} - - - - - ))} + + Loading...}> + + ); } - -{ - /* - - {tank.tree_type !== 'tech-tree' && ( - - {tank.tree_type === 'collector' ? 'Collector' : 'Premium'} - - )} - - {(() => { - if (tank.type === 'AT-SPG') return 'Tank Destroyer'; - if (tank.type === 'lightTank') return 'Light Tank'; - if (tank.type === 'mediumTank') return 'Medium Tank'; - if (tank.type === 'heavyTank') return 'Heavy Tank'; - })()} - - - */ -} diff --git a/src/components/PageWrapper.tsx b/src/components/PageWrapper.tsx index 666937af3..df8f10e84 100644 --- a/src/components/PageWrapper.tsx +++ b/src/components/PageWrapper.tsx @@ -3,28 +3,30 @@ import { ComponentProps } from 'react'; interface PageWrapperProps extends ComponentProps { color?: ComponentProps['accentColor']; + size?: 'regular' | 'wide'; } export default function PageWrapper({ style, color, + size = 'regular', ...props }: PageWrapperProps) { return ( ); From 48578407db0984098561fa3ef821e926b65b2d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 1 Dec 2023 12:36:31 -0600 Subject: [PATCH 14/74] feat: icons --- .../tankopedia/components/List/index.tsx | 61 +++++++++++++------ src/core/blitzkrieg/tankopedia.ts | 6 +- 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/app/tools/tankopedia/components/List/index.tsx b/src/app/tools/tankopedia/components/List/index.tsx index 2919b7e37..0f83a9695 100644 --- a/src/app/tools/tankopedia/components/List/index.tsx +++ b/src/app/tools/tankopedia/components/List/index.tsx @@ -6,7 +6,12 @@ import { Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; import { use, useRef } from 'react'; import { Search } from 'react-fuzzysort'; import { tankIcon } from '../../../../../core/blitzkrieg/tankIcon'; -import { tanks } from '../../../../../core/blitzkrieg/tankopedia'; +import { + TANK_ICONS, + TANK_ICONS_COLLECTOR, + TANK_ICONS_PREMIUM, + tanks, +} from '../../../../../core/blitzkrieg/tankopedia'; import { theme } from '../../../../../stitches.config'; import * as styles from './index.css'; @@ -64,31 +69,49 @@ export function List() { }} /> - - {tank.name_short ?? - tank.name ?? - `Unknown tank ${tank.id}`} - + + + {tank.name_short ?? + tank.name ?? + `Unknown tank ${tank.id}`} + + diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts index 96260cdca..dee09b571 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -61,21 +61,21 @@ export const tankNamesDiacritics = tankNames.then((tankNames) => ), ); -export const TANK_ICONS: Record = { +export const TANK_ICONS: Record = { 'AT-SPG': 'https://i.imgur.com/BIHSEH0.png', lightTank: 'https://i.imgur.com/CSNha5V.png', mediumTank: 'https://i.imgur.com/wvf3ltm.png', heavyTank: 'https://i.imgur.com/ECeqlZa.png', }; -export const TANK_ICONS_PREMIUM: Record = { +export const TANK_ICONS_PREMIUM: Record = { 'AT-SPG': 'https://i.imgur.com/TCu3EdR.png', lightTank: 'https://i.imgur.com/zdkpTRb.png', mediumTank: 'https://i.imgur.com/3z7eHX6.png', heavyTank: 'https://i.imgur.com/P3vbmyA.png', }; -export const TANK_ICONS_COLLECTOR: Record = { +export const TANK_ICONS_COLLECTOR: Record = { 'AT-SPG': 'https://i.imgur.com/WTjeirB.png', lightTank: 'https://i.imgur.com/EwhtKkU.png', mediumTank: 'https://i.imgur.com/u8YDMBh.png', From 17935fbe89506a1f498a6f8dbf41cc2d060721b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 09:55:57 -0600 Subject: [PATCH 15/74] feat: better contrast --- src/app/tools/tankopedia/components/List/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/tools/tankopedia/components/List/index.tsx b/src/app/tools/tankopedia/components/List/index.tsx index 0f83a9695..dcacec1c1 100644 --- a/src/app/tools/tankopedia/components/List/index.tsx +++ b/src/app/tools/tankopedia/components/List/index.tsx @@ -103,7 +103,7 @@ export function List() { style={{ color: tank.tree_type === 'tech-tree' - ? slateDark.slate11 + ? slateDark.slate12 : undefined, }} > From d1fb5da0028d47667a62691843b7a9d1e5286f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 09:56:08 -0600 Subject: [PATCH 16/74] feat: flags path --- scripts/buildTankopedia.ts | 91 ++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 43 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index 051aec443..14f79b7f9 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -8,7 +8,6 @@ import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; import { NATION_IDS } from '../src/constants/nations'; import { BlitzkriegTankopedia, Tier } from '../src/core/blitzkrieg/tankopedia'; -import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; const LANGUAGE = 'en'; const TEMP = 'temp/blitz'; @@ -27,6 +26,7 @@ const directoriesOfInterest = { tankParameters: 'assets/Data/3d/Tanks/Parameters', smallIcons: 'assets/Data/Gfx/UI/BattleScreenHUD/SmallTankIcons', bigIcons: 'assets/Data/Gfx/UI/BigTankIcons', + flags: 'assets/Data/Gfx/Lobby/flags', }; const directoriesOfInterestArray = Object.values(directoriesOfInterest); @@ -129,50 +129,55 @@ Promise.all( ).then(async () => { if (publish) { const octokit = new Octokit({ auth: env.GH_TOKEN }); - const tankopediaChange: FileChange = { - content: JSON.stringify(tankopedia), - path: 'tankopedia.json', - encoding: 'utf-8', - }; - const iconsChange = ( - await Promise.all( - tankIds.map(async (id) => { - try { - const [contentSmall, contentBig] = await Promise.all([ - readFile(images[id].small, { encoding: 'base64' }), - readFile(images[id].big, { encoding: 'base64' }), - ]); + // const tankopediaChange: FileChange = { + // content: JSON.stringify(tankopedia), + // path: 'tankopedia.json', + // encoding: 'utf-8', + // }; + // const iconsChange = ( + // await Promise.all( + // tankIds.map(async (id) => { + // try { + // const [contentSmall, contentBig] = await Promise.all([ + // readFile(images[id].small, { encoding: 'base64' }), + // readFile(images[id].big, { encoding: 'base64' }), + // ]); - return [ - { - content: contentBig, - path: `icons/big/${id}.webp`, - encoding: 'base64', - }, - { - content: contentSmall, - path: `icons/small/${id}.webp`, - encoding: 'base64', - }, - ]; - } catch (error) { - console.log(error); - return undefined; - } - }), - ) - ).flat() as FileChange[]; + // return [ + // { + // content: contentBig, + // path: `icons/big/${id}.webp`, + // encoding: 'base64', + // }, + // { + // content: contentSmall, + // path: `icons/small/${id}.webp`, + // encoding: 'base64', + // }, + // ]; + // } catch (error) { + // console.log(error); + // return undefined; + // } + // }), + // ) + // ).flat() as FileChange[]; + const flagChanges = await readdir( + `${TEMP}/${directoriesOfInterest.flags}`, + ).then((flags) => flags.filter((flag) => flag.startsWith('flag_text'))); - console.log('Writing files...'); - await commitMultipleFiles( - octokit, - 'tresabhi', - 'blitzkrieg-assets', - 'main', - new Date().toString(), - [tankopediaChange, ...iconsChange], - true, - ); + console.log(flagChanges); + + // console.log('Writing files...'); + // await commitMultipleFiles( + // octokit, + // 'tresabhi', + // 'blitzkrieg-assets', + // 'main', + // new Date().toString(), + // [tankopediaChange, ...iconsChange], + // true, + // ); } else { writeFile( 'dist/tankopedia/tankopedia.json', From 86664b5491756af07e358e5e34f8a98a0e6b9e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:16:49 -0600 Subject: [PATCH 17/74] feat: updated dependencies --- package.json | 6 +- tsconfig.json | 2 +- yarn.lock | 2918 +++++++++++++++++++++++++++++++------------------ 3 files changed, 1878 insertions(+), 1048 deletions(-) diff --git a/package.json b/package.json index ac95dc249..43982a098 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@prisma/client": "^5.4.1", "@radix-ui/colors": "^3.0.0-rc.4", "@radix-ui/react-icons": "^1.3.0", - "@radix-ui/themes": "^1.1.2", + "@radix-ui/themes": "^2.0.1", "@resvg/resvg-js": "^2.4.1", "@vanilla-extract/css": "^1.13.0", "bepaint": "^0.1.0-beta.3", @@ -46,7 +46,7 @@ "js-yaml": "^4.1.0", "lodash": "^4.17.21", "markdown-escape": "^2.0.0", - "next": "^13.5.2", + "next": "^14.0.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-fuzzysort": "^1.0.1", @@ -70,7 +70,7 @@ "@types/react": "^18.2.22", "@vanilla-extract/next-plugin": "^2.3.1", "compare-versions": "^6.1.0", - "knip": "^2.27.1", + "knip": "^3.4.0", "prettier": "^3.0.3", "prisma": "^5.4.1", "typescript": "^5.2.2" diff --git a/tsconfig.json b/tsconfig.json index 247c2639e..ee57cddeb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,5 +21,5 @@ ] }, "include": ["src/**/*", ".next/types/**/*.ts", "dist/website/types/**/*.ts"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "dist"] } diff --git a/yarn.lock b/yarn.lock index 313664132..e827f3060 100644 --- a/yarn.lock +++ b/yarn.lock @@ -141,56 +141,46 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" "@babel/compat-data@^7.22.9": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" - integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" + integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.20.7": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" - integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" + integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.20" - "@babel/helpers" "^7.22.15" - "@babel/parser" "^7.22.16" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.5" + "@babel/parser" "^7.23.5" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.20" - "@babel/types" "^7.22.19" - convert-source-map "^1.7.0" + "@babel/traverse" "^7.23.5" + "@babel/types" "^7.23.5" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" - integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== +"@babel/generator@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" + integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== dependencies: - "@babel/types" "^7.22.15" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== - dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -233,10 +223,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" - integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -263,67 +253,55 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== -"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" - integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" + integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" - integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== +"@babel/helpers@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" + integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.23.5" + "@babel/types" "^7.23.5" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.20.15", "@babel/parser@^7.21.3", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": - version "7.22.16" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" - integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== - -"@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" + integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== "@babel/plugin-syntax-typescript@^7.20.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/runtime@^7.12.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" - integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.13.10": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" + integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== dependencies: regenerator-runtime "^0.14.0" @@ -336,99 +314,95 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" + integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.23.5" + "@babel/types" "^7.23.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" - integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" + integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@discordjs/builders@^1.6.5": - version "1.6.5" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.6.5.tgz#3e23912eaab1d542b61ca0fa7202e5aaef2b7200" - integrity sha512-SdweyCs/+mHj+PNhGLLle7RrRFX9ZAhzynHahMCLqp5Zeq7np7XC6/mgzHc79QoVlQ1zZtOkTTiJpOZu5V8Ufg== +"@discordjs/builders@^1.7.0": + version "1.7.0" + resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37" + integrity sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw== dependencies: - "@discordjs/formatters" "^0.3.2" - "@discordjs/util" "^1.0.1" - "@sapphire/shapeshift" "^3.9.2" - discord-api-types "0.37.50" + "@discordjs/formatters" "^0.3.3" + "@discordjs/util" "^1.0.2" + "@sapphire/shapeshift" "^3.9.3" + discord-api-types "0.37.61" fast-deep-equal "^3.1.3" ts-mixer "^6.0.3" - tslib "^2.6.1" + tslib "^2.6.2" -"@discordjs/collection@^1.5.3": +"@discordjs/collection@1.5.3": version "1.5.3" resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== -"@discordjs/formatters@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.2.tgz#3ae054f7b3097cc0dc7645fade37a3f20fa1fb4b" - integrity sha512-lE++JZK8LSSDRM5nLjhuvWhGuKiXqu+JZ/DsOR89DVVia3z9fdCJVcHF2W/1Zxgq0re7kCzmAJlCMMX3tetKpA== - dependencies: - discord-api-types "0.37.50" +"@discordjs/collection@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.0.0.tgz#409b80c74eb8486cc4ee6a9b83426aaff1380f8c" + integrity sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w== -"@discordjs/rest@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.0.1.tgz#100c208a964e54b8d7cd418bbaed279c816b8ec5" - integrity sha512-/eWAdDRvwX/rIE2tuQUmKaxmWeHmGealttIzGzlYfI4+a7y9b6ZoMp8BG/jaohs8D8iEnCNYaZiOFLVFLQb8Zg== +"@discordjs/formatters@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.3.tgz#b16fdd79bb819680ab7e519193004e9dc124a749" + integrity sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w== dependencies: - "@discordjs/collection" "^1.5.3" - "@discordjs/util" "^1.0.1" + discord-api-types "0.37.61" + +"@discordjs/rest@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.2.0.tgz#f4ec00d3faff965c00a879b7e87bb4b6f4446966" + integrity sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A== + dependencies: + "@discordjs/collection" "^2.0.0" + "@discordjs/util" "^1.0.2" "@sapphire/async-queue" "^1.5.0" "@sapphire/snowflake" "^3.5.1" "@vladfrangu/async_event_emitter" "^2.2.2" - discord-api-types "0.37.50" - magic-bytes.js "^1.0.15" - tslib "^2.6.1" - undici "5.22.1" + discord-api-types "0.37.61" + magic-bytes.js "^1.5.0" + tslib "^2.6.2" + undici "5.27.2" -"@discordjs/util@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.1.tgz#7d6f97b65425d3a8b46ea1180150dee6991a88cf" - integrity sha512-d0N2yCxB8r4bn00/hvFZwM7goDcUhtViC5un4hPj73Ba4yrChLSJD8fy7Ps5jpTLg1fE9n4K0xBLc1y9WGwSsA== +"@discordjs/util@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.2.tgz#dc1896d764452b1bd9707eb9aa99ccfbb30bd1c0" + integrity sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw== -"@discordjs/ws@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.1.tgz#fab8aa4c1667040a95b5268a2875add27353d323" - integrity sha512-avvAolBqN3yrSvdBPcJ/0j2g42ABzrv3PEL76e3YTp2WYMGH7cuspkjfSyNWaqYl1J+669dlLp+YFMxSVQyS5g== +"@discordjs/ws@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.2.tgz#3933b12d4686aabf6a95dfe5fb6e744342a661d1" + integrity sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q== dependencies: - "@discordjs/collection" "^1.5.3" - "@discordjs/rest" "^2.0.1" - "@discordjs/util" "^1.0.1" + "@discordjs/collection" "^2.0.0" + "@discordjs/rest" "^2.1.0" + "@discordjs/util" "^1.0.2" "@sapphire/async-queue" "^1.5.0" - "@types/ws" "^8.5.5" + "@types/ws" "^8.5.9" "@vladfrangu/async_event_emitter" "^2.2.2" - discord-api-types "0.37.50" - tslib "^2.6.1" - ws "^8.13.0" + discord-api-types "0.37.61" + tslib "^2.6.2" + ws "^8.14.2" "@docsearch/css@3.5.2", "@docsearch/css@^3.5.2": version "3.5.2" @@ -458,7 +432,7 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@ericcornelissen/bash-parser@^0.5.2": +"@ericcornelissen/bash-parser@0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@ericcornelissen/bash-parser/-/bash-parser-0.5.2.tgz#5eb3bc52020d97fbaebc63b5168ca0aa0b2e8418" integrity sha512-4pIMTa1nEFfMXitv7oaNEWOdM+zpOZavesa5GaiWTgda6Zk32CFGxjUp/iIaN0PwgUW1yTq/fztSjbpE8SLGZQ== @@ -493,10 +467,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" - integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== +"@esbuild/android-arm64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz#fb7130103835b6d43ea499c3f30cfb2b2ed58456" + integrity sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA== "@esbuild/android-arm@0.17.6": version "0.17.6" @@ -508,10 +482,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" - integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== +"@esbuild/android-arm@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.8.tgz#b46e4d9e984e6d6db6c4224d72c86b7757e35bcb" + integrity sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA== "@esbuild/android-x64@0.17.6": version "0.17.6" @@ -523,10 +497,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" - integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== +"@esbuild/android-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.8.tgz#a13db9441b5a4f4e4fec4a6f8ffacfea07888db7" + integrity sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A== "@esbuild/darwin-arm64@0.17.6": version "0.17.6" @@ -538,10 +512,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" - integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== +"@esbuild/darwin-arm64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz#49f5718d36541f40dd62bfdf84da9c65168a0fc2" + integrity sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw== "@esbuild/darwin-x64@0.17.6": version "0.17.6" @@ -553,10 +527,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" - integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== +"@esbuild/darwin-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz#75c5c88371eea4bfc1f9ecfd0e75104c74a481ac" + integrity sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q== "@esbuild/freebsd-arm64@0.17.6": version "0.17.6" @@ -568,10 +542,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" - integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== +"@esbuild/freebsd-arm64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz#9d7259fea4fd2b5f7437b52b542816e89d7c8575" + integrity sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw== "@esbuild/freebsd-x64@0.17.6": version "0.17.6" @@ -583,10 +557,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" - integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== +"@esbuild/freebsd-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz#abac03e1c4c7c75ee8add6d76ec592f46dbb39e3" + integrity sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg== "@esbuild/linux-arm64@0.17.6": version "0.17.6" @@ -598,10 +572,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" - integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== +"@esbuild/linux-arm64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz#c577932cf4feeaa43cb9cec27b89cbe0df7d9098" + integrity sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ== "@esbuild/linux-arm@0.17.6": version "0.17.6" @@ -613,10 +587,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" - integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== +"@esbuild/linux-arm@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz#d6014d8b98b5cbc96b95dad3d14d75bb364fdc0f" + integrity sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ== "@esbuild/linux-ia32@0.17.6": version "0.17.6" @@ -628,10 +602,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" - integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== +"@esbuild/linux-ia32@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz#2379a0554307d19ac4a6cdc15b08f0ea28e7a40d" + integrity sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ== "@esbuild/linux-loong64@0.17.6": version "0.17.6" @@ -643,10 +617,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" - integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== +"@esbuild/linux-loong64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz#e2a5bbffe15748b49356a6cd7b2d5bf60c5a7123" + integrity sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ== "@esbuild/linux-mips64el@0.17.6": version "0.17.6" @@ -658,10 +632,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" - integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== +"@esbuild/linux-mips64el@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz#1359331e6f6214f26f4b08db9b9df661c57cfa24" + integrity sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q== "@esbuild/linux-ppc64@0.17.6": version "0.17.6" @@ -673,10 +647,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" - integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== +"@esbuild/linux-ppc64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz#9ba436addc1646dc89dae48c62d3e951ffe70951" + integrity sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg== "@esbuild/linux-riscv64@0.17.6": version "0.17.6" @@ -688,10 +662,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" - integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== +"@esbuild/linux-riscv64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz#fbcf0c3a0b20f40b5fc31c3b7695f0769f9de66b" + integrity sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg== "@esbuild/linux-s390x@0.17.6": version "0.17.6" @@ -703,10 +677,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" - integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== +"@esbuild/linux-s390x@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz#989e8a05f7792d139d5564ffa7ff898ac6f20a4a" + integrity sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg== "@esbuild/linux-x64@0.17.6": version "0.17.6" @@ -718,10 +692,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" - integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== +"@esbuild/linux-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz#b187295393a59323397fe5ff51e769ec4e72212b" + integrity sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg== "@esbuild/netbsd-x64@0.17.6": version "0.17.6" @@ -733,10 +707,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" - integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== +"@esbuild/netbsd-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz#c1ec0e24ea82313cb1c7bae176bd5acd5bde7137" + integrity sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw== "@esbuild/openbsd-x64@0.17.6": version "0.17.6" @@ -748,10 +722,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" - integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== +"@esbuild/openbsd-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz#0c5b696ac66c6d70cf9ee17073a581a28af9e18d" + integrity sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ== "@esbuild/sunos-x64@0.17.6": version "0.17.6" @@ -763,10 +737,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" - integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== +"@esbuild/sunos-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz#2a697e1f77926ff09fcc457d8f29916d6cd48fb1" + integrity sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w== "@esbuild/win32-arm64@0.17.6": version "0.17.6" @@ -778,10 +752,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" - integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== +"@esbuild/win32-arm64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz#ec029e62a2fca8c071842ecb1bc5c2dd20b066f1" + integrity sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg== "@esbuild/win32-ia32@0.17.6": version "0.17.6" @@ -793,10 +767,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" - integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== +"@esbuild/win32-ia32@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz#cbb9a3146bde64dc15543e48afe418c7a3214851" + integrity sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw== "@esbuild/win32-x64@0.17.6": version "0.17.6" @@ -808,15 +782,20 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.3": - version "0.19.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" - integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== +"@esbuild/win32-x64@0.19.8": + version "0.19.8" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz#c8285183dbdb17008578dbacb6e22748709b4822" + integrity sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA== + +"@fastify/busboy@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== "@floating-ui/core@^1.4.2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c" - integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.1.tgz#62707d7ec585d0929f882321a1b1f4ea9c680da5" + integrity sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw== dependencies: "@floating-ui/utils" "^0.1.3" @@ -829,16 +808,16 @@ "@floating-ui/utils" "^0.1.3" "@floating-ui/react-dom@^2.0.0": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20" - integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" + integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== dependencies: "@floating-ui/dom" "^1.5.1" "@floating-ui/utils@^0.1.3": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.4.tgz#19654d1026cc410975d46445180e70a5089b3e7d" - integrity sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA== + version "0.1.6" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" + integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -877,62 +856,62 @@ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.19" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" - integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@next/env@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.2.tgz#1c09e6cf1df8b1edf3cf0ca9c0e0119a49802a5d" - integrity sha512-dUseBIQVax+XtdJPzhwww4GetTjlkRSsXeQnisIJWBaHsnxYcN2RGzsPHi58D6qnkATjnhuAtQTJmR1hKYQQPg== +"@next/env@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.3.tgz#9a58b296e7ae04ffebce8a4e5bd0f87f71de86bd" + integrity sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA== -"@next/swc-darwin-arm64@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.2.tgz#f099a36fdd06b1949eb4e190aee95a52b97d3885" - integrity sha512-7eAyunAWq6yFwdSQliWMmGhObPpHTesiKxMw4DWVxhm5yLotBj8FCR4PXGkpRP2tf8QhaWuVba+/fyAYggqfQg== +"@next/swc-darwin-arm64@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz#b1a0440ffbf69056451947c4aea5b6d887e9fbbc" + integrity sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw== -"@next/swc-darwin-x64@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.2.tgz#b8950fbe150db6f82961619e31fc6e9232fce8f4" - integrity sha512-WxXYWE7zF1ch8rrNh5xbIWzhMVas6Vbw+9BCSyZvu7gZC5EEiyZNJsafsC89qlaSA7BnmsDXVWQmc+s1feSYbQ== +"@next/swc-darwin-x64@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz#48b527ef7eb5dbdcaf62fd107bc3a78371f36f09" + integrity sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ== -"@next/swc-linux-arm64-gnu@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.2.tgz#8134d31fa9ad6848561b6969d27a8c07ab090974" - integrity sha512-URSwhRYrbj/4MSBjLlefPTK3/tvg95TTm6mRaiZWBB6Za3hpHKi8vSdnCMw5D2aP6k0sQQIEG6Pzcfwm+C5vrg== +"@next/swc-linux-arm64-gnu@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz#0a36475a38b2855ab8ea0fe8b56899bc90184c0f" + integrity sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg== -"@next/swc-linux-arm64-musl@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.2.tgz#56233fe5140ed437c638194f0a01a3f89821ca89" - integrity sha512-HefiwAdIygFyNmyVsQeiJp+j8vPKpIRYDlmTlF9/tLdcd3qEL/UEBswa1M7cvO8nHcr27ZTKXz5m7dkd56/Esg== +"@next/swc-linux-arm64-musl@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz#25328a9f55baa09fde6364e7e47ade65c655034f" + integrity sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA== -"@next/swc-linux-x64-gnu@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.2.tgz#1947a9dc603e6d5d5a8e99db7d42e2240c78e713" - integrity sha512-htGVVroW0tdHgMYwKWkxWvVoG2RlAdDXRO1RQxYDvOBQsaV0nZsgKkw0EJJJ3urTYnwKskn/MXm305cOgRxD2w== +"@next/swc-linux-x64-gnu@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz#594b747e3c8896b2da67bba54fcf8a6b5a410e5e" + integrity sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg== -"@next/swc-linux-x64-musl@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.2.tgz#83eea3985eed84fbbbb1004a555d2f093d4ed245" - integrity sha512-UBD333GxbHVGi7VDJPPDD1bKnx30gn2clifNJbla7vo5nmBV+x5adyARg05RiT9amIpda6yzAEEUu+s774ldkw== +"@next/swc-linux-x64-musl@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz#a02da58fc6ecad8cf5c5a2a96a7f6030ec7f6215" + integrity sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg== -"@next/swc-win32-arm64-msvc@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.2.tgz#c3734235e85458b76ec170dd0d6c13c2fdfac5ed" - integrity sha512-Em9ApaSFIQnWXRT3K6iFnr9uBXymixLc65Xw4eNt7glgH0eiXpg+QhjmgI2BFyc7k4ZIjglfukt9saNpEyolWA== +"@next/swc-win32-arm64-msvc@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz#bf2be23d3ba2ebd0d4a9376a31f783efdb677b48" + integrity sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog== -"@next/swc-win32-ia32-msvc@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.2.tgz#cf16184af9be8b8f7750833a441c116b7a76b273" - integrity sha512-TBACBvvNYU+87X0yklSuAseqdpua8m/P79P0SG1fWUvWDDA14jASIg7kr86AuY5qix47nZLEJ5WWS0L20jAUNw== +"@next/swc-win32-ia32-msvc@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz#839f8de85a4bf2c3c69242483ab87cb916427551" + integrity sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg== -"@next/swc-win32-x64-msvc@13.5.2": - version "13.5.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.2.tgz#cf8db00763d9219567655b90853b7d484f3fcad6" - integrity sha512-LfTHt+hTL8w7F9hnB3H4nRasCzLD/fP+h4/GUVBTxrkMJOnh/7OZ0XbYDKO/uuWwryJS9kZjhxcruBiYwc5UDw== +"@next/swc-win32-x64-msvc@14.0.3": + version "14.0.3" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz#27b623612b1d0cea6efe0a0d31aa1a335fc99647" + integrity sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -955,7 +934,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/map-workspaces@^3.0.4": +"@npmcli/map-workspaces@3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== @@ -976,9 +955,9 @@ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== "@octokit/core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.1.tgz#865da2b30d54354cccb6e30861ddfa0e24494780" - integrity sha512-lyeeeZyESFo+ffI801SaBKmCfsvarO+dgV8/0gD8u1d87clbEdWsP5yC+dSj3zLhb2eIf5SJrn6vDz9AheETHw== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.0.2.tgz#ae7c5d61fdd98ba348a27c3cc510879a130b1234" + integrity sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg== dependencies: "@octokit/auth-token" "^4.0.0" "@octokit/graphql" "^7.0.0" @@ -989,12 +968,11 @@ universal-user-agent "^6.0.0" "@octokit/endpoint@^9.0.0": - version "9.0.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.1.tgz#c3f69d27accddcb04a3199fcef541804288149d2" - integrity sha512-hRlOKAovtINHQPYHZlfyFwaM8OyetxeoC81lAkBy34uLb8exrZB50SQdeW3EROqiY9G9yxQTpp5OHTV54QD+vA== + version "9.0.4" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.4.tgz#8afda5ad1ffc3073d08f2b450964c610b821d1ea" + integrity sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw== dependencies: "@octokit/types" "^12.0.0" - is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/graphql@^7.0.0": @@ -1006,34 +984,29 @@ "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^18.0.0": - version "18.1.1" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" - integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== +"@octokit/openapi-types@^19.0.2": + version "19.1.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" + integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== -"@octokit/openapi-types@^19.0.0": - version "19.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.0.0.tgz#0101bf62ab14c1946149a0f8385440963e1253c4" - integrity sha512-PclQ6JGMTE9iUStpzMkwLCISFn/wDeRjkZFIKALpvJQNBGwDoYYi2fFvuHwssoQ1rXI5mfh6jgTgWuddeUzfWw== - -"@octokit/plugin-paginate-rest@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz#417b5367da2ba3c2d255a59b87c1cc608228ec38" - integrity sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ== +"@octokit/plugin-paginate-rest@^9.0.0": + version "9.1.4" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz#9eca55e3e88f15b574e072732769e933bfa88d8b" + integrity sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ== dependencies: - "@octokit/types" "^11.0.0" + "@octokit/types" "^12.3.0" "@octokit/plugin-request-log@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz#260fa6970aa97bbcbd91f99f3cd812e2b285c9f1" integrity sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA== -"@octokit/plugin-rest-endpoint-methods@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz#e15d54540893202da107305ded2bfd21ce6f769d" - integrity sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA== +"@octokit/plugin-rest-endpoint-methods@^10.0.0": + version "10.2.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz#eeaa4de97a2ae26404dea30ce3e17b11928e027c" + integrity sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q== dependencies: - "@octokit/types" "^11.0.0" + "@octokit/types" "^12.3.0" "@octokit/request-error@^5.0.0": version "5.0.1" @@ -1045,71 +1018,165 @@ once "^1.4.0" "@octokit/request@^8.0.1", "@octokit/request@^8.0.2": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.2.tgz#26763e2001da1c98fa89c7df4d6414246bb1564b" - integrity sha512-A0RJJfzjlZQwb+39eDm5UM23dkxbp28WEG4p2ueH+Q2yY4p349aRK/vcUlEuIB//ggcrHJceoYYkBP/LYCoXEg== + version "8.1.6" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.1.6.tgz#a76a859c30421737a3918b40973c2ff369009571" + integrity sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ== dependencies: "@octokit/endpoint" "^9.0.0" "@octokit/request-error" "^5.0.0" "@octokit/types" "^12.0.0" - is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/rest@^20.0.1": - version "20.0.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.0.1.tgz#b8ee194b7cf89772d1e3fea3209f741c76a5efd3" - integrity sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q== + version "20.0.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-20.0.2.tgz#5cc8871ba01b14604439049e5f06c74b45c99594" + integrity sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ== dependencies: "@octokit/core" "^5.0.0" - "@octokit/plugin-paginate-rest" "^8.0.0" + "@octokit/plugin-paginate-rest" "^9.0.0" "@octokit/plugin-request-log" "^4.0.0" - "@octokit/plugin-rest-endpoint-methods" "^9.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" -"@octokit/types@^11.0.0": - version "11.1.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-11.1.0.tgz#9e5db741d582b05718a4d91bac8cc987def235ea" - integrity sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ== +"@octokit/types@^12.0.0", "@octokit/types@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.3.0.tgz#e3f8bc53f65ef551e19cc1a0fea15adadec17d2d" + integrity sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ== dependencies: - "@octokit/openapi-types" "^18.0.0" + "@octokit/openapi-types" "^19.0.2" -"@octokit/types@^12.0.0": - version "12.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.0.0.tgz#6b34309288b6f5ac9761d2589e3165cde1b95fee" - integrity sha512-EzD434aHTFifGudYAygnFlS1Tl6KhbTynEWELQXIbTY8Msvb5nEqTZIm7sbPEt4mQYLZwu3zPKVdeIrw0g7ovg== - dependencies: - "@octokit/openapi-types" "^19.0.0" - -"@pkgjs/parseargs@^0.11.0": +"@pkgjs/parseargs@0.11.0", "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@prisma/client@^5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.4.1.tgz#f891d1bc2739d303afaf4406b673f57bf84b226c" - integrity sha512-xyD0DJ3gRNfLbPsC+YfMBBuLJtZKQfy1OD2qU/PZg+HKrr7SO+09174LMeTlWP0YF2wca9LxtVd4HnAiB5ketQ== +"@pnpm/constants@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@pnpm/constants/-/constants-7.1.1.tgz#3db261425fe15425aa213a2b003f4f60c9378b43" + integrity sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw== + +"@pnpm/core-loggers@9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@pnpm/core-loggers/-/core-loggers-9.0.4.tgz#019bd12bb0ca5f824e89eaae4a57470d62177271" + integrity sha512-P5IiCwLbYy/vlCDTxEMReB67NVs1Y4ip6iIEM3Y1fbxm0JbPMWTUMKGf2fy7eqGDF3/Vuxk5H7o/A4II6SWzMA== dependencies: - "@prisma/engines-version" "5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f" + "@pnpm/types" "9.4.0" -"@prisma/engines-version@5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f": - version "5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.4.1-1.2f302df92bd8945e20ad4595a73def5b96afa54f.tgz#347534906f2a9d6fcf02aeeb911103c5ebfe4384" - integrity sha512-+nUQM/y8C+1GG5Ioeqcu6itFslCfxvQSAUVSMC9XM2G2Fcq0F4Afnp6m0pXF6X6iUBWen7jZBPmM9Qlq4Nr3/A== +"@pnpm/error@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@pnpm/error/-/error-5.0.2.tgz#153d18fe9eeaeb02e48e9dc45b042f4c962b3822" + integrity sha512-0TEm+tWNYm+9uh6DSKyRbv8pv/6b4NL0PastLvMxIoqZbBZ5Zj1cYi332R9xsSUi31ZOsu2wpgn/bC7DA9hrjg== + dependencies: + "@pnpm/constants" "7.1.1" -"@prisma/engines@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.4.1.tgz#80b854c87ba30d02ce8df1578cc955ac1c97216a" - integrity sha512-vJTdY4la/5V3N7SFvWRmSMUh4mIQnyb/MNoDjzVbh9iLmEC+uEykj/1GPviVsorvfz7DbYSQC4RiwmlEpTEvGA== +"@pnpm/fetching-types@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/fetching-types/-/fetching-types-5.0.0.tgz#36807c4bea4697d5ad7519d80929666a91c0083d" + integrity sha512-o9gdO1v8Uc5P2fBBuW6GSpfTqIivQmQlqjQJdFiQX0m+tgxlrMRneIg392jZuc6fk7kFqjLheInlslgJfwY+4Q== + dependencies: + "@zkochan/retry" "^0.2.0" + node-fetch "3.0.0-beta.9" -"@radix-ui/colors@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-2.1.0.tgz#8aa6f233f68076a92c57db93d7235172e88fda44" - integrity sha512-gcBnxjS2u2c6thQz/9K1+Pt2ZYcm5WKU4SLi0emYkRmYbVUw+37rlc5wgLtYOsSsRP9nxVtbJJYj6WVO7UUmZg== +"@pnpm/graceful-fs@3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@pnpm/graceful-fs/-/graceful-fs-3.2.0.tgz#241846c42c23feff7421b8bd97d4039891003f12" + integrity sha512-vRoXJxscDpHak7YE9SqCkzfrayn+Lw+YueOeHIPEqkgokrHeYgYeONoc2kGh0ObHaRtNSsonozVfJ456kxLNvA== + dependencies: + graceful-fs "^4.2.11" -"@radix-ui/colors@^3.0.0-rc.4": - version "3.0.0-rc.4" - resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-3.0.0-rc.4.tgz#1c2e74cad363a8501db9674bf40c88333b83b274" - integrity sha512-dUG9WQCdjKPiiqbQsahUGmOuC+9kCltckQtej7hkVIQp56xirLaMsNrOs9xMYXnIbNqK/vZCmoEk+q1Nda+2AA== +"@pnpm/logger@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/logger/-/logger-5.0.0.tgz#9ac8254d40d8d5b5e676742dc66b8cac1af380bf" + integrity sha512-YfcB2QrX+Wx1o6LD1G2Y2fhDhOix/bAY/oAnMpHoNLsKkWIRbt1oKLkIFvxBMzLwAEPqnYWguJrYC+J6i4ywbw== + dependencies: + bole "^5.0.0" + ndjson "^2.0.0" + +"@pnpm/npm-package-arg@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/npm-package-arg/-/npm-package-arg-1.0.0.tgz#2a27938f4d38c6cce5f3695fd1e7d5ed8929645e" + integrity sha512-oQYP08exi6mOPdAZZWcNIGS+KKPsnNwUBzSuAEGWuCcqwMAt3k/WVCqVIXzBxhO5sP2b43og69VHmPj6IroKqw== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + +"@pnpm/npm-resolver@18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/npm-resolver/-/npm-resolver-18.0.0.tgz#e7023b07b2e12836a2e3d354fc9fed3e1cccc4a3" + integrity sha512-FGHmnRjSf7tQHagk6bMrUtHvZbz3ROUoGRDrpMyqJo///+S7SZt/hSDS77PhZ7T6PRXipkFyUtRkqtHmGKFCAg== + dependencies: + "@pnpm/core-loggers" "9.0.4" + "@pnpm/error" "5.0.2" + "@pnpm/fetching-types" "5.0.0" + "@pnpm/graceful-fs" "3.2.0" + "@pnpm/resolve-workspace-range" "5.0.1" + "@pnpm/resolver-base" "11.0.0" + "@pnpm/types" "9.4.0" + "@zkochan/retry" "^0.2.0" + encode-registry "^3.0.1" + load-json-file "^6.2.0" + lru-cache "^10.0.1" + normalize-path "^3.0.0" + p-limit "^3.1.0" + p-memoize "4.0.1" + parse-npm-tarball-url "^3.0.0" + path-temp "^2.1.0" + ramda "npm:@pnpm/ramda@0.28.1" + rename-overwrite "^4.0.4" + semver "^7.5.4" + ssri "10.0.5" + version-selector-type "^3.0.0" + +"@pnpm/resolve-workspace-range@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@pnpm/resolve-workspace-range/-/resolve-workspace-range-5.0.1.tgz#839179560fbf5e565234e5dd1d65b79765d86f4c" + integrity sha512-yQ0pMthlw8rTgS/C9hrjne+NEnnSNevCjtdodd7i15I59jMBYciHifZ/vjg0NY+Jl+USTc3dBE+0h/4tdYjMKg== + dependencies: + semver "^7.4.0" + +"@pnpm/resolver-base@11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@pnpm/resolver-base/-/resolver-base-11.0.0.tgz#f18d65d805766008ee948e939bb7dffad84b8083" + integrity sha512-oxfjO8Ie6aBQPXSqOWGJP9s0xj9Z4cbRI7fK63WKhjwmNH4CTrSfikRL2o4FoXo2APAbJEUp2lCxx+86dq2tUg== + dependencies: + "@pnpm/types" "9.4.0" + +"@pnpm/types@9.4.0": + version "9.4.0" + resolved "https://registry.yarnpkg.com/@pnpm/types/-/types-9.4.0.tgz#243b62eea4beab0bb65f1ecec1dfb6f739bba9bd" + integrity sha512-IRDuIuNobLRQe0UyY2gbrrTzYS46tTNvOEfL6fOf0Qa8NyxUzeXz946v7fQuQE3LSBf8ENBC5SXhRmDl+mBEqA== + +"@pnpm/workspace.pkgs-graph@^2.0.10": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@pnpm/workspace.pkgs-graph/-/workspace.pkgs-graph-2.0.11.tgz#37ae4e0e470c3df8252e9d91076bf7ec62e7b250" + integrity sha512-VRX7E7pX92C0akCMYGzsTqJoOwQS7/8R40pAPK7smgaEpKeEgVThqnIXt+wPdseD5CzS7OzMaIWlT3WXr3O5rQ== + dependencies: + "@pnpm/npm-package-arg" "^1.0.0" + "@pnpm/npm-resolver" "18.0.0" + "@pnpm/resolve-workspace-range" "5.0.1" + ramda "npm:@pnpm/ramda@0.28.1" + +"@prisma/client@^5.4.1": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.6.0.tgz#1c15932250d5658fe0127e62faf4ecd96a877259" + integrity sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug== + dependencies: + "@prisma/engines-version" "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" + +"@prisma/engines-version@5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee": + version "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee.tgz#57b003ab5e1ea1523b5cdd7f06b24ebcf5c7fd8c" + integrity sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw== + +"@prisma/engines@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.6.0.tgz#82c445aa10633bbc0388aa2d6e411a0bd94c9439" + integrity sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw== + +"@radix-ui/colors@^3.0.0", "@radix-ui/colors@^3.0.0-rc.4": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/colors/-/colors-3.0.0.tgz#e8a591a303c44e503bd1212cacf40a09511165e0" + integrity sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg== "@radix-ui/number@1.0.1": version "1.0.1" @@ -1133,7 +1200,7 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-visually-hidden" "1.0.3" -"@radix-ui/react-alert-dialog@^1.0.4": +"@radix-ui/react-alert-dialog@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.0.5.tgz#70dd529cbf1e4bff386814d3776901fcaa131b8c" integrity sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA== @@ -1162,7 +1229,7 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" -"@radix-ui/react-avatar@^1.0.3": +"@radix-ui/react-avatar@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz#de9a5349d9e3de7bbe990334c4d2011acbbb9623" integrity sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw== @@ -1206,7 +1273,7 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-context-menu@^2.1.4": +"@radix-ui/react-context-menu@^2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-context-menu/-/react-context-menu-2.1.5.tgz#1bdbd72761439f9166f75dc4598f276265785c83" integrity sha512-R5XaDj06Xul1KGb+WP8qiOh7tKJNz2durpLBXAGZjSVtctcRFCuEvy2gtMwRJGePwQQE5nV77gs4FwRi8T+r2g== @@ -1226,7 +1293,7 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dialog@1.0.5", "@radix-ui/react-dialog@^1.0.4": +"@radix-ui/react-dialog@1.0.5", "@radix-ui/react-dialog@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz#71657b1b116de6c7a0b03242d7d43e01062c7300" integrity sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q== @@ -1254,18 +1321,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-dismissable-layer@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz#883a48f5f938fa679427aa17fcba70c5494c6978" - integrity sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/primitive" "1.0.1" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-escape-keydown" "1.0.3" - "@radix-ui/react-dismissable-layer@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" @@ -1278,7 +1333,7 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" -"@radix-ui/react-dropdown-menu@^2.0.5": +"@radix-ui/react-dropdown-menu@^2.0.6": version "2.0.6" resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.6.tgz#cdf13c956c5e263afe4e5f3587b3071a25755b63" integrity sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA== @@ -1299,16 +1354,6 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/react-focus-scope@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz#9c2e8d4ed1189a1d419ee61edd5c1828726472f9" - integrity sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-focus-scope@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" @@ -1332,7 +1377,7 @@ "@radix-ui/react-label" "2.0.2" "@radix-ui/react-primitive" "1.0.3" -"@radix-ui/react-hover-card@^1.0.6": +"@radix-ui/react-hover-card@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-hover-card/-/react-hover-card-1.0.7.tgz#684bca2504432566357e7157e087051aa3577948" integrity sha512-OcUN2FU0YpmajD/qkph3XzMcK/NmSk9hGWnjV68p6QiZMgILugusgQwnLSDs3oFSJYGKf3Y49zgFedhGh04k9A== @@ -1394,7 +1439,7 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-popover@^1.0.6": +"@radix-ui/react-popover@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-popover/-/react-popover-1.0.7.tgz#23eb7e3327330cb75ec7b4092d685398c1654e3c" integrity sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ== @@ -1416,23 +1461,6 @@ aria-hidden "^1.1.1" react-remove-scroll "2.5.5" -"@radix-ui/react-popper@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.2.tgz#4c0b96fcd188dc1f334e02dba2d538973ad842e9" - integrity sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg== - dependencies: - "@babel/runtime" "^7.13.10" - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.0.3" - "@radix-ui/react-compose-refs" "1.0.1" - "@radix-ui/react-context" "1.0.1" - "@radix-ui/react-primitive" "1.0.3" - "@radix-ui/react-use-callback-ref" "1.0.1" - "@radix-ui/react-use-layout-effect" "1.0.1" - "@radix-ui/react-use-rect" "1.0.1" - "@radix-ui/react-use-size" "1.0.1" - "@radix-ui/rect" "1.0.1" - "@radix-ui/react-popper@1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42" @@ -1450,15 +1478,7 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" -"@radix-ui/react-portal@1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.3.tgz#ffb961244c8ed1b46f039e6c215a6c4d9989bda1" - integrity sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA== - dependencies: - "@babel/runtime" "^7.13.10" - "@radix-ui/react-primitive" "1.0.3" - -"@radix-ui/react-portal@1.0.4", "@radix-ui/react-portal@^1.0.3": +"@radix-ui/react-portal@1.0.4", "@radix-ui/react-portal@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" integrity sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q== @@ -1516,7 +1536,7 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-scroll-area@^1.0.4": +"@radix-ui/react-scroll-area@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz#01160c6893f24a2ddb5aa399ae5b3ba84ad4d3cc" integrity sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw== @@ -1532,10 +1552,10 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" -"@radix-ui/react-select@^1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-1.2.2.tgz#caa981fa0d672cf3c1b2a5240135524e69b32181" - integrity sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw== +"@radix-ui/react-select@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" + integrity sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w== dependencies: "@babel/runtime" "^7.13.10" "@radix-ui/number" "1.0.1" @@ -1544,12 +1564,12 @@ "@radix-ui/react-compose-refs" "1.0.1" "@radix-ui/react-context" "1.0.1" "@radix-ui/react-direction" "1.0.1" - "@radix-ui/react-dismissable-layer" "1.0.4" + "@radix-ui/react-dismissable-layer" "1.0.5" "@radix-ui/react-focus-guards" "1.0.1" - "@radix-ui/react-focus-scope" "1.0.3" + "@radix-ui/react-focus-scope" "1.0.4" "@radix-ui/react-id" "1.0.1" - "@radix-ui/react-popper" "1.1.2" - "@radix-ui/react-portal" "1.0.3" + "@radix-ui/react-popper" "1.1.3" + "@radix-ui/react-portal" "1.0.4" "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-slot" "1.0.2" "@radix-ui/react-use-callback-ref" "1.0.1" @@ -1623,7 +1643,7 @@ "@radix-ui/react-roving-focus" "1.0.4" "@radix-ui/react-use-controllable-state" "1.0.1" -"@radix-ui/react-tooltip@^1.0.6": +"@radix-ui/react-tooltip@^1.0.7": version "1.0.7" resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.0.7.tgz#8f55070f852e7e7450cc1d9210b793d2e5a7686e" integrity sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw== @@ -1642,7 +1662,7 @@ "@radix-ui/react-use-controllable-state" "1.0.1" "@radix-ui/react-visually-hidden" "1.0.3" -"@radix-ui/react-use-callback-ref@1.0.1": +"@radix-ui/react-use-callback-ref@1.0.1", "@radix-ui/react-use-callback-ref@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz#f4bb1f27f2023c984e6534317ebc411fc181107a" integrity sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ== @@ -1710,130 +1730,191 @@ dependencies: "@babel/runtime" "^7.13.10" -"@radix-ui/themes@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/themes/-/themes-1.1.2.tgz#e53022f8f298a87612cda17e4a32b927b23c8d98" - integrity sha512-VnNeanSxHQurSgwQe5Z3zNZP5SrwhRY+RW97FPZe7TOJGpa+rpDHLDR9vourSsEGxsgrtTXHJaoII1pyIXDi8A== +"@radix-ui/themes@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/themes/-/themes-2.0.1.tgz#b5125da412966a2ad91c706da9a231780a934ee5" + integrity sha512-uO+faiGfwuIR0N9utwIfuasAmH1qRHYJtYTX2Syx0UYEtc9pPAhoCoYobZZi+J03H5WaQouvGiBN6T+UUMm+6Q== dependencies: - "@radix-ui/colors" "^2.1.0" + "@radix-ui/colors" "^3.0.0" "@radix-ui/primitive" "^1.0.1" "@radix-ui/react-accessible-icon" "^1.0.3" - "@radix-ui/react-alert-dialog" "^1.0.4" + "@radix-ui/react-alert-dialog" "^1.0.5" "@radix-ui/react-aspect-ratio" "^1.0.3" - "@radix-ui/react-avatar" "^1.0.3" + "@radix-ui/react-avatar" "^1.0.4" "@radix-ui/react-checkbox" "^1.0.4" - "@radix-ui/react-context-menu" "^2.1.4" - "@radix-ui/react-dialog" "^1.0.4" + "@radix-ui/react-context-menu" "^2.1.5" + "@radix-ui/react-dialog" "^1.0.5" "@radix-ui/react-direction" "^1.0.1" - "@radix-ui/react-dropdown-menu" "^2.0.5" + "@radix-ui/react-dropdown-menu" "^2.0.6" "@radix-ui/react-form" "^0.0.3" - "@radix-ui/react-hover-card" "^1.0.6" - "@radix-ui/react-popover" "^1.0.6" - "@radix-ui/react-portal" "^1.0.3" + "@radix-ui/react-hover-card" "^1.0.7" + "@radix-ui/react-popover" "^1.0.7" + "@radix-ui/react-portal" "^1.0.4" "@radix-ui/react-radio-group" "^1.1.3" - "@radix-ui/react-scroll-area" "^1.0.4" - "@radix-ui/react-select" "^1.2.2" + "@radix-ui/react-scroll-area" "^1.0.5" + "@radix-ui/react-select" "^2.0.0" "@radix-ui/react-separator" "^1.0.3" "@radix-ui/react-slider" "^1.1.2" "@radix-ui/react-slot" "^1.0.2" "@radix-ui/react-switch" "^1.0.3" "@radix-ui/react-tabs" "^1.0.4" - "@radix-ui/react-tooltip" "^1.0.6" + "@radix-ui/react-tooltip" "^1.0.7" + "@radix-ui/react-use-callback-ref" "^1.0.1" "@radix-ui/react-visually-hidden" "^1.0.3" classnames "^2.3.2" -"@resvg/resvg-js-android-arm-eabi@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.4.1.tgz#49dc9722f95096f8aff70186deae8e148d60dce5" - integrity sha512-AA6f7hS0FAPpvQMhBCf6f1oD1LdlqNXKCxAAPpKh6tR11kqV0YIB9zOlIYgITM14mq2YooLFl6XIbbvmY+jwUw== +"@resvg/resvg-js-android-arm-eabi@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.0.tgz#fed7723ed5c5f7490762e025ad704bcbceee37b7" + integrity sha512-lJnZ/2P5aMocrFMW7HWhVne5gH82I8xH6zsfH75MYr4+/JOaVcGCTEQ06XFohGMdYRP3v05SSPLPvTM/RHjxfA== -"@resvg/resvg-js-android-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.4.1.tgz#fdb7c9362ea27a228831d047cfd1ea240daed780" - integrity sha512-/QleoRdPfsEuH9jUjilYcDtKK/BkmWcK+1LXM8L2nsnf/CI8EnFyv7ZzCj4xAIvZGAy9dTYr/5NZBcTwxG2HQg== +"@resvg/resvg-js-android-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.0.tgz#e0531a220ec8954e41039b2483cc3706d30d3635" + integrity sha512-N527f529bjMwYWShZYfBD60dXA4Fux+D695QsHQ93BDYZSHUoOh1CUGUyICevnTxs7VgEl98XpArmUWBZQVMfQ== -"@resvg/resvg-js-darwin-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.4.1.tgz#5ef093f1276149340b9f5a5c487717c4de87bee7" - integrity sha512-U1oMNhea+kAXgiEXgzo7EbFGCD1Edq5aSlQoe6LMly6UjHzgx2W3N5kEXCwU/CgN5FiQhZr7PlSJSlcr7mdhfg== +"@resvg/resvg-js-darwin-arm64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.0.tgz#38f609cd2bd71ce6a065df7a8b8144479b156969" + integrity sha512-MabUKLVayEwlPo0mIqAmMt+qESN8LltCvv5+GLgVga1avpUrkxj/fkU1TKm8kQegutUjbP/B0QuMuUr0uhF8ew== -"@resvg/resvg-js-darwin-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.4.1.tgz#18dd758184f4877be1f6ac80d2f37999581c998c" - integrity sha512-avyVh6DpebBfHHtTQTZYSr6NG1Ur6TEilk1+H0n7V+g4F7x7WPOo8zL00ZhQCeRQ5H4f8WXNWIEKL8fwqcOkYw== +"@resvg/resvg-js-darwin-x64@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.0.tgz#5c3f69d0cd68980e7e5cfcabf0db90e85d289559" + integrity sha512-zrFetdnSw/suXjmyxSjfDV7i61hahv6DDG6kM7BYN2yJ3Es5+BZtqYZTcIWogPJedYKmzN1YTMWGd/3f0ubFiA== -"@resvg/resvg-js-linux-arm-gnueabihf@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.4.1.tgz#eee8f8166763aacc935a53e223e7b9c31b10c94a" - integrity sha512-isY/mdKoBWH4VB5v621co+8l101jxxYjuTkwOLsbW+5RK9EbLciPlCB02M99ThAHzI2MYxIUjXNmNgOW8btXvw== +"@resvg/resvg-js-linux-arm-gnueabihf@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.0.tgz#6bcae7d4101e7fea2be0db167eda832cab63e27f" + integrity sha512-sH4gxXt7v7dGwjGyzLwn7SFGvwZG6DQqLaZ11MmzbCwd9Zosy1TnmrMJfn6TJ7RHezmQMgBPi18bl55FZ1AT4A== -"@resvg/resvg-js-linux-arm64-gnu@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.4.1.tgz#826569e1ee08f07879ce32850822ede2ee1192ef" - integrity sha512-uY5voSCrFI8TH95vIYBm5blpkOtltLxLRODyhKJhGfskOI7XkRw5/t1u0sWAGYD8rRSNX+CA+np86otKjubrNg== +"@resvg/resvg-js-linux-arm64-gnu@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.0.tgz#fb71ea6b9a4b30412fa096fdbf9e8427012b3a99" + integrity sha512-fCyMncqCJtrlANADIduYF4IfnWQ295UKib7DAxFXQhBsM9PLDTpizr0qemZcCNadcwSVHnAIzL4tliZhCM8P6A== -"@resvg/resvg-js-linux-arm64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.4.1.tgz#faf63d873666078ca74604454d40e4fecc22beb4" - integrity sha512-6mT0+JBCsermKMdi/O2mMk3m7SqOjwi9TKAwSngRZ/nQoL3Z0Z5zV+572ztgbWr0GODB422uD8e9R9zzz38dRQ== +"@resvg/resvg-js-linux-arm64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.0.tgz#ec7e85b8b6eea23c0242faa1f1486241f253a190" + integrity sha512-ouLjTgBQHQyxLht4FdMPTvuY8xzJigM9EM2Tlu0llWkN1mKyTQrvYWi6TA6XnKdzDJHy7ZLpWpjZi7F5+Pg+Vg== -"@resvg/resvg-js-linux-x64-gnu@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.4.1.tgz#37b4c16c488aac3834a069c3725f017285d94b1e" - integrity sha512-60KnrscLj6VGhkYOJEmmzPlqqfcw1keDh6U+vMcNDjPhV3B5vRSkpP/D/a8sfokyeh4VEacPSYkWGezvzS2/mg== +"@resvg/resvg-js-linux-x64-gnu@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.0.tgz#2a9b2a14554b0b1825c2ebc52b5fc2d95a831a63" + integrity sha512-n3zC8DWsvxC1AwxpKFclIPapDFibs5XdIRoV/mcIlxlh0vseW1F49b97F33BtJQRmlntsqqN6GMMqx8byB7B+Q== -"@resvg/resvg-js-linux-x64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.4.1.tgz#6099cf57c958832549b0671991246e06bb44df27" - integrity sha512-0AMyZSICC1D7ge115cOZQW8Pcad6PjWuZkBFF3FJuSxC6Dgok0MQnLTs2MfMdKBlAcwO9dXsf3bv9tJZj8pATA== +"@resvg/resvg-js-linux-x64-musl@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.0.tgz#42081a8b06ccfa011aee9cc10b2f0fea3a4563ed" + integrity sha512-n4tasK1HOlAxdTEROgYA1aCfsEKk0UOFDNd/AQTTZlTmCbHKXPq+O8npaaKlwXquxlVK8vrkcWbksbiGqbCAcw== -"@resvg/resvg-js-win32-arm64-msvc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.4.1.tgz#10c9472a20198a218d8c3b6d8fbb3fcba213b670" - integrity sha512-76XDFOFSa3d0QotmcNyChh2xHwk+JTFiEQBVxMlHpHMeq7hNrQJ1IpE1zcHSQvrckvkdfLboKRrlGB86B10Qjw== +"@resvg/resvg-js-win32-arm64-msvc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.0.tgz#3af0d5f7bd9193ac6be8f226b539be6f7576302d" + integrity sha512-X2+EoBJFwDI5LDVb51Sk7ldnVLitMGr9WwU/i21i3fAeAXZb3hM16k67DeTy16OYkT2dk/RfU1tP1wG+rWbz2Q== -"@resvg/resvg-js-win32-ia32-msvc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.4.1.tgz#bfc1d37ed485d72ca5717138b99ba40788fa2720" - integrity sha512-odyVFGrEWZIzzJ89KdaFtiYWaIJh9hJRW/frcEcG3agJ464VXkN/2oEVF5ulD+5mpGlug9qJg7htzHcKxDN8sg== +"@resvg/resvg-js-win32-ia32-msvc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.0.tgz#64af45bfee41cb2bea0b6dd0bdc94175183f2b56" + integrity sha512-L7oevWjQoUgK5W1fCKn0euSVemhDXVhrjtwqpc7MwBKKimYeiOshO1Li1pa8bBt5PESahenhWgdB6lav9O0fEg== -"@resvg/resvg-js-win32-x64-msvc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.4.1.tgz#83cae82dfe27121f85492eb4dc03f6fe33d8a703" - integrity sha512-vY4kTLH2S3bP+puU5x7hlAxHv+ulFgcK6Zn3efKSr0M0KnZ9A3qeAjZteIpkowEFfUeMPNg2dvvoFRJA9zqxSw== +"@resvg/resvg-js-win32-x64-msvc@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.0.tgz#08431a243c15f002d32e5e628857d19852323274" + integrity sha512-8lJlghb+Unki5AyKgsnFbRJwkEj9r1NpwyuBG8yEJiG1W9eEGl03R3I7bsVa3haof/3J1NlWf0rzSa1G++A2iw== "@resvg/resvg-js@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@resvg/resvg-js/-/resvg-js-2.4.1.tgz#07e9cd57f3c925a5fb075a313a0640fc74cba4a2" - integrity sha512-wTOf1zerZX8qYcMmLZw3czR4paI4hXqPjShNwJRh5DeHxvgffUS5KM7XwxtbIheUW6LVYT5fhT2AJiP6mU7U4A== + version "2.6.0" + resolved "https://registry.yarnpkg.com/@resvg/resvg-js/-/resvg-js-2.6.0.tgz#d811100796dda1f37a516c747dab3bbc9b24e5e4" + integrity sha512-Tf3YpbBKcQn991KKcw/vg7vZf98v01seSv6CVxZBbRkL/xyjnoYB6KgrFL6zskT1A4dWC/vg77KyNOW+ePaNlA== optionalDependencies: - "@resvg/resvg-js-android-arm-eabi" "2.4.1" - "@resvg/resvg-js-android-arm64" "2.4.1" - "@resvg/resvg-js-darwin-arm64" "2.4.1" - "@resvg/resvg-js-darwin-x64" "2.4.1" - "@resvg/resvg-js-linux-arm-gnueabihf" "2.4.1" - "@resvg/resvg-js-linux-arm64-gnu" "2.4.1" - "@resvg/resvg-js-linux-arm64-musl" "2.4.1" - "@resvg/resvg-js-linux-x64-gnu" "2.4.1" - "@resvg/resvg-js-linux-x64-musl" "2.4.1" - "@resvg/resvg-js-win32-arm64-msvc" "2.4.1" - "@resvg/resvg-js-win32-ia32-msvc" "2.4.1" - "@resvg/resvg-js-win32-x64-msvc" "2.4.1" + "@resvg/resvg-js-android-arm-eabi" "2.6.0" + "@resvg/resvg-js-android-arm64" "2.6.0" + "@resvg/resvg-js-darwin-arm64" "2.6.0" + "@resvg/resvg-js-darwin-x64" "2.6.0" + "@resvg/resvg-js-linux-arm-gnueabihf" "2.6.0" + "@resvg/resvg-js-linux-arm64-gnu" "2.6.0" + "@resvg/resvg-js-linux-arm64-musl" "2.6.0" + "@resvg/resvg-js-linux-x64-gnu" "2.6.0" + "@resvg/resvg-js-linux-x64-musl" "2.6.0" + "@resvg/resvg-js-win32-arm64-msvc" "2.6.0" + "@resvg/resvg-js-win32-ia32-msvc" "2.6.0" + "@resvg/resvg-js-win32-x64-msvc" "2.6.0" + +"@rollup/rollup-android-arm-eabi@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz#0ea289f68ff248b50fea5716ca9f65f7d4dba3ae" + integrity sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA== + +"@rollup/rollup-android-arm64@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz#27c8c67fc5de574874085a1b480ac65b3e18378e" + integrity sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA== + +"@rollup/rollup-darwin-arm64@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz#c5735c042980c85495411af7183dd20294763bd8" + integrity sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw== + +"@rollup/rollup-darwin-x64@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz#af844bd54abb73ca3c9cf89a31eec17861d1375d" + integrity sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg== + +"@rollup/rollup-linux-arm-gnueabihf@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz#5e972f63c441eaf859551039b3f18db9b035977d" + integrity sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ== + +"@rollup/rollup-linux-arm64-gnu@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz#f4cfbc71e3b6fdb395b28b1472414e181515c72d" + integrity sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw== + +"@rollup/rollup-linux-arm64-musl@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz#6a94c691830dc29bf708de7c640f494996130893" + integrity sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw== + +"@rollup/rollup-linux-x64-gnu@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz#f07bae3f7dc532d9ea5ab36c9071db329f9a1efb" + integrity sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA== + +"@rollup/rollup-linux-x64-musl@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz#357a34fdbf410af88ce48bd802bea6462bb9a8bc" + integrity sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ== + +"@rollup/rollup-win32-arm64-msvc@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz#b6e97fd38281667e35297033393cd1101f4a31be" + integrity sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ== + +"@rollup/rollup-win32-ia32-msvc@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz#a95db026c640c8128bfd38546d85342f2329beaf" + integrity sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw== + +"@rollup/rollup-win32-x64-msvc@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz#45785b5caf83200a34a9867ba50d69560880c120" + integrity sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A== "@sapphire/async-queue@^1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== -"@sapphire/shapeshift@^3.9.2": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.2.tgz#a9c12cd51e1bc467619bb56df804450dd14871ac" - integrity sha512-YRbCXWy969oGIdqR/wha62eX8GNHsvyYi0Rfd4rNW6tSVVa8p0ELiMEuOH/k8rgtvRoM+EMV7Csqz77YdwiDpA== +"@sapphire/shapeshift@^3.9.3": + version "3.9.3" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz#89d26713044bc21cc5e0845e61a8a328ca3c1a84" + integrity sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ== dependencies: fast-deep-equal "^3.1.3" lodash "^4.17.21" -"@sapphire/snowflake@^3.5.1": +"@sapphire/snowflake@3.5.1", "@sapphire/snowflake@^3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== @@ -1846,7 +1927,12 @@ fflate "^0.7.3" string.prototype.codepointat "^0.2.1" -"@snyk/github-codeowners@^1.1.0": +"@sindresorhus/merge-streams@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz#9cd84cc15bc865a5ca35fcaae198eb899f7b5c90" + integrity sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw== + +"@snyk/github-codeowners@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz#45b99732c3c38b5f5b47e43d2b0c9db67a6d2bcc" integrity sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw== @@ -1868,36 +1954,36 @@ integrity sha512-AqlrT8YA1o7Ff5wPfMOL0pvL+1X+sw60NN6CcOCqs658emD6RfiXhF7Gu9QcfKBH7ELY2nInLhKSCWVoNL70MQ== "@types/body-parser@*": - version "1.19.3" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" - integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== dependencies: "@types/connect" "*" "@types/node" "*" "@types/connect@*": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== dependencies: "@types/node" "*" "@types/decompress@^4.2.6": - version "4.2.6" - resolved "https://registry.yarnpkg.com/@types/decompress/-/decompress-4.2.6.tgz#2ae3fb360c4d27593f51293e54990b9e709477ae" - integrity sha512-ULmsMkKxU7aIGbnxP4Rz28hLdRZ4q0cdy6kcb8dx+UgDGOn+id5fibvoeTnjuolhrRM7f7TOtGADeKEk60SSsQ== + version "4.2.7" + resolved "https://registry.yarnpkg.com/@types/decompress/-/decompress-4.2.7.tgz#604f69b69d519ecb74dea1ea0829f159b85e1332" + integrity sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g== dependencies: "@types/node" "*" "@types/escape-html@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/escape-html/-/escape-html-1.0.2.tgz#072b7b13784fb3cee9c2450c22f36405983f5e3c" - integrity sha512-gaBLT8pdcexFztLSPRtriHeXY/Kn4907uOCZ4Q3lncFBkheAWOuNt53ypsF8szgxbEJ513UeBzcf4utN0EzEwA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/escape-html/-/escape-html-1.0.4.tgz#dc7c166b76c7b03b27e32f80edf01d91eb5d9af2" + integrity sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg== "@types/express-serve-static-core@^4.17.33": - version "4.17.37" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz#7e4b7b59da9142138a2aaa7621f5abedce8c7320" - integrity sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg== + version "4.17.41" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" + integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1905,126 +1991,159 @@ "@types/send" "*" "@types/express@^4.17.18": - version "4.17.18" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.18.tgz#efabf5c4495c1880df1bdffee604b143b29c4a95" - integrity sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ== + version "4.17.21" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" + integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" "@types/serve-static" "*" +"@types/hast@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.3.tgz#7f75e6b43bc3f90316046a287d9ad3888309f7e1" + integrity sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ== + dependencies: + "@types/unist" "*" + "@types/http-errors@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" - integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== "@types/js-yaml@^4.0.8": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.8.tgz#7574e422d70d4a1b41f517d1d9abc61be2299a97" - integrity sha512-m6jnPk1VhlYRiLFm3f8X9Uep761f+CK8mHyS65LutH2OhmBF0BeMEjHgg05usH8PLZMWWc/BUR9RPmkvpWnyRA== + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" + integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== "@types/linkify-it@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.3.tgz#15a0712296c5041733c79efe233ba17ae5a7587b" - integrity sha512-pTjcqY9E4nOI55Wgpz7eiI8+LzdYnw3qxXCfHyBDdPbYvbyLgWLJGh8EdPvqawwMK1Uo1794AUkkR38Fr0g+2g== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8" + integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw== "@types/lodash@^4.14.199": - version "4.14.199" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" - integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== + version "4.14.202" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" + integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== "@types/markdown-escape@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/markdown-escape/-/markdown-escape-1.1.0.tgz#8bd940d6701880eb7229467542c029bc05a7b22f" - integrity sha512-bJZh73L6fSt8MmTON/btR8hiKRipoIoPfLO41lxr6l65QXdG1rwUjR8Hu5xU7XYHBwKHiJZ+sTQ8L2TKkQrBpw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@types/markdown-escape/-/markdown-escape-1.1.3.tgz#b880ab7c1e23c76b1d663e5a5640107c493e0c3e" + integrity sha512-JIc1+s3y5ujKnt/+N+wq6s/QdL2qZ11fP79MijrVXsAAnzSxCbT2j/3prHRouJdZ2yFLN3vkP0HytfnoCczjOw== -"@types/markdown-it@^13.0.1": - version "13.0.1" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-13.0.1.tgz#2f45bd54315f5db2d9bd909ec7fd4d994cf75df4" - integrity sha512-SUEb8Frsxs3D5Gg9xek6i6EG6XQ5s+O+ZdQzIPESZVZw3Pv3CPQfjCJBI+RgqZd1IBeu18S0Rn600qpPnEK37w== +"@types/markdown-it@^13.0.7": + version "13.0.7" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-13.0.7.tgz#4a495115f470075bd4434a0438ac477a49c2e152" + integrity sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA== dependencies: "@types/linkify-it" "*" "@types/mdurl" "*" +"@types/mdast@^4.0.0": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.3.tgz#1e011ff013566e919a4232d1701ad30d70cab333" + integrity sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg== + dependencies: + "@types/unist" "*" + "@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39" + integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA== "@types/mime@*": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" + integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== "@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node@*", "@types/node@^20.6.5": - version "20.6.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.5.tgz#4c6a79adf59a8e8193ac87a0e522605b16587258" - integrity sha512-2qGq5LAOTh9izcc0+F+dToFigBWiK1phKPt7rNhOqJSr35y8rlIBjDwGtFSgAI6MGIhjwOVNSQZVdJsZJ2uR1w== + version "20.10.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" + integrity sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg== + dependencies: + undici-types "~5.26.4" "@types/prop-types@*": - version "15.7.7" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.7.tgz#f9361f7b87fd5d8188b2c998db0a1f47e9fb391a" - integrity sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog== + version "15.7.11" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/qs@*": - version "6.9.8" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.8.tgz#f2a7de3c107b89b441e071d5472e6b726b4adf45" - integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + version "6.9.10" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" + integrity sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw== "@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react@^18.2.22": - version "18.2.22" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.22.tgz#abe778a1c95a07fa70df40a52d7300a40b949ccb" - integrity sha512-60fLTOLqzarLED2O3UQImc/lsNRgG0jE/a1mPW9KjMemY0LMITWEsbS4VvZ4p6rorEHd5YKxxmMKSDK505GHpA== + version "18.2.41" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.41.tgz#9eea044246bdb10510df89ef7f8422a8b6ad8fb9" + integrity sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + version "0.16.8" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.8.tgz#ce5ace04cfeabe7ef87c0091e50752e36707deff" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== "@types/send@*": - version "0.17.1" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== dependencies: "@types/mime" "^1" "@types/node" "*" "@types/serve-static@*": - version "1.15.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + version "1.15.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" + integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== dependencies: "@types/http-errors" "*" "@types/mime" "*" "@types/node" "*" -"@types/web-bluetooth@^0.0.17": - version "0.0.17" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40" - integrity sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA== +"@types/unist@*", "@types/unist@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" + integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== -"@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== +"@types/web-bluetooth@^0.0.20": + version "0.0.20" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" + integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== + +"@types/ws@8.5.9": + version "8.5.9" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== dependencies: "@types/node" "*" +"@types/ws@^8.5.9": + version "8.5.10" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" + integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + dependencies: + "@types/node" "*" + +"@ungap/structured-clone@^1.0.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + "@vanilla-extract/babel-plugin-debug-ids@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.3.tgz#ce07190343b51ed658b385bdce1e79952a4e8526" @@ -2032,14 +2151,13 @@ dependencies: "@babel/core" "^7.20.7" -"@vanilla-extract/css@^1.10.0", "@vanilla-extract/css@^1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.13.0.tgz#85f521d428f55b0e9599675033caba81194cc6c0" - integrity sha512-JFFBXhnJrPlGqHBabagXqo5ghXw9mtV270ycIGyLDZG8NAK5eRwAYkMowAxuzK7wZSm67GnETWYB7b0AUmyttg== +"@vanilla-extract/css@^1.13.0", "@vanilla-extract/css@^1.14.0": + version "1.14.0" + resolved "https://registry.yarnpkg.com/@vanilla-extract/css/-/css-1.14.0.tgz#45fab9c04d893e3e363cf2cde7559d21233b7f63" + integrity sha512-rYfm7JciWZ8PFzBM/HDiE2GLnKI3xJ6/vdmVJ5BSgcCZ5CxRlM9Cjqclni9lGzF3eMOijnUhCd/KV8TOzyzbMA== dependencies: "@emotion/hash" "^0.9.0" "@vanilla-extract/private" "^1.0.3" - ahocorasick "1.0.2" chalk "^4.1.1" css-what "^6.1.0" cssesc "^3.0.0" @@ -2047,17 +2165,18 @@ deep-object-diff "^1.1.9" deepmerge "^4.2.2" media-query-parser "^2.0.2" + modern-ahocorasick "^1.0.0" outdent "^0.8.0" "@vanilla-extract/integration@^6.0.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@vanilla-extract/integration/-/integration-6.2.2.tgz#6bf7de451b47802065d7d6460a1aeb53bf247a16" - integrity sha512-gV3qPFjFap1+IrPeuFy+tEZOq7l7ifJf1ik/kluDWhPr1ffsFG9puq1/jjJ4rod1BIC79Q5ZWPNvBInHyxfCew== + version "6.2.4" + resolved "https://registry.yarnpkg.com/@vanilla-extract/integration/-/integration-6.2.4.tgz#bd8a5ec0916051c1ef5fb66d8484a5cad8d8c58d" + integrity sha512-+AfymNMVq9sEUe0OJpdCokmPZg4Zi6CqKaW/PnUOfDwEn53ighHOMOBl5hAgxYR8Kiz9NG43Bn00mkjWlFi+ng== dependencies: "@babel/core" "^7.20.7" "@babel/plugin-syntax-typescript" "^7.20.0" "@vanilla-extract/babel-plugin-debug-ids" "^1.0.2" - "@vanilla-extract/css" "^1.10.0" + "@vanilla-extract/css" "^1.14.0" esbuild "0.17.6" eval "0.1.8" find-up "^5.0.0" @@ -2069,9 +2188,9 @@ vite-node "^0.28.5" "@vanilla-extract/next-plugin@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@vanilla-extract/next-plugin/-/next-plugin-2.3.1.tgz#5c117903b2d8dd3c71c4ace02832bd8a9133d5aa" - integrity sha512-aoDTnCY3gJXjytoxlA7Xk4A/BDxdzUBeZhHWypauKJ06XJKlV/odjXt8K5FhCrMy8o+nqnCpjOD6KXcg6JmIdw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/@vanilla-extract/next-plugin/-/next-plugin-2.3.2.tgz#e82bf1c343f01e2ba5971ea7ab5a6a4f7b8d8668" + integrity sha512-wBulJAhmr8guYo5YxrfsA1T/TQ3tbMJjNtE6QrVZvs1NTnT9/WAmf4IVrbUvQbH+LBj5LXO8dRzueGPAvepSng== dependencies: "@vanilla-extract/webpack-plugin" "^2.3.1" @@ -2090,136 +2209,153 @@ debug "^4.3.1" loader-utils "^2.0.0" +"@vitejs/plugin-vue@^4.5.0": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.5.1.tgz#84815bfeb46928c03a9ed765e4a8425c22345e15" + integrity sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g== + "@vladfrangu/async_event_emitter@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz#84c5a3f8d648842cec5cc649b88df599af32ed88" - integrity sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ== + version "2.2.4" + resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz#d3537432c6db6444680a596271dff8ea407343b3" + integrity sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug== -"@vue/compiler-core@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" - integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== +"@vue/compiler-core@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.9.tgz#df1fc7947dcef5c2e12d257eae540057707f47d1" + integrity sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ== dependencies: - "@babel/parser" "^7.21.3" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.3" + "@vue/shared" "3.3.9" estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" - integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== +"@vue/compiler-dom@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz#67315ea4193d9d18c7a710889b8f90f7aa3914d2" + integrity sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg== dependencies: - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-core" "3.3.9" + "@vue/shared" "3.3.9" -"@vue/compiler-sfc@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" - integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== +"@vue/compiler-sfc@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz#5900906baba1a90389200d81753ad0f7ceb98a83" + integrity sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A== dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/compiler-dom" "3.3.4" - "@vue/compiler-ssr" "3.3.4" - "@vue/reactivity-transform" "3.3.4" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.3" + "@vue/compiler-core" "3.3.9" + "@vue/compiler-dom" "3.3.9" + "@vue/compiler-ssr" "3.3.9" + "@vue/reactivity-transform" "3.3.9" + "@vue/shared" "3.3.9" estree-walker "^2.0.2" - magic-string "^0.30.0" - postcss "^8.1.10" + magic-string "^0.30.5" + postcss "^8.4.31" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" - integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== +"@vue/compiler-ssr@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz#3b3dbfa5368165fa4ff74c060503b4087ec1beed" + integrity sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g== dependencies: - "@vue/compiler-dom" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-dom" "3.3.9" + "@vue/shared" "3.3.9" -"@vue/devtools-api@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" - integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== +"@vue/devtools-api@^6.5.1": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz#7f71f31e40973eeee65b9a64382b13593fdbd697" + integrity sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA== -"@vue/reactivity-transform@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" - integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== +"@vue/reactivity-transform@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz#5d894dd9a42a422a2db309babb385f9a2529b52f" + integrity sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg== dependencies: - "@babel/parser" "^7.20.15" - "@vue/compiler-core" "3.3.4" - "@vue/shared" "3.3.4" + "@babel/parser" "^7.23.3" + "@vue/compiler-core" "3.3.9" + "@vue/shared" "3.3.9" estree-walker "^2.0.2" - magic-string "^0.30.0" + magic-string "^0.30.5" -"@vue/reactivity@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" - integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== +"@vue/reactivity@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.9.tgz#e28e8071bd74edcdd9c87b667ad00e8fbd8d6920" + integrity sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw== dependencies: - "@vue/shared" "3.3.4" + "@vue/shared" "3.3.9" -"@vue/runtime-core@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" - integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== +"@vue/runtime-core@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.9.tgz#c835b77f7dc7ae5f251e93f277b54963ea1b5c31" + integrity sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w== dependencies: - "@vue/reactivity" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/reactivity" "3.3.9" + "@vue/shared" "3.3.9" -"@vue/runtime-dom@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" - integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== +"@vue/runtime-dom@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz#68081d981695a229d72f431fed0b0cdd9161ce53" + integrity sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ== dependencies: - "@vue/runtime-core" "3.3.4" - "@vue/shared" "3.3.4" - csstype "^3.1.1" + "@vue/runtime-core" "3.3.9" + "@vue/shared" "3.3.9" + csstype "^3.1.2" -"@vue/server-renderer@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" - integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== +"@vue/server-renderer@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.9.tgz#ffb41bc9c7afafcc608d0c500e9d6b0af7d68fad" + integrity sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A== dependencies: - "@vue/compiler-ssr" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-ssr" "3.3.9" + "@vue/shared" "3.3.9" -"@vue/shared@3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" - integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== +"@vue/shared@3.3.9": + version "3.3.9" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.9.tgz#df740d26d338faf03e09ca662a8031acf66051db" + integrity sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA== -"@vueuse/core@10.4.1", "@vueuse/core@^10.4.1": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.4.1.tgz#fc2c8a83a571c207aaedbe393b22daa6d35123f2" - integrity sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg== +"@vueuse/core@10.6.1", "@vueuse/core@^10.6.1": + version "10.6.1" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.6.1.tgz#5b16d8238054c6983b6cb7cd77a78035f098dd89" + integrity sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q== dependencies: - "@types/web-bluetooth" "^0.0.17" - "@vueuse/metadata" "10.4.1" - "@vueuse/shared" "10.4.1" - vue-demi ">=0.14.5" + "@types/web-bluetooth" "^0.0.20" + "@vueuse/metadata" "10.6.1" + "@vueuse/shared" "10.6.1" + vue-demi ">=0.14.6" -"@vueuse/integrations@^10.4.1": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.4.1.tgz#a48356a0bad49f5e724cd9acaebd73d2b66f22a9" - integrity sha512-uRBPyG5Lxoh1A/J+boiioPT3ELEAPEo4t8W6Mr4yTKIQBeW/FcbsotZNPr4k9uz+3QEksMmflWloS9wCnypM7g== +"@vueuse/integrations@^10.6.1": + version "10.6.1" + resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.6.1.tgz#8358ced20d1a976422693ae3711ad29b70948504" + integrity sha512-mPDupuofMJ4DPmtX/FfP1MajmWRzYDv8WSaTCo8LQ5kFznjWgmUQ16ApjYqgMquqffNY6+IRMdMgosLDRZOSZA== dependencies: - "@vueuse/core" "10.4.1" - "@vueuse/shared" "10.4.1" - vue-demi ">=0.14.5" + "@vueuse/core" "10.6.1" + "@vueuse/shared" "10.6.1" + vue-demi ">=0.14.6" -"@vueuse/metadata@10.4.1": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.4.1.tgz#9d2ff5c67abf17a8c07865c2413fbd0e92f7b7d7" - integrity sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg== +"@vueuse/metadata@10.6.1": + version "10.6.1" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.6.1.tgz#100faa0ced3c0ab4c014fb8e66e781e85e4eb88d" + integrity sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw== -"@vueuse/shared@10.4.1": - version "10.4.1" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.4.1.tgz#d5ce33033c156efb60664b5d6034d6cd4e2f530c" - integrity sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg== +"@vueuse/shared@10.6.1": + version "10.6.1" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.6.1.tgz#1d9fc1e3f9083e45b59a693fc372bc50ad62a9e4" + integrity sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q== dependencies: - vue-demi ">=0.14.5" + vue-demi ">=0.14.6" + +"@zkochan/retry@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@zkochan/retry/-/retry-0.2.0.tgz#cb52c9fce1976f3eed7b1979b739e70706f4a3d2" + integrity sha512-WhB+2B/ZPlW2Xy/kMJBrMbqecWXcbDDgn0K0wKBAgO2OlBTz1iLJrRWduo+DGGn0Akvz1Lu4Xvls7dJojximWw== + +"@zkochan/rimraf@^2.1.2": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@zkochan/rimraf/-/rimraf-2.1.3.tgz#1074cb72d6e4997275285b04296a343b6ac7046b" + integrity sha512-mCfR3gylCzPC+iqdxEA6z5SxJeOgzgbwmyxanKriIne5qZLswDe/M43aD3p5MNzwzXRhbZg/OX+MpES6Zk1a6A== + dependencies: + rimraf "^3.0.2" accepts@~1.3.8: version "1.3.8" @@ -2230,9 +2366,9 @@ accepts@~1.3.8: negotiator "0.6.3" acorn@^8.10.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== aggregate-error@^3.0.0: version "3.1.0" @@ -2242,11 +2378,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ahocorasick@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ahocorasick/-/ahocorasick-1.0.2.tgz#9eee93aef9d02bfb476d9b648d9b7a40ef2fd500" - integrity sha512-hCOfMzbFx5IDutmWLAt6MZwOUjIfSM9G9FyVxytmE4Rs/5YDPWQrD/+IR1w+FweD9H2oOZEnv36TmkjhNURBVA== - algoliasearch@^4.19.1: version "4.20.0" resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.20.0.tgz#700c2cb66e14f8a288460036c7b2a554d0d93cf4" @@ -2277,11 +2408,6 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== -ansi-sequence-parser@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" - integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2391,6 +2517,22 @@ body-parser@1.20.1: type-is "~1.6.18" unpipe "1.0.0" +bole@^5.0.0: + version "5.0.9" + resolved "https://registry.yarnpkg.com/bole/-/bole-5.0.9.tgz#ecd3b25d2f4b49941cd12028df89a71bdb142ae6" + integrity sha512-35GeBG6T7GW9VmLDF2IoKAtFCqMjmmq1uICbsICI0pID7ZAyUKlf7dg1wpXmn9GcMKHtg0S19CPMU5yfY3tv+g== + dependencies: + fast-safe-stringify "^2.0.7" + individual "^3.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" @@ -2406,13 +2548,13 @@ braces@^3.0.2: fill-range "^7.0.1" browserslist@^4.21.9: - version "4.21.11" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.11.tgz#35f74a3e51adc4d193dcd76ea13858de7b8fecb8" - integrity sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ== + version "4.22.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" + integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== dependencies: - caniuse-lite "^1.0.30001538" - electron-to-chromium "^1.4.526" - node-releases "^2.0.13" + caniuse-lite "^1.0.30001565" + electron-to-chromium "^1.4.601" + node-releases "^2.0.14" update-browserslist-db "^1.0.13" buffer-alloc-unsafe@^1.1.0: @@ -2451,7 +2593,14 @@ buffer@^5.2.1: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@1.6.0, busboy@^1.6.0: +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -2469,22 +2618,28 @@ cac@^6.7.14: integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== call-bind@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" camelize@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538: - version "1.0.30001538" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" - integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001565: + version "1.0.30001566" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" + integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== + +ccount@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^2.4.2: version "2.4.2" @@ -2508,6 +2663,16 @@ chalk@^5.2.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== +character-entities-html4@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== + +character-entities-legacy@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== + classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" @@ -2552,6 +2717,11 @@ color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +comma-separated-tokens@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== + commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -2574,6 +2744,11 @@ compose-function@^3.0.3: dependencies: arity-n "^1.0.4" +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -2586,10 +2761,10 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== cookie-signature@1.0.6: version "1.0.6" @@ -2615,6 +2790,11 @@ cross-spawn@^7.0.0: shebang-command "^2.0.0" which "^2.0.1" +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + css-background-parser@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/css-background-parser/-/css-background-parser-0.1.0.tgz#48a17f7fe6d4d4f1bca3177ddf16c5617950741b" @@ -2649,11 +2829,16 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.1: +csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +data-uri-to-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" + integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2743,6 +2928,15 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -2753,6 +2947,11 @@ deprecation@^2.0.0: resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2763,37 +2962,37 @@ detect-node-es@^1.1.0: resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== +devlop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: - path-type "^4.0.0" + dequal "^2.0.0" -discord-api-types@0.37.50: - version "0.37.50" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.50.tgz#6059eb8c0b784ad8194655a8b8b7f540fcfac428" - integrity sha512-X4CDiMnDbA3s3RaUXWXmgAIbY1uxab3fqe3qwzg5XutR3wjqi7M3IkgQbsIBzpqBN2YWr/Qdv7JrFRqSgb4TFg== +discord-api-types@0.37.61: + version "0.37.61" + resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.61.tgz#9dd8e58c624237e6f1b23be2d29579af268b8c5b" + integrity sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw== discord.js@^14.13.0: - version "14.13.0" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.13.0.tgz#e7a00bdba70adb9e266a06884ca1acaf9a0b5c20" - integrity sha512-Kufdvg7fpyTEwANGy9x7i4od4yu5c6gVddGi5CKm4Y5a6sF0VBODObI3o0Bh7TGCj0LfNT8Qp8z04wnLFzgnbA== + version "14.14.1" + resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.14.1.tgz#9a2bea23bba13819705ab87612837610abce9ee3" + integrity sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w== dependencies: - "@discordjs/builders" "^1.6.5" - "@discordjs/collection" "^1.5.3" - "@discordjs/formatters" "^0.3.2" - "@discordjs/rest" "^2.0.1" - "@discordjs/util" "^1.0.1" - "@discordjs/ws" "^1.0.1" - "@sapphire/snowflake" "^3.5.1" - "@types/ws" "^8.5.5" - discord-api-types "0.37.50" - fast-deep-equal "^3.1.3" - lodash.snakecase "^4.1.1" - tslib "^2.6.1" - undici "5.22.1" - ws "^8.13.0" + "@discordjs/builders" "^1.7.0" + "@discordjs/collection" "1.5.3" + "@discordjs/formatters" "^0.3.3" + "@discordjs/rest" "^2.1.0" + "@discordjs/util" "^1.0.2" + "@discordjs/ws" "^1.0.2" + "@sapphire/snowflake" "3.5.1" + "@types/ws" "8.5.9" + discord-api-types "0.37.61" + fast-deep-equal "3.1.3" + lodash.snakecase "4.1.1" + tslib "2.6.2" + undici "5.27.2" + ws "8.14.2" dotenv@^16.3.1: version "16.3.1" @@ -2805,7 +3004,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -easy-table@^1.2.0: +easy-table@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.2.0.tgz#ba9225d7138fee307bfd4f0b5bc3c04bdc7c54eb" integrity sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww== @@ -2819,15 +3018,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.526: - version "1.4.528" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.528.tgz#7c900fd73d9d2e8bb0dab0e301f25f0f4776ef2c" - integrity sha512-UdREXMXzLkREF4jA8t89FQjA8WHI6ssP38PMY4/4KhXFQbtImnghh4GkCgrtiZwLKUKVD2iTVXvDVQjfomEQuA== +electron-to-chromium@^1.4.601: + version "1.4.601" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz#cac69868548aee89961ffe63ff5a7716f0685b75" + integrity sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA== emoji-regex@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f" - integrity sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA== + version "10.3.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.3.0.tgz#76998b9268409eb3dae3de989254d456e70cfe23" + integrity sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw== emoji-regex@^8.0.0: version "8.0.0" @@ -2844,6 +3043,13 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +encode-registry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/encode-registry/-/encode-registry-3.0.1.tgz#cb925d0db14ce59b18882b62c67133721b0846d1" + integrity sha512-6qOwkl1g0fv0DN3Y3ggr2EaZXN71aoAqPp3p/pVaWSBSIo+YjLOWN61Fva43oVyQNPf7kgm8lkudzlzojwE2jw== + dependencies: + mem "^8.0.0" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" @@ -2856,6 +3062,18 @@ end-of-stream@^1.0.0: dependencies: once "^1.4.0" +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + esbuild@0.17.6: version "0.17.6" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.6.tgz#bbccd4433629deb6e0a83860b3b61da120ba4e01" @@ -2913,32 +3131,32 @@ esbuild@^0.18.10: "@esbuild/win32-x64" "0.18.20" esbuild@^0.19.3: - version "0.19.3" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" - integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== + version "0.19.8" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.8.tgz#ad05b72281d84483fa6b5345bd246c27a207b8f1" + integrity sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w== optionalDependencies: - "@esbuild/android-arm" "0.19.3" - "@esbuild/android-arm64" "0.19.3" - "@esbuild/android-x64" "0.19.3" - "@esbuild/darwin-arm64" "0.19.3" - "@esbuild/darwin-x64" "0.19.3" - "@esbuild/freebsd-arm64" "0.19.3" - "@esbuild/freebsd-x64" "0.19.3" - "@esbuild/linux-arm" "0.19.3" - "@esbuild/linux-arm64" "0.19.3" - "@esbuild/linux-ia32" "0.19.3" - "@esbuild/linux-loong64" "0.19.3" - "@esbuild/linux-mips64el" "0.19.3" - "@esbuild/linux-ppc64" "0.19.3" - "@esbuild/linux-riscv64" "0.19.3" - "@esbuild/linux-s390x" "0.19.3" - "@esbuild/linux-x64" "0.19.3" - "@esbuild/netbsd-x64" "0.19.3" - "@esbuild/openbsd-x64" "0.19.3" - "@esbuild/sunos-x64" "0.19.3" - "@esbuild/win32-arm64" "0.19.3" - "@esbuild/win32-ia32" "0.19.3" - "@esbuild/win32-x64" "0.19.3" + "@esbuild/android-arm" "0.19.8" + "@esbuild/android-arm64" "0.19.8" + "@esbuild/android-x64" "0.19.8" + "@esbuild/darwin-arm64" "0.19.8" + "@esbuild/darwin-x64" "0.19.8" + "@esbuild/freebsd-arm64" "0.19.8" + "@esbuild/freebsd-x64" "0.19.8" + "@esbuild/linux-arm" "0.19.8" + "@esbuild/linux-arm64" "0.19.8" + "@esbuild/linux-ia32" "0.19.8" + "@esbuild/linux-loong64" "0.19.8" + "@esbuild/linux-mips64el" "0.19.8" + "@esbuild/linux-ppc64" "0.19.8" + "@esbuild/linux-riscv64" "0.19.8" + "@esbuild/linux-s390x" "0.19.8" + "@esbuild/linux-x64" "0.19.8" + "@esbuild/netbsd-x64" "0.19.8" + "@esbuild/openbsd-x64" "0.19.8" + "@esbuild/sunos-x64" "0.19.8" + "@esbuild/win32-arm64" "0.19.8" + "@esbuild/win32-ia32" "0.19.8" + "@esbuild/win32-x64" "0.19.8" escalade@^3.1.1: version "3.1.1" @@ -3010,15 +3228,15 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" -fast-deep-equal@^3.1.3: +fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.12, fast-glob@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== +fast-glob@3.3.2, fast-glob@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -3026,6 +3244,11 @@ fast-glob@^3.2.12, fast-glob@^3.3.0: merge2 "^1.3.0" micromatch "^4.0.4" +fast-safe-stringify@^2.0.7: + version "2.1.1" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -3040,6 +3263,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fetch-blob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" + integrity sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow== + fflate@^0.7.3: version "0.7.4" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" @@ -3098,10 +3326,10 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -focus-trap@^7.5.2: - version "7.5.2" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.2.tgz#e5ee678d10a18651f2591ffb66c949fb098d57cf" - integrity sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw== +focus-trap@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2" + integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w== dependencies: tabbable "^6.2.0" @@ -3128,15 +3356,29 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fsevents@~2.3.2: +fs-extra@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== fuzzysort@^2.0.4: version "2.0.4" @@ -3148,15 +3390,15 @@ 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-intrinsic@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-nonce@^1.0.0: version "1.0.1" @@ -3184,33 +3426,53 @@ glob-to-regexp@^0.4.1: integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^10.2.2: - version "10.3.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.7.tgz#d5bd30a529c8c9b262fb4b217941f64ad90e25ac" - integrity sha512-wCMbE1m9Nx5yD9LYtgsVWq5VhHlk5WzJirw594qZR6AIvQYuHrdDtIktUVjQItalD53y7dqoedu9xP0u0WaxIQ== + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== dependencies: foreground-child "^3.1.0" - jackspeak "^2.0.3" + jackspeak "^2.3.5" minimatch "^9.0.1" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^13.1.3: - version "13.2.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== +globby@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.0.tgz#ea9c062a3614e33f516804e778590fcf055256b9" + integrity sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ== dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" + "@sindresorhus/merge-streams" "^1.0.0" + fast-glob "^3.3.2" ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" + path-type "^5.0.0" + slash "^5.1.0" + unicorn-magic "^0.1.0" -graceful-fs@^4.1.10, graceful-fs@^4.1.2: +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.10, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -3230,6 +3492,13 @@ has-own-property@^0.1.0: resolved "https://registry.yarnpkg.com/has-own-property/-/has-own-property-0.1.0.tgz#992b0f5bb3a25416f8d4d0cde53f497b9d7b1ea5" integrity sha512-14qdBKoonU99XDhWcFKZTShK+QV47qU97u8zzoVo9cL5TZ3BmBHXogItSt9qJjR0KUMFRhcCW8uGIGl8nkl7Aw== +has-property-descriptors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== + dependencies: + get-intrinsic "^1.2.2" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" @@ -3240,18 +3509,119 @@ has-symbols@^1.0.3: resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" + +hast-util-from-parse5@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz#654a5676a41211e14ee80d1b1758c399a0327651" + integrity sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^8.0.0" + property-information "^6.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.0.1.tgz#2ba8510e4ed2a1e541cde2a4ebb5c38ab4c82c2d" + integrity sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-to-html@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.0.tgz#51c0ae2a3550b9aa988c094c4fc4e327af0dddd1" + integrity sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + ccount "^2.0.0" + comma-separated-tokens "^2.0.0" + hast-util-raw "^9.0.0" + hast-util-whitespace "^3.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + stringify-entities "^4.0.0" + zwitch "^2.0.4" + +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + +hast-util-whitespace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== + dependencies: + "@types/hast" "^3.0.0" + +hastscript@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-8.0.0.tgz#4ef795ec8dee867101b9f23cc830d4baf4fd781a" + integrity sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" hex-rgb@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/hex-rgb/-/hex-rgb-4.3.0.tgz#af5e974e83bb2fefe44d55182b004ec818c07776" integrity sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw== +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -3281,21 +3651,34 @@ ieee754@^1.1.13: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.8, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" + integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== immer@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.2.tgz#11636c5b77acf529e059582d76faf338beb56141" - integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA== + version "10.0.3" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.0.3.tgz#a8de42065e964aa3edf6afc282dfc7f7f34ae3c9" + integrity sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A== 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== -inherits@2.0.4, inherits@~2.0.3: +individual@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/individual/-/individual-3.0.0.tgz#e7ca4f85f8957b018734f285750dc22ec2f9862d" + integrity sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3312,6 +3695,11 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3349,11 +3737,6 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3374,10 +3757,10 @@ iterable-lookahead@^1.0.0: resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" integrity sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ== -jackspeak@^2.0.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" - integrity sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg== +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -3388,17 +3771,17 @@ javascript-stringify@^2.0.1: resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== -jiti@^1.19.3: - version "1.20.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" - integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== +jiti@1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.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.1.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== @@ -3410,10 +3793,20 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + json-parse-even-better-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" - integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" + integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== + +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^2.1.2, json5@^2.2.3: version "2.2.3" @@ -3425,28 +3818,39 @@ jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== -knip@^2.27.1: - version "2.27.1" - resolved "https://registry.yarnpkg.com/knip/-/knip-2.27.1.tgz#ca228170cafa55fedbd7db739c2b2cc34faf712d" - integrity sha512-3YuqCWvdw/sjGSdGHzzKfX5eMXk1aOa9zpHLleSWqgm/xvrDHft7ezwyO8RSKpzyLKIU123Rimhr/AwgOyOuNQ== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - "@ericcornelissen/bash-parser" "^0.5.2" - "@npmcli/map-workspaces" "^3.0.4" - "@snyk/github-codeowners" "^1.1.0" + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +knip@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/knip/-/knip-3.4.0.tgz#4f4d25a56be70881e22456b201da5bce2fef6e48" + integrity sha512-YGNxfwv5LK28B5rgQkzpMBKusid4lZLTtGrUXbb/j7Iqu2PAt6jIgrYejzJXmnj/FvHGjwkWm2iAp2vRttoMqA== + dependencies: + "@ericcornelissen/bash-parser" "0.5.2" + "@npmcli/map-workspaces" "3.0.4" + "@pkgjs/parseargs" "0.11.0" + "@pnpm/logger" "5.0.0" + "@pnpm/workspace.pkgs-graph" "^2.0.10" + "@snyk/github-codeowners" "1.1.0" chalk "^5.2.0" - easy-table "^1.2.0" - fast-glob "^3.2.12" - globby "^13.1.3" - jiti "^1.19.3" - js-yaml "^4.1.0" - micromatch "^4.0.5" - minimist "^1.2.8" - pretty-ms "^8.0.0" - strip-json-comments "^5.0.0" - summary "^2.1.0" - typescript "^5.0.2" - zod "^3.22.2" - zod-validation-error "^1.5.0" + easy-table "1.2.0" + fast-glob "3.3.2" + globby "^14.0.0" + jiti "1.21.0" + js-yaml "4.1.0" + micromatch "4.0.5" + minimist "1.2.8" + pretty-ms "8.0.0" + strip-json-comments "5.0.1" + summary "2.1.0" + zod "3.22.4" + zod-validation-error "2.1.0" linebreak@^1.1.0: version "1.1.0" @@ -3456,6 +3860,21 @@ linebreak@^1.1.0: base64-js "0.0.8" unicode-trie "^2.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-json-file@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" + integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== + dependencies: + graceful-fs "^4.1.15" + parse-json "^5.0.0" + strip-bom "^4.0.0" + type-fest "^0.6.0" + loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -3482,7 +3901,7 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.snakecase@^4.1.1: +lodash.snakecase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== @@ -3499,6 +3918,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.1.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" + integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3506,15 +3930,17 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -"lru-cache@^9.1.1 || ^10.0.0": - version "10.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" - integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" -magic-bytes.js@^1.0.15: - version "1.0.17" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.0.17.tgz#6265d568df98c02b523c0defdd18b86cb2cae883" - integrity sha512-PEDpPzHpKe5AxkVmQrNPHFRvPN2ELkkj3eIg4IZO9JdhBiAY3aU53lgYXs9j8B7lpza+QiW0UA4QHCH7EskSeg== +magic-bytes.js@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.6.0.tgz#ee4354ac41a9b86f410e2690bc25dc4c264fb55d" + integrity sha512-eOGBE+NSCwU9dKKox93BPHjX4KSxIuiRY1/H1lkfxIagT0Llhs6bkRk8iqoP/0aeDl7FEZPa+ln5lay5mcNY4w== magic-string@^0.16.0: version "0.16.0" @@ -3523,10 +3949,10 @@ magic-string@^0.16.0: dependencies: vlq "^0.2.1" -magic-string@^0.30.0: - version "0.30.3" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" - integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== +magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -3537,6 +3963,13 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-age-cleaner@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + map-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" @@ -3552,6 +3985,20 @@ markdown-escape@^2.0.0: resolved "https://registry.yarnpkg.com/markdown-escape/-/markdown-escape-2.0.0.tgz#44484d30d7845b91575c77fd8898f23a0a6f890c" integrity sha512-Trz4v0+XWlwy68LJIyw3bLbsJiC8XAbRCKF9DbEtZjyndKOGVx6n+wNB0VfoRmY2LKboQLeniap3xrb6LGSJ8A== +mdast-util-to-hast@^13.0.0: + version "13.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz#74c0a9f014bb2340cae6118f6fccd75467792be7" + integrity sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og== + dependencies: + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + "@ungap/structured-clone" "^1.0.0" + devlop "^1.0.0" + micromark-util-sanitize-uri "^2.0.0" + trim-lines "^3.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + media-query-parser@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" @@ -3564,12 +4011,28 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +mem@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-6.1.1.tgz#ea110c2ebc079eca3022e6b08c85a795e77f6318" + integrity sha512-Ci6bIfq/UgcxPTYa8dQQ5FY3BzKkT894bwXWXxC/zqs0XgMO2cT20CGkOqda7gZNkmK5VP4x89IGZ6K7hfbn3Q== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.0.0" + +mem@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" + integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== + dependencies: + map-age-cleaner "^0.1.3" + mimic-fn "^3.1.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -3579,7 +4042,39 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromatch@^4.0.4, micromatch@^4.0.5: +micromark-util-character@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.0.1.tgz#52b824c2e2633b6fb33399d2ec78ee2a90d6b298" + integrity sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw== + dependencies: + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-util-encode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" + integrity sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA== + +micromark-util-sanitize-uri@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" + integrity sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-encode "^2.0.0" + micromark-util-symbol "^2.0.0" + +micromark-util-symbol@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" + integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== + +micromark-util-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" + integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== + +micromatch@4.0.5, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== @@ -3604,6 +4099,18 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mimic-fn@^3.0.0, mimic-fn@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" + integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== + +minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^9.0.0, minimatch@^9.0.1: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -3611,20 +4118,20 @@ minimatch@^9.0.0, minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.8: +minimist@1.2.8, minimist@^1.2.5: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" - integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== -minisearch@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.1.0.tgz#6e74e743dbd0e88fa5ca52fef2391e0aa7055252" - integrity sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg== +minisearch@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b" + integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ== mlly@^1.1.0, mlly@^1.2.0, mlly@^1.4.0: version "1.4.2" @@ -3636,6 +4143,16 @@ mlly@^1.1.0, mlly@^1.2.0, mlly@^1.4.0: pkg-types "^1.0.3" ufo "^1.3.0" +modern-ahocorasick@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" + integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== + +mrmime@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3651,44 +4168,67 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.3.4, nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== +nanoid@^3.3.6, nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +ndjson@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" + integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.5" + readable-stream "^3.6.0" + split2 "^3.0.0" + through2 "^4.0.0" negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -next@^13.5.2: - version "13.5.2" - resolved "https://registry.yarnpkg.com/next/-/next-13.5.2.tgz#809dd84e481049e298fe79d28b1d66b587483fca" - integrity sha512-vog4UhUaMYAzeqfiAAmgB/QWLW7p01/sg+2vn6bqc/CxHFYizMzLv6gjxKzl31EVFkfl/F+GbxlKizlkTE9RdA== +next@^14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/next/-/next-14.0.3.tgz#8d801a08eaefe5974203d71092fccc463103a03f" + integrity sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw== dependencies: - "@next/env" "13.5.2" + "@next/env" "14.0.3" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" - postcss "8.4.14" + postcss "8.4.31" styled-jsx "5.1.1" watchpack "2.4.0" - zod "3.21.4" optionalDependencies: - "@next/swc-darwin-arm64" "13.5.2" - "@next/swc-darwin-x64" "13.5.2" - "@next/swc-linux-arm64-gnu" "13.5.2" - "@next/swc-linux-arm64-musl" "13.5.2" - "@next/swc-linux-x64-gnu" "13.5.2" - "@next/swc-linux-x64-musl" "13.5.2" - "@next/swc-win32-arm64-msvc" "13.5.2" - "@next/swc-win32-ia32-msvc" "13.5.2" - "@next/swc-win32-x64-msvc" "13.5.2" + "@next/swc-darwin-arm64" "14.0.3" + "@next/swc-darwin-x64" "14.0.3" + "@next/swc-linux-arm64-gnu" "14.0.3" + "@next/swc-linux-arm64-musl" "14.0.3" + "@next/swc-linux-x64-gnu" "14.0.3" + "@next/swc-linux-x64-musl" "14.0.3" + "@next/swc-win32-arm64-msvc" "14.0.3" + "@next/swc-win32-ia32-msvc" "14.0.3" + "@next/swc-win32-x64-msvc" "14.0.3" -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== +node-fetch@3.0.0-beta.9: + version "3.0.0-beta.9" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.0.0-beta.9.tgz#0a7554cfb824380dd6812864389923c783c80d9b" + integrity sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg== + dependencies: + data-uri-to-buffer "^3.0.1" + fetch-blob "^2.1.1" + +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-normalize-package-bin@^3.0.0: version "3.0.1" @@ -3701,9 +4241,9 @@ object-assign@^4.0.1: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-pairs@^0.1.0: version "0.1.0" @@ -3722,7 +4262,7 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -once@^1.4.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -3734,7 +4274,12 @@ outdent@^0.8.0: resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.8.0.tgz#2ebc3e77bf49912543f1008100ff8e7f44428eb0" integrity sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A== -p-limit@^3.0.2: +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw== + +p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -3755,6 +4300,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-memoize@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/p-memoize/-/p-memoize-4.0.1.tgz#6f4231857fec10de2504611fe820c808fa8c5f8b" + integrity sha512-km0sP12uE0dOZ5qP+s7kGVf07QngxyG0gS8sYFvFWhqlgzOsSy+m71aUejf/0akxj5W7gE//2G74qTv6b4iMog== + dependencies: + mem "^6.0.1" + mimic-fn "^3.0.0" + pako@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -3768,11 +4321,35 @@ parse-css-color@^0.2.1: color-name "^1.1.4" hex-rgb "^4.1.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + parse-ms@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-3.0.0.tgz#3ea24a934913345fcc3656deda72df921da3a70e" integrity sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw== +parse-npm-tarball-url@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/parse-npm-tarball-url/-/parse-npm-tarball-url-3.0.0.tgz#4bcdd84b7eb824b9539182dea082f7bde2cbb24f" + integrity sha512-InpdgIdNe5xWMEUcrVQUniQKwnggBtJ7+SCwh7zQAZwbbIYZV9XdgJyhtmDSSvykFyQXoe4BINnzKTfCwWLs5g== + dependencies: + semver "^6.1.0" + +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" @@ -3783,6 +4360,11 @@ path-exists@^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" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -3796,15 +4378,22 @@ path-scurry@^1.10.1: lru-cache "^9.1.1 || ^10.0.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-temp@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-temp/-/path-temp-2.1.0.tgz#cc68bb26d4fc301df799bb40b8c005cab0e62786" + integrity sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w== + dependencies: + unique-string "^2.0.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path-type@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-5.0.0.tgz#14b01ed7aea7ddf9c7c3f46181d4d04f9c785bb8" + integrity sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg== pathe@^1.1.0, pathe@^1.1.1: version "1.1.1" @@ -3862,35 +4451,35 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.1.10, postcss@^8.4.27: - version "8.4.30" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" - integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.27, postcss@^8.4.31: + version "8.4.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" + integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact@^10.0.0: - version "10.17.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.17.1.tgz#0a1b3c658c019e759326b9648c62912cf5c2dde1" - integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== + version "10.19.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.2.tgz#841797620dba649aaac1f8be42d37c3202dcea8b" + integrity sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg== prettier@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" - integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" + integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== -pretty-ms@^8.0.0: +pretty-ms@8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-8.0.0.tgz#a35563b2a02df01e595538f86d7de54ca23194a3" integrity sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q== @@ -3898,17 +4487,22 @@ pretty-ms@^8.0.0: parse-ms "^3.0.0" prisma@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.4.1.tgz#2abbd2ae446519654330d67acd81e7bafbac67a2" - integrity sha512-op9PmU8Bcw5dNAas82wBYTG0yHnpq9/O3bhxbDBrNzwZTwBqsVCxxYRLf6wHNh9HVaDGhgjjHlu1+BcW8qdnBg== + version "5.6.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.6.0.tgz#ae2c27fdfb4d53be7f7dafb50d6b8b7f55c93aa5" + integrity sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A== dependencies: - "@prisma/engines" "5.4.1" + "@prisma/engines" "5.6.0" 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" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +property-information@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" + integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -3929,6 +4523,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +"ramda@npm:@pnpm/ramda@0.28.1": + version "0.28.1" + resolved "https://registry.yarnpkg.com/@pnpm/ramda/-/ramda-0.28.1.tgz#0f32abc5275d586a03e0dc1dd90a009ac668ff33" + integrity sha512-zcAG+lvU0fMziNeGXpPyCyCJYp5ZVrPElEE4t14jAmViaihohocZ+dDkcRIyAomox8pQsuZnv1EyHR+pOhmUWw== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -4003,6 +4602,15 @@ read-package-json-fast@^3.0.0: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -4021,6 +4629,14 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== +rename-overwrite@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/rename-overwrite/-/rename-overwrite-4.0.4.tgz#254f0fa91610fa467c233482109ae1dc2f365736" + integrity sha512-5MC+p5npnyaJlFkwTHb0pqU2mkUkkW65ZWH8qwxcDlv+5nchtalcdzG+gaaianbWWwvwxi7vu7WSg6jdCweKug== + dependencies: + "@zkochan/rimraf" "^2.1.2" + fs-extra "10.1.0" + "require-like@>= 0.1.1": version "0.1.2" resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" @@ -4036,13 +4652,39 @@ reverse-arguments@^1.0.0: resolved "https://registry.yarnpkg.com/reverse-arguments/-/reverse-arguments-1.0.0.tgz#c28095a3a921ac715d61834ddece9027992667cd" integrity sha512-/x8uIPdTafBqakK0TmPNJzgkLP+3H+yxpUJhCQHsLBg1rYEVNR2D8BRYNWQhVBjyOd7oo1dZRVzIkwMY2oqfYQ== +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rollup@^3.27.1: - version "3.29.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.3.tgz#97769774ccaa6a3059083d4680fcabd8ead01289" - integrity sha512-T7du6Hum8jOkSWetjRgbwpM6Sy0nECYrYRSmZjayFcOddtKJWU4d17AC3HNUk7HRuqy4p+G7aEZclSHytqUmEg== + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" +rollup@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.6.1.tgz#351501c86b5b4f976dde8c5837516452b59921f8" + integrity sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ== + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.6.1" + "@rollup/rollup-android-arm64" "4.6.1" + "@rollup/rollup-darwin-arm64" "4.6.1" + "@rollup/rollup-darwin-x64" "4.6.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.6.1" + "@rollup/rollup-linux-arm64-gnu" "4.6.1" + "@rollup/rollup-linux-arm64-musl" "4.6.1" + "@rollup/rollup-linux-x64-gnu" "4.6.1" + "@rollup/rollup-linux-x64-musl" "4.6.1" + "@rollup/rollup-win32-arm64-msvc" "4.6.1" + "@rollup/rollup-win32-ia32-msvc" "4.6.1" + "@rollup/rollup-win32-x64-msvc" "4.6.1" + fsevents "~2.3.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4050,7 +4692,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.2.1, safe-buffer@^5.1.1: +safe-buffer@5.2.1, safe-buffer@^5.1.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -4066,9 +4708,9 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== satori@^0.10.8: - version "0.10.8" - resolved "https://registry.yarnpkg.com/satori/-/satori-0.10.8.tgz#15dac06ef46d08e8fbc5bbb7e372eadbb7d2eded" - integrity sha512-WlPLxgpx5kIyMuOO6qi98DhZGIbRk5XJRqENkt6D6gyDBWGyo3M5kcSl0X/oSFHUH+n4unlzwMejoPM47s4zug== + version "0.10.11" + resolved "https://registry.yarnpkg.com/satori/-/satori-0.10.11.tgz#4d198beef405668120566d29a554411c534d8a5d" + integrity sha512-yLm1xPRPZUaKcBZJ6nmezoJjHB4MqV8x7Mu0PyZUJodRWRDD27UbeMwzuY9LEGG57WYLO4CQsGPlbHWV1Ex9TQ== dependencies: "@shuding/opentype.js" "1.4.0-beta.0" css-background-parser "^0.1.0" @@ -4100,11 +4742,18 @@ seek-bzip@^1.0.5: dependencies: commander "^2.8.1" -semver@^6.3.1: +semver@^6.1.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.4.0, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -4134,6 +4783,16 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" @@ -4156,15 +4815,19 @@ shell-quote-word@^1.0.1: resolved "https://registry.yarnpkg.com/shell-quote-word/-/shell-quote-word-1.0.1.tgz#e2bdfd22d599fd68886491677e38f560f9d469c9" integrity sha512-lT297f1WLAdq0A4O+AknIFRP6kkiI3s8C913eJ0XqBxJbZPGWUNkRQk2u8zk4bEAjUJ5i+fSLwB6z1HzeT+DEg== -shiki@^0.14.4: - version "0.14.4" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.4.tgz#2454969b466a5f75067d0f2fa0d7426d32881b20" - integrity sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ== +shikiji-transformers@^0.7.4: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shikiji-transformers/-/shikiji-transformers-0.7.6.tgz#56e9317f87aabd8f18f8899d94121532d720b69f" + integrity sha512-yTp+7JMD/aXbV9ndn14eo9IK/UNt8iDsLNyqlOmCtcldlkqWE9T2YKAlOHOTVaeDfYWUWZa2EgSXb/CBfepBrw== dependencies: - ansi-sequence-parser "^1.1.0" - jsonc-parser "^3.2.0" - vscode-oniguruma "^1.7.0" - vscode-textmate "^8.0.0" + shikiji "0.7.6" + +shikiji@0.7.6, shikiji@^0.7.4: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shikiji/-/shikiji-0.7.6.tgz#ae65517af8dfbb4f861288cd888e8ecaf9aceec9" + integrity sha512-KzEtvSGQtBvfwVIB70kOmIfl/5rz1LC8j+tvlHXsJKAIdONNQvG1at7ivUUq3xUctqgO6fsO3AGomUSh0F+wsQ== + dependencies: + hast-util-to-html "^9.0.0" side-channel@^1.0.4: version "1.0.4" @@ -4180,10 +4843,10 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slash@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" + integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg== source-map-js@^1.0.2: version "1.0.2" @@ -4203,6 +4866,25 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +space-separated-tokens@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +ssri@10.0.5: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -4214,7 +4896,6 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4242,6 +4923,13 @@ string.prototype.codepointat@^0.2.1: resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz#004ad44c8afc727527b108cd462b4d971cd469bc" integrity sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg== +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4249,8 +4937,15 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +stringify-entities@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.3.tgz#cfabd7039d22ad30f3cc435b0ca2c1574fc88ef8" + integrity sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g== + dependencies: + character-entities-html4 "^2.0.0" + character-entities-legacy "^3.0.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4264,6 +4959,11 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + strip-dirs@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5" @@ -4271,7 +4971,7 @@ strip-dirs@^2.0.0: dependencies: is-natural-number "^4.0.1" -strip-json-comments@^5.0.0: +strip-json-comments@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== @@ -4283,7 +4983,7 @@ styled-jsx@5.1.1: dependencies: client-only "0.0.1" -summary@^2.1.0: +summary@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/summary/-/summary-2.1.0.tgz#be8a49a0aa34eb6ceea56042cae88f8add4b0885" integrity sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw== @@ -4320,6 +5020,13 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -4371,16 +5078,26 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +trim-lines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== + ts-mixer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.1: +tslib@2.6.2, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -4389,15 +5106,15 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^5.0.2, typescript@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typescript@^5.2.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" + integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== ufo@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.0.tgz#c92f8ac209daff607c57bbd75029e190930a0019" - integrity sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw== + version "1.3.2" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" + integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== unbzip2-stream@^1.0.9: version "1.4.3" @@ -4407,12 +5124,17 @@ unbzip2-stream@^1.0.9: buffer "^5.2.1" through "^2.3.8" -undici@5.22.1: - version "5.22.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.22.1.tgz#877d512effef2ac8be65e695f3586922e1a57d7b" - integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + +undici@5.27.2: + version "5.27.2" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" unescape-js@^1.0.5: version "1.1.4" @@ -4429,10 +5151,65 @@ unicode-trie@^2.0.0: pako "^0.2.5" tiny-inflate "^1.0.0" -universal-user-agent@^6.0.0: +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-position@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-stringify-position@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== + dependencies: + "@types/unist" "^3.0.0" + +unist-util-visit-parents@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + +unist-util-visit@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + dependencies: + "@types/unist" "^3.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + +universal-user-agent@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" @@ -4467,7 +5244,7 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4477,11 +5254,50 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== +version-selector-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/version-selector-type/-/version-selector-type-3.0.0.tgz#47c365fb4d9ca4a54e6dabcad6fb7a46265f7955" + integrity sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA== + dependencies: + semver "^7.3.2" + +vfile-location@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.2.tgz#220d9ca1ab6f8b2504a4db398f7ebc149f9cb464" + integrity sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + +vfile-message@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + +vfile@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.1.tgz#1e8327f41eac91947d4fe9d237a2dd9209762536" + integrity sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw== + dependencies: + "@types/unist" "^3.0.0" + unist-util-stringify-position "^4.0.0" + vfile-message "^4.0.0" + vite-node@^0.28.5: version "0.28.5" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.28.5.tgz#56d0f78846ea40fddf2e28390899df52a4738006" @@ -4497,9 +5313,9 @@ vite-node@^0.28.5: vite "^3.0.0 || ^4.0.0" vite-node@^0.34.5: - version "0.34.5" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.5.tgz#21d6bd637cb0c14d0edc1d7bdf832a70dc11c427" - integrity sha512-RNZ+DwbCvDoI5CbCSQSyRyzDTfFvFauvMs6Yq4ObJROKlIKuat1KgSX/Ako5rlDMfVCyMcpMRMTkJBxd6z8YRA== + version "0.34.6" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.6.tgz#34d19795de1498562bf21541a58edcd106328a17" + integrity sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA== dependencies: cac "^6.7.14" debug "^4.3.4" @@ -4508,10 +5324,10 @@ vite-node@^0.34.5: picocolors "^1.0.0" vite "^3.0.0 || ^4.0.0 || ^5.0.0-0" -"vite@^3.0.0 || ^4.0.0", "vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", vite@^4.1.4, vite@^4.4.9: - version "4.4.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" - integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== +"vite@^3.0.0 || ^4.0.0", vite@^4.1.4: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -4519,59 +5335,63 @@ vite-node@^0.34.5: optionalDependencies: fsevents "~2.3.2" +"vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", vite@^5.0.2: + version "5.0.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.4.tgz#d984d2aaa8bac30f1ca9b9eea9b97e052f88c307" + integrity sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg== + dependencies: + esbuild "^0.19.3" + postcss "^8.4.31" + rollup "^4.2.0" + optionalDependencies: + fsevents "~2.3.3" + vitepress-plugin-auto-sidebar@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vitepress-plugin-auto-sidebar/-/vitepress-plugin-auto-sidebar-1.1.0.tgz#d8131e31143e99b6e142cb7d23b9323a578a862b" integrity sha512-LgkpjKVlNlQS54PFv5R/Y4+CHtHoXsJ3xgyVTKNi0sG1fXUmViKCg3Hnl9eo/SfNn894qsNRXoNneQmRBP2Lmw== vitepress@^1.0.0-rc.20: - version "1.0.0-rc.20" - resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.0-rc.20.tgz#a5570f929c52cef010da26039cf9122c11e160a1" - integrity sha512-CykMUJ8JLxLcGWek0ew3wln4RYbsOd1+0YzXITTpajggpynm2S331TNkJVOkHrMRc6GYe3y4pS40GfgcW0ZwAw== + version "1.0.0-rc.31" + resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.0-rc.31.tgz#8defda3d5705a219e5bf3565efe57c7d52315b01" + integrity sha512-ikH9pIjOOAbyoYAGBVfTz8TzuXp+UoWaIRMU4bw/oiTg8R65SbAaGKY84xx6TuL+f4VqUJ8lhzW82YyxSLvstA== dependencies: "@docsearch/css" "^3.5.2" "@docsearch/js" "^3.5.2" - "@types/markdown-it" "^13.0.1" - "@vue/devtools-api" "^6.5.0" - "@vueuse/core" "^10.4.1" - "@vueuse/integrations" "^10.4.1" - focus-trap "^7.5.2" + "@types/markdown-it" "^13.0.7" + "@vitejs/plugin-vue" "^4.5.0" + "@vue/devtools-api" "^6.5.1" + "@vueuse/core" "^10.6.1" + "@vueuse/integrations" "^10.6.1" + focus-trap "^7.5.4" mark.js "8.11.1" - minisearch "^6.1.0" - shiki "^0.14.4" - vite "^4.4.9" - vue "^3.3.4" + minisearch "^6.3.0" + mrmime "^1.0.1" + shikiji "^0.7.4" + shikiji-transformers "^0.7.4" + vite "^5.0.2" + vue "^3.3.8" vlq@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== -vscode-oniguruma@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" - integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== - -vscode-textmate@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" - integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== - -vue-demi@>=0.14.5: +vue-demi@>=0.14.6: version "0.14.6" resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92" integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== -vue@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" - integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== +vue@^3.3.8: + version "3.3.9" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.9.tgz#219a2ec68e8d4d0b0180460af0f5b9299b3f3f1f" + integrity sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w== dependencies: - "@vue/compiler-dom" "3.3.4" - "@vue/compiler-sfc" "3.3.4" - "@vue/runtime-dom" "3.3.4" - "@vue/server-renderer" "3.3.4" - "@vue/shared" "3.3.4" + "@vue/compiler-dom" "3.3.9" + "@vue/compiler-sfc" "3.3.9" + "@vue/runtime-dom" "3.3.9" + "@vue/server-renderer" "3.3.9" + "@vue/shared" "3.3.9" watchpack@2.4.0: version "2.4.0" @@ -4588,6 +5408,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -4618,7 +5443,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.13.0: +ws@8.14.2, ws@^8.14.2: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== @@ -4640,6 +5465,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" @@ -4663,24 +5493,24 @@ yoga-wasm-web@^0.3.3: resolved "https://registry.yarnpkg.com/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz#eb8e9fcb18e5e651994732f19a220cb885d932ba" integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== -zod-validation-error@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-1.5.0.tgz#2b355007a1c3b7fb04fa476bfad4e7b3fd5491e3" - integrity sha512-/7eFkAI4qV0tcxMBB/3+d2c1P6jzzZYdYSlBuAklzMuCrJu5bzJfHS0yVAS87dRHVlhftd6RFJDIvv03JgkSbw== +zod-validation-error@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-2.1.0.tgz#208eac75237dfed47c0018d2fe8fd03501bfc9ac" + integrity sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ== -zod@3.21.4: - version "3.21.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" - integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== - -zod@^3.22.2: - version "3.22.2" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" - integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== +zod@3.22.4: + version "3.22.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" + integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== zustand@^4.4.1: - version "4.4.1" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" - integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== + version "4.4.7" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" + integrity sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw== dependencies: use-sync-external-store "1.2.0" + +zwitch@^2.0.0, zwitch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From 1d1d751d4338d56443d79e8f27fef6cce199af78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:16:59 -0600 Subject: [PATCH 18/74] fix: missing tank types --- src/components/Breakdown/components/Row.tsx | 8 ++++---- src/components/Tanks/components/Item.tsx | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Breakdown/components/Row.tsx b/src/components/Breakdown/components/Row.tsx index 13040c43a..13da1e0f2 100644 --- a/src/components/Breakdown/components/Row.tsx +++ b/src/components/Breakdown/components/Row.tsx @@ -5,7 +5,7 @@ import { GrayColor, PALETTES, } from '../../../constants/radixColors'; -import { TREE_TYPE_ICONS, TreeTypeEnum } from '../../Tanks'; +import { TREE_TYPE_ICONS, TankType, TreeTypeEnum } from '../../Tanks'; import { RowStat } from './RowStat'; export interface RowStatItem { @@ -21,7 +21,7 @@ interface RowProps { title: string; minimized?: boolean; treeType?: TreeTypeEnum; - tankType?: string; + tankType?: TankType; color?: AccentColor | GrayColor; stats: (RowStatItem | undefined)[]; } @@ -72,8 +72,8 @@ export function Row({ ? treeType === TreeTypeEnum.Collector ? theme.textLowContrast_blue : treeType === TreeTypeEnum.Premium - ? theme.textLowContrast_amber - : theme.textHighContrast + ? theme.textLowContrast_amber + : theme.textHighContrast : theme.textLowContrast, fontWeight: 900, fontSize: 16, diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index ce3f5ba35..d92e33bd9 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -22,7 +22,7 @@ export const TREE_TYPE_NAMES: Record = { export interface ItemProps { image?: string; - tankType?: string; + tankType?: TankType; name: string; treeType: TreeTypeEnum; } From 579d7570afdfb066a4061f71c3a1ed9be63f1ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 18:26:48 -0600 Subject: [PATCH 19/74] feat: better sizing --- .../tankopedia/components/List/index.css.tsx | 2 +- .../tankopedia/components/List/index.tsx | 19 ++++++++++++------- src/app/tools/tankopedia/page.css.tsx | 0 src/components/PageWrapper.tsx | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) delete mode 100644 src/app/tools/tankopedia/page.css.tsx diff --git a/src/app/tools/tankopedia/components/List/index.css.tsx b/src/app/tools/tankopedia/components/List/index.css.tsx index 0d2846c87..fdf0efa93 100644 --- a/src/app/tools/tankopedia/components/List/index.css.tsx +++ b/src/app/tools/tankopedia/components/List/index.css.tsx @@ -7,7 +7,7 @@ export const listingShadow = style({ boxShadow: `inset 0 -128px 128px -128px ${theme.colors.appBackground1}`, [`.${listing}:hover &`]: { - boxShadow: `inset 0 0 128px -128px ${theme.colors.appBackground1}`, + boxShadow: `inset 0 0 0 -128px ${theme.colors.appBackground1}`, }, }); diff --git a/src/app/tools/tankopedia/components/List/index.tsx b/src/app/tools/tankopedia/components/List/index.tsx index dcacec1c1..4b72a37f0 100644 --- a/src/app/tools/tankopedia/components/List/index.tsx +++ b/src/app/tools/tankopedia/components/List/index.tsx @@ -37,13 +37,18 @@ export function List() { input={input} list={awaitedTanks.map((tank, index) => ({ node: ( - + @@ -96,8 +101,8 @@ export function List() { tank.tree_type === 'collector' ? 'blue' : tank.tree_type === 'premium' - ? 'amber' - : undefined + ? 'amber' + : undefined } weight="medium" style={{ diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.tsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/components/PageWrapper.tsx b/src/components/PageWrapper.tsx index df8f10e84..09ce1bfb6 100644 --- a/src/components/PageWrapper.tsx +++ b/src/components/PageWrapper.tsx @@ -19,7 +19,7 @@ export default function PageWrapper({ gap="4" style={{ width: '100%', - maxWidth: size === 'regular' ? 800 : 880, + maxWidth: size === 'regular' ? 800 : 960, margin: 'auto', padding: 16, boxSizing: 'border-box', From c5e1a7d6ab57cb4c54608fa47d57b764593689e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 19:45:43 -0600 Subject: [PATCH 20/74] feat: page turner --- src/app/layout.tsx | 8 +- .../ratings/components/PageTurner/index.tsx | 2 + .../tankopedia/components/List/index.tsx | 135 ----------- .../tools/tankopedia/components/Options.tsx | 60 +++++ .../tankopedia/components/PageTurner.tsx | 0 .../List/index.css.tsx => page.css.tsx} | 8 +- src/app/tools/tankopedia/page.tsx | 226 +++++++++++++++++- src/stores/tankopedia.ts | 27 +++ 8 files changed, 322 insertions(+), 144 deletions(-) delete mode 100644 src/app/tools/tankopedia/components/List/index.tsx create mode 100644 src/app/tools/tankopedia/components/Options.tsx create mode 100644 src/app/tools/tankopedia/components/PageTurner.tsx rename src/app/tools/tankopedia/{components/List/index.css.tsx => page.css.tsx} (75%) create mode 100644 src/stores/tankopedia.ts diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 69c55312d..969502694 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -41,7 +41,13 @@ export default function RootLayout({ children }: RootLayoutProps) { : 'url(https://i.imgur.com/PhS06NJ.png)', }} > - + {!isEmbed && } {children} diff --git a/src/app/tools/ratings/components/PageTurner/index.tsx b/src/app/tools/ratings/components/PageTurner/index.tsx index ba009d392..ecda55b86 100644 --- a/src/app/tools/ratings/components/PageTurner/index.tsx +++ b/src/app/tools/ratings/components/PageTurner/index.tsx @@ -59,6 +59,8 @@ export function PageTurner({ type="number" ref={pageInput} style={{ width: 64, textAlign: 'center' }} + min={1} + max={pages} onBlur={(event) => { onPageChange( Math.max( diff --git a/src/app/tools/tankopedia/components/List/index.tsx b/src/app/tools/tankopedia/components/List/index.tsx deleted file mode 100644 index 4b72a37f0..000000000 --- a/src/app/tools/tankopedia/components/List/index.tsx +++ /dev/null @@ -1,135 +0,0 @@ -'use client'; - -import { slateDark } from '@radix-ui/colors'; -import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; -import { Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; -import { use, useRef } from 'react'; -import { Search } from 'react-fuzzysort'; -import { tankIcon } from '../../../../../core/blitzkrieg/tankIcon'; -import { - TANK_ICONS, - TANK_ICONS_COLLECTOR, - TANK_ICONS_PREMIUM, - tanks, -} from '../../../../../core/blitzkrieg/tankopedia'; -import { theme } from '../../../../../stitches.config'; -import * as styles from './index.css'; - -export function List() { - const awaitedTanks = use( - tanks.then((tanks) => tanks.sort((a, b) => b.tier - a.tier)), - ); - const input = useRef(null); - - return ( - <> - - - - - - - - {awaitedTanks.length > 0 && ( - - ({ - node: ( - - - - - -
- - - - - {tank.name_short ?? - tank.name ?? - `Unknown tank ${tank.id}`} - - - - - - ), - query: `${ - tank.name_short ?? tank.name ?? `Unknown tank ${tank.id}` - } ${tank.tree_type} ${ - tank.type === 'AT-SPG' ? 'tank destroyer' : tank.type - } ${tank.id}`, - }))} - /> - - )} - - ); -} diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx new file mode 100644 index 000000000..43fce3f1c --- /dev/null +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -0,0 +1,60 @@ +import { CaretDownIcon } from '@radix-ui/react-icons'; +import { Button, DropdownMenu, Flex } from '@radix-ui/themes'; +import { + TankopediaSortBy, + TankopediaSortDirection, + useTankopedia, +} from '../../../../stores/tankopedia'; + +export function Options() { + const tankopediaState = useTankopedia(); + + return ( + + + + + + + + useTankopedia.setState({ sortBy: value as TankopediaSortBy }) + } + > + Tier + + + + + + + + + + + useTankopedia.setState({ + sortDirection: value as TankopediaSortDirection, + }) + } + > + + Ascending + + + Descending + + + + + + ); +} diff --git a/src/app/tools/tankopedia/components/PageTurner.tsx b/src/app/tools/tankopedia/components/PageTurner.tsx new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/tools/tankopedia/components/List/index.css.tsx b/src/app/tools/tankopedia/page.css.tsx similarity index 75% rename from src/app/tools/tankopedia/components/List/index.css.tsx rename to src/app/tools/tankopedia/page.css.tsx index fdf0efa93..2e23bdc30 100644 --- a/src/app/tools/tankopedia/components/List/index.css.tsx +++ b/src/app/tools/tankopedia/page.css.tsx @@ -1,12 +1,12 @@ import { style } from '@vanilla-extract/css'; -import { theme } from '../../../../../stitches.config'; +import { theme } from '../../../stitches.config'; export const listing = style({}); export const listingShadow = style({ boxShadow: `inset 0 -128px 128px -128px ${theme.colors.appBackground1}`, - [`.${listing}:hover &`]: { + [`.${listing}:hover &, .${listing}:active &`]: { boxShadow: `inset 0 0 0 -128px ${theme.colors.appBackground1}`, }, }); @@ -15,7 +15,7 @@ export const listingLabel = style({ transition: `transform ${theme.durations.regular}`, transform: 'translateY(0)', - [`.${listing}:hover &`]: { + [`.${listing}:hover &, .${listing}:active &`]: { transform: 'translateY(200%)', }, }); @@ -24,7 +24,7 @@ export const listingImage = style({ transition: `transform ${theme.durations.regular}`, transform: 'translateX(25%) translateY(0)', - [`.${listing}:hover &`]: { + [`.${listing}:hover &, .${listing}:active &`]: { transform: 'translateX(25%) translateY(10%)', }, }); diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index ca38f7641..6bebd5f78 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -1,13 +1,231 @@ -import { Text } from '@radix-ui/themes'; -import { Suspense } from 'react'; +'use client'; + +import { slateDark } from '@radix-ui/colors'; +import { + CaretLeftIcon, + CaretRightIcon, + MagnifyingGlassIcon, +} from '@radix-ui/react-icons'; +import { Button, Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; +import { go } from 'fuzzysort'; +import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; -import { List } from './components/List'; +import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; +import { + BlitzkriegTankopediaEntry, + TANK_ICONS, + TANK_ICONS_COLLECTOR, + TANK_ICONS_PREMIUM, + tanks, +} from '../../../core/blitzkrieg/tankopedia'; +import { theme } from '../../../stitches.config'; +import { useTankopedia } from '../../../stores/tankopedia'; +import { Options } from './components/Options'; +import * as styles from './page.css'; + +const TANKS_PER_PAGE = 30; export default function Page() { + const tankopediaState = useTankopedia(); + const awaitedTanks = use(tanks); + const input = useRef(null); + const sortedTanks = useMemo( + () => + awaitedTanks.sort((a, b) => { + let diff = 0; + if (tankopediaState.sortBy === 'tier') diff = a.tier - b.tier; + return tankopediaState.sortDirection === 'ascending' ? diff : -diff; + }), + [tankopediaState.sortBy, tankopediaState.sortDirection], + ); + const [searchedList, setSearchedList] = useState(sortedTanks); + const [page, setPage] = useState(0); + const pageInput = useRef(null); + + useEffect(() => { + if (pageInput.current) pageInput.current.value = `${page + 1}`; + }, [page]); + return ( Loading...}> - + + + + + + { + if (event.target.value.length === 0) { + setSearchedList(sortedTanks); + } else { + setSearchedList( + go(event.target.value, sortedTanks, { + keys: [ + 'name', + 'name_short', + 'id', + 'nation', + 'tree_type', + 'type', + ] satisfies (keyof BlitzkriegTankopediaEntry)[], + }).map(({ obj }) => obj), + ); + } + }} + /> + + + + + + + + Page + { + setPage( + Math.max( + 0, + Math.min( + Math.floor(searchedList.length / TANKS_PER_PAGE), + event.target.valueAsNumber - 1, + ), + ), + ); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + (event.target as HTMLInputElement).blur(); + } + }} + /> + + out of {Math.floor(searchedList.length / TANKS_PER_PAGE) + 1} + + + + + + + + {searchedList + .map((tank) => ( + + + + + +
+ + + + + {tank.name_short ?? + tank.name ?? + `Unknown tank ${tank.id}`} + + + + + + )) + .slice(page * TANKS_PER_PAGE, (page + 1) * TANKS_PER_PAGE)} + ); diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts new file mode 100644 index 000000000..097b9441b --- /dev/null +++ b/src/stores/tankopedia.ts @@ -0,0 +1,27 @@ +import { produce } from 'immer'; +import { create } from 'zustand'; +import { devtools, persist } from 'zustand/middleware'; + +export type TankopediaSortBy = 'tier'; +export type TankopediaSortDirection = 'ascending' | 'descending'; + +type Tankopedia = { + sortBy: TankopediaSortBy; + sortDirection: TankopediaSortDirection; +}; + +export const useTankopedia = create()( + devtools( + persist( + (set) => ({ + sortBy: 'tier', + sortDirection: 'descending', + }), + { name: 'tankopedia' }, + ), + ), +); + +export default function mutateTankopedia(recipe: (draft: Tankopedia) => void) { + useTankopedia.setState(produce(recipe)); +} From 20c839394a0ba86fcee9011c9bf5e8361a29ed71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 19:51:55 -0600 Subject: [PATCH 21/74] fix: page readjusting on search --- src/app/tools/tankopedia/page.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 6bebd5f78..a2f24d7f8 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -45,6 +45,14 @@ export default function Page() { useEffect(() => { if (pageInput.current) pageInput.current.value = `${page + 1}`; }, [page]); + useEffect(() => { + setPage( + Math.min( + Math.max(0, page), + Math.ceil(searchedList.length / TANKS_PER_PAGE) - 1, + ), + ); + }, [searchedList]); return ( From 28e2139683e8ff4c005f0581b790af29164ea46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 3 Dec 2023 21:44:58 -0600 Subject: [PATCH 22/74] feat: even coooooooooler animations --- src/app/tools/tankopedia/page.css.tsx | 15 ++++++++++--- src/app/tools/tankopedia/page.tsx | 32 ++++++++++++++++++--------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.tsx index 2e23bdc30..caac3d0f6 100644 --- a/src/app/tools/tankopedia/page.css.tsx +++ b/src/app/tools/tankopedia/page.css.tsx @@ -1,7 +1,15 @@ import { style } from '@vanilla-extract/css'; import { theme } from '../../../stitches.config'; -export const listing = style({}); +export const listing = style({ + transition: `background-position ${theme.durations.regular}`, + + backgroundPosition: 'left center', + + ':hover': { + backgroundPosition: '-256px center', + }, +}); export const listingShadow = style({ boxShadow: `inset 0 -128px 128px -128px ${theme.colors.appBackground1}`, @@ -22,9 +30,10 @@ export const listingLabel = style({ export const listingImage = style({ transition: `transform ${theme.durations.regular}`, - transform: 'translateX(25%) translateY(0)', + position: 'absolute', + left: '50%', [`.${listing}:hover &, .${listing}:active &`]: { - transform: 'translateX(25%) translateY(10%)', + transform: 'translate(-25%, 10%)', }, }); diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index a2f24d7f8..9d806f0b4 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -154,26 +154,38 @@ export default function Page() { flex: 1, }} > - + - + className={styles.listingImage} + > + +
Date: Sun, 3 Dec 2023 22:09:08 -0600 Subject: [PATCH 23/74] feat: i am having too much fun --- scripts/buildTankopedia.ts | 8 +++++--- src/app/tools/tankopedia/page.css.tsx | 13 ++++++++----- src/app/tools/tankopedia/page.tsx | 27 +++++++++++++++++++-------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index 14f79b7f9..c417171b9 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -98,8 +98,8 @@ Promise.all( tree_type: isCollector ? 'collector' : isPremium - ? 'premium' - : 'tech-tree', + ? 'premium' + : 'tech-tree', tier, type, }; @@ -164,7 +164,9 @@ Promise.all( // ).flat() as FileChange[]; const flagChanges = await readdir( `${TEMP}/${directoriesOfInterest.flags}`, - ).then((flags) => flags.filter((flag) => flag.startsWith('flag_text'))); + ).then((flags) => + flags.filter((flag) => flag.startsWith('flag_tutor-tank_')), + ); console.log(flagChanges); diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.tsx index caac3d0f6..1d3407fe6 100644 --- a/src/app/tools/tankopedia/page.css.tsx +++ b/src/app/tools/tankopedia/page.css.tsx @@ -1,13 +1,16 @@ import { style } from '@vanilla-extract/css'; import { theme } from '../../../stitches.config'; -export const listing = style({ - transition: `background-position ${theme.durations.regular}`, +export const listing = style({}); - backgroundPosition: 'left center', +export const flag = style({ + transitionDuration: theme.durations.regular, + left: '0', + top: '0', - ':hover': { - backgroundPosition: '-256px center', + [`.${listing}:hover &, .${listing}:active &`]: { + transform: 'translateX(-25%)', + filter: 'blur(3rem)', }, }); diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 9d806f0b4..4f22e1d07 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -23,6 +23,12 @@ import { useTankopedia } from '../../../stores/tankopedia'; import { Options } from './components/Options'; import * as styles from './page.css'; +const flags = [ + 'https://i.imgur.com/Iho9ATV.png', + 'https://i.imgur.com/uKWdnOn.png', + 'https://i.imgur.com/kf4GwjJ.png', +]; + const TANKS_PER_PAGE = 30; export default function Page() { @@ -154,14 +160,7 @@ export default function Page() { flex: 1, }} > - + + +
Date: Sun, 3 Dec 2023 22:11:37 -0600 Subject: [PATCH 24/74] feat: :) --- src/app/tools/tankopedia/page.css.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.tsx index 1d3407fe6..84e4839ef 100644 --- a/src/app/tools/tankopedia/page.css.tsx +++ b/src/app/tools/tankopedia/page.css.tsx @@ -15,7 +15,7 @@ export const flag = style({ }); export const listingShadow = style({ - boxShadow: `inset 0 -128px 128px -128px ${theme.colors.appBackground1}`, + boxShadow: `inset 128px -128px 128px -128px ${theme.colors.appBackground1}`, [`.${listing}:hover &, .${listing}:active &`]: { boxShadow: `inset 0 0 0 -128px ${theme.colors.appBackground1}`, From 3e952faad30a5729db714b8636d2dfcc9dee4242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:13:14 -0600 Subject: [PATCH 25/74] feat: correct flags --- scripts/buildTankopedia.ts | 44 ++++++++++++++++++++++--------- src/app/tools/tankopedia/page.tsx | 30 +++++++++------------ 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/scripts/buildTankopedia.ts b/scripts/buildTankopedia.ts index c417171b9..93680c356 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildTankopedia.ts @@ -1,5 +1,6 @@ import { Octokit } from '@octokit/rest'; import decompress from 'decompress'; +import { config } from 'dotenv'; import { writeFileSync } from 'fs'; import { cp, mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; import { load } from 'js-yaml'; @@ -8,6 +9,9 @@ import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; import { NATION_IDS } from '../src/constants/nations'; import { BlitzkriegTankopedia, Tier } from '../src/core/blitzkrieg/tankopedia'; +import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; + +config(); const LANGUAGE = 'en'; const TEMP = 'temp/blitz'; @@ -86,7 +90,7 @@ Promise.all( const type = tags[0]; if ((name ?? name_short) === undefined) { - console.log(vehicleData.userString._text); + console.warn(`Missing name for ${vehicle}`); } tankIds.push(id); @@ -165,21 +169,37 @@ Promise.all( const flagChanges = await readdir( `${TEMP}/${directoriesOfInterest.flags}`, ).then((flags) => - flags.filter((flag) => flag.startsWith('flag_tutor-tank_')), + Promise.all( + flags + .filter((flag) => flag.startsWith('flag_tutor-tank_')) + .map(async (flag) => { + const content = await readFile( + `${TEMP}/${directoriesOfInterest.flags}/${flag}`, + { encoding: 'base64' }, + ); + const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; + + return { + content, + encoding: 'base64', + path: `flags/${name}.webp`, + } satisfies FileChange; + }), + ), ); console.log(flagChanges); - // console.log('Writing files...'); - // await commitMultipleFiles( - // octokit, - // 'tresabhi', - // 'blitzkrieg-assets', - // 'main', - // new Date().toString(), - // [tankopediaChange, ...iconsChange], - // true, - // ); + console.log('Writing files...'); + await commitMultipleFiles( + octokit, + 'tresabhi', + 'blitzkrieg-assets', + 'main', + new Date().toString(), + flagChanges, + true, + ); } else { writeFile( 'dist/tankopedia/tankopedia.json', diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 4f22e1d07..58a36a27a 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -10,6 +10,7 @@ import { Button, Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; import { go } from 'fuzzysort'; import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; +import { asset } from '../../../core/blitzkrieg/asset'; import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; import { BlitzkriegTankopediaEntry, @@ -23,12 +24,6 @@ import { useTankopedia } from '../../../stores/tankopedia'; import { Options } from './components/Options'; import * as styles from './page.css'; -const flags = [ - 'https://i.imgur.com/Iho9ATV.png', - 'https://i.imgur.com/uKWdnOn.png', - 'https://i.imgur.com/kf4GwjJ.png', -]; - const TANKS_PER_PAGE = 30; export default function Page() { @@ -170,17 +165,18 @@ export default function Page() { display: 'flex', }} > - + {tank.nation !== 'other' && ( + + )}
Date: Mon, 4 Dec 2023 10:25:54 -0600 Subject: [PATCH 26/74] feat: persistent sorting --- .../tools/tankopedia/components/Options.tsx | 5 +++- src/app/tools/tankopedia/page.tsx | 25 ++++++++++++++++--- src/stores/tankopedia.ts | 2 +- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx index 43fce3f1c..b504cb7ca 100644 --- a/src/app/tools/tankopedia/components/Options.tsx +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -1,3 +1,5 @@ +'use client'; + import { CaretDownIcon } from '@radix-ui/react-icons'; import { Button, DropdownMenu, Flex } from '@radix-ui/themes'; import { @@ -10,7 +12,7 @@ export function Options() { const tankopediaState = useTankopedia(); return ( - + - - - - useTankopedia.setState({ sortBy: value as TankopediaSortBy }) - } - > - Tier - Name - - - + + + + + + + + + mutateTankopedia((draft) => { + draft.sort.by = value as TankopediaSortBy; + }) + } + > + Tier + Name + + + - - - - - - - useTankopedia.setState({ - sortDirection: value as TankopediaSortDirection, - }) - } - > - - Ascending - - - Descending - - - - + + + + + + + mutateTankopedia((draft) => { + draft.sort.direction = value as TankopediaSortDirection; + }) + } + > + + Ascending + + + Descending + + + + + + + + + {TIERS.toReversed().map((tier, index) => ( + + ))} + + ); } diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 4244aa94e..a624890fd 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -30,34 +30,36 @@ export default function Page() { const tankopediaState = useTankopedia(); const awaitedTanks = use(tanks); const input = useRef(null); - const sortedTanks = useMemo( + const searchableTanks = useMemo( () => - awaitedTanks.toSorted((a, b) => { - let diff = 0; + awaitedTanks + .filter((tank) => tankopediaState.filters.tiers.includes(tank.tier)) + .toSorted((a, b) => { + let diff = 0; - if (tankopediaState.sortBy === 'tier') { - diff = a.tier - b.tier; - } - if (tankopediaState.sortBy === 'name') { - diff = ( - a.name_short ?? - a.name ?? - `Unknown tank ${a.id}` - ).localeCompare(b.name_short ?? b.name ?? `Unknown tank ${b.id}`); - } + if (tankopediaState.sort.by === 'tier') { + diff = a.tier - b.tier; + } + if (tankopediaState.sort.by === 'name') { + diff = ( + a.name_short ?? + a.name ?? + `Unknown tank ${a.id}` + ).localeCompare(b.name_short ?? b.name ?? `Unknown tank ${b.id}`); + } - return tankopediaState.sortDirection === 'ascending' ? diff : -diff; - }), - [tankopediaState.sortBy, tankopediaState.sortDirection], + return tankopediaState.sort.direction === 'ascending' ? diff : -diff; + }), + [tankopediaState.filters, tankopediaState.sort], ); - const [searchedList, setSearchedList] = useState(sortedTanks); + const [searchedList, setSearchedList] = useState(searchableTanks); const [page, setPage] = useState(0); const pageInput = useRef(null); useEffect(() => { - setSearchedList(sortedTanks); + setSearchedList(searchableTanks); if (input.current) input.current.value = ''; - }, [sortedTanks]); + }, [searchableTanks]); useEffect(() => { if (pageInput.current) pageInput.current.value = `${page + 1}`; @@ -84,10 +86,10 @@ export default function Page() { placeholder="Search tanks..." onChange={(event) => { if (event.target.value.length === 0) { - setSearchedList(sortedTanks); + setSearchedList(searchableTanks); } else { setSearchedList( - go(event.target.value, sortedTanks, { + go(event.target.value, searchableTanks, { keys: [ 'name', 'name_short', diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts index dee09b571..bf71b7d18 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -84,6 +84,8 @@ export const TANK_ICONS_COLLECTOR: Record = { export type Tier = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; +export const TIERS: Tier[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; + export const TIER_ROMAN_NUMERALS: Record = { 1: 'I', 2: 'II', diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index afb6ce360..c3f2f7d1d 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -1,21 +1,32 @@ import { produce } from 'immer'; import { create } from 'zustand'; import { devtools, persist } from 'zustand/middleware'; +import { TIERS, Tier } from '../core/blitzkrieg/tankopedia'; export type TankopediaSortBy = 'tier' | 'name'; export type TankopediaSortDirection = 'ascending' | 'descending'; type Tankopedia = { - sortBy: TankopediaSortBy; - sortDirection: TankopediaSortDirection; + sort: { + by: TankopediaSortBy; + direction: TankopediaSortDirection; + }; + filters: { + tiers: Tier[]; + }; }; export const useTankopedia = create()( devtools( persist( (set) => ({ - sortBy: 'tier', - sortDirection: 'descending', + sort: { + by: 'tier', + direction: 'descending', + }, + filters: { + tiers: [...TIERS], + }, }), { name: 'tankopedia' }, ), From b503f4fa8fbdbe0fd2111cf3bbdbc3d25a20e5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:35:27 -0600 Subject: [PATCH 28/74] feat: more filters --- .../tools/tankopedia/components/Options.tsx | 145 ++++++++++++++---- src/app/tools/tankopedia/page.tsx | 13 +- src/components/Tanks/components/Item.tsx | 20 ++- src/core/blitzkrieg/tankopedia.ts | 4 +- src/stores/tankopedia.ts | 9 +- 5 files changed, 151 insertions(+), 40 deletions(-) diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx index 9a4e887c0..c4ec3e29b 100644 --- a/src/app/tools/tankopedia/components/Options.tsx +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -2,6 +2,13 @@ import { CaretDownIcon } from '@radix-ui/react-icons'; import { Button, DropdownMenu, Flex } from '@radix-ui/themes'; +import { + TANK_TYPES, + TREE_TYPES, + TREE_TYPE_ICONS, + TREE_TYPE_IMAGES, + TreeTypeEnum, +} from '../../../../components/Tanks'; import { TIERS, TIER_ROMAN_NUMERALS, @@ -16,7 +23,7 @@ export function Options() { const tankopediaState = useTankopedia(); return ( - + @@ -67,38 +74,110 @@ export function Options() { - - - {TIERS.toReversed().map((tier, index) => ( - - ))} - + + {TIERS.toReversed().map((tier, index) => ( + + ))} + + + + {TANK_TYPES.toReversed().map((type, index) => ( + + ))} + + + + {TREE_TYPES.map((type, index) => ( + + ))} ); diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index a624890fd..adc61e79e 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -33,7 +33,18 @@ export default function Page() { const searchableTanks = useMemo( () => awaitedTanks - .filter((tank) => tankopediaState.filters.tiers.includes(tank.tier)) + .filter( + (tank) => + (tankopediaState.filters.tiers.length === 0 + ? true + : tankopediaState.filters.tiers.includes(tank.tier)) && + (tankopediaState.filters.types.length === 0 + ? true + : tankopediaState.filters.types.includes(tank.type)) && + (tankopediaState.filters.treeTypes.length === 0 + ? true + : tankopediaState.filters.treeTypes.includes(tank.tree_type)), + ) .toSorted((a, b) => { let diff = 0; diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index d92e33bd9..6195424f0 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -11,8 +11,18 @@ export enum TreeTypeEnum { Collector, } -export type TankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; -export type TreeTypeString = 'tech-tree' | 'premium' | 'collector'; +export const TANK_TYPES = [ + 'AT-SPG', + 'lightTank', + 'mediumTank', + 'heavyTank', +] as const; + +// TODO: remove hyphen for underscore +export const TREE_TYPES = ['tech-tree', 'premium', 'collector'] as const; + +export type TankType = (typeof TANK_TYPES)[number]; +export type TreeTypeString = (typeof TREE_TYPES)[number]; export const TREE_TYPE_NAMES: Record = { 'tech-tree': 'Tech tree', @@ -20,6 +30,12 @@ export const TREE_TYPE_NAMES: Record = { collector: 'Collector', }; +export const TREE_TYPE_IMAGES: Record = { + 'tech-tree': 'https://i.imgur.com/pJxO2XY.png', + premium: 'https://i.imgur.com/mZzSwOU.png', + collector: 'https://i.imgur.com/7A0RsG5.png', +}; + export interface ItemProps { image?: string; tankType?: TankType; diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts index bf71b7d18..26c625710 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -82,9 +82,9 @@ export const TANK_ICONS_COLLECTOR: Record = { heavyTank: 'https://i.imgur.com/8xRf3nc.png', }; -export type Tier = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10; +export const TIERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as const; -export const TIERS: Tier[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; +export type Tier = (typeof TIERS)[number]; export const TIER_ROMAN_NUMERALS: Record = { 1: 'I', diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index c3f2f7d1d..4a1ffe742 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -1,7 +1,8 @@ import { produce } from 'immer'; import { create } from 'zustand'; import { devtools, persist } from 'zustand/middleware'; -import { TIERS, Tier } from '../core/blitzkrieg/tankopedia'; +import { TankType, TreeTypeString } from '../components/Tanks'; +import { Tier } from '../core/blitzkrieg/tankopedia'; export type TankopediaSortBy = 'tier' | 'name'; export type TankopediaSortDirection = 'ascending' | 'descending'; @@ -13,6 +14,8 @@ type Tankopedia = { }; filters: { tiers: Tier[]; + types: TankType[]; + treeTypes: TreeTypeString[]; }; }; @@ -25,7 +28,9 @@ export const useTankopedia = create()( direction: 'descending', }, filters: { - tiers: [...TIERS], + tiers: [], + types: [], + treeTypes: [], }, }), { name: 'tankopedia' }, From 6ed9a191b90289f917f56f3832a3d33f70703ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 12:39:14 -0600 Subject: [PATCH 29/74] feat: generalized page turner --- .../tankopedia/components/PageTurner.tsx | 77 +++++++++++++++++ src/app/tools/tankopedia/page.tsx | 83 ++++--------------- 2 files changed, 94 insertions(+), 66 deletions(-) diff --git a/src/app/tools/tankopedia/components/PageTurner.tsx b/src/app/tools/tankopedia/components/PageTurner.tsx index e69de29bb..95d9e8fc2 100644 --- a/src/app/tools/tankopedia/components/PageTurner.tsx +++ b/src/app/tools/tankopedia/components/PageTurner.tsx @@ -0,0 +1,77 @@ +import { CaretLeftIcon, CaretRightIcon } from '@radix-ui/react-icons'; +import { Button, Flex, TextField } from '@radix-ui/themes'; +import { useEffect, useRef } from 'react'; +import { BlitzkriegTankopediaEntry } from '../../../../core/blitzkrieg/tankopedia'; + +interface PageTurnerProps { + page: number; + setPage: (page: number) => void; + searchedList: BlitzkriegTankopediaEntry[]; + tanksPerPage: number; +} + +export function PageTurner({ + page, + setPage, + searchedList, + tanksPerPage, +}: PageTurnerProps) { + const pageInput = useRef(null); + + useEffect(() => { + if (pageInput.current) pageInput.current.value = `${page + 1}`; + }, [page]); + + return ( + + + + Page + { + setPage( + Math.max( + 0, + Math.min( + Math.floor(searchedList.length / tanksPerPage), + event.target.valueAsNumber - 1, + ), + ), + ); + }} + onKeyDown={(event) => { + if (event.key === 'Enter') { + (event.target as HTMLInputElement).blur(); + } + }} + /> + + out of {Math.floor(searchedList.length / tanksPerPage) + 1} + + + + + ); +} diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index adc61e79e..0e74ea994 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -1,12 +1,8 @@ 'use client'; import { slateDark } from '@radix-ui/colors'; -import { - CaretLeftIcon, - CaretRightIcon, - MagnifyingGlassIcon, -} from '@radix-ui/react-icons'; -import { Button, Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; +import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; +import { Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; import { go } from 'fuzzysort'; import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; @@ -22,6 +18,7 @@ import { import { theme } from '../../../stitches.config'; import { useTankopedia } from '../../../stores/tankopedia'; import { Options } from './components/Options'; +import { PageTurner } from './components/PageTurner'; import * as styles from './page.css'; const TANKS_PER_PAGE = 30; @@ -65,16 +62,12 @@ export default function Page() { ); const [searchedList, setSearchedList] = useState(searchableTanks); const [page, setPage] = useState(0); - const pageInput = useRef(null); useEffect(() => { setSearchedList(searchableTanks); if (input.current) input.current.value = ''; }, [searchableTanks]); - useEffect(() => { - if (pageInput.current) pageInput.current.value = `${page + 1}`; - }, [page]); useEffect(() => { setPage( Math.min( @@ -117,64 +110,15 @@ export default function Page() { - - - - - Page - { - setPage( - Math.max( - 0, - Math.min( - Math.floor(searchedList.length / TANKS_PER_PAGE), - event.target.valueAsNumber - 1, - ), - ), - ); - }} - onKeyDown={(event) => { - if (event.key === 'Enter') { - (event.target as HTMLInputElement).blur(); - } - }} - /> - - out of {Math.floor(searchedList.length / TANKS_PER_PAGE) + 1} - - - - + + {searchedList .map((tank) => ( @@ -283,6 +227,13 @@ export default function Page() { )) .slice(page * TANKS_PER_PAGE, (page + 1) * TANKS_PER_PAGE)} + + ); From fb4e00afc4635987dc2a6ecd5702916a7167fdef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 18:40:24 -0600 Subject: [PATCH 30/74] feat: tier display --- src/app/tools/tankopedia/page.tsx | 76 +++++++++++++++++-------------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 0e74ea994..d40a55be4 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -13,6 +13,7 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, + TIER_ROMAN_NUMERALS, tanks, } from '../../../core/blitzkrieg/tankopedia'; import { theme } from '../../../stitches.config'; @@ -127,6 +128,8 @@ export default function Page() { href={`/tools/tankopedia/${tank.id}`} style={{ flex: 1, + textDecoration: 'none', + color: 'unset', }} > @@ -180,45 +183,52 @@ export default function Page() { - - - {tank.name_short ?? - tank.name ?? - `Unknown tank ${tank.id}`} + + + + {tank.name_short ?? + tank.name ?? + `Unknown tank ${tank.id}`} + + + + + {TIER_ROMAN_NUMERALS[tank.tier]} From f8ef0063e42cbfd128bf12366a2c78225a445925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 18:40:57 -0600 Subject: [PATCH 31/74] fix: removed toSorted --- src/app/tools/tankopedia/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index d40a55be4..b167c5e59 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -43,7 +43,7 @@ export default function Page() { ? true : tankopediaState.filters.treeTypes.includes(tank.tree_type)), ) - .toSorted((a, b) => { + .sort((a, b) => { let diff = 0; if (tankopediaState.sort.by === 'tier') { From 965d36cdc5c79f35207b40eb66095195f33d1383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 18:45:38 -0600 Subject: [PATCH 32/74] feat: remove more to... array funcs --- src/app/tools/tankopedia/components/Options.tsx | 4 ++-- src/app/tools/tankopedia/page.tsx | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx index c4ec3e29b..8ae5df7a6 100644 --- a/src/app/tools/tankopedia/components/Options.tsx +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -75,7 +75,7 @@ export function Options() { - {TIERS.toReversed().map((tier, index) => ( + {[...TIERS].reverse().map((tier, index) => ( + ))} + + {TREE_TYPES.map((type, index) => ( ); } diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 6c3c01a4f..93c882afe 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -41,7 +41,10 @@ export default function Page() { : tankopediaState.filters.types.includes(tank.type)) && (tankopediaState.filters.treeTypes.length === 0 ? true - : tankopediaState.filters.treeTypes.includes(tank.tree_type)), + : tankopediaState.filters.treeTypes.includes(tank.tree_type)) && + (tankopediaState.filters.nations.length === 0 + ? true + : tankopediaState.filters.nations.includes(tank.nation)), ) .sort((a, b) => { let diff = 0; @@ -81,7 +84,7 @@ export default function Page() { return ( Loading...}> - + @@ -108,14 +111,14 @@ export default function Page() { - - + + {searchedList diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/tankopedia.ts index 26c625710..f60049af6 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/tankopedia.ts @@ -98,3 +98,13 @@ export const TIER_ROMAN_NUMERALS: Record = { 9: 'IX', 10: 'X', }; + +export const NATIONS = tanks.then((tanks) => { + const nationsObject: Record = {}; + + tanks.forEach(({ nation }) => { + nationsObject[nation] = true; + }); + + return Object.keys(nationsObject); +}); diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 4a1ffe742..0dc2ccbeb 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -16,6 +16,7 @@ type Tankopedia = { tiers: Tier[]; types: TankType[]; treeTypes: TreeTypeString[]; + nations: string[]; }; }; @@ -31,6 +32,7 @@ export const useTankopedia = create()( tiers: [], types: [], treeTypes: [], + nations: [], }, }), { name: 'tankopedia' }, From bf7a319770cf7a3310c3437f91d3d09e6cc9d9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:27:23 -0600 Subject: [PATCH 35/74] feat: better navbar --- src/components/Navbar/components/Button.tsx | 21 ------ src/components/Navbar/index.tsx | 81 ++++++++++++++------- 2 files changed, 53 insertions(+), 49 deletions(-) delete mode 100644 src/components/Navbar/components/Button.tsx diff --git a/src/components/Navbar/components/Button.tsx b/src/components/Navbar/components/Button.tsx deleted file mode 100644 index 123a464c5..000000000 --- a/src/components/Navbar/components/Button.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ReactNode } from 'react'; - -interface ButtonProps { - children: ReactNode; -} - -export function Button({ children }: ButtonProps) { - return ( - - ); -} diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index c2236e524..d03d6e331 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -1,38 +1,63 @@ +import { DiscordLogoIcon } from '@radix-ui/react-icons'; +import { Card, Flex, Text, Theme } from '@radix-ui/themes'; import Link from 'next/link'; -import { theme } from '../../stitches.config'; import { BlitzkriegWormWide } from '../BlitzkriegWormWide'; export default function Navbar() { return ( -
- {/* */} - + - - - {/* */} -
+ + + + + + + ❤️ + + + by TrèsAbhi + + + + + + + + + + + + + ); } From cfe71e15a453ac98f2b898cb550085553d53c1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 4 Dec 2023 19:46:53 -0600 Subject: [PATCH 36/74] feat: frosty navbar --- .vscode/settings.json | 1 + src/app/layout.tsx | 1 + src/app/tools/tankopedia/page.tsx | 2 +- src/components/Navbar/index.tsx | 21 +++++++++++++++------ src/constants/tools.ts | 4 ++-- src/stitches.config.ts | 2 ++ 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9390bdd16..ce9ffc450 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -13,6 +13,7 @@ "Everytime", "fullstats", "fuzzysort", + "gamemode", "immer", "kranvagn", "krieg", diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 969502694..c6d4b75af 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -36,6 +36,7 @@ export default function RootLayout({ children }: RootLayoutProps) { - @@ -36,6 +44,7 @@ export default function Navbar() { by TrèsAbhi @@ -57,7 +66,7 @@ export default function Navbar() {
- +
); } diff --git a/src/constants/tools.ts b/src/constants/tools.ts index 0bc0847fe..4211c50a9 100644 --- a/src/constants/tools.ts +++ b/src/constants/tools.ts @@ -14,12 +14,12 @@ export const TOOLS: Tool[] = [ { id: 'ratings', title: 'Ratings', - description: 'Current and archived ratings leaderboards', + description: 'Ratings gamemode leaderboards', }, { id: 'tankopedia', title: 'Tankopedia', - description: 'Full Blitz tank encyclopedia', + description: 'Blitz tank encyclopedia', }, { id: 'inactive', diff --git a/src/stitches.config.ts b/src/stitches.config.ts index f8016ac4a..307f317ab 100644 --- a/src/stitches.config.ts +++ b/src/stitches.config.ts @@ -4,6 +4,7 @@ import { orangeDark, slate, slateDark, + slateDarkA, tealDark, } from '@radix-ui/colors'; import { createBorderStyles, createColors, createSpaces } from 'bepaint'; @@ -14,6 +15,7 @@ export const theme = { colors: { ...createColors(slateDark), + ...createColors(slateDarkA, 'alpha'), ...createColors(slate, 'light'), ...createColors(amberDark, 'amber'), From ad0fc695962d25b0a4369c73941b11b09a1d645d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:36:18 -0600 Subject: [PATCH 37/74] feat: move tankopedia to tankDefinitions --- .vscode/settings.json | 1 + package.json | 2 +- .../{buildTankopedia.ts => buildAssets.ts} | 186 ++++++++---------- src/app/embeds/session/page.tsx | 186 +++++++++--------- .../tools/tankopedia/components/Options.tsx | 2 +- .../tankopedia/components/PageTurner.tsx | 4 +- src/app/tools/tankopedia/page.tsx | 12 +- src/commands/breakdown.tsx | 10 +- src/commands/eligible.ts | 16 +- src/commands/ownedTanks.tsx | 30 +-- src/commands/searchTanks.ts | 2 +- src/components/Tanks/components/Item.tsx | 2 +- src/components/TierWeights.tsx | 2 +- ...{tankopediaInfo.ts => encyclopediaInfo.ts} | 4 +- src/core/blitz/getTreeType.ts | 4 +- src/core/blitz/resolveTankId.ts | 9 +- src/core/blitz/resolveTankName.ts | 6 +- .../{tankopedia.ts => definitions/tanks.ts} | 39 ++-- src/core/blitzkrieg/filtersToDescription.ts | 10 +- src/core/blitzstars/tankAverages.ts | 4 +- src/core/discord/addFilterOptions.ts | 8 +- src/core/discord/autocompleteTanks.ts | 2 +- src/core/statistics/filterStats.ts | 16 +- src/core/statistics/getTierWeights.ts | 6 +- src/stores/tankopedia.ts | 2 +- 25 files changed, 270 insertions(+), 295 deletions(-) rename scripts/{buildTankopedia.ts => buildAssets.ts} (54%) rename src/core/blitz/{tankopediaInfo.ts => encyclopediaInfo.ts} (82%) rename src/core/blitzkrieg/{tankopedia.ts => definitions/tanks.ts} (65%) diff --git a/.vscode/settings.json b/.vscode/settings.json index ce9ffc450..7ccf745d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -28,6 +28,7 @@ "playerinfo", "ratingsleaderboard", "ratingsplot", + "researchable", "Resvg", "roboto", "searchclans", diff --git a/package.json b/package.json index 43982a098..1605e113d 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build:website": "next build", "build:docs": "vitepress build docs", "build:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard", - "build:tankopedia": "vite-node --script scripts/buildTankopedia", + "build:assets": "vite-node --script scripts/buildAssets", "build:ratingsplot": "vite-node --script scripts/buildRatingsPlot", "dev:bot": "yarn build:bot && yarn start:bot", "dev:docs": "vitepress dev docs", diff --git a/scripts/buildTankopedia.ts b/scripts/buildAssets.ts similarity index 54% rename from scripts/buildTankopedia.ts rename to scripts/buildAssets.ts index 56dc51b30..e8604ba44 100644 --- a/scripts/buildTankopedia.ts +++ b/scripts/buildAssets.ts @@ -2,13 +2,16 @@ import { Octokit } from '@octokit/rest'; import decompress from 'decompress'; import { config } from 'dotenv'; import { writeFileSync } from 'fs'; -import { cp, mkdir, readFile, readdir, rm, writeFile } from 'fs/promises'; +import { readFile, readdir, rm } from 'fs/promises'; import { load } from 'js-yaml'; import { argv, env } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; import { NATION_IDS } from '../src/constants/nations'; -import { BlitzkriegTankopedia, Tier } from '../src/core/blitzkrieg/tankopedia'; +import { + TankDefinitions, + Tier, +} from '../src/core/blitzkrieg/definitions/tanks'; import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; config(); @@ -34,27 +37,19 @@ const directoriesOfInterest = { }; const directoriesOfInterestArray = Object.values(directoriesOfInterest); -console.log('Removing old tankopedia files...'); -await rm('dist/tankopedia', { recursive: true, force: true }); if (!noRewrite) { - console.log('Removing old temp files...'); await rm(TEMP, { recursive: true, force: true }); - - console.log('Extracting Blitz files...'); await decompress(apkFile, TEMP, { filter: (file) => directoriesOfInterestArray.some((dir) => file.path.startsWith(dir)), }); } -console.log('Creating new tankopedia folder'); -await mkdir('dist/tankopedia'); - const strings = await readFile( `${TEMP}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml`, 'utf-8', ).then((data) => load(data) as Record); -const tankopedia: BlitzkriegTankopedia = {}; +const tankDefinitions: TankDefinitions = {}; const tankIds: number[] = []; const images: Record = {}; const nations = await readdir( @@ -76,7 +71,6 @@ Promise.all( await Promise.all( Object.entries(list.root).map( async ([vehicle, vehicleData]) => { - // Tankopedia const nationVehicleId = parseInt(list.root[vehicle].id._text); const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; const name = strings[vehicleData.userString._text]; @@ -94,7 +88,7 @@ Promise.all( } tankIds.push(id); - tankopedia[id] = { + tankDefinitions[id] = { id, name, name_short, @@ -121,101 +115,91 @@ Promise.all( .replace(/~res:\//, '') .replace(/\..+/, '')}.packed.webp`, }; - - if (!publish) { - cp(images[id].small, `dist/tankopedia/icons/small/${id}.webp`); - cp(images[id].big, `dist/tankopedia/icons/big/${id}.webp`); - } }, ), ); }), ).then(async () => { - if (publish) { - const octokit = new Octokit({ auth: env.GH_TOKEN }); - // const tankopediaChange: FileChange = { - // content: JSON.stringify(tankopedia), - // path: 'tankopedia.json', - // encoding: 'utf-8', - // }; - // const iconsChange = ( - // await Promise.all( - // tankIds.map(async (id) => { - // try { - // const [contentSmall, contentBig] = await Promise.all([ - // readFile(images[id].small, { encoding: 'base64' }), - // readFile(images[id].big, { encoding: 'base64' }), - // ]); + if (!publish) return; - // return [ - // { - // content: contentBig, - // path: `icons/big/${id}.webp`, - // encoding: 'base64', - // }, - // { - // content: contentSmall, - // path: `icons/small/${id}.webp`, - // encoding: 'base64', - // }, - // ]; - // } catch (error) { - // console.log(error); - // return undefined; - // } - // }), - // ) - // ).flat() as FileChange[]; - const flags = await readdir(`${TEMP}/${directoriesOfInterest.flags}`); - // const scratchedFlags = await Promise.all( - // flags - // .filter((flag) => flag.startsWith('flag_tutor-tank_')) - // .map(async (flag) => { - // const content = await readFile( - // `${TEMP}/${directoriesOfInterest.flags}/${flag}`, - // { encoding: 'base64' }, - // ); - // const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; + const octokit = new Octokit({ auth: env.GH_TOKEN }); + // const tankDefinitionsChange: FileChange = { + // content: JSON.stringify(tankDefinitions), + // path: 'definitions/tanks.json', + // encoding: 'utf-8', + // }; + // const iconsChange = ( + // await Promise.all( + // tankIds.map(async (id) => { + // try { + // const [contentSmall, contentBig] = await Promise.all([ + // readFile(images[id].small, { encoding: 'base64' }), + // readFile(images[id].big, { encoding: 'base64' }), + // ]); - // return { - // content, - // encoding: 'base64', - // path: `flags/scratched/${name}.webp`, - // } satisfies FileChange; - // }), - // ); - const circleFlags = await Promise.all( - flags - .filter((flag) => flag.startsWith('flag_profile-stat_')) - .map(async (flag) => { - const content = await readFile( - `${TEMP}/${directoriesOfInterest.flags}/${flag}`, - { encoding: 'base64' }, - ); - const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; + // return [ + // { + // content: contentBig, + // path: `icons/big/${id}.webp`, + // encoding: 'base64', + // }, + // { + // content: contentSmall, + // path: `icons/small/${id}.webp`, + // encoding: 'base64', + // }, + // ]; + // } catch (error) { + // console.log(error); + // return undefined; + // } + // }), + // ) + // ).flat() as FileChange[]; + const flags = await readdir(`${TEMP}/${directoriesOfInterest.flags}`); + // const scratchedFlags = await Promise.all( + // flags + // .filter((flag) => flag.startsWith('flag_tutor-tank_')) + // .map(async (flag) => { + // const content = await readFile( + // `${TEMP}/${directoriesOfInterest.flags}/${flag}`, + // { encoding: 'base64' }, + // ); + // const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; - return { - content, - encoding: 'base64', - path: `flags/circle/${name}.webp`, - } satisfies FileChange; - }), - ); + // return { + // content, + // encoding: 'base64', + // path: `flags/scratched/${name}.webp`, + // } satisfies FileChange; + // }), + // ); + const circleFlags = await Promise.all( + flags + .filter((flag) => flag.startsWith('flag_profile-stat_')) + .map(async (flag) => { + const content = await readFile( + `${TEMP}/${directoriesOfInterest.flags}/${flag}`, + { encoding: 'base64' }, + ); + const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; - console.log('Writing files...'); - await commitMultipleFiles( - octokit, - 'tresabhi', - 'blitzkrieg-assets', - 'main', - new Date().toString(), - circleFlags, - true, - ); - } else { - writeFile( - 'dist/tankopedia/tankopedia.json', - JSON.stringify(tankopedia, null, 2), - ); - } + return { + content, + encoding: 'base64', + path: `flags/circle/${name}.webp`, + } satisfies FileChange; + }), + ); + + console.log('Writing files...'); + await commitMultipleFiles( + octokit, + 'tresabhi', + 'blitzkrieg-assets', + 'main', + new Date().toString(), + circleFlags, + true, + ); }); diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index e722836a5..7d50336d0 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -7,9 +7,9 @@ import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import fetchBlitz from '../../../core/blitz/fetchBlitz'; import { - BlitzkriegTankopediaEntry, - tankopedia, -} from '../../../core/blitzkrieg/tankopedia'; + TankDefinition, + tankDefinitions, +} from '../../../core/blitzkrieg/definitions/tanks'; import { tankAverages } from '../../../core/blitzstars/tankAverages'; import calculateWN8 from '../../../core/statistics/calculateWN8'; import { deltaTankStats } from '../../../core/statistics/deltaTankStats'; @@ -30,7 +30,7 @@ export default function SessionPage() { list: { stats: IndividualTankStats; - tankopedia?: BlitzkriegTankopediaEntry; + tankDefinitions?: TankDefinition; career: IndividualTankStats; currentWN8?: number; careerWN8?: number; @@ -88,7 +88,7 @@ export default function SessionPage() { }), {}, ); - const awaitedTankopedia = await tankopedia; + const awaitedTankDefinitions = await tankDefinitions; const awaitedTankAverages = await tankAverages; const careerWN8 = careerRaw[id].reduce( @@ -119,7 +119,7 @@ export default function SessionPage() { ).map((stats) => { return { stats, - tankopedia: awaitedTankopedia[stats.tank_id], + tankDefinitions: awaitedTankDefinitions[stats.tank_id], career: career[stats.tank_id], currentWN8: awaitedTankAverages[stats.tank_id] ? calculateWN8( @@ -238,95 +238,97 @@ export default function SessionPage() { .sort( (a, b) => b.stats.last_battle_time - a.stats.last_battle_time, ) - .map(({ stats, tankopedia, career, careerWN8, currentWN8 }) => { - const rowStats: Record< - CustomColumnDisplay, - Breakdown.RowStatItem | undefined - > = { - battles: { - title: 'Battles', - current: stats.all.battles.toLocaleString(), - career: career.all.battles.toLocaleString(), - }, - winrate: { - title: 'Winrate', - current: `${( - 100 * - (stats.all.wins / stats.all.battles) - ).toFixed(2)}%`, - career: `${( - 100 * - (career.all.wins / career.all.battles) - ).toFixed(2)}%`, - delta: - stats.all.wins / stats.all.battles - - career.all.wins / career.all.battles, - }, - wn8: { - title: 'WN8', - current: - currentWN8 === undefined - ? undefined - : Math.round(currentWN8).toLocaleString(), - career: - careerWN8 === undefined - ? undefined - : Math.round(careerWN8).toLocaleString(), - percentile: - currentWN8 === undefined - ? undefined - : getWN8Percentile(currentWN8), - }, - damage: { - title: 'Damage', - current: Math.round( - stats.all.damage_dealt / stats.all.battles, - ).toLocaleString(), - career: Math.round( - career.all.damage_dealt / career.all.battles, - ).toLocaleString(), - delta: - stats.all.damage_dealt / stats.all.battles - - career.all.damage_dealt / career.all.battles, - }, - none: undefined, - }; + .map( + ({ stats, tankDefinitions, career, careerWN8, currentWN8 }) => { + const rowStats: Record< + CustomColumnDisplay, + Breakdown.RowStatItem | undefined + > = { + battles: { + title: 'Battles', + current: stats.all.battles.toLocaleString(), + career: career.all.battles.toLocaleString(), + }, + winrate: { + title: 'Winrate', + current: `${( + 100 * + (stats.all.wins / stats.all.battles) + ).toFixed(2)}%`, + career: `${( + 100 * + (career.all.wins / career.all.battles) + ).toFixed(2)}%`, + delta: + stats.all.wins / stats.all.battles - + career.all.wins / career.all.battles, + }, + wn8: { + title: 'WN8', + current: + currentWN8 === undefined + ? undefined + : Math.round(currentWN8).toLocaleString(), + career: + careerWN8 === undefined + ? undefined + : Math.round(careerWN8).toLocaleString(), + percentile: + currentWN8 === undefined + ? undefined + : getWN8Percentile(currentWN8), + }, + damage: { + title: 'Damage', + current: Math.round( + stats.all.damage_dealt / stats.all.battles, + ).toLocaleString(), + career: Math.round( + career.all.damage_dealt / career.all.battles, + ).toLocaleString(), + delta: + stats.all.damage_dealt / stats.all.battles - + career.all.damage_dealt / career.all.battles, + }, + none: undefined, + }; - return ( - { - if (tankopedia?.tree_type === 'collector') - return TreeTypeEnum.Collector; - if (tankopedia?.tree_type === 'premium') - return TreeTypeEnum.Premium; - })()} - stats={session.customColumns.map((customColumn) => { - const rowStat = rowStats[customColumn.display]; + return ( + { + if (tankDefinitions?.tree_type === 'collector') + return TreeTypeEnum.Collector; + if (tankDefinitions?.tree_type === 'premium') + return TreeTypeEnum.Premium; + })()} + stats={session.customColumns.map((customColumn) => { + const rowStat = rowStats[customColumn.display]; - if (!rowStat) return undefined; + if (!rowStat) return undefined; - return { - ...rowStat, - delta: - customColumn.showDelta && - rowStat.percentile === undefined - ? rowStat.delta - : undefined, - }; - })} - /> - ); - })} + return { + ...rowStat, + delta: + customColumn.showDelta && + rowStat.percentile === undefined + ? rowStat.delta + : undefined, + }; + })} + /> + ); + }, + )}
diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx index 53e91a419..0b03484d4 100644 --- a/src/app/tools/tankopedia/components/Options.tsx +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -15,7 +15,7 @@ import { NATIONS, TIERS, TIER_ROMAN_NUMERALS, -} from '../../../../core/blitzkrieg/tankopedia'; +} from '../../../../core/blitzkrieg/definitions/tanks'; import mutateTankopedia, { TankopediaSortBy, TankopediaSortDirection, diff --git a/src/app/tools/tankopedia/components/PageTurner.tsx b/src/app/tools/tankopedia/components/PageTurner.tsx index 95d9e8fc2..533268263 100644 --- a/src/app/tools/tankopedia/components/PageTurner.tsx +++ b/src/app/tools/tankopedia/components/PageTurner.tsx @@ -1,12 +1,12 @@ import { CaretLeftIcon, CaretRightIcon } from '@radix-ui/react-icons'; import { Button, Flex, TextField } from '@radix-ui/themes'; import { useEffect, useRef } from 'react'; -import { BlitzkriegTankopediaEntry } from '../../../../core/blitzkrieg/tankopedia'; +import { TankDefinition } from '../../../../core/blitzkrieg/definitions/tanks'; interface PageTurnerProps { page: number; setPage: (page: number) => void; - searchedList: BlitzkriegTankopediaEntry[]; + searchedList: TankDefinition[]; tanksPerPage: number; } diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 23deba60f..02ececfc3 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -7,15 +7,15 @@ import { go } from 'fuzzysort'; import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { asset } from '../../../core/blitzkrieg/asset'; -import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; import { - BlitzkriegTankopediaEntry, TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, TIER_ROMAN_NUMERALS, - tanks, -} from '../../../core/blitzkrieg/tankopedia'; + TankDefinition, + tanksDefinitionsArray, +} from '../../../core/blitzkrieg/definitions/tanks'; +import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; import { theme } from '../../../stitches.config'; import { useTankopedia } from '../../../stores/tankopedia'; import { Options } from './components/Options'; @@ -26,7 +26,7 @@ const TANKS_PER_PAGE = 3 * 2 ** 4; export default function Page() { const tankopediaState = useTankopedia(); - const awaitedTanks = use(tanks); + const awaitedTanks = use(tanksDefinitionsArray); const input = useRef(null); const searchableTanks = useMemo( () => @@ -102,7 +102,7 @@ export default function Page() { 'name', 'name_short', 'id', - ] satisfies (keyof BlitzkriegTankopediaEntry)[], + ] satisfies (keyof TankDefinition)[], }).map(({ obj }) => obj), ); } diff --git a/src/commands/breakdown.tsx b/src/commands/breakdown.tsx index 694eb951e..bd843f41e 100644 --- a/src/commands/breakdown.tsx +++ b/src/commands/breakdown.tsx @@ -9,8 +9,8 @@ import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; +import { tankDefinitions } from '../core/blitzkrieg/definitions/tanks'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; -import { tankopedia } from '../core/blitzkrieg/tankopedia'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; import getStatsInPeriod from '../core/blitzstars/getStatsInPeriod'; import { tankAverages } from '../core/blitzstars/tankAverages'; @@ -44,7 +44,7 @@ async function render( { start, end, name }: ResolvedPeriod, filters: StatFilters, ) { - const awaitedTankopedia = await tankopedia; + const awaitedTankDefinitions = await tankDefinitions; const awaitedTankAverages = await tankAverages; const statsInPeriod = await getStatsInPeriod(region, id, start, end); const { filteredOrder } = await filterStats(statsInPeriod, filters); @@ -183,7 +183,7 @@ async function render( await Promise.all( filteredOrder.map(async (id, index) => { - const tankopediaEntry = awaitedTankopedia[id]; + const tankDefinition = awaitedTankDefinitions[id]; const current = orderedCurrentStats[index]; const career = orderedCareerStats[index]; const currentWN8 = orderedCurrentWN8[index]; @@ -193,8 +193,8 @@ async function render( >( async (accumulator, [tankIdString, stats]) => { const tankId = parseInt(tankIdString); - const tankopediaEntry = (await tankopedia)[tankId]; + const tankDefinition = (await tankDefinitions)[tankId]; - if (!tankopediaEntry) return accumulator; + if (!tankDefinition) return accumulator; - const tankTier = tankopediaEntry.tier; + const tankTier = tankDefinition.tier; return (await accumulator) + tankTier * stats.battles; }, @@ -79,9 +79,9 @@ export const eligibleCommand: CommandRegistry = { (await entries.reduce>( async (accumulator, [tankIdString, stats]) => { const tankId = parseInt(tankIdString); - const tankopediaEntry = (await tankopedia)[tankId]; + const tankDefinition = (await tankDefinitions)[tankId]; - if (!tankopediaEntry) return accumulator; + if (!tankDefinition) return accumulator; return stats.battles; }, @@ -110,7 +110,7 @@ export const eligibleCommand: CommandRegistry = { async (accumulator, [tankIdString, stats]) => { const tankId = parseInt(tankIdString); - if ((await tankopedia)[tankId]?.tier === 10) { + if ((await tankDefinitions)[tankId]?.tier === 10) { const tankStats = diffed[tankId]; return (await accumulator) + tankStats.damage_dealt; } else return accumulator; @@ -121,7 +121,7 @@ export const eligibleCommand: CommandRegistry = { async (accumulator, [tankIdString, stats]) => { const tankId = parseInt(tankIdString); - if ((await tankopedia)[tankId]?.tier === 10) { + if ((await tankDefinitions)[tankId]?.tier === 10) { const tankStats = diffed[tankId]; return (await accumulator) + tankStats.battles; } else return accumulator; diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 007355a03..22526695f 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -3,20 +3,20 @@ import NoData, { NoDataType } from '../components/NoData'; import * as Tanks from '../components/Tanks'; import TitleBar from '../components/TitleBar'; import Wrapper from '../components/Wrapper'; +import { encyclopediaInfo } from '../core/blitz/encyclopediaInfo'; import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; -import { tankopediaInfo } from '../core/blitz/tankopediaInfo'; +import { + TIER_ROMAN_NUMERALS, + TankDefinition, + Tier, + tankDefinitions, +} from '../core/blitzkrieg/definitions/tanks'; import { emblemIdToURL } from '../core/blitzkrieg/emblemIdToURL'; import { tankIcon } from '../core/blitzkrieg/tankIcon'; -import { - BlitzkriegTankopediaEntry, - TIER_ROMAN_NUMERALS, - Tier, - tankopedia, -} from '../core/blitzkrieg/tankopedia'; import addTierChoices from '../core/discord/addTierChoices'; import addUsernameChoices from '../core/discord/addUsernameChoices'; import autocompleteUsername from '../core/discord/autocompleteUsername'; @@ -42,21 +42,21 @@ export const ownedTanksCommand: CommandRegistry = { const filteredTanks = ( await Promise.all( tankStats.map(async (tankData) => ({ - tankopedia: (await tankopedia)[tankData.tank_id]!, + tankDefinitions: (await tankDefinitions)[tankData.tank_id]!, id: tankData.tank_id, })), ) - ).filter((tank) => tank.tankopedia?.tier === tier); + ).filter((tank) => tank.tankDefinitions?.tier === tier); const clanAccountInfo = await getClanAccountInfo(server, id, ['clan']); - const groupedTanks: Record = {}; + const groupedTanks: Record = {}; const nations: string[] = []; filteredTanks.forEach((tank) => { - if (groupedTanks[tank.tankopedia.nation] === undefined) { - groupedTanks[tank.tankopedia.nation] = [tank.tankopedia]; - nations.push(tank.tankopedia.nation); + if (groupedTanks[tank.tankDefinitions.nation] === undefined) { + groupedTanks[tank.tankDefinitions.nation] = [tank.tankDefinitions]; + nations.push(tank.tankDefinitions.nation); } else { - groupedTanks[tank.tankopedia.nation].push(tank.tankopedia); + groupedTanks[tank.tankDefinitions.nation].push(tank.tankDefinitions); } }); @@ -87,7 +87,7 @@ export const ownedTanksCommand: CommandRegistry = { return ( - {(await tankopediaInfo).vehicle_nations[nation]} + {(await encyclopediaInfo).vehicle_nations[nation]} diff --git a/src/commands/searchTanks.ts b/src/commands/searchTanks.ts index 99bc0e113..cb2f1e089 100644 --- a/src/commands/searchTanks.ts +++ b/src/commands/searchTanks.ts @@ -1,7 +1,7 @@ import { SlashCommandBuilder } from 'discord.js'; import { go } from 'fuzzysort'; import markdownEscape from 'markdown-escape'; -import { tankNamesDiacritics } from '../core/blitzkrieg/tankopedia'; +import { tankNamesDiacritics } from '../core/blitzkrieg/definitions/tanks'; import addTankChoices from '../core/discord/addTankChoices'; import embedInfo from '../core/discord/embedInfo'; import { CommandRegistry } from '../events/interactionCreate'; diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index 2fed154c5..d7de2cc98 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -2,7 +2,7 @@ import { TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, -} from '../../../core/blitzkrieg/tankopedia'; +} from '../../../core/blitzkrieg/definitions/tanks'; import { theme } from '../../../stitches.config'; export enum TreeTypeEnum { diff --git a/src/components/TierWeights.tsx b/src/components/TierWeights.tsx index 355edbce6..3fe2149b6 100644 --- a/src/components/TierWeights.tsx +++ b/src/components/TierWeights.tsx @@ -1,4 +1,4 @@ -import { Tier } from '../core/blitzkrieg/tankopedia'; +import { Tier } from '../core/blitzkrieg/definitions/tanks'; import { theme } from '../stitches.config'; export type TierWeightsRecord = Partial>; diff --git a/src/core/blitz/tankopediaInfo.ts b/src/core/blitz/encyclopediaInfo.ts similarity index 82% rename from src/core/blitz/tankopediaInfo.ts rename to src/core/blitz/encyclopediaInfo.ts index cc9855fea..e27f70593 100644 --- a/src/core/blitz/tankopediaInfo.ts +++ b/src/core/blitz/encyclopediaInfo.ts @@ -1,7 +1,7 @@ import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import fetchBlitz from './fetchBlitz'; -export interface TankopediaInfo { +export interface EncyclopediaInfo { achievement_sections: Record; tanks_updated_at: number; languages: Record; @@ -10,6 +10,6 @@ export interface TankopediaInfo { game_version: string; } -export const tankopediaInfo = fetchBlitz( +export const encyclopediaInfo = fetchBlitz( `https://api.wotblitz.com/wotb/encyclopedia/info/?application_id=${WARGAMING_APPLICATION_ID}`, ); diff --git a/src/core/blitz/getTreeType.ts b/src/core/blitz/getTreeType.ts index 6f784129d..b8aedd82d 100644 --- a/src/core/blitz/getTreeType.ts +++ b/src/core/blitz/getTreeType.ts @@ -1,8 +1,8 @@ import { TreeTypeEnum } from '../../components/Tanks'; -import { tankopedia } from '../blitzkrieg/tankopedia'; +import { tankDefinitions } from '../blitzkrieg/definitions/tanks'; export default async function getTreeType(id: number) { - const entry = (await tankopedia)[id]; + const entry = (await tankDefinitions)[id]; if (entry.tree_type === 'collector') return TreeTypeEnum.Collector; if (entry.tree_type === 'premium') return TreeTypeEnum.Premium; diff --git a/src/core/blitz/resolveTankId.ts b/src/core/blitz/resolveTankId.ts index a360e2f83..c110ee3a2 100644 --- a/src/core/blitz/resolveTankId.ts +++ b/src/core/blitz/resolveTankId.ts @@ -1,12 +1,15 @@ import { go } from 'fuzzysort'; -import { tankopedia, tanks } from '../blitzkrieg/tankopedia'; +import { + tankDefinitions, + tanksDefinitionsArray, +} from '../blitzkrieg/definitions/tanks'; import { UserError } from '../blitzkrieg/userError'; export default async function resolveTankId(tank: string | number) { const number = typeof tank === 'string' ? parseInt(tank) : tank; if (Number.isNaN(number)) { - const searchResult = go(`${tank}`, await tanks, { + const searchResult = go(`${tank}`, await tanksDefinitionsArray, { keys: ['name'], limit: 1, }); @@ -19,7 +22,7 @@ export default async function resolveTankId(tank: string | number) { return searchResult[0].obj.id; } } else { - if ((await tankopedia)[number]) { + if ((await tankDefinitions)[number]) { return number; } else { throw new UserError('Tank not found', { diff --git a/src/core/blitz/resolveTankName.ts b/src/core/blitz/resolveTankName.ts index c0760926a..b08e8ad0a 100644 --- a/src/core/blitz/resolveTankName.ts +++ b/src/core/blitz/resolveTankName.ts @@ -1,8 +1,8 @@ -import { tankopedia } from '../blitzkrieg/tankopedia'; +import { tankDefinitions } from '../blitzkrieg/definitions/tanks'; export default async function resolveTankName(tankId: number) { - const awaitedTankopedia = await tankopedia; - const entry = awaitedTankopedia[tankId]; + const awaitedTankDefinitions = await tankDefinitions; + const entry = awaitedTankDefinitions[tankId]; return entry?.name_short ?? entry?.name ?? `Unknown Tank ${tankId}`; } diff --git a/src/core/blitzkrieg/tankopedia.ts b/src/core/blitzkrieg/definitions/tanks.ts similarity index 65% rename from src/core/blitzkrieg/tankopedia.ts rename to src/core/blitzkrieg/definitions/tanks.ts index f60049af6..f691489a5 100644 --- a/src/core/blitzkrieg/tankopedia.ts +++ b/src/core/blitzkrieg/definitions/tanks.ts @@ -1,24 +1,8 @@ import { deburr } from 'lodash'; -import { TankType, TreeTypeString } from '../../components/Tanks'; -import { asset } from './asset'; +import { TankType, TreeTypeString } from '../../../components/Tanks'; +import { asset } from '../asset'; -export interface TankopediaEntry { - name: string; - nation: string; - is_premium: boolean; - is_collectible: boolean; - tier: Tier; - cost: { price_credit: number; price_gold: number }; - images: { preview: string; normal: string }; - tank_id: number; - type: string; - description: string; -} -export interface Tankopedia { - [id: number]: TankopediaEntry | undefined; -} - -export interface BlitzkriegTankopediaEntry { +export interface TankDefinition { id: number; nation: string; name: string; @@ -28,15 +12,16 @@ export interface BlitzkriegTankopediaEntry { type: TankType; } -export type BlitzkriegTankopedia = Record; +export type TankDefinitions = Record; -export const tankopedia = fetch(asset('tankopedia.json'), { +export const tankDefinitions = fetch(asset('definitions/tanks.json'), { cache: 'no-store', -}).then(async (response) => response.json() as Promise); -const entries = new Promise(async (resolve) => { - resolve(Object.entries(await tankopedia).map(([, entry]) => entry)); +}).then(async (response) => response.json() as Promise); + +const entries = new Promise(async (resolve) => { + resolve(Object.entries(await tankDefinitions).map(([, entry]) => entry)); }); -export const tanks = new Promise( +export const tanksDefinitionsArray = new Promise( async (resolve) => { resolve((await entries).map((entry) => entry)); }, @@ -47,7 +32,7 @@ export const tankNames = new Promise(async (resolve) => { export const tankNamesDiacritics = tankNames.then((tankNames) => Promise.all( tankNames.map(async (tankName, index) => { - const { id } = (await tanks)[index]; + const { id } = (await tanksDefinitionsArray)[index]; const name = tankName ?? `Unknown Tank ${id}`; const diacriticless = deburr(name); @@ -99,7 +84,7 @@ export const TIER_ROMAN_NUMERALS: Record = { 10: 'X', }; -export const NATIONS = tanks.then((tanks) => { +export const NATIONS = tanksDefinitionsArray.then((tanks) => { const nationsObject: Record = {}; tanks.forEach(({ nation }) => { diff --git a/src/core/blitzkrieg/filtersToDescription.ts b/src/core/blitzkrieg/filtersToDescription.ts index 32c5f8ec5..949cb8fe5 100644 --- a/src/core/blitzkrieg/filtersToDescription.ts +++ b/src/core/blitzkrieg/filtersToDescription.ts @@ -1,8 +1,8 @@ import { TREE_TYPE_NAMES } from '../../components/Tanks'; +import { encyclopediaInfo } from '../blitz/encyclopediaInfo'; import resolveTankName from '../blitz/resolveTankName'; -import { tankopediaInfo } from '../blitz/tankopediaInfo'; import { StatFilters } from '../statistics/filterStats'; -import { TIER_ROMAN_NUMERALS, Tier } from './tankopedia'; +import { TIER_ROMAN_NUMERALS, Tier } from './definitions/tanks'; export async function filtersToDescription({ nation, @@ -11,13 +11,13 @@ export async function filtersToDescription({ treeType, tank, }: StatFilters) { - const awaitedTankopediaInfo = await tankopediaInfo; + const awaitedEncyclopediaInfo = await encyclopediaInfo; const info: string[] = []; if (tank) return await resolveTankName(tank); - if (nation) info.push(awaitedTankopediaInfo.vehicle_nations[nation]); + if (nation) info.push(awaitedEncyclopediaInfo.vehicle_nations[nation]); if (tier) info.push(`Tier ${TIER_ROMAN_NUMERALS[tier as Tier]}`); - if (tankType) info.push(awaitedTankopediaInfo.vehicle_types[tankType]); + if (tankType) info.push(awaitedEncyclopediaInfo.vehicle_types[tankType]); if (treeType) info.push(TREE_TYPE_NAMES[treeType]); return info.length === 0 ? 'No filters' : info.join(', '); diff --git a/src/core/blitzstars/tankAverages.ts b/src/core/blitzstars/tankAverages.ts index 110e1db84..1ed7d87a3 100644 --- a/src/core/blitzstars/tankAverages.ts +++ b/src/core/blitzstars/tankAverages.ts @@ -1,6 +1,6 @@ import { AllStats } from '../blitz/getAccountInfo'; import { context } from '../blitzkrieg/context'; -import { tankopedia } from '../blitzkrieg/tankopedia'; +import { tankDefinitions } from '../blitzkrieg/definitions/tanks'; export interface SpecialStats { winrate: number; @@ -80,7 +80,7 @@ export interface IndividualTankAverage { last_update: number; } -tankopedia; +tankDefinitions; export type TankAverages = Record; diff --git a/src/core/discord/addFilterOptions.ts b/src/core/discord/addFilterOptions.ts index 94d8eef42..2c45a612d 100644 --- a/src/core/discord/addFilterOptions.ts +++ b/src/core/discord/addFilterOptions.ts @@ -4,7 +4,7 @@ import { SlashCommandSubcommandGroupBuilder, } from 'discord.js'; import { TREE_TYPE_NAMES, TreeTypeString } from '../../components/Tanks'; -import { tankopediaInfo } from '../blitz/tankopediaInfo'; +import { encyclopediaInfo } from '../blitz/encyclopediaInfo'; import addPeriodSubCommands from './addPeriodSubCommands'; import addTankChoices from './addTankChoices'; import addTierChoices from './addTierChoices'; @@ -17,7 +17,7 @@ export default async function addFilterOptions< option: SlashCommandSubcommandBuilder, ) => SlashCommandSubcommandBuilder = (option) => option, ): Promise { - const awaitedTankopediaInfo = await tankopediaInfo; + const awaitedEncyclopediaInfo = await encyclopediaInfo; addPeriodSubCommands(option, (option) => { extra(option); @@ -28,7 +28,7 @@ export default async function addFilterOptions< .setName('nation') .setDescription('Nation') .addChoices( - ...Object.entries(awaitedTankopediaInfo.vehicle_nations).map( + ...Object.entries(awaitedEncyclopediaInfo.vehicle_nations).map( ([type, name]) => ({ name, value: type }), ), ) @@ -40,7 +40,7 @@ export default async function addFilterOptions< .setName('tank-type') .setDescription('Tank type') .addChoices( - ...Object.entries(awaitedTankopediaInfo.vehicle_types).map( + ...Object.entries(awaitedEncyclopediaInfo.vehicle_types).map( ([type, name]) => ({ name: name.replace(' Tank', ''), value: type, diff --git a/src/core/discord/autocompleteTanks.ts b/src/core/discord/autocompleteTanks.ts index 1765a3bb9..78f1b17ab 100644 --- a/src/core/discord/autocompleteTanks.ts +++ b/src/core/discord/autocompleteTanks.ts @@ -4,7 +4,7 @@ import { CacheType, } from 'discord.js'; import { go } from 'fuzzysort'; -import { tankNamesDiacritics } from '../blitzkrieg/tankopedia'; +import { tankNamesDiacritics } from '../blitzkrieg/definitions/tanks'; import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX, diff --git a/src/core/statistics/filterStats.ts b/src/core/statistics/filterStats.ts index e371bca55..c48ce83c5 100644 --- a/src/core/statistics/filterStats.ts +++ b/src/core/statistics/filterStats.ts @@ -1,5 +1,5 @@ import { TreeTypeString } from '../../components/Tanks'; -import { tankopedia } from '../blitzkrieg/tankopedia'; +import { tankDefinitions } from '../blitzkrieg/definitions/tanks'; import { DiffedTankStats } from '../blitzstars/getStatsInPeriod'; import { tankAverages } from '../blitzstars/tankAverages'; import calculateWN8 from './calculateWN8'; @@ -20,10 +20,10 @@ export async function filterStats( // tank, if provided, takes priority over all other filters if (filters.tank) filters = { tank: filters.tank }; - const awaitedTankopedia = await tankopedia; + const awaitedTankDefinitions = await tankDefinitions; const awaitedTankAverages = await tankAverages; const filteredOrder = order.filter((id) => { - const entry = awaitedTankopedia[id]; + const entry = awaitedTankDefinitions[id]; return ( entry && @@ -44,9 +44,9 @@ export async function filterStats( awaitedTankAverages[id] ? accumulator + diff[id].battles : accumulator, 0, ); - const battlesOfTanksWithTankopediaEntry = filteredOrder.reduce( + const battlesOfTanksWithTankDefinition = filteredOrder.reduce( (accumulator, id) => - awaitedTankopedia[id] ? accumulator + diff[id].battles : accumulator, + awaitedTankDefinitions[id] ? accumulator + diff[id].battles : accumulator, 0, ); const supplementary = { @@ -63,11 +63,11 @@ export async function filterStats( tier: filteredOrder.reduce( (accumulator, id) => - awaitedTankopedia[id] - ? accumulator + awaitedTankopedia[id]!.tier * diff[id].battles + awaitedTankDefinitions[id] + ? accumulator + awaitedTankDefinitions[id]!.tier * diff[id].battles : accumulator, 0, - ) / battlesOfTanksWithTankopediaEntry, + ) / battlesOfTanksWithTankDefinition, }; return { stats, supplementary, filteredOrder }; diff --git a/src/core/statistics/getTierWeights.ts b/src/core/statistics/getTierWeights.ts index 020ea7e6b..933bd30ee 100644 --- a/src/core/statistics/getTierWeights.ts +++ b/src/core/statistics/getTierWeights.ts @@ -1,16 +1,16 @@ import { TierWeightsRecord } from '../../components/TierWeights'; import { AllStats } from '../blitz/getAccountInfo'; -import { tankopedia } from '../blitzkrieg/tankopedia'; +import { tankDefinitions } from '../blitzkrieg/definitions/tanks'; export async function getTierWeights( stats: Record, order: number[] = Object.keys(stats).map(parseInt), ) { - const awaitedTankopedia = await tankopedia; + const awaitedTankDefinitions = await tankDefinitions; const tierWeights: TierWeightsRecord = {}; order.forEach((id) => { - const entry = awaitedTankopedia[id]; + const entry = awaitedTankDefinitions[id]; if (!entry) return; if (!tierWeights[entry.tier]) tierWeights[entry.tier] = 0; diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index 0dc2ccbeb..4f060706d 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -2,7 +2,7 @@ import { produce } from 'immer'; import { create } from 'zustand'; import { devtools, persist } from 'zustand/middleware'; import { TankType, TreeTypeString } from '../components/Tanks'; -import { Tier } from '../core/blitzkrieg/tankopedia'; +import { Tier } from '../core/blitzkrieg/definitions/tanks'; export type TankopediaSortBy = 'tier' | 'name'; export type TankopediaSortDirection = 'ascending' | 'descending'; From 4bfe34ba530afd7555cbb901ffa48ac8dc92e236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 5 Dec 2023 17:59:58 -0600 Subject: [PATCH 38/74] feat: read dvpl --- .vscode/settings.json | 3 +++ package.json | 3 +++ scripts/buildAssets.ts | 49 +++++++++++++++++++------------------- src/core/blitz/readDVPL.ts | 49 ++++++++++++++++++++++++++++++++++++++ yarn.lock | 41 +++++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 24 deletions(-) create mode 100644 src/core/blitz/readDVPL.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 7ccf745d0..12fd07bf9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,8 @@ "customperiod", "deburr", "diacriticless", + "dvpl", + "DVPLCRC", "Everytime", "fullstats", "fuzzysort", @@ -38,6 +40,7 @@ "Smri", "startcase", "statsfull", + "steamapps", "Stringifying", "strvk", "subnation", diff --git a/package.json b/package.json index 1605e113d..2407827c9 100644 --- a/package.json +++ b/package.json @@ -65,12 +65,15 @@ "@types/express": "^4.17.18", "@types/js-yaml": "^4.0.8", "@types/lodash": "^4.14.199", + "@types/lz4": "^0.6.4", "@types/markdown-escape": "^1.1.0", "@types/node": "^20.6.5", "@types/react": "^18.2.22", "@vanilla-extract/next-plugin": "^2.3.1", "compare-versions": "^6.1.0", + "crc": "^4.3.2", "knip": "^3.4.0", + "lz4": "^0.6.5", "prettier": "^3.0.3", "prisma": "^5.4.1", "typescript": "^5.2.2" diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index e8604ba44..8c563b980 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,13 +1,13 @@ import { Octokit } from '@octokit/rest'; -import decompress from 'decompress'; import { config } from 'dotenv'; import { writeFileSync } from 'fs'; -import { readFile, readdir, rm } from 'fs/promises'; +import { readFile, readdir } from 'fs/promises'; import { load } from 'js-yaml'; import { argv, env } from 'process'; import { ElementCompact, xml2js } from 'xml-js'; import { parse } from 'yaml'; import { NATION_IDS } from '../src/constants/nations'; +import { readDVPL } from '../src/core/blitz/readDVPL'; import { TankDefinitions, Tier, @@ -16,39 +16,40 @@ import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; config(); +const DATA = + 'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data'; const LANGUAGE = 'en'; -const TEMP = 'temp/blitz'; -const publish = argv.includes('--publish'); -const apkFile = argv - .find((argument) => argument.startsWith('--file')) - ?.split('=')[1]; -const noRewrite = argv.includes('--no-rewrite'); +const targets = argv + .find((argument) => argument.startsWith('--target')) + ?.split('=')[1] + .split(','); -if (!apkFile) throw new Error('No file specified'); +if (!targets) throw new Error('No target(s) specified'); const directoriesOfInterest = { - vehicleDefinitions: 'assets/Data/XML/item_defs/vehicles', - strings: 'assets/Data/Strings', - tankParameters: 'assets/Data/3d/Tanks/Parameters', - smallIcons: 'assets/Data/Gfx/UI/BattleScreenHUD/SmallTankIcons', - bigIcons: 'assets/Data/Gfx/UI/BigTankIcons', - flags: 'assets/Data/Gfx/Lobby/flags', + vehicleDefinitions: 'XML/item_defs/vehicles', + strings: 'Strings', + tankParameters: '3d/Tanks/Parameters', + smallIcons: 'Gfx/UI/BattleScreenHUD/SmallTankIcons', + bigIcons: 'Gfx/UI/BigTankIcons', + flags: 'Gfx/Lobby/flags', }; -const directoriesOfInterestArray = Object.values(directoriesOfInterest); -if (!noRewrite) { - await rm(TEMP, { recursive: true, force: true }); - await decompress(apkFile, TEMP, { - filter: (file) => - directoriesOfInterestArray.some((dir) => file.path.startsWith(dir)), - }); -} +console.log( + ( + await readDVPL( + `${DATA}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml.dvpl`, + ) + ).toString(), +); +throw new Error('stop'); const strings = await readFile( - `${TEMP}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml`, + `${DATA}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml.dvpl`, 'utf-8', ).then((data) => load(data) as Record); + const tankDefinitions: TankDefinitions = {}; const tankIds: number[] = []; const images: Record = {}; diff --git a/src/core/blitz/readDVPL.ts b/src/core/blitz/readDVPL.ts new file mode 100644 index 000000000..85812065f --- /dev/null +++ b/src/core/blitz/readDVPL.ts @@ -0,0 +1,49 @@ +import { crc32 } from 'crc'; +import { readFile } from 'fs/promises'; +import { decodeBlock } from 'lz4'; + +/** + * Thanks Maddoxkkm! Modernized heavily. + * + * https://github.com/Maddoxkkm/dvpl_converter/ + */ +export async function readDVPL(file: string) { + const buffer = await readFile(file); + const footerBuffer = buffer.slice(buffer.length - 20, buffer.length); + + if ( + footerBuffer.toString('utf8', 16, 20) !== 'DVPL' || + footerBuffer.length !== 20 + ) { + throw 'InvalidDVPLFooter'; + } + + const footerData = { + oSize: footerBuffer.readUInt32LE(0), + cSize: footerBuffer.readUInt32LE(4), + crc32: footerBuffer.readUInt32LE(8), + type: footerBuffer.readUInt32LE(12), + }; + const targetBlock = buffer.slice(0, buffer.length - 20); + + if (targetBlock.length !== footerData.cSize) throw 'DVPLSizeMismatch'; + if (crc32(targetBlock) !== footerData.crc32) throw 'DVPLCRC32Mismatch'; + if (footerData.type === 0) { + if (!(footerData.oSize === footerData.cSize && footerData.type === 0)) { + throw 'DVPLTypeSizeMismatch'; + } + + return targetBlock; + } else if (footerData.type === 1 || footerData.type === 2) { + const deDVPLBlock = Buffer.alloc(footerData.oSize); + const DecompressedBlockSize = decodeBlock(targetBlock, deDVPLBlock); + + if (DecompressedBlockSize !== footerData.oSize) { + throw 'DVPLDecodeSizeMismatch'; + } + + return deDVPLBlock; + } else { + throw new TypeError('Unknown DVPL format'); + } +} diff --git a/yarn.lock b/yarn.lock index e827f3060..74b22a608 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2027,6 +2027,13 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== +"@types/lz4@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@types/lz4/-/lz4-0.6.4.tgz#eba8c0bb9e6a997e78107092953c8cfa92733a46" + integrity sha512-vvxMIkowyHbY6zkCantyYwAK83N5E04bzFZSPJICG1SDpaL89L7lObs9DhLuhJhXHCQMkjzN3LYoAH6LjfwMFQ== + dependencies: + "@types/node" "*" + "@types/markdown-escape@^1.1.0": version "1.1.3" resolved "https://registry.yarnpkg.com/@types/markdown-escape/-/markdown-escape-1.1.3.tgz#b880ab7c1e23c76b1d663e5a5640107c493e0c3e" @@ -2781,6 +2788,11 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +crc@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/crc/-/crc-4.3.2.tgz#49b7821cbf2cf61dfd079ed93863bbebd5469b9a" + integrity sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A== + cross-spawn@^7.0.0: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2834,6 +2846,11 @@ csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== + data-uri-to-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" @@ -3937,6 +3954,16 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lz4@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/lz4/-/lz4-0.6.5.tgz#ae8b7522681b6ab155023e6c56bf73087090122b" + integrity sha512-KSZcJU49QZOlJSItaeIU3p8WoAvkTmD9fJqeahQXNu1iQ/kR0/mQLdbrK8JY9MY8f6AhJoMrihp1nu1xDbscSQ== + dependencies: + buffer "^5.2.1" + cuint "^0.2.2" + nan "^2.13.2" + xxhashjs "^0.2.2" + magic-bytes.js@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.6.0.tgz#ee4354ac41a9b86f410e2690bc25dc4c264fb55d" @@ -4168,6 +4195,11 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nan@^2.13.2: + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== + nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -4896,6 +4928,7 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4946,6 +4979,7 @@ stringify-entities@^4.0.0: character-entities-legacy "^3.0.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5460,6 +5494,13 @@ xtend@^4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xxhashjs@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" + integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== + dependencies: + cuint "^0.2.2" + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" From aa78bc404559bfd1e6bc2f697d1fcac4177bf18e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 5 Dec 2023 18:05:14 -0600 Subject: [PATCH 39/74] feat: modernized --- src/core/blitz/readDVPL.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/core/blitz/readDVPL.ts b/src/core/blitz/readDVPL.ts index 85812065f..fff0c81d0 100644 --- a/src/core/blitz/readDVPL.ts +++ b/src/core/blitz/readDVPL.ts @@ -9,13 +9,13 @@ import { decodeBlock } from 'lz4'; */ export async function readDVPL(file: string) { const buffer = await readFile(file); - const footerBuffer = buffer.slice(buffer.length - 20, buffer.length); + const footerBuffer = buffer.subarray(buffer.length - 20, buffer.length); if ( footerBuffer.toString('utf8', 16, 20) !== 'DVPL' || footerBuffer.length !== 20 ) { - throw 'InvalidDVPLFooter'; + throw new SyntaxError('Invalid DVPL footer'); } const footerData = { @@ -24,13 +24,17 @@ export async function readDVPL(file: string) { crc32: footerBuffer.readUInt32LE(8), type: footerBuffer.readUInt32LE(12), }; - const targetBlock = buffer.slice(0, buffer.length - 20); + const targetBlock = buffer.subarray(0, buffer.length - 20); - if (targetBlock.length !== footerData.cSize) throw 'DVPLSizeMismatch'; - if (crc32(targetBlock) !== footerData.crc32) throw 'DVPLCRC32Mismatch'; + if (targetBlock.length !== footerData.cSize) { + throw new RangeError('DVPL size mismatch'); + } + if (crc32(targetBlock) !== footerData.crc32) { + throw new TypeError('DVPL CRC32 mismatch'); + } if (footerData.type === 0) { if (!(footerData.oSize === footerData.cSize && footerData.type === 0)) { - throw 'DVPLTypeSizeMismatch'; + throw new RangeError('DVPL type and size mismatch'); } return targetBlock; @@ -39,11 +43,11 @@ export async function readDVPL(file: string) { const DecompressedBlockSize = decodeBlock(targetBlock, deDVPLBlock); if (DecompressedBlockSize !== footerData.oSize) { - throw 'DVPLDecodeSizeMismatch'; + throw new RangeError('Decompressed DVPL size mismatch'); } return deDVPLBlock; } else { - throw new TypeError('Unknown DVPL format'); + throw new SyntaxError('Unknown DVPL format'); } } From 9df47777d003b6ec6f8bef2eb09d282d50d9dbfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 5 Dec 2023 19:14:53 -0600 Subject: [PATCH 40/74] feat: build assets --- .vscode/settings.json | 2 + package.json | 2 +- scripts/buildAssets.ts | 441 +++++++++++------- scripts/buildRatingsLeaderboard.ts | 2 +- src/components/Tanks/components/Item.tsx | 8 +- src/core/blitz/readStringDVPL.ts | 6 + src/core/blitz/readXMLDVPL.ts | 9 + src/core/blitz/readYAMLDVPL.ts | 8 + .../core/blitzkrieg}/commitMultipleFiles.ts | 14 +- src/core/blitzkrieg/definitions/tanks.ts | 24 +- tsconfig.json | 2 +- yarn.lock | 24 +- 12 files changed, 328 insertions(+), 214 deletions(-) create mode 100644 src/core/blitz/readStringDVPL.ts create mode 100644 src/core/blitz/readXMLDVPL.ts create mode 100644 src/core/blitz/readYAMLDVPL.ts rename {scripts => src/core/blitzkrieg}/commitMultipleFiles.ts (87%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 12fd07bf9..ceab1196e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -58,6 +58,8 @@ "webp", "winrate", "wotblitz", + "XMLDVPL", + "YAMLDVPL", "zustand" ], "deno.enable": false, diff --git a/package.json b/package.json index 2407827c9..7dafc306f 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,6 @@ "vite-node": "^0.34.5", "vitepress": "^1.0.0-rc.20", "vitepress-plugin-auto-sidebar": "^1.1.0", - "xml-js": "^1.6.11", "yaml": "^2.3.4", "zustand": "^4.4.1" }, @@ -72,6 +71,7 @@ "@vanilla-extract/next-plugin": "^2.3.1", "compare-versions": "^6.1.0", "crc": "^4.3.2", + "fast-xml-parser": "^4.3.2", "knip": "^3.4.0", "lz4": "^0.6.5", "prettier": "^3.0.3", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 8c563b980..a968edc14 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,33 +1,50 @@ import { Octokit } from '@octokit/rest'; import { config } from 'dotenv'; -import { writeFileSync } from 'fs'; -import { readFile, readdir } from 'fs/promises'; -import { load } from 'js-yaml'; +import { readdir } from 'fs/promises'; import { argv, env } from 'process'; -import { ElementCompact, xml2js } from 'xml-js'; -import { parse } from 'yaml'; +import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; -import { readDVPL } from '../src/core/blitz/readDVPL'; +import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; +import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; +import commitMultipleFiles from '../src/core/blitzkrieg/commitMultipleFiles'; import { TankDefinitions, Tier, } from '../src/core/blitzkrieg/definitions/tanks'; -import commitMultipleFiles, { FileChange } from './commitMultipleFiles'; config(); +interface VehicleDefinitionList { + [key: string]: { + id: number; + userString: string; + shortUserString?: string; + description: string; + price: number | { gold: ''; '#text': number }; + sellPrice?: { gold: ''; '#text': number }; + enrichmentPermanentCost: number; + notInShop?: boolean; + tags: string; + level: number; + combatRole?: Record; + configurationModes: string; + }; +} +interface Strings { + [key: string]: string; +} +type BlitzTankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; + +const blitzTankTypeToBlitzkrieg: Record = { + 'AT-SPG': 'tank_destroyer', + lightTank: 'light', + mediumTank: 'medium', + heavyTank: 'heavy', +}; const DATA = 'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data'; const LANGUAGE = 'en'; - -const targets = argv - .find((argument) => argument.startsWith('--target')) - ?.split('=')[1] - .split(','); - -if (!targets) throw new Error('No target(s) specified'); - -const directoriesOfInterest = { +const DOI = { vehicleDefinitions: 'XML/item_defs/vehicles', strings: 'Strings', tankParameters: '3d/Tanks/Parameters', @@ -36,171 +53,251 @@ const directoriesOfInterest = { flags: 'Gfx/Lobby/flags', }; -console.log( - ( - await readDVPL( - `${DATA}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml.dvpl`, - ) - ).toString(), -); -throw new Error('stop'); +const octokit = new Octokit({ auth: env.GH_TOKEN }); +const targets = argv + .find((argument) => argument.startsWith('--target')) + ?.split('=')[1] + .split(','); -const strings = await readFile( - `${DATA}/${directoriesOfInterest.strings}/${LANGUAGE}.yaml.dvpl`, - 'utf-8', -).then((data) => load(data) as Record); +if (!targets) throw new Error('No target(s) specified'); -const tankDefinitions: TankDefinitions = {}; -const tankIds: number[] = []; -const images: Record = {}; -const nations = await readdir( - `${TEMP}/${directoriesOfInterest.vehicleDefinitions}`, -); +if (targets.includes('tankDefinitions')) { + console.log('Building tank definitions...'); -writeFileSync('test.json', JSON.stringify(strings, null, 2)); - -Promise.all( - nations - .filter((nation) => nation !== 'common') - .map(async (nation) => { - const listXML = await readFile( - `${TEMP}/${directoriesOfInterest.vehicleDefinitions}/${nation}/list.xml`, - 'utf-8', - ); - const list = xml2js(listXML, { compact: true }) as ElementCompact; - - await Promise.all( - Object.entries(list.root).map( - async ([vehicle, vehicleData]) => { - const nationVehicleId = parseInt(list.root[vehicle].id._text); - const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; - const name = strings[vehicleData.userString._text]; - const name_short = strings[vehicleData.shortUserString?._text]; - const isPremium = 'gold' in vehicleData.price; - const isCollector = vehicleData.sellPrice - ? 'gold' in vehicleData.sellPrice - : false; - const tier = parseInt(vehicleData.level._text) as Tier; - const tags = vehicleData.tags._text.split(' '); - const type = tags[0]; - - if ((name ?? name_short) === undefined) { - console.warn(`Missing name for ${vehicle}`); - } - - tankIds.push(id); - tankDefinitions[id] = { - id, - name, - name_short, - nation, - tree_type: isCollector - ? 'collector' - : isPremium - ? 'premium' - : 'researchable', - tier, - type, - }; - - // Tank images - const parameterPath = `${TEMP}/${directoriesOfInterest.tankParameters}/${nation}/${vehicle}.yaml`; - const parameterString = await readFile(parameterPath, 'utf-8'); - const { smallIconPath, bigIconPath } = - parse(parameterString).resourcesPath; - images[id] = { - small: `${TEMP}/assets/Data/${(smallIconPath as string) - .replace(/~res:\//, '') - .replace(/\..+/, '')}.packed.webp`, - big: `${TEMP}/assets/Data/${(bigIconPath as string) - .replace(/~res:\//, '') - .replace(/\..+/, '')}.packed.webp`, - }; - }, - ), - ); - }), -).then(async () => { - if (!publish) return; - - const octokit = new Octokit({ auth: env.GH_TOKEN }); - // const tankDefinitionsChange: FileChange = { - // content: JSON.stringify(tankDefinitions), - // path: 'definitions/tanks.json', - // encoding: 'utf-8', - // }; - // const iconsChange = ( - // await Promise.all( - // tankIds.map(async (id) => { - // try { - // const [contentSmall, contentBig] = await Promise.all([ - // readFile(images[id].small, { encoding: 'base64' }), - // readFile(images[id].big, { encoding: 'base64' }), - // ]); - - // return [ - // { - // content: contentBig, - // path: `icons/big/${id}.webp`, - // encoding: 'base64', - // }, - // { - // content: contentSmall, - // path: `icons/small/${id}.webp`, - // encoding: 'base64', - // }, - // ]; - // } catch (error) { - // console.log(error); - // return undefined; - // } - // }), - // ) - // ).flat() as FileChange[]; - const flags = await readdir(`${TEMP}/${directoriesOfInterest.flags}`); - // const scratchedFlags = await Promise.all( - // flags - // .filter((flag) => flag.startsWith('flag_tutor-tank_')) - // .map(async (flag) => { - // const content = await readFile( - // `${TEMP}/${directoriesOfInterest.flags}/${flag}`, - // { encoding: 'base64' }, - // ); - // const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; - - // return { - // content, - // encoding: 'base64', - // path: `flags/scratched/${name}.webp`, - // } satisfies FileChange; - // }), - // ); - const circleFlags = await Promise.all( - flags - .filter((flag) => flag.startsWith('flag_profile-stat_')) - .map(async (flag) => { - const content = await readFile( - `${TEMP}/${directoriesOfInterest.flags}/${flag}`, - { encoding: 'base64' }, - ); - const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; - - return { - content, - encoding: 'base64', - path: `flags/circle/${name}.webp`, - } satisfies FileChange; - }), + const tankDefinitions: TankDefinitions = {}; + const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( + (nations) => nations.filter((nation) => nation !== 'common'), + ); + const strings = await readYAMLDVPL( + `${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`, ); - console.log('Writing files...'); + await Promise.all( + nations.map(async (nation) => { + const tanks = await readXMLDVPL( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, + ); + + for (const tankIndex in tanks) { + const tank = tanks[tankIndex]; + const nationVehicleId = tank.id; + const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; + const name = strings[tank.userString]; + const name_short = tank.shortUserString + ? strings[tank.shortUserString] === name + ? undefined + : strings[tank.shortUserString] + : undefined; + const isPremium = + typeof tank.price === 'number' ? false : 'gold' in tank.price; + const isCollector = tank.sellPrice ? 'gold' in tank.sellPrice : false; + const tier = tank.level as Tier; + const tags = tank.tags.split(' '); + const type = blitzTankTypeToBlitzkrieg[tags[0] as BlitzTankType]; + + if ((name ?? name_short) === undefined) { + console.warn(`Missing name for ${tankIndex}`); + } + + tankDefinitions[id] = { + id, + name, + name_short, + nation, + tree_type: isCollector + ? 'collector' + : isPremium + ? 'premium' + : 'researchable', + tier, + type, + }; + } + }), + ); + + console.log('Committing tank definitions...'); await commitMultipleFiles( octokit, 'tresabhi', 'blitzkrieg-assets', 'main', - new Date().toString(), - circleFlags, + 'tank definitions', + [ + { + content: JSON.stringify(tankDefinitions), + encoding: 'utf-8', + path: 'definitions/tanks.json', + }, + ], true, ); -}); +} + +// console.log( +// ( +// await readDVPL( +// `${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`, +// ) +// ).toString(), +// ); + +// const strings = await readFile( +// `${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`, +// 'utf-8', +// ).then((data) => load(data) as Record); + +// const tankDefinitions: TankDefinitions = {}; +// const tankIds: number[] = []; +// const images: Record = {}; +// const nations = await readdir( +// `${TEMP}/${DOI.vehicleDefinitions}`, +// ); + +// writeFileSync('test.json', JSON.stringify(strings, null, 2)); + +// Promise.all( +// nations +// .filter((nation) => nation !== 'common') +// .map(async (nation) => { +// const listXML = await readFile( +// `${TEMP}/${DOI.vehicleDefinitions}/${nation}/list.xml`, +// 'utf-8', +// ); +// const list = xml2js(listXML, { compact: true }) as ElementCompact; + +// await Promise.all( +// Object.entries(list.root).map( +// async ([vehicle, vehicleData]) => { +// const nationVehicleId = parseInt(list.root[vehicle].id._text); +// const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; +// const name = strings[vehicleData.userString._text]; +// const name_short = strings[vehicleData.shortUserString?._text]; +// const isPremium = 'gold' in vehicleData.price; +// const isCollector = vehicleData.sellPrice +// ? 'gold' in vehicleData.sellPrice +// : false; +// const tier = parseInt(vehicleData.level._text) as Tier; +// const tags = vehicleData.tags._text.split(' '); +// const type = tags[0]; + +// if ((name ?? name_short) === undefined) { +// console.warn(`Missing name for ${vehicle}`); +// } + +// tankIds.push(id); +// tankDefinitions[id] = { +// id, +// name, +// name_short, +// nation, +// tree_type: isCollector +// ? 'collector' +// : isPremium +// ? 'premium' +// : 'researchable', +// tier, +// type, +// }; + +// // Tank images +// const parameterPath = `${TEMP}/${DOI.tankParameters}/${nation}/${vehicle}.yaml`; +// const parameterString = await readFile(parameterPath, 'utf-8'); +// const { smallIconPath, bigIconPath } = +// parse(parameterString).resourcesPath; +// images[id] = { +// small: `${TEMP}/assets/Data/${(smallIconPath as string) +// .replace(/~res:\//, '') +// .replace(/\..+/, '')}.packed.webp`, +// big: `${TEMP}/assets/Data/${(bigIconPath as string) +// .replace(/~res:\//, '') +// .replace(/\..+/, '')}.packed.webp`, +// }; +// }, +// ), +// ); +// }), +// ).then(async () => { +// if (!publish) return; + +// const octokit = new Octokit({ auth: env.GH_TOKEN }); +// // const tankDefinitionsChange: FileChange = { +// // content: JSON.stringify(tankDefinitions), +// // path: 'definitions/tanks.json', +// // encoding: 'utf-8', +// // }; +// // const iconsChange = ( +// // await Promise.all( +// // tankIds.map(async (id) => { +// // try { +// // const [contentSmall, contentBig] = await Promise.all([ +// // readFile(images[id].small, { encoding: 'base64' }), +// // readFile(images[id].big, { encoding: 'base64' }), +// // ]); + +// // return [ +// // { +// // content: contentBig, +// // path: `icons/big/${id}.webp`, +// // encoding: 'base64', +// // }, +// // { +// // content: contentSmall, +// // path: `icons/small/${id}.webp`, +// // encoding: 'base64', +// // }, +// // ]; +// // } catch (error) { +// // console.log(error); +// // return undefined; +// // } +// // }), +// // ) +// // ).flat() as FileChange[]; +// const flags = await readdir(`${TEMP}/${DOI.flags}`); +// // const scratchedFlags = await Promise.all( +// // flags +// // .filter((flag) => flag.startsWith('flag_tutor-tank_')) +// // .map(async (flag) => { +// // const content = await readFile( +// // `${TEMP}/${DOI.flags}/${flag}`, +// // { encoding: 'base64' }, +// // ); +// // const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; + +// // return { +// // content, +// // encoding: 'base64', +// // path: `flags/scratched/${name}.webp`, +// // } satisfies FileChange; +// // }), +// // ); +// const circleFlags = await Promise.all( +// flags +// .filter((flag) => flag.startsWith('flag_profile-stat_')) +// .map(async (flag) => { +// const content = await readFile( +// `${TEMP}/${DOI.flags}/${flag}`, +// { encoding: 'base64' }, +// ); +// const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; + +// return { +// content, +// encoding: 'base64', +// path: `flags/circle/${name}.webp`, +// } satisfies FileChange; +// }), +// ); + +// console.log('Writing files...'); +// await commitMultipleFiles( +// octokit, +// 'tresabhi', +// 'blitzkrieg-assets', +// 'main', +// new Date().toString(), +// circleFlags, +// true, +// ); +// }); diff --git a/scripts/buildRatingsLeaderboard.ts b/scripts/buildRatingsLeaderboard.ts index b69df4cc1..dbe09a0d7 100644 --- a/scripts/buildRatingsLeaderboard.ts +++ b/scripts/buildRatingsLeaderboard.ts @@ -6,8 +6,8 @@ import { RatingsNeighbors, RatingsPlayer, } from '../src/commands/ratings'; +import commitMultipleFiles from '../src/core/blitzkrieg/commitMultipleFiles.js'; import { patientFetchJSON } from '../src/core/blitzkrieg/patientFetchJSON'; -import commitMultipleFiles from './commitMultipleFiles.js'; /* * Central North American Time (UTC-5): use 0 5 * * *. diff --git a/src/components/Tanks/components/Item.tsx b/src/components/Tanks/components/Item.tsx index d7de2cc98..4363e0a80 100644 --- a/src/components/Tanks/components/Item.tsx +++ b/src/components/Tanks/components/Item.tsx @@ -12,10 +12,10 @@ export enum TreeTypeEnum { } export const TANK_TYPES = [ - 'AT-SPG', - 'lightTank', - 'mediumTank', - 'heavyTank', + 'tank_destroyer', + 'light', + 'medium', + 'heavy', ] as const; // TODO: remove hyphen for underscore diff --git a/src/core/blitz/readStringDVPL.ts b/src/core/blitz/readStringDVPL.ts new file mode 100644 index 000000000..d55639d44 --- /dev/null +++ b/src/core/blitz/readStringDVPL.ts @@ -0,0 +1,6 @@ +import { readDVPL } from './readDVPL'; + +export async function readStringDVPL(file: string) { + const buffer = await readDVPL(file); + return buffer.toString(); +} diff --git a/src/core/blitz/readXMLDVPL.ts b/src/core/blitz/readXMLDVPL.ts new file mode 100644 index 000000000..b40031619 --- /dev/null +++ b/src/core/blitz/readXMLDVPL.ts @@ -0,0 +1,9 @@ +import { XMLParser } from 'fast-xml-parser'; +import { readStringDVPL } from './readStringDVPL'; + +export async function readXMLDVPL(file: string) { + const parser = new XMLParser(); + const xml = await readStringDVPL(file); + + return parser.parse(xml).root as Type; +} diff --git a/src/core/blitz/readYAMLDVPL.ts b/src/core/blitz/readYAMLDVPL.ts new file mode 100644 index 000000000..c95623225 --- /dev/null +++ b/src/core/blitz/readYAMLDVPL.ts @@ -0,0 +1,8 @@ +import { parse } from 'yaml'; +import { readStringDVPL } from './readStringDVPL'; + +export async function readYAMLDVPL(file: string) { + const yaml = await readStringDVPL(file); + + return parse(yaml) as Type; +} diff --git a/scripts/commitMultipleFiles.ts b/src/core/blitzkrieg/commitMultipleFiles.ts similarity index 87% rename from scripts/commitMultipleFiles.ts rename to src/core/blitzkrieg/commitMultipleFiles.ts index d24eb2a42..292414229 100644 --- a/scripts/commitMultipleFiles.ts +++ b/src/core/blitzkrieg/commitMultipleFiles.ts @@ -15,9 +15,8 @@ export default async function commitMultipleFiles( branch: string, message: string, changes: FileChange[], - logBlobCreation = false, + verbose = false, ) { - // Get the latest commit SHA on the specified branch const latestCommitSha = ( await octokit.git.getRef({ owner, @@ -25,8 +24,6 @@ export default async function commitMultipleFiles( ref: `heads/${branch}`, }) ).data.object.sha; - - // Get the tree SHA for the latest commit const treeSha = ( await octokit.git.getCommit({ owner, @@ -34,7 +31,6 @@ export default async function commitMultipleFiles( commit_sha: latestCommitSha, }) ).data.tree.sha; - const blobs: { sha: string; path: string; @@ -65,13 +61,14 @@ export default async function commitMultipleFiles( `Failed blob ${changeIndex + 1} / ${ changes.length }; retrying in ${TIME_PER_BLOB}ms...`, + error, ); await new Promise((resolve) => setTimeout(resolve, TIME_PER_BLOB)); } } - if (logBlobCreation) { + if (verbose) { console.log( `Created blob ${changeIndex + 1} / ${changes.length} (${( (100 * (changeIndex + 1)) / @@ -81,15 +78,12 @@ export default async function commitMultipleFiles( } } - // Create a new tree with the new blobs const { data: treeData } = await octokit.git.createTree({ owner, repo, base_tree: treeSha, tree: blobs, }); - - // Create a new commit with the new tree const { data: newCommitData } = await octokit.git.createCommit({ owner, repo, @@ -97,8 +91,6 @@ export default async function commitMultipleFiles( tree: treeData.sha, parents: [latestCommitSha], }); - - // Update the branch reference to point to the new commit await octokit.git.updateRef({ owner, repo, diff --git a/src/core/blitzkrieg/definitions/tanks.ts b/src/core/blitzkrieg/definitions/tanks.ts index f691489a5..224a7424a 100644 --- a/src/core/blitzkrieg/definitions/tanks.ts +++ b/src/core/blitzkrieg/definitions/tanks.ts @@ -47,24 +47,24 @@ export const tankNamesDiacritics = tankNames.then((tankNames) => ); export const TANK_ICONS: Record = { - 'AT-SPG': 'https://i.imgur.com/BIHSEH0.png', - lightTank: 'https://i.imgur.com/CSNha5V.png', - mediumTank: 'https://i.imgur.com/wvf3ltm.png', - heavyTank: 'https://i.imgur.com/ECeqlZa.png', + tank_destroyer: 'https://i.imgur.com/BIHSEH0.png', + light: 'https://i.imgur.com/CSNha5V.png', + medium: 'https://i.imgur.com/wvf3ltm.png', + heavy: 'https://i.imgur.com/ECeqlZa.png', }; export const TANK_ICONS_PREMIUM: Record = { - 'AT-SPG': 'https://i.imgur.com/TCu3EdR.png', - lightTank: 'https://i.imgur.com/zdkpTRb.png', - mediumTank: 'https://i.imgur.com/3z7eHX6.png', - heavyTank: 'https://i.imgur.com/P3vbmyA.png', + tank_destroyer: 'https://i.imgur.com/TCu3EdR.png', + light: 'https://i.imgur.com/zdkpTRb.png', + medium: 'https://i.imgur.com/3z7eHX6.png', + heavy: 'https://i.imgur.com/P3vbmyA.png', }; export const TANK_ICONS_COLLECTOR: Record = { - 'AT-SPG': 'https://i.imgur.com/WTjeirB.png', - lightTank: 'https://i.imgur.com/EwhtKkU.png', - mediumTank: 'https://i.imgur.com/u8YDMBh.png', - heavyTank: 'https://i.imgur.com/8xRf3nc.png', + tank_destroyer: 'https://i.imgur.com/WTjeirB.png', + light: 'https://i.imgur.com/EwhtKkU.png', + medium: 'https://i.imgur.com/u8YDMBh.png', + heavy: 'https://i.imgur.com/8xRf3nc.png', }; export const TIERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as const; diff --git a/tsconfig.json b/tsconfig.json index ee57cddeb..6c4176c22 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,6 @@ } ] }, - "include": ["src/**/*", ".next/types/**/*.ts", "dist/website/types/**/*.ts"], + "include": ["src/**/*", "scripts/**/*"], "exclude": ["node_modules", "dist"] } diff --git a/yarn.lock b/yarn.lock index 74b22a608..5a2b22a56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3266,6 +3266,13 @@ fast-safe-stringify@^2.0.7: resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== +fast-xml-parser@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz#761e641260706d6e13251c4ef8e3f5694d4b0d79" + integrity sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg== + dependencies: + strnum "^1.0.5" + fastq@^1.6.0: version "1.15.0" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" @@ -4755,11 +4762,6 @@ satori@^0.10.8: postcss-value-parser "^4.2.0" yoga-wasm-web "^0.3.3" -sax@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== - scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -5010,6 +5012,11 @@ strip-json-comments@5.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.1.tgz#0d8b7d01b23848ed7dbdf4baaaa31a8250d8cfa0" integrity sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw== +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + styled-jsx@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" @@ -5482,13 +5489,6 @@ ws@8.14.2, ws@^8.14.2: resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From 9a44b1fcfbd50e0cec7c5550e11e3173a7bea827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:17:42 -0600 Subject: [PATCH 41/74] feat: re-added rest of the asset gens --- package.json | 1 + scripts/buildAssets.ts | 293 +++++++++------------ src/app/tools/tankopedia/page.tsx | 22 +- src/core/blitz/readBase64DVPL.ts | 6 + src/core/blitzkrieg/commitMultipleFiles.ts | 4 +- src/core/blitzkrieg/definitions/tanks.ts | 2 +- src/core/blitzkrieg/octokit.ts | 3 + tsconfig.json | 17 +- yarn.lock | 22 +- 9 files changed, 187 insertions(+), 183 deletions(-) create mode 100644 src/core/blitz/readBase64DVPL.ts diff --git a/package.json b/package.json index 7dafc306f..42d36bddd 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "license": "MIT", "dependencies": { + "@octokit/plugin-throttling": "^8.1.3", "@octokit/rest": "^20.0.1", "@prisma/client": "^5.4.1", "@radix-ui/colors": "^3.0.0-rc.4", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index a968edc14..078e80eef 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,12 +1,14 @@ -import { Octokit } from '@octokit/rest'; import { config } from 'dotenv'; import { readdir } from 'fs/promises'; -import { argv, env } from 'process'; +import { argv } from 'process'; import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; +import { readBase64DVPL } from '../src/core/blitz/readBase64DVPL'; import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; -import commitMultipleFiles from '../src/core/blitzkrieg/commitMultipleFiles'; +import commitMultipleFiles, { + FileChange, +} from '../src/core/blitzkrieg/commitMultipleFiles'; import { TankDefinitions, Tier, @@ -34,6 +36,15 @@ interface Strings { [key: string]: string; } type BlitzTankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; +/** + * Warning! This is not exhaustive. + */ +interface TankParameters { + resourcesPath: { + smallIconPath: string; + bigIconPath: string; + }; +} const blitzTankTypeToBlitzkrieg: Record = { 'AT-SPG': 'tank_destroyer', @@ -53,7 +64,7 @@ const DOI = { flags: 'Gfx/Lobby/flags', }; -const octokit = new Octokit({ auth: env.GH_TOKEN }); +const allTargets = argv.includes('--all-targets'); const targets = argv .find((argument) => argument.startsWith('--target')) ?.split('=')[1] @@ -61,7 +72,7 @@ const targets = argv if (!targets) throw new Error('No target(s) specified'); -if (targets.includes('tankDefinitions')) { +if (allTargets || targets.includes('tankDefinitions')) { console.log('Building tank definitions...'); const tankDefinitions: TankDefinitions = {}; @@ -82,7 +93,7 @@ if (targets.includes('tankDefinitions')) { const tank = tanks[tankIndex]; const nationVehicleId = tank.id; const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; - const name = strings[tank.userString]; + const name = strings[tank.userString] ?? tankIndex; const name_short = tank.shortUserString ? strings[tank.shortUserString] === name ? undefined @@ -94,13 +105,13 @@ if (targets.includes('tankDefinitions')) { const tier = tank.level as Tier; const tags = tank.tags.split(' '); const type = blitzTankTypeToBlitzkrieg[tags[0] as BlitzTankType]; + const testing = tags.includes('testTank') ? true : undefined; if ((name ?? name_short) === undefined) { console.warn(`Missing name for ${tankIndex}`); } tankDefinitions[id] = { - id, name, name_short, nation, @@ -111,6 +122,7 @@ if (targets.includes('tankDefinitions')) { : 'researchable', tier, type, + testing, }; } }), @@ -118,7 +130,6 @@ if (targets.includes('tankDefinitions')) { console.log('Committing tank definitions...'); await commitMultipleFiles( - octokit, 'tresabhi', 'blitzkrieg-assets', 'main', @@ -134,170 +145,126 @@ if (targets.includes('tankDefinitions')) { ); } -// console.log( -// ( -// await readDVPL( -// `${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`, -// ) -// ).toString(), -// ); +if ( + allTargets || + targets.includes('bigTankIcons') || + targets.includes('smallTankIcons') +) { + console.log('Building tank icons...'); -// const strings = await readFile( -// `${DATA}/${DOI.strings}/${LANGUAGE}.yaml.dvpl`, -// 'utf-8', -// ).then((data) => load(data) as Record); + const changes: FileChange[] = []; + const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( + (nations) => nations.filter((nation) => nation !== 'common'), + ); -// const tankDefinitions: TankDefinitions = {}; -// const tankIds: number[] = []; -// const images: Record = {}; -// const nations = await readdir( -// `${TEMP}/${DOI.vehicleDefinitions}`, -// ); + await Promise.all( + nations.map(async (nation) => { + const tanks = await readXMLDVPL( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, + ); -// writeFileSync('test.json', JSON.stringify(strings, null, 2)); + for (const tankIndex in tanks) { + const tank = tanks[tankIndex]; + const nationVehicleId = tank.id; + const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; + const parameters = await readYAMLDVPL( + `${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`, + ); + const small = `${DATA}/${parameters.resourcesPath.smallIconPath + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp.dvpl`; + const big = `${DATA}/${parameters.resourcesPath.bigIconPath + .replace(/~res:\//, '') + .replace(/\..+/, '')}.packed.webp.dvpl`; -// Promise.all( -// nations -// .filter((nation) => nation !== 'common') -// .map(async (nation) => { -// const listXML = await readFile( -// `${TEMP}/${DOI.vehicleDefinitions}/${nation}/list.xml`, -// 'utf-8', -// ); -// const list = xml2js(listXML, { compact: true }) as ElementCompact; + if (targets.includes('bigTankIcons')) { + changes.push({ + content: await readBase64DVPL(big), + encoding: 'base64', + path: `icons/big/${id}.webp`, + }); + } + if (targets.includes('smallTankIcons')) { + changes.push({ + content: await readBase64DVPL(small), + encoding: 'base64', + path: `icons/small/${id}.webp`, + }); + } + } + }), + ); -// await Promise.all( -// Object.entries(list.root).map( -// async ([vehicle, vehicleData]) => { -// const nationVehicleId = parseInt(list.root[vehicle].id._text); -// const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; -// const name = strings[vehicleData.userString._text]; -// const name_short = strings[vehicleData.shortUserString?._text]; -// const isPremium = 'gold' in vehicleData.price; -// const isCollector = vehicleData.sellPrice -// ? 'gold' in vehicleData.sellPrice -// : false; -// const tier = parseInt(vehicleData.level._text) as Tier; -// const tags = vehicleData.tags._text.split(' '); -// const type = tags[0]; + console.log('Committing tank icons...'); + await commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'tank icons', + changes, + true, + ); +} -// if ((name ?? name_short) === undefined) { -// console.warn(`Missing name for ${vehicle}`); -// } +if (allTargets || targets.includes('scratchedFlags')) { + console.log('Building scratched flags...'); -// tankIds.push(id); -// tankDefinitions[id] = { -// id, -// name, -// name_short, -// nation, -// tree_type: isCollector -// ? 'collector' -// : isPremium -// ? 'premium' -// : 'researchable', -// tier, -// type, -// }; + const flags = await readdir(`${DATA}/${DOI.flags}`); -// // Tank images -// const parameterPath = `${TEMP}/${DOI.tankParameters}/${nation}/${vehicle}.yaml`; -// const parameterString = await readFile(parameterPath, 'utf-8'); -// const { smallIconPath, bigIconPath } = -// parse(parameterString).resourcesPath; -// images[id] = { -// small: `${TEMP}/assets/Data/${(smallIconPath as string) -// .replace(/~res:\//, '') -// .replace(/\..+/, '')}.packed.webp`, -// big: `${TEMP}/assets/Data/${(bigIconPath as string) -// .replace(/~res:\//, '') -// .replace(/\..+/, '')}.packed.webp`, -// }; -// }, -// ), -// ); -// }), -// ).then(async () => { -// if (!publish) return; + console.log('Committing scratched flags...'); + commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'scratched flags', + await Promise.all( + flags + .filter( + (flag) => + flag.startsWith('flag_tutor-tank_') && + !flag.endsWith('@2x.packed.webp.dvpl'), + ) + .map(async (flag) => { + const content = await readBase64DVPL(`${DATA}/${DOI.flags}/${flag}`); + const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; -// const octokit = new Octokit({ auth: env.GH_TOKEN }); -// // const tankDefinitionsChange: FileChange = { -// // content: JSON.stringify(tankDefinitions), -// // path: 'definitions/tanks.json', -// // encoding: 'utf-8', -// // }; -// // const iconsChange = ( -// // await Promise.all( -// // tankIds.map(async (id) => { -// // try { -// // const [contentSmall, contentBig] = await Promise.all([ -// // readFile(images[id].small, { encoding: 'base64' }), -// // readFile(images[id].big, { encoding: 'base64' }), -// // ]); + return { + content, + encoding: 'base64', + path: `flags/scratched/${name}.webp`, + } satisfies FileChange; + }), + ), + true, + ); +} -// // return [ -// // { -// // content: contentBig, -// // path: `icons/big/${id}.webp`, -// // encoding: 'base64', -// // }, -// // { -// // content: contentSmall, -// // path: `icons/small/${id}.webp`, -// // encoding: 'base64', -// // }, -// // ]; -// // } catch (error) { -// // console.log(error); -// // return undefined; -// // } -// // }), -// // ) -// // ).flat() as FileChange[]; -// const flags = await readdir(`${TEMP}/${DOI.flags}`); -// // const scratchedFlags = await Promise.all( -// // flags -// // .filter((flag) => flag.startsWith('flag_tutor-tank_')) -// // .map(async (flag) => { -// // const content = await readFile( -// // `${TEMP}/${DOI.flags}/${flag}`, -// // { encoding: 'base64' }, -// // ); -// // const name = flag.match(/flag_tutor-tank_(.+)\.packed\.webp/)![1]; +if (allTargets || targets.includes('circleFlags')) { + const flags = await readdir(`${DATA}/${DOI.flags}`); -// // return { -// // content, -// // encoding: 'base64', -// // path: `flags/scratched/${name}.webp`, -// // } satisfies FileChange; -// // }), -// // ); -// const circleFlags = await Promise.all( -// flags -// .filter((flag) => flag.startsWith('flag_profile-stat_')) -// .map(async (flag) => { -// const content = await readFile( -// `${TEMP}/${DOI.flags}/${flag}`, -// { encoding: 'base64' }, -// ); -// const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; + commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'circle flags', + await Promise.all( + flags + .filter( + (flag) => + flag.startsWith('flag_profile-stat_') && + !flag.endsWith('@2x.packed.webp.dvpl'), + ) + .map(async (flag) => { + const content = await readBase64DVPL(`${DATA}/${DOI.flags}/${flag}`); + const name = flag.match(/flag_profile-stat_(.+)\.packed\.webp/)![1]; -// return { -// content, -// encoding: 'base64', -// path: `flags/circle/${name}.webp`, -// } satisfies FileChange; -// }), -// ); - -// console.log('Writing files...'); -// await commitMultipleFiles( -// octokit, -// 'tresabhi', -// 'blitzkrieg-assets', -// 'main', -// new Date().toString(), -// circleFlags, -// true, -// ); -// }); + return { + content, + encoding: 'base64', + path: `flags/circle/${name}.webp`, + } satisfies FileChange; + }), + ), + true, + ); +} diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 02ececfc3..bdd48959f 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -142,18 +142,16 @@ export default function Page() { display: 'flex', }} > - {tank.nation !== 'other' && ( - - )} +
setTimeout(resolve, TIME_PER_BLOB)); diff --git a/src/core/blitzkrieg/definitions/tanks.ts b/src/core/blitzkrieg/definitions/tanks.ts index 224a7424a..27e32a342 100644 --- a/src/core/blitzkrieg/definitions/tanks.ts +++ b/src/core/blitzkrieg/definitions/tanks.ts @@ -3,13 +3,13 @@ import { TankType, TreeTypeString } from '../../../components/Tanks'; import { asset } from '../asset'; export interface TankDefinition { - id: number; nation: string; name: string; name_short?: string; tree_type: TreeTypeString; tier: Tier; type: TankType; + testing?: boolean; } export type TankDefinitions = Record; diff --git a/src/core/blitzkrieg/octokit.ts b/src/core/blitzkrieg/octokit.ts index 509aafa5a..a5fa63fe4 100644 --- a/src/core/blitzkrieg/octokit.ts +++ b/src/core/blitzkrieg/octokit.ts @@ -1,4 +1,7 @@ +import { throttling } from '@octokit/plugin-throttling'; import { Octokit } from '@octokit/rest'; import { secrets } from './secrets'; +Octokit.plugin(throttling); + export const octokit = new Octokit({ auth: secrets.GH_TOKEN }); diff --git a/tsconfig.json b/tsconfig.json index 6c4176c22..48adb851b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,11 @@ "noEmit": true, "resolveJsonModule": true, "jsx": "preserve", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "incremental": true, "isolatedModules": true, @@ -20,6 +24,13 @@ } ] }, - "include": ["src/**/*", "scripts/**/*"], - "exclude": ["node_modules", "dist"] + "include": [ + "src/**/*", + "scripts/**/*", + "dist/website/types/**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] } diff --git a/yarn.lock b/yarn.lock index 5a2b22a56..9a36c8cb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -984,7 +984,7 @@ "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^19.0.2": +"@octokit/openapi-types@^19.0.2", "@octokit/openapi-types@^19.1.0": version "19.1.0" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== @@ -1008,6 +1008,14 @@ dependencies: "@octokit/types" "^12.3.0" +"@octokit/plugin-throttling@^8.1.3": + version "8.1.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.1.3.tgz#7fb0e001c0cb9383c6be07740b8ec326ed990f6b" + integrity sha512-pfyqaqpc0EXh5Cn4HX9lWYsZ4gGbjnSmUILeu4u2gnuM50K/wIk9s1Pxt3lVeVwekmITgN/nJdoh43Ka+vye8A== + dependencies: + "@octokit/types" "^12.2.0" + bottleneck "^2.15.3" + "@octokit/request-error@^5.0.0": version "5.0.1" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.0.1.tgz#277e3ce3b540b41525e07ba24c5ef5e868a72db9" @@ -1044,6 +1052,13 @@ dependencies: "@octokit/openapi-types" "^19.0.2" +"@octokit/types@^12.2.0": + version "12.4.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" + integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== + dependencies: + "@octokit/openapi-types" "^19.1.0" + "@pkgjs/parseargs@0.11.0", "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -2532,6 +2547,11 @@ bole@^5.0.0: fast-safe-stringify "^2.0.7" individual "^3.0.0" +bottleneck@^2.15.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" From 2ce083222e55e46bb1f310fd127b1c4d677123b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:19:13 -0600 Subject: [PATCH 42/74] fix: tighter all targets integration --- scripts/buildAssets.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 078e80eef..4cafcf637 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -70,9 +70,9 @@ const targets = argv ?.split('=')[1] .split(','); -if (!targets) throw new Error('No target(s) specified'); +if (!targets && !allTargets) throw new Error('No target(s) specified'); -if (allTargets || targets.includes('tankDefinitions')) { +if (allTargets || targets?.includes('tankDefinitions')) { console.log('Building tank definitions...'); const tankDefinitions: TankDefinitions = {}; @@ -147,8 +147,8 @@ if (allTargets || targets.includes('tankDefinitions')) { if ( allTargets || - targets.includes('bigTankIcons') || - targets.includes('smallTankIcons') + targets?.includes('bigTankIcons') || + targets?.includes('smallTankIcons') ) { console.log('Building tank icons...'); @@ -177,14 +177,14 @@ if ( .replace(/~res:\//, '') .replace(/\..+/, '')}.packed.webp.dvpl`; - if (targets.includes('bigTankIcons')) { + if (allTargets || targets?.includes('bigTankIcons')) { changes.push({ content: await readBase64DVPL(big), encoding: 'base64', path: `icons/big/${id}.webp`, }); } - if (targets.includes('smallTankIcons')) { + if (allTargets || targets?.includes('smallTankIcons')) { changes.push({ content: await readBase64DVPL(small), encoding: 'base64', @@ -206,7 +206,7 @@ if ( ); } -if (allTargets || targets.includes('scratchedFlags')) { +if (allTargets || targets?.includes('scratchedFlags')) { console.log('Building scratched flags...'); const flags = await readdir(`${DATA}/${DOI.flags}`); @@ -239,7 +239,7 @@ if (allTargets || targets.includes('scratchedFlags')) { ); } -if (allTargets || targets.includes('circleFlags')) { +if (allTargets || targets?.includes('circleFlags')) { const flags = await readdir(`${DATA}/${DOI.flags}`); commitMultipleFiles( From 604e751bf4266c5ddf41a340593610adabedcb0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 6 Dec 2023 10:34:43 -0600 Subject: [PATCH 43/74] feat: test tank filters --- scripts/buildAssets.ts | 1 + scripts/buildRatingsLeaderboard.ts | 1 - .../tools/tankopedia/components/Options.tsx | 33 +++++++++++++++++-- src/app/tools/tankopedia/page.tsx | 7 +++- src/core/blitzkrieg/definitions/tanks.ts | 3 +- src/stores/tankopedia.ts | 3 ++ 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 4cafcf637..0d960f3f8 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -112,6 +112,7 @@ if (allTargets || targets?.includes('tankDefinitions')) { } tankDefinitions[id] = { + id, name, name_short, nation, diff --git a/scripts/buildRatingsLeaderboard.ts b/scripts/buildRatingsLeaderboard.ts index dbe09a0d7..64d00a244 100644 --- a/scripts/buildRatingsLeaderboard.ts +++ b/scripts/buildRatingsLeaderboard.ts @@ -126,7 +126,6 @@ if (publish) { console.log(`Publishing to season ${info.current_season}...`); commitMultipleFiles( - octokit, 'tresabhi', 'blitzkrieg-assets', 'main', diff --git a/src/app/tools/tankopedia/components/Options.tsx b/src/app/tools/tankopedia/components/Options.tsx index 0b03484d4..4cd4d5690 100644 --- a/src/app/tools/tankopedia/components/Options.tsx +++ b/src/app/tools/tankopedia/components/Options.tsx @@ -19,6 +19,7 @@ import { import mutateTankopedia, { TankopediaSortBy, TankopediaSortDirection, + TankopediaTestTankDisplay, useTankopedia, } from '../../../../stores/tankopedia'; @@ -27,8 +28,8 @@ export function Options() { const tankopediaState = useTankopedia(); return ( - - + + + + + + mutateTankopedia((draft) => { + draft.filters.test = value as TankopediaTestTankDisplay; + }) + } + > + + Include + + + Exclude + + Only + + + + {[...TIERS].reverse().map((tier, index) => ( - - - - mutateTankopedia((draft) => { - draft.sort.by = value as TankopediaSortBy; - }) - } - > - Tier - Name - - - - - - - - - - - mutateTankopedia((draft) => { - draft.sort.direction = value as TankopediaSortDirection; - }) - } - > - - Ascending - - - Descending - - - - - + @@ -106,39 +72,46 @@ export function Options() { - - {[...TIERS].reverse().map((tier, index) => ( + + {TREE_TYPES.map((type, index) => ( ))} - + {[...TANK_TYPES].reverse().map((type, index) => ( + ))} + + + {nations.map((nation, index) => ( - ))} + style={{ + flex: 1, + margin: -0.5, + borderTopLeftRadius: index === 0 ? undefined : 0, + borderBottomLeftRadius: 0, + borderTopRightRadius: + index === TIERS.length - 6 ? undefined : 0, + borderBottomRightRadius: 0, + }} + onClick={() => + mutateTankopedia((draft) => { + if (draft.filters.tiers.includes(tier)) { + draft.filters.tiers = draft.filters.tiers.filter( + (preexistingTier) => preexistingTier !== tier, + ); + } else { + draft.filters.tiers.push(tier); + } + }) + } + > + {TIER_ROMAN_NUMERALS[tier]} + + ))} + + + + {[...TIERS] + .reverse() + .slice(5, 10) + .map((tier, index) => ( + + ))} + - + + {nations.slice(0, 5).map((nation, index) => ( + + ))} + + + + {nations.slice(5, 10).map((nation, index) => ( + + ))} + + ); } diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 748832ea7..d5d9e206a 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -1,8 +1,16 @@ 'use client'; import { slateDark } from '@radix-ui/colors'; -import { MagnifyingGlassIcon } from '@radix-ui/react-icons'; -import { Card, Flex, Inset, Text, TextField } from '@radix-ui/themes'; +import { CaretDownIcon, MagnifyingGlassIcon } from '@radix-ui/react-icons'; +import { + Button, + Card, + DropdownMenu, + Flex, + Inset, + Text, + TextField, +} from '@radix-ui/themes'; import { go } from 'fuzzysort'; import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; @@ -17,7 +25,12 @@ import { } from '../../../core/blitzkrieg/definitions/tanks'; import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; import { theme } from '../../../stitches.config'; -import { useTankopedia } from '../../../stores/tankopedia'; +import mutateTankopedia, { + TankopediaSortBy, + TankopediaSortDirection, + TankopediaTestTankDisplay, + useTankopedia, +} from '../../../stores/tankopedia'; import { Options } from './components/Options'; import { PageTurner } from './components/PageTurner'; import * as styles from './page.css'; @@ -90,30 +103,79 @@ export default function Page() { Loading...}> - - - - - { - if (event.target.value.length === 0) { - setSearchedList(searchableTanks); - } else { - setSearchedList( - go(event.target.value, searchableTanks, { - keys: [ - 'name', - 'name_short', - 'id', - ] satisfies (keyof TankDefinition)[], - }).map(({ obj }) => obj), - ); - } - }} - /> - + + + + + + { + if (event.target.value.length === 0) { + setSearchedList(searchableTanks); + } else { + setSearchedList( + go(event.target.value, searchableTanks, { + keys: [ + 'name', + 'name_short', + 'id', + ] satisfies (keyof TankDefinition)[], + }).map(({ obj }) => obj), + ); + } + }} + /> + + + + + + + + By + + mutateTankopedia((draft) => { + draft.sort.by = value as TankopediaSortBy; + }) + } + > + + Tier + + + Name + + + + + + Direction + + mutateTankopedia((draft) => { + draft.sort.direction = value as TankopediaSortDirection; + }) + } + > + + Ascending + + + Descending + + + + + + @@ -222,6 +284,11 @@ export default function Page() { tank.tree_type === 'researchable' ? slateDark.slate12 : undefined, + whiteSpace: 'nowrap', + maxWidth: 160, + display: 'block', + textOverflow: 'ellipsis', + overflow: 'hidden', }} > {tank.name_short ?? diff --git a/src/stores/session.ts b/src/stores/session.ts index 4612ba8d2..4419a7dd0 100644 --- a/src/stores/session.ts +++ b/src/stores/session.ts @@ -1,6 +1,6 @@ import { produce } from 'immer'; import { create } from 'zustand'; -import { devtools, persist } from 'zustand/middleware'; +import { persist } from 'zustand/middleware'; import { CustomColumnDisplay } from '../app/tools/session/components/CustomColumn'; import { AccentColor, GrayColor } from '../constants/radixColors'; import { Region } from '../constants/regions'; @@ -65,25 +65,23 @@ export function resetSession() { } export const useSession = create()( - devtools( - persist( - (set) => ({ - isTracking: false, - resetPrompt: true, - showTotal: true, - showCareer: true, - embedPrompt: true, + persist( + (set) => ({ + isTracking: false, + resetPrompt: true, + showTotal: true, + showCareer: true, + embedPrompt: true, - customColumns: [ - { display: 'battles', showDelta: false }, - { display: 'winrate', showDelta: true }, - { display: 'wn8', showDelta: false }, - { display: 'damage', showDelta: true }, - ], - color: 'slate', - }), - { name: 'session' }, - ), + customColumns: [ + { display: 'battles', showDelta: false }, + { display: 'winrate', showDelta: true }, + { display: 'wn8', showDelta: false }, + { display: 'damage', showDelta: true }, + ], + color: 'slate', + }), + { name: 'session' }, ), ); diff --git a/src/stores/tankopedia.ts b/src/stores/tankopedia.ts index a2dbb6a4f..447edf4bd 100644 --- a/src/stores/tankopedia.ts +++ b/src/stores/tankopedia.ts @@ -1,6 +1,5 @@ import { produce } from 'immer'; import { create } from 'zustand'; -import { devtools, persist } from 'zustand/middleware'; import { TankType, TreeTypeString } from '../components/Tanks'; import { Tier } from '../core/blitzkrieg/definitions/tanks'; @@ -22,26 +21,19 @@ type Tankopedia = { }; }; -export const useTankopedia = create()( - devtools( - persist( - (set) => ({ - sort: { - by: 'tier', - direction: 'descending', - }, - filters: { - tiers: [], - types: [], - treeTypes: [], - nations: [], - test: 'include', - }, - }), - { name: 'tankopedia' }, - ), - ), -); +export const useTankopedia = create()(() => ({ + sort: { + by: 'tier', + direction: 'descending', + }, + filters: { + tiers: [], + types: [], + treeTypes: [], + nations: [], + test: 'include', + }, +})); export default function mutateTankopedia(recipe: (draft: Tankopedia) => void) { useTankopedia.setState(produce(recipe)); From fb9c04c779c2dbf6f02daa4108a86c0f60e40d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Wed, 6 Dec 2023 12:48:19 -0600 Subject: [PATCH 46/74] feat: even cleaner filters --- .../tankopedia/components/Options/index.tsx | 571 +++++++++--------- src/app/tools/tankopedia/page.tsx | 20 +- 2 files changed, 298 insertions(+), 293 deletions(-) diff --git a/src/app/tools/tankopedia/components/Options/index.tsx b/src/app/tools/tankopedia/components/Options/index.tsx index 79fc47221..d6e9f6a35 100644 --- a/src/app/tools/tankopedia/components/Options/index.tsx +++ b/src/app/tools/tankopedia/components/Options/index.tsx @@ -27,218 +27,219 @@ export function Options() { const tankopediaState = useTankopedia(); return ( - - - - - - - - - - mutateTankopedia((draft) => { - draft.filters.test = value as TankopediaTestTankDisplay; - }) - } - > - - Include - - - Exclude - - Only - - - - - - {TREE_TYPES.map((type, index) => ( - - ))} - - - - {[...TANK_TYPES].reverse().map((type, index) => ( - - ))} - - - - {[...TIERS].reverse().map((tier, index) => ( - - ))} - - - - {nations.map((nation, index) => ( - + + + + + + + mutateTankopedia((draft) => { + draft.filters.test = value as TankopediaTestTankDisplay; + }) + } + > + + Include + + + Exclude + + Only + + + + + {TREE_TYPES.map((type, index) => ( + - ))} - - - - - {[...TIERS] - .reverse() - .slice(0, 5) - .map((tier, index) => ( + onClick={() => + mutateTankopedia((draft) => { + if (draft.filters.treeTypes.includes(type)) { + draft.filters.treeTypes = draft.filters.treeTypes.filter( + (preexistingType) => preexistingType !== type, + ); + } else { + draft.filters.treeTypes.push(type); + } + }) + } + > + + + ))} + + + {[...TANK_TYPES].reverse().map((type, index) => ( + + ))} + + + + {[...TIERS] + .reverse() + .slice(0, 5) + .map((tier, index) => ( + + ))} + + + {[...TIERS] + .reverse() + .slice(5, 10) + .map((tier, index) => ( + + ))} + + + + + {nations.slice(0, 5).map((nation, index) => ( ))} - + - - {[...TIERS] - .reverse() - .slice(5, 10) - .map((tier, index) => ( + + {nations.slice(5, 10).map((nation, index) => ( ))} + - - - {nations.slice(0, 5).map((nation, index) => ( + + + {[...TIERS].reverse().map((tier, index) => ( + + ))} + + + {nations.map((nation, index) => ( - ))} - - - - {nations.slice(5, 10).map((nation, index) => ( - - + {showFilters && ( + + Loading...}> + + + + )} Date: Wed, 6 Dec 2023 17:58:26 -0600 Subject: [PATCH 48/74] feat: start of tank page --- src/app/tools/layout.tsx | 2 +- src/app/tools/tankopedia/[id]/page.tsx | 21 ++++++++++++ .../tankopedia/components/Options/index.tsx | 32 +++---------------- src/components/Flag.tsx | 19 +++++++++++ 4 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 src/app/tools/tankopedia/[id]/page.tsx create mode 100644 src/components/Flag.tsx diff --git a/src/app/tools/layout.tsx b/src/app/tools/layout.tsx index 2f281b63f..ebaae8f62 100644 --- a/src/app/tools/layout.tsx +++ b/src/app/tools/layout.tsx @@ -11,7 +11,7 @@ interface ToolsLayoutProps { export default function ToolsLayout({ children }: ToolsLayoutProps) { const pathname = usePathname(); - const toolId = pathname.split('/').at(-1); + const toolId = pathname.split('/').at(2); const tool = TOOLS.find((tool) => tool.id === toolId); return ( diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx new file mode 100644 index 000000000..0fd04e08e --- /dev/null +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -0,0 +1,21 @@ +import { Flex, Heading } from '@radix-ui/themes'; +import { use } from 'react'; +import { Flag } from '../../../../components/Flag'; +import PageWrapper from '../../../../components/PageWrapper'; +import { tankDefinitions } from '../../../../core/blitzkrieg/definitions/tanks'; + +// get [id] form the path +export default function Page({ params }: { params: { id: string } }) { + const id = parseInt(params.id); + const awaitedTankDefinitions = use(tankDefinitions); + const definition = awaitedTankDefinitions[id]; + + return ( + + + + {definition.name} + + + ); +} diff --git a/src/app/tools/tankopedia/components/Options/index.tsx b/src/app/tools/tankopedia/components/Options/index.tsx index d6e9f6a35..c67417100 100644 --- a/src/app/tools/tankopedia/components/Options/index.tsx +++ b/src/app/tools/tankopedia/components/Options/index.tsx @@ -3,6 +3,7 @@ import { CaretDownIcon } from '@radix-ui/react-icons'; import { Button, DropdownMenu, Flex } from '@radix-ui/themes'; import { use } from 'react'; +import { Flag } from '../../../../../components/Flag'; import { TANK_TYPES, TREE_TYPES, @@ -10,7 +11,6 @@ import { TREE_TYPE_IMAGES, TreeTypeEnum, } from '../../../../../components/Tanks'; -import { asset } from '../../../../../core/blitzkrieg/asset'; import { NATIONS, TIERS, @@ -267,15 +267,7 @@ export function Options() { }) } > - + ))} @@ -314,15 +306,7 @@ export function Options() { }) } > - + ))} @@ -394,15 +378,7 @@ export function Options() { }) } > - + ))} diff --git a/src/components/Flag.tsx b/src/components/Flag.tsx new file mode 100644 index 000000000..21edaf8ea --- /dev/null +++ b/src/components/Flag.tsx @@ -0,0 +1,19 @@ +import { asset } from '../core/blitzkrieg/asset'; + +interface FlagProps { + nation: string; +} + +export function Flag({ nation }: FlagProps) { + return ( +
+ {nation} +
+ ); +} From 6c496e616d6dfa2be81e011b79578ca52cac17d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 7 Dec 2023 12:58:54 -0600 Subject: [PATCH 49/74] feat: scg tests --- scripts/buildAssets.ts | 98 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 0d960f3f8..f74b26176 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,5 +1,5 @@ import { config } from 'dotenv'; -import { readdir } from 'fs/promises'; +import { readFile, readdir } from 'fs/promises'; import { argv } from 'process'; import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; @@ -16,6 +16,102 @@ import { config(); +class SCGStream { + public index = 0; + + constructor(public buffer: Buffer) {} + + consume(size: number) { + const subarray = this.buffer.subarray(this.index, this.index + size); + this.index += size; + + return subarray; + } + + consumeAscii(size: number) { + return this.consume(size).toString('ascii'); + } + + consumeByteArray(size: number) { + return this.consume(size); + } + + consumeInt8() { + return this.consume(1).readInt8(); + } + consumeInt16() { + return this.consume(2).readInt16LE(); + } + consumeInt32() { + return this.consume(4).readInt32LE(); + } + + consumeSCGHeader() { + return { + name: this.consumeAscii(4), + version: this.consumeInt32(), + nodeCount: this.consumeInt32(), + nodeCount2: this.consumeInt32(), + }; + } + + consumeKAHeader() { + return { + name: this.consumeAscii(2), + version: this.consumeInt16(), + count: this.consumeInt32(), + }; + } + + consumeKA() { + const type = this.consumeInt8(); + + if (type === 2) { + // int32 + return { type, value: this.consumeInt32() }; + } else if (type === 4) { + // string + const length = this.consumeInt32(); + const value = this.consumeAscii(length); + + return { type, length, value }; + } else if (type === 6) { + // byte array + const length = this.consumeInt32(); + const value = this.consumeByteArray(length); + + return { type, length, value }; + } + { + throw new TypeError(`Unknown KA type: ${type}`); + } + } + + consumeRemaining() { + return this.consume(Number.POSITIVE_INFINITY); + } + + skip(size: number) { + this.index += size; + } +} + +async function readSCG(file: string) { + const stream = new SCGStream(await readFile(file)); + + const header = stream.consumeSCGHeader(); + + for (let i = 0; i < header.nodeCount; i++) { + const ka = stream.consumeKAHeader(); + + for (let KAIndex = 0; KAIndex < ka.count; KAIndex++) { + console.log(stream.consumeKA()); + } + } +} + +await readSCG('test.scg'); + interface VehicleDefinitionList { [key: string]: { id: number; From 8caf4069dc9e7bd3d3162f764a91e1cd9ce0d7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:13:54 -0600 Subject: [PATCH 50/74] feat: more things --- .vscode/settings.json | 1 + package.json | 1 + scripts/buildAssets.ts | 98 +------------ scripts/buildTest.ts | 304 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 307 insertions(+), 97 deletions(-) create mode 100644 scripts/buildTest.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index ceab1196e..458f0f7c8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -33,6 +33,7 @@ "researchable", "Resvg", "roboto", + "SCPG", "searchclans", "searchplayers", "searchtanks", diff --git a/package.json b/package.json index 42d36bddd..52823815b 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build:docs": "vitepress build docs", "build:ratingsleaderboard": "vite-node --script scripts/buildRatingsLeaderboard", "build:assets": "vite-node --script scripts/buildAssets", + "build:test": "vite-node --script scripts/buildTest", "build:ratingsplot": "vite-node --script scripts/buildRatingsPlot", "dev:bot": "yarn build:bot && yarn start:bot", "dev:docs": "vitepress dev docs", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index f74b26176..0d960f3f8 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,5 +1,5 @@ import { config } from 'dotenv'; -import { readFile, readdir } from 'fs/promises'; +import { readdir } from 'fs/promises'; import { argv } from 'process'; import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; @@ -16,102 +16,6 @@ import { config(); -class SCGStream { - public index = 0; - - constructor(public buffer: Buffer) {} - - consume(size: number) { - const subarray = this.buffer.subarray(this.index, this.index + size); - this.index += size; - - return subarray; - } - - consumeAscii(size: number) { - return this.consume(size).toString('ascii'); - } - - consumeByteArray(size: number) { - return this.consume(size); - } - - consumeInt8() { - return this.consume(1).readInt8(); - } - consumeInt16() { - return this.consume(2).readInt16LE(); - } - consumeInt32() { - return this.consume(4).readInt32LE(); - } - - consumeSCGHeader() { - return { - name: this.consumeAscii(4), - version: this.consumeInt32(), - nodeCount: this.consumeInt32(), - nodeCount2: this.consumeInt32(), - }; - } - - consumeKAHeader() { - return { - name: this.consumeAscii(2), - version: this.consumeInt16(), - count: this.consumeInt32(), - }; - } - - consumeKA() { - const type = this.consumeInt8(); - - if (type === 2) { - // int32 - return { type, value: this.consumeInt32() }; - } else if (type === 4) { - // string - const length = this.consumeInt32(); - const value = this.consumeAscii(length); - - return { type, length, value }; - } else if (type === 6) { - // byte array - const length = this.consumeInt32(); - const value = this.consumeByteArray(length); - - return { type, length, value }; - } - { - throw new TypeError(`Unknown KA type: ${type}`); - } - } - - consumeRemaining() { - return this.consume(Number.POSITIVE_INFINITY); - } - - skip(size: number) { - this.index += size; - } -} - -async function readSCG(file: string) { - const stream = new SCGStream(await readFile(file)); - - const header = stream.consumeSCGHeader(); - - for (let i = 0; i < header.nodeCount; i++) { - const ka = stream.consumeKAHeader(); - - for (let KAIndex = 0; KAIndex < ka.count; KAIndex++) { - console.log(stream.consumeKA()); - } - } -} - -await readSCG('test.scg'); - interface VehicleDefinitionList { [key: string]: { id: number; diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts new file mode 100644 index 000000000..eabfbfd6f --- /dev/null +++ b/scripts/buildTest.ts @@ -0,0 +1,304 @@ +import { readFile } from 'fs/promises'; + +enum KATypes { + NONE, + BOOLEAN, + INT32, + FLOAT, + STRING, + WIDE_STRING, + BYTE_ARRAY, + UINT32, + KEYED_ARCHIVE, + INT64, + UINT64, + VECTOR2, + VECTOR3, + VECTOR4, + MATRIX2, + MATRIX3, + MATRIX4, + COLOR, + FASTNAME, + AABBOX3, + FILEPATH, + FLOAT64, + INT8, + UINT8, + INT16, + UINT16, + ARRAY, +} + +const VERTEX_TYPES = [ + 'VERTEX', + 'NORMAL', + 'COLOR', + 'TEXCOORD0', + 'TEXCOORD1', + 'TEXCOORD2', + 'TEXCOORD3', + 'TANGENT', + 'BINORMAL', + 'HARD_JOINTINDEX', + 'PIVOT4', + 'FLEXIBILITY', + 'ANGLE_SIN_COS', + 'JOINTINDEX', + 'JOINTWEIGHT', + 'CUBETEXCOORD0', + 'CUBETEXCOORD1', + 'CUBETEXCOORD2', + 'CUBETEXCOORD3', +] as const; + +type VertexType = (typeof VERTEX_TYPES)[number]; + +type KAResolvedValue = { buffer: Buffer; value: Type }; + +interface PolygonGroupRaw { + '##name': KAResolvedValue<'PolygonGroup'>; + '#id': KAResolvedValue; + cubeTextureCoordCount: KAResolvedValue; + indexCount: KAResolvedValue; + indexFormat: KAResolvedValue<0 | 1>; + indices: KAResolvedValue; + packing: KAResolvedValue<0 | 1>; + primitiveCount: KAResolvedValue; + rhi_primitiveType: KAResolvedValue<1 | 2 | 10>; + textureCoordCount: KAResolvedValue; + vertexCount: KAResolvedValue; + vertexFormat: KAResolvedValue; + vertices: KAResolvedValue; +} + +interface PolygonGroup extends Omit { + indices: number[]; +} + +class SCPGStream { + public index = 0; + + constructor(public buffer: Buffer) {} + + skip(size: number) { + this.index += size; + } + consume(size: number) { + const subarray = this.buffer.subarray(this.index, this.index + size); + this.index += size; + + return subarray; + } + consumeRemaining() { + return this.consume(Number.POSITIVE_INFINITY); + } + + consumeByteArray(size: number) { + const buffer = this.consume(size); + return { buffer, value: buffer }; + } + consumeAscii(size: number) { + const buffer = this.consume(size); + return { buffer, value: buffer.toString('ascii') }; + } + consumeInt8() { + const buffer = this.consume(1); + return { buffer, value: buffer.readInt8() }; + } + consumeInt16() { + const buffer = this.consume(2); + return { buffer, value: buffer.readInt16LE() }; + } + consumeInt32() { + const buffer = this.consume(4); + return { buffer, value: buffer.readInt32LE() }; + } + consumeUInt8() { + const buffer = this.consume(1); + return { buffer, value: buffer.readUInt8() }; + } + consumeUInt16() { + const buffer = this.consume(2); + return { buffer, value: buffer.readUInt16LE() }; + } + consumeUInt32() { + const buffer = this.consume(4); + return { buffer, value: buffer.readUInt32LE() }; + } + + consumeSCGHeader() { + return { + name: this.consumeAscii(4).value, + version: this.consumeUInt32().value, + nodeCount: this.consumeUInt32().value, + nodeCount2: this.consumeUInt32().value, + }; + } + consumeSCG() { + const header = this.consumeSCGHeader(); + const polygonGroupsRaw: PolygonGroupRaw[] = []; + + for (let index = 0; index < header.nodeCount; index++) { + const polygonGroupRaw = this.consumeKA(); + polygonGroupsRaw.push(polygonGroupRaw); + } + + const polygonGroups = polygonGroupsRaw.map((polygonGroupRaw) => { + const indicesStream = new SCPGStream(polygonGroupRaw.indices.value); + const indices: number[] = []; + + for (let index = 0; index < polygonGroupRaw.indexCount.value; index++) { + indices.push( + polygonGroupRaw.indexFormat.value + ? indicesStream.consumeUInt32().value + : indicesStream.consumeUInt16().value, + ); + } + + const verticesStream = new SCPGStream(polygonGroupRaw.vertices.buffer); + const vertexFormat = BigInt( + '0x' + polygonGroupRaw.vertexFormat.buffer.toString('hex'), + ) + .toString(2) + .padStart(polygonGroupRaw.vertexFormat.buffer.length * 8, '0') + .split('') + .map(parseInt) + .map((bit, index) => { + if (bit) return VERTEX_TYPES[index]; + }) + .filter(Boolean); + const vertices: { type: VertexType; value: number[] }[] = []; + + for (let index = 0; index < polygonGroupRaw.vertexCount.value; index++) { + vertexFormat.forEach((type) => { + if (['COLOR', 'FLEXIBILITY', 'HARD_JOINTINDEX'].includes(type)) { + vertices.push({ + type, + value: [verticesStream.consumeUInt32().value], + }); + } else if ( + [ + 'TEXCOORD0', + 'TEXCOORD1', + 'TEXCOORD2', + 'TEXCOORD3', + 'ANGLE_SIN_COS', + ].includes(type) + ) { + vertices.push({ + type, + value: [ + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + ], + }); + } else if ( + [ + 'VERTEX', + 'NORMAL', + 'TANGENT', + 'BINORMAL', + 'CUBETEXCOORD0', + 'CUBETEXCOORD1', + 'CUBETEXCOORD2', + 'CUBETEXCOORD3', + ].includes(type) + ) { + vertices.push({ + type, + value: [ + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + ], + }); + } else if (['PIVOT4', 'JOINTINDEX', 'JOINTWEIGHT'].includes(type)) { + vertices.push({ + type, + value: [ + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + verticesStream.consumeUInt32().value, + ], + }); + } else { + throw new TypeError(`Unknown vertex type: ${type}`); + } + }); + } + + return { vertices, indices }; + }); + + // writeFileSync( + // 'test.txt', + // polygonGroups + // .map((i) => + // i.vertices + // .map( + // (e) => + // `${e.type.padEnd(16, ' ')} ${e.value + // .map((j) => j.toString(16).padStart(8, '0')) + // .join(' ')}`, + // ) + // .join('\n'), + // ) + // .join('\n\n'), + // ); + + return polygonGroups; + } + + consumeKAHeader() { + return { + name: this.consumeAscii(2).value, + version: this.consumeUInt16().value, + count: this.consumeUInt32().value, + }; + } + consumeKAValue() { + const type = this.consumeUInt8().value; + + switch (type) { + case KATypes.INT32: + return this.consumeInt32(); + + case KATypes.STRING: { + const length = this.consumeUInt32(); + return this.consumeAscii(length.value); + } + + case KATypes.BYTE_ARRAY: { + const length = this.consumeUInt32(); + return this.consumeByteArray(length.value); + } + + default: + throw new TypeError(`Unknown KA type: ${type}`); + } + } + consumeKAPair() { + const name = this.consumeKAValue().value as string; + const value = this.consumeKAValue(); + + return { name, value }; + } + consumeKA() { + const header = this.consumeKAHeader(); + const pairs: Record = {}; + + for (let index = 0; index < header.count; index++) { + const { name, value } = this.consumeKAPair(); + pairs[name] = value; + } + + return pairs as Type; + } +} + +const stream = new SCPGStream(await readFile('test.scg')); + +stream.consumeSCG(); +// console.log(stream.consumeSCG()); From 81826d054969f20c7bf28b72a945d3c2abf33398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:41:49 -0600 Subject: [PATCH 51/74] feat: more data driven --- .vscode/settings.json | 5 ++ scripts/buildTest.ts | 193 +++++++++++++++++++++--------------------- 2 files changed, 101 insertions(+), 97 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 458f0f7c8..32d61fe86 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,10 +3,12 @@ "Abhi", "accountinfo", "bepaint", + "BINORMAL", "blitzstars", "cleandist", "cockroackdb", "corsproxy", + "CUBETEXCOORD", "customperiod", "deburr", "diacriticless", @@ -17,6 +19,8 @@ "fuzzysort", "gamemode", "immer", + "JOINTINDEX", + "JOINTWEIGHT", "kranvagn", "krieg", "Leaderboard", @@ -49,6 +53,7 @@ "tankopedia", "tankopedias", "tankstats", + "TEXCOORD", "tresabhi", "Unicum", "Unregistering", diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index eabfbfd6f..64208ab8a 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -1,6 +1,8 @@ +import { writeFileSync } from 'fs'; import { readFile } from 'fs/promises'; +import { range } from 'lodash'; -enum KATypes { +enum KAType { NONE, BOOLEAN, INT32, @@ -30,29 +32,61 @@ enum KATypes { ARRAY, } -const VERTEX_TYPES = [ - 'VERTEX', - 'NORMAL', - 'COLOR', - 'TEXCOORD0', - 'TEXCOORD1', - 'TEXCOORD2', - 'TEXCOORD3', - 'TANGENT', - 'BINORMAL', - 'HARD_JOINTINDEX', - 'PIVOT4', - 'FLEXIBILITY', - 'ANGLE_SIN_COS', - 'JOINTINDEX', - 'JOINTWEIGHT', - 'CUBETEXCOORD0', - 'CUBETEXCOORD1', - 'CUBETEXCOORD2', - 'CUBETEXCOORD3', -] as const; +enum VertexType { + VERTEX, + NORMAL, + COLOR, + TEXCOORD0, + TEXCOORD1, + TEXCOORD2, + TEXCOORD3, + TANGENT, + BINORMAL, + HARD_JOINTINDEX, + PIVOT4, + FLEXIBILITY, + ANGLE_SIN_COS, + JOINTINDEX, + JOINTWEIGHT, + CUBETEXCOORD0, + CUBETEXCOORD1, + CUBETEXCOORD2, + CUBETEXCOORD3, +} -type VertexType = (typeof VERTEX_TYPES)[number]; +const VECTOR_SIZES = [ + [ + // vector 1; basically array of 1 number + VertexType.COLOR, + VertexType.FLEXIBILITY, + VertexType.HARD_JOINTINDEX, + ], + [ + // vector 2; 2d vector + VertexType.TEXCOORD0, + VertexType.TEXCOORD1, + VertexType.TEXCOORD2, + VertexType.TEXCOORD3, + VertexType.ANGLE_SIN_COS, + ], + [ + // vector 3; 3d vector + VertexType.VERTEX, + VertexType.NORMAL, + VertexType.TANGENT, + VertexType.BINORMAL, + VertexType.CUBETEXCOORD0, + VertexType.CUBETEXCOORD1, + VertexType.CUBETEXCOORD2, + VertexType.CUBETEXCOORD3, + ], + [ + // vector 4; 4d vector or something more complex + VertexType.PIVOT4, + VertexType.JOINTINDEX, + VertexType.JOINTWEIGHT, + ], +]; type KAResolvedValue = { buffer: Buffer; value: Type }; @@ -164,89 +198,54 @@ class SCPGStream { .padStart(polygonGroupRaw.vertexFormat.buffer.length * 8, '0') .split('') .map(parseInt) - .map((bit, index) => { - if (bit) return VERTEX_TYPES[index]; - }) - .filter(Boolean); + .map((bit, index) => (bit ? index : null)) + .filter((index) => index !== null) as VertexType[]; const vertices: { type: VertexType; value: number[] }[] = []; for (let index = 0; index < polygonGroupRaw.vertexCount.value; index++) { + // skipping 4 everytime stops leaving some garbage + verticesStream.skip(4); + vertexFormat.forEach((type) => { - if (['COLOR', 'FLEXIBILITY', 'HARD_JOINTINDEX'].includes(type)) { - vertices.push({ - type, - value: [verticesStream.consumeUInt32().value], - }); - } else if ( - [ - 'TEXCOORD0', - 'TEXCOORD1', - 'TEXCOORD2', - 'TEXCOORD3', - 'ANGLE_SIN_COS', - ].includes(type) - ) { - vertices.push({ - type, - value: [ - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - ], - }); - } else if ( - [ - 'VERTEX', - 'NORMAL', - 'TANGENT', - 'BINORMAL', - 'CUBETEXCOORD0', - 'CUBETEXCOORD1', - 'CUBETEXCOORD2', - 'CUBETEXCOORD3', - ].includes(type) - ) { - vertices.push({ - type, - value: [ - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - ], - }); - } else if (['PIVOT4', 'JOINTINDEX', 'JOINTWEIGHT'].includes(type)) { - vertices.push({ - type, - value: [ - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - verticesStream.consumeUInt32().value, - ], - }); - } else { + const resolved = VECTOR_SIZES.some((types, size) => { + if (types.includes(type)) { + vertices.push({ + type, + value: range(size + 1).map( + () => verticesStream.consumeUInt32().value, + ), + }); + + return true; + } + }); + + if (!resolved) { throw new TypeError(`Unknown vertex type: ${type}`); } }); } + console.log(verticesStream.consumeRemaining().length); + return { vertices, indices }; }); - // writeFileSync( - // 'test.txt', - // polygonGroups - // .map((i) => - // i.vertices - // .map( - // (e) => - // `${e.type.padEnd(16, ' ')} ${e.value - // .map((j) => j.toString(16).padStart(8, '0')) - // .join(' ')}`, - // ) - // .join('\n'), - // ) - // .join('\n\n'), - // ); + writeFileSync( + 'test.txt', + polygonGroups + .map((i) => + i.vertices + .map( + (e) => + `${VertexType[e.type].padEnd(16, ' ')} ${e.value + .map((j) => j.toString(16).padStart(8, '0')) + .join(' ')}`, + ) + .join('\n'), + ) + .join('\n\n'), + ); return polygonGroups; } @@ -262,15 +261,15 @@ class SCPGStream { const type = this.consumeUInt8().value; switch (type) { - case KATypes.INT32: + case KAType.INT32: return this.consumeInt32(); - case KATypes.STRING: { + case KAType.STRING: { const length = this.consumeUInt32(); return this.consumeAscii(length.value); } - case KATypes.BYTE_ARRAY: { + case KAType.BYTE_ARRAY: { const length = this.consumeUInt32(); return this.consumeByteArray(length.value); } From 610c75d274e2b2bf698ac7df52b5252272f74d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:36:46 -0600 Subject: [PATCH 52/74] feat: float --- scripts/buildTest.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index 64208ab8a..bf24fd21b 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -73,7 +73,7 @@ const VECTOR_SIZES = [ // vector 3; 3d vector VertexType.VERTEX, VertexType.NORMAL, - VertexType.TANGENT, + // VertexType.TANGENT, MOVED TO 4 VertexType.BINORMAL, VertexType.CUBETEXCOORD0, VertexType.CUBETEXCOORD1, @@ -82,6 +82,7 @@ const VECTOR_SIZES = [ ], [ // vector 4; 4d vector or something more complex + VertexType.TANGENT, // UNCONFIRMED VertexType.PIVOT4, VertexType.JOINTINDEX, VertexType.JOINTWEIGHT, @@ -160,6 +161,10 @@ class SCPGStream { const buffer = this.consume(4); return { buffer, value: buffer.readUInt32LE() }; } + consumeFloat() { + const buffer = this.consume(4); + return { buffer, value: buffer.readFloatLE() }; + } consumeSCGHeader() { return { @@ -203,16 +208,13 @@ class SCPGStream { const vertices: { type: VertexType; value: number[] }[] = []; for (let index = 0; index < polygonGroupRaw.vertexCount.value; index++) { - // skipping 4 everytime stops leaving some garbage - verticesStream.skip(4); - vertexFormat.forEach((type) => { const resolved = VECTOR_SIZES.some((types, size) => { if (types.includes(type)) { vertices.push({ type, value: range(size + 1).map( - () => verticesStream.consumeUInt32().value, + () => verticesStream.consumeFloat().value, ), }); @@ -239,7 +241,7 @@ class SCPGStream { .map( (e) => `${VertexType[e.type].padEnd(16, ' ')} ${e.value - .map((j) => j.toString(16).padStart(8, '0')) + .map((j) => j.toString(10).padStart(32, ' ')) .join(' ')}`, ) .join('\n'), From 6b9bf76da2cec608aa2f3c63a2d157ae15bbe903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 11:06:56 -0600 Subject: [PATCH 53/74] feat: model reconstruction --- package.json | 4 + scripts/buildTest.ts | 43 ++- src/app/tools/tankopedia/[id]/page.tsx | 94 +++++- yarn.lock | 406 ++++++++++++++++++++++++- 4 files changed, 525 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 52823815b..b39449a90 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,8 @@ "@radix-ui/colors": "^3.0.0-rc.4", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^2.0.1", + "@react-three/drei": "^9.90.1", + "@react-three/fiber": "^8.15.12", "@resvg/resvg-js": "^2.4.1", "@vanilla-extract/css": "^1.13.0", "bepaint": "^0.1.0-beta.3", @@ -53,6 +55,7 @@ "react-dom": "^18.2.0", "react-fuzzysort": "^1.0.1", "satori": "^0.10.8", + "three": "^0.159.0", "vite-node": "^0.34.5", "vitepress": "^1.0.0-rc.20", "vitepress-plugin-auto-sidebar": "^1.1.0", @@ -70,6 +73,7 @@ "@types/markdown-escape": "^1.1.0", "@types/node": "^20.6.5", "@types/react": "^18.2.22", + "@types/three": "^0.159.0", "@vanilla-extract/next-plugin": "^2.3.1", "compare-versions": "^6.1.0", "crc": "^4.3.2", diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index bf24fd21b..417707492 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -233,20 +233,37 @@ class SCPGStream { return { vertices, indices }; }); + // writeFileSync( + // 'test.txt', + // polygonGroups + // .map((i) => + // i.vertices + // .map( + // (e) => + // `${VertexType[e.type].padEnd(16, ' ')} ${e.value + // .map((j) => j.toString(10).padStart(25, ' ')) + // .join(' ')}`, + // ) + // .join('\n'), + // ) + // .join('\n\n'), + // ); + + // writeFileSync( + // 'test.json', + + // ) + writeFileSync( - 'test.txt', - polygonGroups - .map((i) => - i.vertices - .map( - (e) => - `${VertexType[e.type].padEnd(16, ' ')} ${e.value - .map((j) => j.toString(10).padStart(32, ' ')) - .join(' ')}`, - ) - .join('\n'), - ) - .join('\n\n'), + 'test.json', + JSON.stringify( + polygonGroups.map((group) => ({ + vertices: group.vertices + .filter(({ type }) => type === VertexType.VERTEX) + .map(({ value }) => value), + indices: group.indices, + })), + ), ); return polygonGroups; diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index 0fd04e08e..82a3411a5 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -1,14 +1,28 @@ -import { Flex, Heading } from '@radix-ui/themes'; -import { use } from 'react'; +'use client'; + +import { Checkbox, Flex, Heading } from '@radix-ui/themes'; +import { OrbitControls } from '@react-three/drei'; +import { Canvas } from '@react-three/fiber'; +import { use, useState } from 'react'; +import { + BufferAttribute, + BufferGeometry, + Mesh, + MeshStandardMaterial, + Vector3Tuple, +} from 'three'; +import model from '../../../../../test.json'; import { Flag } from '../../../../components/Flag'; import PageWrapper from '../../../../components/PageWrapper'; import { tankDefinitions } from '../../../../core/blitzkrieg/definitions/tanks'; -// get [id] form the path +const SIZE = 0.05; + export default function Page({ params }: { params: { id: string } }) { const id = parseInt(params.id); const awaitedTankDefinitions = use(tankDefinitions); const definition = awaitedTankDefinitions[id]; + const [display, setDisplay] = useState(model.map(() => true)); return ( @@ -16,6 +30,80 @@ export default function Page({ params }: { params: { id: string } }) { {definition.name}
+ + + + + + + + + {(model as { vertices: Vector3Tuple[]; indices: number[] }[]).map( + ({ vertices, indices }, index) => { + const geometry = new BufferGeometry(); + const verticesArray = new Float32Array(vertices.flat()); + const positionAttribute = new BufferAttribute(verticesArray, 3); + const indexAttribute = new BufferAttribute( + new Uint16Array(indices), + 1, + ); + const material = new MeshStandardMaterial({ + color: 'white', + metalness: 0.75, + // roughness: 0.2, + }); + + geometry + .setAttribute('position', positionAttribute) + .setIndex(indexAttribute) + .computeVertexNormals(); + + return display[index] ? ( + { + event.stopPropagation(); + ( + (event.object as Mesh).material as MeshStandardMaterial + ).color.set('red'); + }} + onPointerOut={(event) => { + event.stopPropagation(); + ( + (event.object as Mesh).material as MeshStandardMaterial + ).color.set('white'); + }} + onClick={(event) => { + event.stopPropagation(); + const newDisplay = [...display]; + newDisplay[index] = !newDisplay[index]; + setDisplay(newDisplay); + }} + /> + ) : null; + }, + )} + + + + + {model.map((group, index) => ( + { + const newDisplay = [...display]; + newDisplay[index] = value as boolean; + setDisplay(newDisplay); + }} + /> + ))} +
); } diff --git a/yarn.lock b/yarn.lock index 9a36c8cb1..3137c4c48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -298,7 +298,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10": +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== @@ -863,6 +863,11 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@mediapipe/tasks-vision@0.10.8": + version "0.10.8" + resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz#a78e137018a19933b7a1d0e887d553d4ab833d10" + integrity sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q== + "@next/env@14.0.3": version "14.0.3" resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.3.tgz#9a58b296e7ae04ffebce8a4e5bd0f87f71de86bd" @@ -1778,6 +1783,99 @@ "@radix-ui/react-visually-hidden" "^1.0.3" classnames "^2.3.2" +"@react-spring/animated@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.6.1.tgz#ccc626d847cbe346f5f8815d0928183c647eb425" + integrity sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ== + dependencies: + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/core@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.6.1.tgz#ebe07c20682b360b06af116ea24e2b609e778c10" + integrity sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/rafz" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/rafz@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.6.1.tgz#d71aafb92b78b24e4ff84639f52745afc285c38d" + integrity sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ== + +"@react-spring/shared@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.6.1.tgz#4e2e4296910656c02bd9fd54c559702bc836ac4e" + integrity sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw== + dependencies: + "@react-spring/rafz" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/three@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/three/-/three-9.6.1.tgz#095fcd1dc6509127c33c14486d88289b89baeb9d" + integrity sha512-Tyw2YhZPKJAX3t2FcqvpLRb71CyTe1GvT3V+i+xJzfALgpk10uPGdGaQQ5Xrzmok1340DAeg2pR/MCfaW7b8AA== + dependencies: + "@react-spring/animated" "~9.6.1" + "@react-spring/core" "~9.6.1" + "@react-spring/shared" "~9.6.1" + "@react-spring/types" "~9.6.1" + +"@react-spring/types@~9.6.1": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.6.1.tgz#913d3a68c5cbc1124fdb18eff919432f7b6abdde" + integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== + +"@react-three/drei@^9.90.1": + version "9.90.1" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.90.1.tgz#59d8cb49fde6209a223f283cbb94865ff9b95acf" + integrity sha512-bvov7gMr0T1vCjI53v1VZs9aD6isGHnrjsHiHDlgyXTYFEnJBn7DFk5g8QqgsXmKhHEoEjyy/7xea8LLmPiBxg== + dependencies: + "@babel/runtime" "^7.11.2" + "@mediapipe/tasks-vision" "0.10.8" + "@react-spring/three" "~9.6.1" + "@use-gesture/react" "^10.2.24" + camera-controls "^2.4.2" + cross-env "^7.0.3" + detect-gpu "^5.0.28" + glsl-noise "^0.0.0" + lodash.clamp "^4.0.3" + lodash.omit "^4.5.0" + lodash.pick "^4.4.0" + maath "^0.9.0" + meshline "^3.1.6" + react-composer "^5.0.3" + react-merge-refs "^1.1.0" + stats-gl "^1.0.4" + stats.js "^0.17.0" + suspend-react "^0.1.3" + three-mesh-bvh "^0.6.7" + three-stdlib "^2.28.0" + troika-three-text "^0.47.2" + utility-types "^3.10.0" + uuid "^9.0.1" + zustand "^3.5.13" + +"@react-three/fiber@^8.15.12": + version "8.15.12" + resolved "https://registry.yarnpkg.com/@react-three/fiber/-/fiber-8.15.12.tgz#0bc08730eec32e53373482fbb518d116d3aa3df3" + integrity sha512-yg0CyXVHIdSbNjM/GAgDrGJnKLTsfTlaR5FoJGEh9IgVKptOoudnFZhBt/Cau4rzx2X6eLmB1+aWOm1dEHSUpg== + dependencies: + "@babel/runtime" "^7.17.8" + "@types/react-reconciler" "^0.26.7" + "@types/webxr" "*" + base64-js "^1.5.1" + buffer "^6.0.3" + its-fine "^1.0.6" + react-reconciler "^0.27.0" + react-use-measure "^2.1.1" + scheduler "^0.21.0" + suspend-react "^0.1.3" + zustand "^3.7.1" + "@resvg/resvg-js-android-arm-eabi@2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.0.tgz#fed7723ed5c5f7490762e025ad704bcbceee37b7" @@ -1990,6 +2088,11 @@ dependencies: "@types/node" "*" +"@types/draco3d@^1.4.0": + version "1.4.9" + resolved "https://registry.yarnpkg.com/@types/draco3d/-/draco3d-1.4.9.tgz#eb3eb7c5fd6f3490ab86ed7ebf36e595a9dc179b" + integrity sha512-4MMUjMQb4yA5fJ4osXx+QxGHt0/ZSy4spT6jL1HM7Tn8OJEC35siqdnpOo+HxPhYjqEFumKfGVF9hJfdyKBIBA== + "@types/escape-html@^1.0.2": version "1.0.4" resolved "https://registry.yarnpkg.com/@types/escape-html/-/escape-html-1.0.4.tgz#dc7c166b76c7b03b27e32f80edf01d91eb5d9af2" @@ -2091,6 +2194,11 @@ dependencies: undici-types "~5.26.4" +"@types/offscreencanvas@^2019.6.4": + version "2019.7.3" + resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== + "@types/prop-types@*": version "15.7.11" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" @@ -2106,6 +2214,29 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== +"@types/react-reconciler@^0.26.7": + version "0.26.7" + resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.26.7.tgz#0c4643f30821ae057e401b0d9037e03e8e9b2a36" + integrity sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ== + dependencies: + "@types/react" "*" + +"@types/react-reconciler@^0.28.0": + version "0.28.8" + resolved "https://registry.yarnpkg.com/@types/react-reconciler/-/react-reconciler-0.28.8.tgz#e51710572bcccf214306833c2438575d310b3e98" + integrity sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "18.2.42" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.42.tgz#6f6b11a904f6d96dda3c2920328a97011a00aba7" + integrity sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/react@^18.2.22": version "18.2.41" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.41.tgz#9eea044246bdb10510df89ef7f8422a8b6ad8fb9" @@ -2137,6 +2268,21 @@ "@types/mime" "*" "@types/node" "*" +"@types/stats.js@*": + version "0.17.3" + resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.3.tgz#705446e12ce0fad618557dd88236f51148b7a935" + integrity sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ== + +"@types/three@^0.159.0": + version "0.159.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.159.0.tgz#e1c9d2a84543c2febee5244cc5cf7d657d13aa45" + integrity sha512-2gybdh7HtX+rGUgslzK7QEJfzD2I0qrbUGzKk+dK0FDx49UHkNX0rqZVRzIgeFjBd1HzzhNNgwNoMacm3Wyc7w== + dependencies: + "@types/stats.js" "*" + "@types/webxr" "*" + fflate "~0.6.10" + meshoptimizer "~0.18.1" + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" @@ -2147,6 +2293,11 @@ resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597" integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow== +"@types/webxr@*", "@types/webxr@^0.5.2": + version "0.5.10" + resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.10.tgz#19c76208ec015ca3f139505e14d94d6b740f518a" + integrity sha512-n3u5sqXQJhf1CS68mw3Wf16FQ4cRPNBBwdYLFzq3UddiADOim1Pn3Y6PBdDilz1vOJF3ybLxJ8ZEDlLIzrOQZg== + "@types/ws@8.5.9": version "8.5.9" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" @@ -2166,6 +2317,18 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@use-gesture/core@10.3.0": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.3.0.tgz#9afd3777a45b2a08990a5dcfcf8d9ddd55b00db9" + integrity sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A== + +"@use-gesture/react@^10.2.24": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.3.0.tgz#180534c821fd635c2853cbcfa813f92c94f27e3f" + integrity sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA== + dependencies: + "@use-gesture/core" "10.3.0" + "@vanilla-extract/babel-plugin-debug-ids@^1.0.2": version "1.0.3" resolved "https://registry.yarnpkg.com/@vanilla-extract/babel-plugin-debug-ids/-/babel-plugin-debug-ids-1.0.3.tgz#ce07190343b51ed658b385bdce1e79952a4e8526" @@ -2493,7 +2656,7 @@ base64-js@0.0.8: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" integrity sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw== -base64-js@^1.3.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -2508,6 +2671,13 @@ bepaint@^0.1.0-beta.3: resolved "https://registry.yarnpkg.com/bepaint/-/bepaint-0.1.0-beta.3.tgz#fe8f0d20e35da075a6ed69f42d61156d985da584" integrity sha512-rybuEo674bEal5QUm/qO9jok3TptyRH2bdHDheFO25fw+HCBic5Oiy+ZWnOFnROCGZQy2Zcw7po4KrKSxz02Pg== +bidi-js@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bidi-js/-/bidi-js-1.0.3.tgz#6f8bcf3c877c4d9220ddf49b9bb6930c88f877d2" + integrity sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== + dependencies: + require-from-string "^2.0.2" + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2620,6 +2790,14 @@ buffer@^5.2.1: 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" + builtins@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" @@ -2658,6 +2836,11 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== +camera-controls@^2.4.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/camera-controls/-/camera-controls-2.7.3.tgz#99e0449f68d203bf5f98f6c4ac0021c10b5c13a8" + integrity sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw== + caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001565: version "1.0.30001566" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" @@ -2813,7 +2996,14 @@ crc@^4.3.2: resolved "https://registry.yarnpkg.com/crc/-/crc-4.3.2.tgz#49b7821cbf2cf61dfd079ed93863bbebd5469b9a" integrity sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A== -cross-spawn@^7.0.0: +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2876,6 +3066,11 @@ data-uri-to-buffer@^3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +debounce@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" + integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -2994,6 +3189,13 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-gpu@^5.0.28: + version "5.0.37" + resolved "https://registry.yarnpkg.com/detect-gpu/-/detect-gpu-5.0.37.tgz#27febe44d478ef4d35cd38007355da795ba075d5" + integrity sha512-EraWs84faI4iskB4qvE39bevMIazEvd1RpoyGLOBesRLbiz6eMeJqqRPHjEFClfRByYZzi9IzU35rBXIO76oDw== + dependencies: + webgl-constants "^1.1.1" + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -3036,6 +3238,11 @@ dotenv@^16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== +draco3d@^1.4.1: + version "1.5.6" + resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.6.tgz#0d570a9792e3a3a9fafbfea065b692940441c626" + integrity sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -3312,6 +3519,11 @@ fetch-blob@^2.1.1: resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-2.1.2.tgz#a7805db1361bd44c1ef62bb57fb5fe8ea173ef3c" integrity sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow== +fflate@^0.6.9, fflate@~0.6.10: + version "0.6.10" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.6.10.tgz#5f40f9659205936a2d18abf88b2e7781662b6d43" + integrity sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg== + fflate@^0.7.3: version "0.7.4" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" @@ -3509,6 +3721,11 @@ globby@^14.0.0: slash "^5.1.0" unicorn-magic "^0.1.0" +glsl-noise@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/glsl-noise/-/glsl-noise-0.0.0.tgz#367745f3a33382c0eeec4cb54b7e99cfc1d7670b" + integrity sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w== + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -3689,7 +3906,7 @@ identity-function@^1.0.0: resolved "https://registry.yarnpkg.com/identity-function/-/identity-function-1.0.0.tgz#bea1159f0985239be3ca348edf40ce2f0dd2c21d" integrity sha512-kNrgUK0qI+9qLTBidsH85HjDLpZfrrS0ElquKKe/fJFdB3D7VeKdXXEvOPDUHSHOzdZKCAAaQIWWyp0l2yq6pw== -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== @@ -3801,6 +4018,13 @@ iterable-lookahead@^1.0.0: resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" integrity sha512-hJnEP2Xk4+44DDwJqUQGdXal5VbyeWLaPyDl2AQc242Zr7iqz4DgpQOrEzglWVMGHMDCkguLHEKxd1+rOsmgSQ== +its-fine@^1.0.6: + version "1.1.1" + resolved "https://registry.yarnpkg.com/its-fine/-/its-fine-1.1.1.tgz#e74b93fddd487441f978a50f64f0f5af4d2fc38e" + integrity sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw== + dependencies: + "@types/react-reconciler" "^0.28.0" + jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" @@ -3935,6 +4159,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.clamp@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa" + integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg== + lodash.curry@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" @@ -3945,6 +4174,16 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.omit@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60" + integrity sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg== + +lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== + lodash.snakecase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -3955,7 +4194,7 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loose-envify@^1.0.0, loose-envify@^1.1.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -3991,6 +4230,11 @@ lz4@^0.6.5: nan "^2.13.2" xxhashjs "^0.2.2" +maath@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/maath/-/maath-0.9.0.tgz#425a9600dfc5d0aecfa48029a2e3eea852531b06" + integrity sha512-aAR8hoUqPxlsU8VOxkS9y37jhUzdUxM017NpCuxFU1Gk+nMaZASZxymZrV8LRSHzRk/watlbfyNKu6XPUhCFrQ== + magic-bytes.js@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.6.0.tgz#ee4354ac41a9b86f410e2690bc25dc4c264fb55d" @@ -4091,6 +4335,16 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +meshline@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/meshline/-/meshline-3.1.7.tgz#f60fef8c5b859740078a60c701b4c95bcc6f794d" + integrity sha512-uf9fPI9wy0Ie0kZjvKuIkf2n7gi3ih0wdTeb/kmSvmzpPyEL5d9lFohg9+JV9VC4sQUBOZDgxu6fnjn57goSHg== + +meshoptimizer@~0.18.1: + version "0.18.1" + resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" + integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -4294,7 +4548,7 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -4528,6 +4782,11 @@ postcss@^8.4.27, postcss@^8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" +potpack@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/potpack/-/potpack-1.0.2.tgz#23b99e64eb74f5741ffe7656b5b5c4ddce8dfc14" + integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== + preact@^10.0.0: version "10.19.2" resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.2.tgz#841797620dba649aaac1f8be42d37c3202dcea8b" @@ -4557,6 +4816,15 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +prop-types@^15.6.0: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + property-information@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" @@ -4602,6 +4870,13 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-composer@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/react-composer/-/react-composer-5.0.3.tgz#7beb9513da5e8687f4f434ea1333ef36a4f3091b" + integrity sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA== + dependencies: + prop-types "^15.6.0" + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -4618,6 +4893,24 @@ react-fuzzysort@^1.0.1: fuzzysort "^2.0.4" lodash.debounce "^4.0.8" +react-is@^16.13.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-merge-refs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-merge-refs/-/react-merge-refs-1.1.0.tgz#73d88b892c6c68cbb7a66e0800faa374f4c38b06" + integrity sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ== + +react-reconciler@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.27.0.tgz#360124fdf2d76447c7491ee5f0e04503ed9acf5b" + integrity sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.21.0" + react-remove-scroll-bar@^2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" @@ -4646,6 +4939,13 @@ react-style-singleton@^2.2.1: invariant "^2.2.4" tslib "^2.0.0" +react-use-measure@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.1.1.tgz#5824537f4ee01c9469c45d5f7a8446177c6cc4ba" + integrity sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig== + dependencies: + debounce "^1.2.1" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -4696,6 +4996,11 @@ rename-overwrite@^4.0.4: "@zkochan/rimraf" "^2.1.2" fs-extra "10.1.0" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + "require-like@>= 0.1.1": version "0.1.2" resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" @@ -4782,6 +5087,13 @@ satori@^0.10.8: postcss-value-parser "^4.2.0" yoga-wasm-web "^0.3.3" +scheduler@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" + integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== + dependencies: + loose-envify "^1.1.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -4939,6 +5251,16 @@ ssri@10.0.5: dependencies: minipass "^7.0.3" +stats-gl@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/stats-gl/-/stats-gl-1.0.7.tgz#b7fa2e0d464c8b7f4c57aa6a9bae33ed09762abe" + integrity sha512-vZI82CjefSxLC1bjw36z28v0+QE9rJKymGlXtfWu+ipW70ZEAwa4EbO4LxluAfLfpqiaAS04NzpYBRLDeAwYWQ== + +stats.js@^0.17.0: + version "0.17.0" + resolved "https://registry.yarnpkg.com/stats.js/-/stats.js-0.17.0.tgz#b1c3dc46d94498b578b7fd3985b81ace7131cc7d" + integrity sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw== + statuses@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" @@ -5063,6 +5385,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +suspend-react@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/suspend-react/-/suspend-react-0.1.3.tgz#a52f49d21cfae9a2fb70bd0c68413d3f9d90768e" + integrity sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ== + tabbable@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -5081,6 +5408,28 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" +three-mesh-bvh@^0.6.7: + version "0.6.8" + resolved "https://registry.yarnpkg.com/three-mesh-bvh/-/three-mesh-bvh-0.6.8.tgz#f27d18ca75bdc59316dff0f561af8fb316621a54" + integrity sha512-EGebF9DZx1S8+7OZYNNTT80GXJZVf+UYXD/HyTg/e2kR/ApofIFfUS4ZzIHNnUVIadpnLSzM4n96wX+l7GMbnQ== + +three-stdlib@^2.28.0: + version "2.28.7" + resolved "https://registry.yarnpkg.com/three-stdlib/-/three-stdlib-2.28.7.tgz#677ad2ce4d57375f7582e5fd62eadfd07ef6059a" + integrity sha512-E7NuztilCswBKnEoyqydvA7N4dy0cf/gLA0bKrrg6+Q6j4WtusGa/+t9oK2HVq47S1AHRH2CvFHpdIGNjPKo/A== + dependencies: + "@types/draco3d" "^1.4.0" + "@types/offscreencanvas" "^2019.6.4" + "@types/webxr" "^0.5.2" + draco3d "^1.4.1" + fflate "^0.6.9" + potpack "^1.0.1" + +three@^0.159.0: + version "0.159.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.159.0.tgz#6576b1210805b14f0765bac41fd0e4ec18e43b2e" + integrity sha512-eCmhlLGbBgucuo4VEA9IO3Qpc7dh8Bd4VKzr7WfW4+8hMcIfoAVi1ev0pJYN9PTTsCslbcKgBwr2wNZ1EvLInA== + through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" @@ -5144,6 +5493,26 @@ trim-lines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== +troika-three-text@^0.47.2: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-three-text/-/troika-three-text-0.47.2.tgz#fdf89059c010563bb829262b20c41f69ca79b712" + integrity sha512-qylT0F+U7xGs+/PEf3ujBdJMYWbn0Qci0kLqI5BJG2kW1wdg4T1XSxneypnF05DxFqJhEzuaOR9S2SjiyknMng== + dependencies: + bidi-js "^1.0.2" + troika-three-utils "^0.47.2" + troika-worker-utils "^0.47.2" + webgl-sdf-generator "1.1.1" + +troika-three-utils@^0.47.2: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-three-utils/-/troika-three-utils-0.47.2.tgz#af49ca694245dce631963d5fefe4e8e1b8af9044" + integrity sha512-/28plhCxfKtH7MSxEGx8e3b/OXU5A0xlwl+Sbdp0H8FXUHKZDoksduEKmjQayXYtxAyuUiCRunYIv/8Vi7aiyg== + +troika-worker-utils@^0.47.2: + version "0.47.2" + resolved "https://registry.yarnpkg.com/troika-worker-utils/-/troika-worker-utils-0.47.2.tgz#e7c5de5f37d56c072b13fa8112bb844e048ff46c" + integrity sha512-mzss4MeyzUkYBppn4x5cdAqrhBHFEuVmMMgLMTyFV23x6GvQMyo+/R5E5Lsbrt7WSt5RfvewjcwD1DChRTA9lA== + ts-mixer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" @@ -5310,11 +5679,21 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utility-types@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" + integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + validate-npm-package-name@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" @@ -5474,6 +5853,16 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== +webgl-constants@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/webgl-constants/-/webgl-constants-1.1.1.tgz#f9633ee87fea56647a60b9ce735cbdfb891c6855" + integrity sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg== + +webgl-sdf-generator@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz#3e1b422b3d87cd3cc77f2602c9db63bc0f6accbd" + integrity sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA== + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -5564,6 +5953,11 @@ zod@3.22.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== +zustand@^3.5.13, zustand@^3.7.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-3.7.2.tgz#7b44c4f4a5bfd7a8296a3957b13e1c346f42514d" + integrity sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA== + zustand@^4.4.1: version "4.4.7" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.7.tgz#355406be6b11ab335f59a66d2cf9815e8f24038c" From 875abf4d32997b5c91989d85e53c75a41c0e139f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 11:36:54 -0600 Subject: [PATCH 54/74] feat: sc2 start --- scripts/buildTest.ts | 81 ++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index 417707492..a25f53f17 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -1,4 +1,3 @@ -import { writeFileSync } from 'fs'; import { readFile } from 'fs/promises'; import { range } from 'lodash'; @@ -228,45 +227,36 @@ class SCPGStream { }); } - console.log(verticesStream.consumeRemaining().length); - return { vertices, indices }; }); - // writeFileSync( - // 'test.txt', - // polygonGroups - // .map((i) => - // i.vertices - // .map( - // (e) => - // `${VertexType[e.type].padEnd(16, ' ')} ${e.value - // .map((j) => j.toString(10).padStart(25, ' ')) - // .join(' ')}`, - // ) - // .join('\n'), - // ) - // .join('\n\n'), - // ); + return polygonGroups.map((group) => ({ + vertices: group.vertices + .filter(({ type }) => type === VertexType.VERTEX) + .map(({ value }) => value), + indices: group.indices, + })); + } - // writeFileSync( - // 'test.json', + consumeSC2Header() { + return { + name: this.consumeAscii(4).value, + version: this.consumeUInt32().value, + nodeCount: this.consumeUInt32().value, + }; + } + consumeSC2Descriptor() { + const size = this.consumeUInt32().value; + const fileType = this.consumeUInt32().value; - // ) + this.skip(8); // other felids that we don't care about for some reason - writeFileSync( - 'test.json', - JSON.stringify( - polygonGroups.map((group) => ({ - vertices: group.vertices - .filter(({ type }) => type === VertexType.VERTEX) - .map(({ value }) => value), - indices: group.indices, - })), - ), - ); - - return polygonGroups; + console.log(this.consumeKA()); + } + consumeSC2() { + const header = this.consumeSC2Header(); + const versionTags = this.consumeKA(); + const descriptor = this.consumeSC2Descriptor(); } consumeKAHeader() { @@ -297,7 +287,7 @@ class SCPGStream { throw new TypeError(`Unknown KA type: ${type}`); } } - consumeKAPair() { + consumeKAV1Pair() { const name = this.consumeKAValue().value as string; const value = this.consumeKAValue(); @@ -307,16 +297,25 @@ class SCPGStream { const header = this.consumeKAHeader(); const pairs: Record = {}; - for (let index = 0; index < header.count; index++) { - const { name, value } = this.consumeKAPair(); - pairs[name] = value; - } + if (header.version === 1) { + for (let index = 0; index < header.count; index++) { + const { name, value } = this.consumeKAV1Pair(); + pairs[name] = value; + } + } else if (header.version === 2) { + for (let index = 0; index < header.count; index++) { + const length = this.consumeUInt16().value; + const string = this.consumeAscii(length); + + console.log(string.value); + } + } else throw new SyntaxError(`Unknown KA version: ${header.version}`); return pairs as Type; } } -const stream = new SCPGStream(await readFile('test.scg')); +const stream = new SCPGStream(await readFile('test.sc2')); -stream.consumeSCG(); +stream.consumeSC2(); // console.log(stream.consumeSCG()); From 365c714213ad735c691eac8b28ceff14d4ce72f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:14:33 -0600 Subject: [PATCH 55/74] feat: more sc2 --- scripts/buildTest.ts | 117 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 101 insertions(+), 16 deletions(-) diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index a25f53f17..b0544a9fe 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -28,6 +28,7 @@ enum KAType { UINT8, INT16, UINT16, + UNKNOWN1, ARRAY, } @@ -136,6 +137,10 @@ class SCPGStream { const buffer = this.consume(size); return { buffer, value: buffer.toString('ascii') }; } + consumeUtf16(size: number) { + const buffer = this.consume(size); + return { buffer, value: buffer.toString('utf16le') }; + } consumeInt8() { const buffer = this.consume(1); return { buffer, value: buffer.readInt8() }; @@ -148,6 +153,10 @@ class SCPGStream { const buffer = this.consume(4); return { buffer, value: buffer.readInt32LE() }; } + consumeInt64() { + const buffer = this.consume(4); + return { buffer, value: buffer.readInt32LE() }; + } consumeUInt8() { const buffer = this.consume(1); return { buffer, value: buffer.readUInt8() }; @@ -160,6 +169,10 @@ class SCPGStream { const buffer = this.consume(4); return { buffer, value: buffer.readUInt32LE() }; } + consumeUInt64() { + const buffer = this.consume(4); + return { buffer, value: buffer.readUInt32LE() }; + } consumeFloat() { const buffer = this.consume(4); return { buffer, value: buffer.readFloatLE() }; @@ -251,12 +264,14 @@ class SCPGStream { this.skip(8); // other felids that we don't care about for some reason - console.log(this.consumeKA()); + return { size, fileType }; } consumeSC2() { const header = this.consumeSC2Header(); const versionTags = this.consumeKA(); const descriptor = this.consumeSC2Descriptor(); + + this.consumeKA(); } consumeKAHeader() { @@ -266,50 +281,121 @@ class SCPGStream { count: this.consumeUInt32().value, }; } - consumeKAValue() { - const type = this.consumeUInt8().value; - + consumeKAValue( + type: KAType = this.consumeUInt8().value, + stringTable?: Record, + ): KAResolvedValue { switch (type) { case KAType.INT32: - return this.consumeInt32(); + return this.consumeInt32() as KAResolvedValue; case KAType.STRING: { const length = this.consumeUInt32(); - return this.consumeAscii(length.value); + return this.consumeAscii(length.value) as KAResolvedValue; } case KAType.BYTE_ARRAY: { const length = this.consumeUInt32(); - return this.consumeByteArray(length.value); + return this.consumeByteArray(length.value) as KAResolvedValue; } + case KAType.FLOAT: + return this.consumeFloat() as KAResolvedValue; + + case KAType.ARRAY: { + const length = this.consumeUInt32(); + const value = []; + + for (let index = 0; index < length.value; index++) { + value.push(this.consumeKAValue(undefined, stringTable)); + } + + return { value } as KAResolvedValue; + } + + case KAType.KEYED_ARCHIVE: { + // the length + this.skip(4); + + const value = this.consumeKA(stringTable); + + return { value } as KAResolvedValue; + } + + case KAType.UINT64: + return this.consumeUInt64() as KAResolvedValue; + default: - throw new TypeError(`Unknown KA type: ${type}`); + throw new TypeError( + `Unknown KA type: ${type} (${KAType[type] ?? 'unknown type'})`, + ); } } - consumeKAV1Pair() { - const name = this.consumeKAValue().value as string; - const value = this.consumeKAValue(); + consumeKAV1Pair(stringTable?: Record) { + const name = this.consumeKAValue(undefined, stringTable).value as string; + const value = this.consumeKAValue(undefined, stringTable).value; return { name, value }; } - consumeKA() { + consumeKA(stringTable?: Record) { const header = this.consumeKAHeader(); const pairs: Record = {}; + console.log( + `starting ka version ${header.version} with ${header.count} pairs`, + ); + if (header.version === 1) { for (let index = 0; index < header.count; index++) { const { name, value } = this.consumeKAV1Pair(); pairs[name] = value; } } else if (header.version === 2) { + const strings: string[] = []; + const stringTable: Record = {}; for (let index = 0; index < header.count; index++) { const length = this.consumeUInt16().value; - const string = this.consumeAscii(length); + const string = this.consumeAscii(length).value; - console.log(string.value); + strings.push(string); } - } else throw new SyntaxError(`Unknown KA version: ${header.version}`); + + for (let index = 0; index < header.count; index++) { + const id = this.consumeUInt32().value; + stringTable[id] = strings[index]; + + console.log(` kav2 string: ${strings[index]}`, id); + } + + console.log('\n NODE TIME BABY'); + + const nodeCount = this.consumeUInt32().value; + for (let index = 0; index < nodeCount; index++) { + const keyId = this.consumeUInt32().value; + const value = this.consumeKAValue(undefined, stringTable); + + console.log(` ${keyId}`, value); + } + } else if (header.version === 258) { + if (!stringTable) throw new Error('No string table provided'); + + for (let index = 0; index < header.count; index++) { + const keyIndex = this.consumeUInt32().value; + const key = stringTable[keyIndex]; + const valueType = this.consumeUInt8().value; + + if (valueType === KAType.STRING) { + const valueIndex = this.consumeUInt32().value; + const value = stringTable[valueIndex]; + pairs[key] = value; + } else { + const { value } = this.consumeKAValue(valueType); + pairs[key] = value; + } + + console.log(' ', keyIndex, key, pairs[key]); + } + } else throw new SyntaxError(`Unhandled KA version: ${header.version}`); return pairs as Type; } @@ -318,4 +404,3 @@ class SCPGStream { const stream = new SCPGStream(await readFile('test.sc2')); stream.consumeSC2(); -// console.log(stream.consumeSCG()); From a0434b6ed20dcb89f02f548da3204139123f425a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:32:11 -0600 Subject: [PATCH 56/74] feat: more sc2 x2 --- .vscode/settings.json | 1 + scripts/buildTest.ts | 30 ++++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 32d61fe86..d268c9fcc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ + "AABBOX", "Abhi", "accountinfo", "bepaint", diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index b0544a9fe..c7ea65aeb 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -119,12 +119,19 @@ class SCPGStream { skip(size: number) { this.index += size; } + read(size: number) { + return this.buffer.subarray(this.index, this.index + size); + } consume(size: number) { - const subarray = this.buffer.subarray(this.index, this.index + size); + const subarray = this.read(size); this.index += size; return subarray; } + + readRemaining() { + return this.read(Number.POSITIVE_INFINITY); + } consumeRemaining() { return this.consume(Number.POSITIVE_INFINITY); } @@ -154,8 +161,8 @@ class SCPGStream { return { buffer, value: buffer.readInt32LE() }; } consumeInt64() { - const buffer = this.consume(4); - return { buffer, value: buffer.readInt32LE() }; + const buffer = this.consume(8); + return { buffer, value: buffer.readBigInt64LE() }; } consumeUInt8() { const buffer = this.consume(1); @@ -170,14 +177,19 @@ class SCPGStream { return { buffer, value: buffer.readUInt32LE() }; } consumeUInt64() { - const buffer = this.consume(4); - return { buffer, value: buffer.readUInt32LE() }; + const buffer = this.consume(8); + return { buffer, value: buffer.readBigUInt64LE() }; } consumeFloat() { const buffer = this.consume(4); return { buffer, value: buffer.readFloatLE() }; } + consumeBoolean() { + const buffer = this.consume(1); + return { buffer, value: buffer.readUInt8() === 1 }; + } + consumeSCGHeader() { return { name: this.consumeAscii(4).value, @@ -325,6 +337,12 @@ class SCPGStream { case KAType.UINT64: return this.consumeUInt64() as KAResolvedValue; + case KAType.UINT32: + return this.consumeUInt32() as KAResolvedValue; + + case KAType.BOOLEAN: + return this.consumeBoolean() as KAResolvedValue; + default: throw new TypeError( `Unknown KA type: ${type} (${KAType[type] ?? 'unknown type'})`, @@ -389,7 +407,7 @@ class SCPGStream { const value = stringTable[valueIndex]; pairs[key] = value; } else { - const { value } = this.consumeKAValue(valueType); + const { value } = this.consumeKAValue(valueType, stringTable); pairs[key] = value; } From f1855a569af7c94abf3dd5947eabe41b84c3c752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 18:45:57 -0600 Subject: [PATCH 57/74] feat: removed sub values --- scripts/buildTest.ts | 162 +++++++++++++++++++------------------------ 1 file changed, 72 insertions(+), 90 deletions(-) diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index c7ea65aeb..aabc73938 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -89,22 +89,20 @@ const VECTOR_SIZES = [ ], ]; -type KAResolvedValue = { buffer: Buffer; value: Type }; - interface PolygonGroupRaw { - '##name': KAResolvedValue<'PolygonGroup'>; - '#id': KAResolvedValue; - cubeTextureCoordCount: KAResolvedValue; - indexCount: KAResolvedValue; - indexFormat: KAResolvedValue<0 | 1>; - indices: KAResolvedValue; - packing: KAResolvedValue<0 | 1>; - primitiveCount: KAResolvedValue; - rhi_primitiveType: KAResolvedValue<1 | 2 | 10>; - textureCoordCount: KAResolvedValue; - vertexCount: KAResolvedValue; - vertexFormat: KAResolvedValue; - vertices: KAResolvedValue; + '##name': 'PolygonGroup'; + '#id': Buffer; + cubeTextureCoordCount: number; + indexCount: number; + indexFormat: 0 | 1; + indices: Buffer; + packing: 0 | 1; + primitiveCount: number; + rhi_primitiveType: 1 | 2 | 10; + textureCoordCount: number; + vertexCount: number; + vertexFormat: number; + vertices: Buffer; } interface PolygonGroup extends Omit { @@ -137,65 +135,54 @@ class SCPGStream { } consumeByteArray(size: number) { - const buffer = this.consume(size); - return { buffer, value: buffer }; + return this.consume(size); } + consumeAscii(size: number) { - const buffer = this.consume(size); - return { buffer, value: buffer.toString('ascii') }; + return this.consume(size).toString('ascii'); } consumeUtf16(size: number) { - const buffer = this.consume(size); - return { buffer, value: buffer.toString('utf16le') }; + return this.consume(size).toString('utf16le'); } + consumeInt8() { - const buffer = this.consume(1); - return { buffer, value: buffer.readInt8() }; + return this.consume(1).readInt8(); } consumeInt16() { - const buffer = this.consume(2); - return { buffer, value: buffer.readInt16LE() }; + return this.consume(2).readInt16LE(); } consumeInt32() { - const buffer = this.consume(4); - return { buffer, value: buffer.readInt32LE() }; + return this.consume(4).readInt32LE(); } consumeInt64() { - const buffer = this.consume(8); - return { buffer, value: buffer.readBigInt64LE() }; + return this.consume(8).readBigInt64LE(); } consumeUInt8() { - const buffer = this.consume(1); - return { buffer, value: buffer.readUInt8() }; + return this.consume(1).readUInt8(); } consumeUInt16() { - const buffer = this.consume(2); - return { buffer, value: buffer.readUInt16LE() }; + return this.consume(2).readUInt16LE(); } consumeUInt32() { - const buffer = this.consume(4); - return { buffer, value: buffer.readUInt32LE() }; + return this.consume(4).readUInt32LE(); } consumeUInt64() { - const buffer = this.consume(8); - return { buffer, value: buffer.readBigUInt64LE() }; + return this.consume(8).readBigUInt64LE(); } consumeFloat() { - const buffer = this.consume(4); - return { buffer, value: buffer.readFloatLE() }; + return this.consume(4).readFloatLE(); } consumeBoolean() { - const buffer = this.consume(1); - return { buffer, value: buffer.readUInt8() === 1 }; + return this.consume(1).readUInt8() === 1; } consumeSCGHeader() { return { - name: this.consumeAscii(4).value, - version: this.consumeUInt32().value, - nodeCount: this.consumeUInt32().value, - nodeCount2: this.consumeUInt32().value, + name: this.consumeAscii(4), + version: this.consumeUInt32(), + nodeCount: this.consumeUInt32(), + nodeCount2: this.consumeUInt32(), }; } consumeSCG() { @@ -208,38 +195,33 @@ class SCPGStream { } const polygonGroups = polygonGroupsRaw.map((polygonGroupRaw) => { - const indicesStream = new SCPGStream(polygonGroupRaw.indices.value); + const indicesStream = new SCPGStream(polygonGroupRaw.indices); const indices: number[] = []; - for (let index = 0; index < polygonGroupRaw.indexCount.value; index++) { + for (let index = 0; index < polygonGroupRaw.indexCount; index++) { indices.push( - polygonGroupRaw.indexFormat.value - ? indicesStream.consumeUInt32().value - : indicesStream.consumeUInt16().value, + polygonGroupRaw.indexFormat + ? indicesStream.consumeUInt32() + : indicesStream.consumeUInt16(), ); } - const verticesStream = new SCPGStream(polygonGroupRaw.vertices.buffer); - const vertexFormat = BigInt( - '0x' + polygonGroupRaw.vertexFormat.buffer.toString('hex'), - ) + const verticesStream = new SCPGStream(polygonGroupRaw.vertices); + const vertexFormat = polygonGroupRaw.vertexFormat .toString(2) - .padStart(polygonGroupRaw.vertexFormat.buffer.length * 8, '0') .split('') .map(parseInt) .map((bit, index) => (bit ? index : null)) .filter((index) => index !== null) as VertexType[]; const vertices: { type: VertexType; value: number[] }[] = []; - for (let index = 0; index < polygonGroupRaw.vertexCount.value; index++) { + for (let index = 0; index < polygonGroupRaw.vertexCount; index++) { vertexFormat.forEach((type) => { const resolved = VECTOR_SIZES.some((types, size) => { if (types.includes(type)) { vertices.push({ type, - value: range(size + 1).map( - () => verticesStream.consumeFloat().value, - ), + value: range(size + 1).map(() => verticesStream.consumeFloat()), }); return true; @@ -265,14 +247,14 @@ class SCPGStream { consumeSC2Header() { return { - name: this.consumeAscii(4).value, - version: this.consumeUInt32().value, - nodeCount: this.consumeUInt32().value, + name: this.consumeAscii(4), + version: this.consumeUInt32(), + nodeCount: this.consumeUInt32(), }; } consumeSC2Descriptor() { - const size = this.consumeUInt32().value; - const fileType = this.consumeUInt32().value; + const size = this.consumeUInt32(); + const fileType = this.consumeUInt32(); this.skip(8); // other felids that we don't care about for some reason @@ -288,41 +270,41 @@ class SCPGStream { consumeKAHeader() { return { - name: this.consumeAscii(2).value, - version: this.consumeUInt16().value, - count: this.consumeUInt32().value, + name: this.consumeAscii(2), + version: this.consumeUInt16(), + count: this.consumeUInt32(), }; } consumeKAValue( - type: KAType = this.consumeUInt8().value, + type: KAType = this.consumeUInt8(), stringTable?: Record, - ): KAResolvedValue { + ): Type { switch (type) { case KAType.INT32: - return this.consumeInt32() as KAResolvedValue; + return this.consumeInt32() as Type; case KAType.STRING: { const length = this.consumeUInt32(); - return this.consumeAscii(length.value) as KAResolvedValue; + return this.consumeAscii(length) as Type; } case KAType.BYTE_ARRAY: { const length = this.consumeUInt32(); - return this.consumeByteArray(length.value) as KAResolvedValue; + return this.consumeByteArray(length) as Type; } case KAType.FLOAT: - return this.consumeFloat() as KAResolvedValue; + return this.consumeFloat() as Type; case KAType.ARRAY: { const length = this.consumeUInt32(); const value = []; - for (let index = 0; index < length.value; index++) { + for (let index = 0; index < length; index++) { value.push(this.consumeKAValue(undefined, stringTable)); } - return { value } as KAResolvedValue; + return value as Type; } case KAType.KEYED_ARCHIVE: { @@ -331,17 +313,17 @@ class SCPGStream { const value = this.consumeKA(stringTable); - return { value } as KAResolvedValue; + return value; } case KAType.UINT64: - return this.consumeUInt64() as KAResolvedValue; + return this.consumeUInt64() as Type; case KAType.UINT32: - return this.consumeUInt32() as KAResolvedValue; + return this.consumeUInt32() as Type; case KAType.BOOLEAN: - return this.consumeBoolean() as KAResolvedValue; + return this.consumeBoolean() as Type; default: throw new TypeError( @@ -350,8 +332,8 @@ class SCPGStream { } } consumeKAV1Pair(stringTable?: Record) { - const name = this.consumeKAValue(undefined, stringTable).value as string; - const value = this.consumeKAValue(undefined, stringTable).value; + const name = this.consumeKAValue(undefined, stringTable); + const value = this.consumeKAValue(undefined, stringTable); return { name, value }; } @@ -372,14 +354,14 @@ class SCPGStream { const strings: string[] = []; const stringTable: Record = {}; for (let index = 0; index < header.count; index++) { - const length = this.consumeUInt16().value; - const string = this.consumeAscii(length).value; + const length = this.consumeUInt16(); + const string = this.consumeAscii(length); strings.push(string); } for (let index = 0; index < header.count; index++) { - const id = this.consumeUInt32().value; + const id = this.consumeUInt32(); stringTable[id] = strings[index]; console.log(` kav2 string: ${strings[index]}`, id); @@ -387,9 +369,9 @@ class SCPGStream { console.log('\n NODE TIME BABY'); - const nodeCount = this.consumeUInt32().value; + const nodeCount = this.consumeUInt32(); for (let index = 0; index < nodeCount; index++) { - const keyId = this.consumeUInt32().value; + const keyId = this.consumeUInt32(); const value = this.consumeKAValue(undefined, stringTable); console.log(` ${keyId}`, value); @@ -398,16 +380,16 @@ class SCPGStream { if (!stringTable) throw new Error('No string table provided'); for (let index = 0; index < header.count; index++) { - const keyIndex = this.consumeUInt32().value; + const keyIndex = this.consumeUInt32(); const key = stringTable[keyIndex]; - const valueType = this.consumeUInt8().value; + const valueType = this.consumeUInt8(); if (valueType === KAType.STRING) { - const valueIndex = this.consumeUInt32().value; + const valueIndex = this.consumeUInt32(); const value = stringTable[valueIndex]; pairs[key] = value; } else { - const { value } = this.consumeKAValue(valueType, stringTable); + const value = this.consumeKAValue(valueType, stringTable); pairs[key] = value; } From fdf77a43cbeab8db9295974da2293a26a46860c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 8 Dec 2023 19:11:40 -0600 Subject: [PATCH 58/74] feat: sc2 complete --- .vscode/settings.json | 1 + scripts/buildTest.ts | 50 +++++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d268c9fcc..0dbe16fe9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,6 +16,7 @@ "dvpl", "DVPLCRC", "Everytime", + "FASTNAME", "fullstats", "fuzzysort", "gamemode", diff --git a/scripts/buildTest.ts b/scripts/buildTest.ts index aabc73938..ddaf255f0 100644 --- a/scripts/buildTest.ts +++ b/scripts/buildTest.ts @@ -1,3 +1,4 @@ +import { writeFileSync } from 'fs'; import { readFile } from 'fs/promises'; import { range } from 'lodash'; @@ -264,8 +265,18 @@ class SCPGStream { const header = this.consumeSC2Header(); const versionTags = this.consumeKA(); const descriptor = this.consumeSC2Descriptor(); + const data = this.consumeKA(); - this.consumeKA(); + writeFileSync( + 'test.json', + JSON.stringify( + { header, versionTags, descriptor, data }, + (key, value) => (typeof value === 'bigint' ? value.toString() : value), + 2, + ), + ); + + // console.log(data); } consumeKAHeader() { @@ -308,8 +319,7 @@ class SCPGStream { } case KAType.KEYED_ARCHIVE: { - // the length - this.skip(4); + this.skip(4); // the length const value = this.consumeKA(stringTable); @@ -325,6 +335,27 @@ class SCPGStream { case KAType.BOOLEAN: return this.consumeBoolean() as Type; + case KAType.AABBOX3: { + const minimum = range(3).map(() => this.consumeFloat()); + const maximum = range(3).map(() => this.consumeFloat()); + + return { minimum, maximum } as Type; + } + + case KAType.VECTOR4: + return range(4).map(() => this.consumeFloat()) as Type; + + case KAType.VECTOR3: + return range(3).map(() => this.consumeFloat()) as Type; + + case KAType.FASTNAME: { + if (!stringTable) throw new Error('No string table provided'); + + const index = this.consumeUInt32(); + + return stringTable[index] as Type; + } + default: throw new TypeError( `Unknown KA type: ${type} (${KAType[type] ?? 'unknown type'})`, @@ -341,10 +372,6 @@ class SCPGStream { const header = this.consumeKAHeader(); const pairs: Record = {}; - console.log( - `starting ka version ${header.version} with ${header.count} pairs`, - ); - if (header.version === 1) { for (let index = 0; index < header.count; index++) { const { name, value } = this.consumeKAV1Pair(); @@ -363,18 +390,15 @@ class SCPGStream { for (let index = 0; index < header.count; index++) { const id = this.consumeUInt32(); stringTable[id] = strings[index]; - - console.log(` kav2 string: ${strings[index]}`, id); } - console.log('\n NODE TIME BABY'); - const nodeCount = this.consumeUInt32(); for (let index = 0; index < nodeCount; index++) { const keyId = this.consumeUInt32(); const value = this.consumeKAValue(undefined, stringTable); + const key = stringTable[keyId]; - console.log(` ${keyId}`, value); + pairs[key] = value; } } else if (header.version === 258) { if (!stringTable) throw new Error('No string table provided'); @@ -392,8 +416,6 @@ class SCPGStream { const value = this.consumeKAValue(valueType, stringTable); pairs[key] = value; } - - console.log(' ', keyIndex, key, pairs[key]); } } else throw new SyntaxError(`Unhandled KA version: ${header.version}`); From 4c2f6bea25c9fa8489e8899694eb87fdf890c951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 9 Dec 2023 15:56:25 -0600 Subject: [PATCH 59/74] feat: uhh --- .vscode/settings.json | 4 + scripts/buildAssets.ts | 66 ++++++++++- .../core/blitz/SCPGStream.ts | 104 ++++++++++-------- src/core/blitz/readBase64DVPL.ts | 4 +- src/core/blitz/readDVPL.ts | 4 +- src/core/blitz/readDVPLFile.ts | 6 + src/core/blitz/readStringDVPL.ts | 4 +- 7 files changed, 136 insertions(+), 56 deletions(-) rename scripts/buildTest.ts => src/core/blitz/SCPGStream.ts (90%) create mode 100644 src/core/blitz/readDVPLFile.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index 0dbe16fe9..aa8b0487b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,7 @@ "AABBOX", "Abhi", "accountinfo", + "alphatest", "bepaint", "BINORMAL", "blitzstars", @@ -12,6 +13,7 @@ "CUBETEXCOORD", "customperiod", "deburr", + "decalmask", "diacriticless", "dvpl", "DVPLCRC", @@ -28,6 +30,7 @@ "Leaderboard", "leaderboards", "MURICA", + "normalmap", "Oopsy", "outdir", "outfile", @@ -45,6 +48,7 @@ "searchtanks", "SKLLD", "Smri", + "Specularity", "startcase", "statsfull", "steamapps", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 0d960f3f8..3f895b53a 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -1,8 +1,10 @@ import { config } from 'dotenv'; -import { readdir } from 'fs/promises'; +import { existsSync } from 'fs'; +import { mkdir, readdir, rm } from 'fs/promises'; import { argv } from 'process'; import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; +import { SCPGStream } from '../src/core/blitz/SCPGStream'; import { readBase64DVPL } from '../src/core/blitz/readBase64DVPL'; import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; @@ -43,6 +45,7 @@ interface TankParameters { resourcesPath: { smallIconPath: string; bigIconPath: string; + blitzModelPath: string; }; } @@ -62,6 +65,7 @@ const DOI = { smallIcons: 'Gfx/UI/BattleScreenHUD/SmallTankIcons', bigIcons: 'Gfx/UI/BigTankIcons', flags: 'Gfx/Lobby/flags', + '3d': '3d', }; const allTargets = argv.includes('--all-targets'); @@ -269,3 +273,63 @@ if (allTargets || targets?.includes('circleFlags')) { true, ); } + +if (allTargets || targets?.includes('tankModels')) { + console.log('Building tank models...'); + + if (existsSync('dist/assets/models')) { + await rm('dist/assets/models', { recursive: true }); + } + await mkdir('dist/assets/models', { recursive: true }); + + const changes: FileChange[] = []; + const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( + (nations) => nations.filter((nation) => nation !== 'common'), + ); + + await Promise.all( + [nations[0]].map(async (nation) => { + const tanks = await readXMLDVPL( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, + ); + + for (const tankIndex in tanks) { + const tank = tanks[tankIndex]; + const nationVehicleId = tank.id; + const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; + + // if (id !== 817) continue; + console.log(`Building model ${id} @ ${nation}/${tankIndex}`); + + const parameters = await readYAMLDVPL( + `${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`, + ); + const sc2Path = parameters.resourcesPath.blitzModelPath; + // const scgPath = parameters.resourcesPath.blitzModelPath.replace( + // /\.sc2$/, + // '.scg', + // ); + const sc2Stream = await SCPGStream.fromDVPLFile( + `${DATA}/${DOI['3d']}/${sc2Path}.dvpl`, + ); + // const scgStream = await SCPGStream.fromDVPLFile( + // `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, + // ); + const sc2Data = sc2Stream.consumeSC2(); + // const scgData = scgStream.consumeSCG(); + + // writeFile(`dist/assets/models/${id}.json`, JSON.stringify(scgData)); + } + }), + ); + + // console.log('Committing tank icons...'); + // await commitMultipleFiles( + // 'tresabhi', + // 'blitzkrieg-assets', + // 'main', + // 'tank icons', + // changes, + // true, + // ); +} diff --git a/scripts/buildTest.ts b/src/core/blitz/SCPGStream.ts similarity index 90% rename from scripts/buildTest.ts rename to src/core/blitz/SCPGStream.ts index ddaf255f0..7b7fccb26 100644 --- a/scripts/buildTest.ts +++ b/src/core/blitz/SCPGStream.ts @@ -1,6 +1,6 @@ -import { writeFileSync } from 'fs'; -import { readFile } from 'fs/promises'; import { range } from 'lodash'; +import { readDVPL } from './readDVPL'; +import { readDVPLFile } from './readDVPLFile'; enum KAType { NONE, @@ -55,6 +55,31 @@ enum VertexType { CUBETEXCOORD3, } +interface SCPGBuffer { + type: 'Buffer'; + data: number[]; +} + +interface PolygonGroupRaw { + '##name': 'PolygonGroup'; + '#id': Buffer; + cubeTextureCoordCount: number; + indexCount: number; + indexFormat: 0 | 1; + indices: Buffer; + packing: 0 | 1; + primitiveCount: number; + rhi_primitiveType: 1 | 2 | 10; + textureCoordCount: number; + vertexCount: number; + vertexFormat: number; + vertices: Buffer; +} + +interface PolygonGroup extends Omit { + indices: number[]; +} + const VECTOR_SIZES = [ [ // vector 1; basically array of 1 number @@ -90,27 +115,7 @@ const VECTOR_SIZES = [ ], ]; -interface PolygonGroupRaw { - '##name': 'PolygonGroup'; - '#id': Buffer; - cubeTextureCoordCount: number; - indexCount: number; - indexFormat: 0 | 1; - indices: Buffer; - packing: 0 | 1; - primitiveCount: number; - rhi_primitiveType: 1 | 2 | 10; - textureCoordCount: number; - vertexCount: number; - vertexFormat: number; - vertices: Buffer; -} - -interface PolygonGroup extends Omit { - indices: number[]; -} - -class SCPGStream { +export class SCPGStream { public index = 0; constructor(public buffer: Buffer) {} @@ -165,7 +170,10 @@ class SCPGStream { return this.consume(2).readUInt16LE(); } consumeUInt32() { - return this.consume(4).readUInt32LE(); + const buffer = this.consume(4); + const value = buffer.readUInt32LE(); + + return value; } consumeUInt64() { return this.consume(8).readBigUInt64LE(); @@ -210,6 +218,7 @@ class SCPGStream { const verticesStream = new SCPGStream(polygonGroupRaw.vertices); const vertexFormat = polygonGroupRaw.vertexFormat .toString(2) + .padStart(8 * 8, '0') .split('') .map(parseInt) .map((bit, index) => (bit ? index : null)) @@ -247,36 +256,31 @@ class SCPGStream { } consumeSC2Header() { - return { + const header = { name: this.consumeAscii(4), version: this.consumeUInt32(), nodeCount: this.consumeUInt32(), }; + const version = this.consumeKA(); + const descriptor = this.consumeSC2Descriptor(header.version); + + return { header, version, descriptor }; } - consumeSC2Descriptor() { + consumeSC2Descriptor(version: number) { const size = this.consumeUInt32(); const fileType = this.consumeUInt32(); - this.skip(8); // other felids that we don't care about for some reason + // other felids that we don't care about for some reason lol + this.skip(size - 4); return { size, fileType }; } consumeSC2() { - const header = this.consumeSC2Header(); - const versionTags = this.consumeKA(); - const descriptor = this.consumeSC2Descriptor(); - const data = this.consumeKA(); + console.log(this.consumeSC2Header()); - writeFileSync( - 'test.json', - JSON.stringify( - { header, versionTags, descriptor, data }, - (key, value) => (typeof value === 'bigint' ? value.toString() : value), - 2, - ), - ); + console.log(this.read(32).toString('ascii')); - // console.log(data); + return this.consumeKA(); } consumeKAHeader() { @@ -319,11 +323,9 @@ class SCPGStream { } case KAType.KEYED_ARCHIVE: { - this.skip(4); // the length + this.skip(4); // UInt32 length of the nested archive in bytes - const value = this.consumeKA(stringTable); - - return value; + return this.consumeKA(stringTable); } case KAType.UINT64: @@ -372,6 +374,8 @@ class SCPGStream { const header = this.consumeKAHeader(); const pairs: Record = {}; + console.log(header); + if (header.version === 1) { for (let index = 0; index < header.count; index++) { const { name, value } = this.consumeKAV1Pair(); @@ -421,8 +425,12 @@ class SCPGStream { return pairs as Type; } + + static fromDVPL(buffer: Buffer) { + return new SCPGStream(readDVPL(buffer)); + } + + static async fromDVPLFile(file: string) { + return new SCPGStream(await readDVPLFile(file)); + } } - -const stream = new SCPGStream(await readFile('test.sc2')); - -stream.consumeSC2(); diff --git a/src/core/blitz/readBase64DVPL.ts b/src/core/blitz/readBase64DVPL.ts index 7615eb869..4e50b9042 100644 --- a/src/core/blitz/readBase64DVPL.ts +++ b/src/core/blitz/readBase64DVPL.ts @@ -1,6 +1,6 @@ -import { readDVPL } from './readDVPL'; +import { readDVPLFile } from './readDVPLFile'; export async function readBase64DVPL(file: string) { - const buffer = await readDVPL(file); + const buffer = await readDVPLFile(file); return buffer.toString('base64'); } diff --git a/src/core/blitz/readDVPL.ts b/src/core/blitz/readDVPL.ts index fff0c81d0..f27473acf 100644 --- a/src/core/blitz/readDVPL.ts +++ b/src/core/blitz/readDVPL.ts @@ -1,5 +1,4 @@ import { crc32 } from 'crc'; -import { readFile } from 'fs/promises'; import { decodeBlock } from 'lz4'; /** @@ -7,8 +6,7 @@ import { decodeBlock } from 'lz4'; * * https://github.com/Maddoxkkm/dvpl_converter/ */ -export async function readDVPL(file: string) { - const buffer = await readFile(file); +export function readDVPL(buffer: Buffer) { const footerBuffer = buffer.subarray(buffer.length - 20, buffer.length); if ( diff --git a/src/core/blitz/readDVPLFile.ts b/src/core/blitz/readDVPLFile.ts new file mode 100644 index 000000000..ef83c77b2 --- /dev/null +++ b/src/core/blitz/readDVPLFile.ts @@ -0,0 +1,6 @@ +import { readFile } from 'fs/promises'; +import { readDVPL } from './readDVPL'; + +export async function readDVPLFile(file: string) { + return readDVPL(await readFile(file)); +} diff --git a/src/core/blitz/readStringDVPL.ts b/src/core/blitz/readStringDVPL.ts index d55639d44..46c799be9 100644 --- a/src/core/blitz/readStringDVPL.ts +++ b/src/core/blitz/readStringDVPL.ts @@ -1,6 +1,6 @@ -import { readDVPL } from './readDVPL'; +import { readDVPLFile } from './readDVPLFile'; export async function readStringDVPL(file: string) { - const buffer = await readDVPL(file); + const buffer = await readDVPLFile(file); return buffer.toString(); } From af95897bdeed1896efdbf5148a61151346682a43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 9 Dec 2023 18:38:24 -0600 Subject: [PATCH 60/74] feat: move versions --- scripts/buildAssets.ts | 7 +- src/core/blitz/SCPGStream.ts | 178 +++++++++++++++++++++++------------ 2 files changed, 125 insertions(+), 60 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 3f895b53a..21f11b928 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -318,7 +318,12 @@ if (allTargets || targets?.includes('tankModels')) { const sc2Data = sc2Stream.consumeSC2(); // const scgData = scgStream.consumeSCG(); - // writeFile(`dist/assets/models/${id}.json`, JSON.stringify(scgData)); + // writeFile( + // `test.json`, + // JSON.stringify(sc2Data, (key, value) => + // typeof value === 'bigint' ? value.toString() : value, + // ), + // ); } }), ); diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 7b7fccb26..d26e3627f 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -3,34 +3,34 @@ import { readDVPL } from './readDVPL'; import { readDVPLFile } from './readDVPLFile'; enum KAType { - NONE, - BOOLEAN, - INT32, - FLOAT, - STRING, - WIDE_STRING, - BYTE_ARRAY, - UINT32, - KEYED_ARCHIVE, - INT64, - UINT64, - VECTOR2, - VECTOR3, - VECTOR4, - MATRIX2, - MATRIX3, - MATRIX4, - COLOR, - FASTNAME, - AABBOX3, - FILEPATH, - FLOAT64, - INT8, - UINT8, - INT16, - UINT16, - UNKNOWN1, - ARRAY, + NONE = 0, + BOOLEAN = 1, + INT32 = 2, + FLOAT = 3, + STRING = 4, + WIDE_STRING = 5, + BYTE_ARRAY = 6, + UINT32 = 7, + KEYED_ARCHIVE = 8, + INT64 = 9, + UINT64 = 10, + VECTOR2 = 11, + VECTOR3 = 12, + VECTOR4 = 13, + MATRIX2 = 14, + MATRIX3 = 15, + MATRIX4 = 16, + COLOR = 17, + FASTNAME = 18, + AABBOX3 = 19, + FILEPATH = 20, + FLOAT64 = 21, + INT8 = 22, + UINT8 = 23, + INT16 = 24, + UINT16 = 25, + ARRAY = 27, + TRANSFORM = 29, } enum VertexType { @@ -186,6 +186,35 @@ export class SCPGStream { return this.consume(1).readUInt8() === 1; } + consumeVector2() { + return [this.consumeFloat(), this.consumeFloat()]; + } + consumeVector3() { + return [...this.consumeVector2(), this.consumeFloat()]; + } + consumeVector4() { + return [...this.consumeVector3(), this.consumeFloat()]; + } + + consumeMatrix2() { + return [this.consumeVector2(), this.consumeVector2()]; + } + consumeMatrix3() { + return [ + this.consumeVector3(), + this.consumeVector3(), + this.consumeVector3(), + ]; + } + consumeMatrix4() { + return [ + this.consumeVector4(), + this.consumeVector4(), + this.consumeVector4(), + this.consumeVector4(), + ]; + } + consumeSCGHeader() { return { name: this.consumeAscii(4), @@ -199,7 +228,7 @@ export class SCPGStream { const polygonGroupsRaw: PolygonGroupRaw[] = []; for (let index = 0; index < header.nodeCount; index++) { - const polygonGroupRaw = this.consumeKA(); + const polygonGroupRaw = this.consumeKA() as PolygonGroupRaw; polygonGroupsRaw.push(polygonGroupRaw); } @@ -276,9 +305,8 @@ export class SCPGStream { return { size, fileType }; } consumeSC2() { - console.log(this.consumeSC2Header()); - - console.log(this.read(32).toString('ascii')); + // TODO: HANDLE MORE THAN 1 NODE + this.consumeSC2Header(); return this.consumeKA(); } @@ -290,26 +318,27 @@ export class SCPGStream { count: this.consumeUInt32(), }; } - consumeKAValue( + // TODO: change return type + consumeKAValue( type: KAType = this.consumeUInt8(), stringTable?: Record, - ): Type { + ): unknown { switch (type) { case KAType.INT32: - return this.consumeInt32() as Type; + return this.consumeInt32(); - case KAType.STRING: { + case (KAType.STRING, KAType.FILEPATH): { const length = this.consumeUInt32(); - return this.consumeAscii(length) as Type; + return this.consumeAscii(length); } case KAType.BYTE_ARRAY: { const length = this.consumeUInt32(); - return this.consumeByteArray(length) as Type; + return this.consumeByteArray(length); } case KAType.FLOAT: - return this.consumeFloat() as Type; + return this.consumeFloat(); case KAType.ARRAY: { const length = this.consumeUInt32(); @@ -319,53 +348,86 @@ export class SCPGStream { value.push(this.consumeKAValue(undefined, stringTable)); } - return value as Type; + return value; } case KAType.KEYED_ARCHIVE: { this.skip(4); // UInt32 length of the nested archive in bytes - return this.consumeKA(stringTable); + return this.consumeKA(stringTable); } - case KAType.UINT64: - return this.consumeUInt64() as Type; - + case KAType.INT8: + return this.consumeInt8(); + case KAType.INT16: + return this.consumeInt16(); + case KAType.INT32: + return this.consumeInt32(); + case KAType.INT64: + return this.consumeInt64(); + case KAType.UINT8: + return this.consumeUInt8(); + case KAType.UINT16: + return this.consumeUInt16(); case KAType.UINT32: - return this.consumeUInt32() as Type; + return this.consumeUInt32(); + case KAType.UINT64: + return this.consumeUInt64(); case KAType.BOOLEAN: - return this.consumeBoolean() as Type; + return this.consumeBoolean(); case KAType.AABBOX3: { - const minimum = range(3).map(() => this.consumeFloat()); - const maximum = range(3).map(() => this.consumeFloat()); + const minimum = this.consumeVector3(); + const maximum = this.consumeVector3(); - return { minimum, maximum } as Type; + return { minimum, maximum }; } - case KAType.VECTOR4: - return range(4).map(() => this.consumeFloat()) as Type; - + case KAType.VECTOR2: + return this.consumeVector2(); case KAType.VECTOR3: - return range(3).map(() => this.consumeFloat()) as Type; + return this.consumeVector3(); + case KAType.VECTOR4: + return this.consumeVector4(); + + case KAType.MATRIX2: + return this.consumeMatrix2(); + case KAType.MATRIX3: + return this.consumeMatrix3(); + case KAType.MATRIX4: + return this.consumeMatrix4(); case KAType.FASTNAME: { if (!stringTable) throw new Error('No string table provided'); const index = this.consumeUInt32(); - return stringTable[index] as Type; + return stringTable[index]; } + case KAType.TRANSFORM: { + if (!stringTable) throw new Error('No string table provided'); + + const position = this.consumeVector3(); + const scale = this.consumeVector3(); + const rotation = this.consumeVector3(); + const UNCONFIRMED_inset = this.consumeFloat(); + + return { position, scale, rotation, UNCONFIRMED_inset }; + } + + case KAType.NONE: + return undefined; + default: throw new TypeError( - `Unknown KA type: ${type} (${KAType[type] ?? 'unknown type'})`, + `Unhandled KA type: ${type} (${KAType[type] ?? 'unknown type'})`, ); } } consumeKAV1Pair(stringTable?: Record) { - const name = this.consumeKAValue(undefined, stringTable); + const name = this.consumeKAValue(undefined, stringTable) as string; const value = this.consumeKAValue(undefined, stringTable); return { name, value }; @@ -374,8 +436,6 @@ export class SCPGStream { const header = this.consumeKAHeader(); const pairs: Record = {}; - console.log(header); - if (header.version === 1) { for (let index = 0; index < header.count; index++) { const { name, value } = this.consumeKAV1Pair(); @@ -423,7 +483,7 @@ export class SCPGStream { } } else throw new SyntaxError(`Unhandled KA version: ${header.version}`); - return pairs as Type; + return pairs; } static fromDVPL(buffer: Buffer) { From 83e28b4dac71da51ab0ce0b8842e035421b4d6c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 9 Dec 2023 19:05:46 -0600 Subject: [PATCH 61/74] feat: move versions x2 --- scripts/buildAssets.ts | 14 +++++++++--- src/core/blitz/SCPGStream.ts | 41 ++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 21f11b928..c405d9605 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -288,7 +288,7 @@ if (allTargets || targets?.includes('tankModels')) { ); await Promise.all( - [nations[0]].map(async (nation) => { + nations.map(async (nation) => { const tanks = await readXMLDVPL( `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, ); @@ -299,7 +299,7 @@ if (allTargets || targets?.includes('tankModels')) { const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; // if (id !== 817) continue; - console.log(`Building model ${id} @ ${nation}/${tankIndex}`); + // console.log(`Building model ${id} @ ${nation}/${tankIndex}`); const parameters = await readYAMLDVPL( `${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`, @@ -315,7 +315,7 @@ if (allTargets || targets?.includes('tankModels')) { // const scgStream = await SCPGStream.fromDVPLFile( // `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, // ); - const sc2Data = sc2Stream.consumeSC2(); + // const sc2Data = sc2Stream.consumeSC2(); // const scgData = scgStream.consumeSCG(); // writeFile( @@ -324,6 +324,14 @@ if (allTargets || targets?.includes('tankModels')) { // typeof value === 'bigint' ? value.toString() : value, // ), // ); + + try { + sc2Stream.consumeSC2(); + } catch (error) { + if (!(error as Error).message.startsWith('Unhandled KA version')) { + throw error; + } + } } }), ); diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index d26e3627f..915349445 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -30,7 +30,7 @@ enum KAType { INT16 = 24, UINT16 = 25, ARRAY = 27, - TRANSFORM = 29, + CUSTOMIZATION_TRANSFORM = 29, } enum VertexType { @@ -305,9 +305,7 @@ export class SCPGStream { return { size, fileType }; } consumeSC2() { - // TODO: HANDLE MORE THAN 1 NODE this.consumeSC2Header(); - return this.consumeKA(); } @@ -323,11 +321,14 @@ export class SCPGStream { type: KAType = this.consumeUInt8(), stringTable?: Record, ): unknown { - switch (type) { - case KAType.INT32: - return this.consumeInt32(); + console.log(KAType[type]); - case (KAType.STRING, KAType.FILEPATH): { + switch (type) { + case KAType.NONE: + return undefined; + + case KAType.FILEPATH: + case KAType.STRING: { const length = this.consumeUInt32(); return this.consumeAscii(length); } @@ -377,13 +378,6 @@ export class SCPGStream { case KAType.BOOLEAN: return this.consumeBoolean(); - case KAType.AABBOX3: { - const minimum = this.consumeVector3(); - const maximum = this.consumeVector3(); - - return { minimum, maximum }; - } - case KAType.VECTOR2: return this.consumeVector2(); case KAType.VECTOR3: @@ -391,6 +385,9 @@ export class SCPGStream { case KAType.VECTOR4: return this.consumeVector4(); + case KAType.COLOR: + return this.consumeVector4(); // as RGBA + case KAType.MATRIX2: return this.consumeMatrix2(); case KAType.MATRIX3: @@ -398,6 +395,13 @@ export class SCPGStream { case KAType.MATRIX4: return this.consumeMatrix4(); + case KAType.AABBOX3: { + const minimum = this.consumeVector3(); + const maximum = this.consumeVector3(); + + return { minimum, maximum }; + } + case KAType.FASTNAME: { if (!stringTable) throw new Error('No string table provided'); @@ -406,7 +410,7 @@ export class SCPGStream { return stringTable[index]; } - case KAType.TRANSFORM: { + case KAType.CUSTOMIZATION_TRANSFORM: { if (!stringTable) throw new Error('No string table provided'); const position = this.consumeVector3(); @@ -417,9 +421,6 @@ export class SCPGStream { return { position, scale, rotation, UNCONFIRMED_inset }; } - case KAType.NONE: - return undefined; - default: throw new TypeError( `Unhandled KA type: ${type} (${KAType[type] ?? 'unknown type'})`, @@ -432,7 +433,7 @@ export class SCPGStream { return { name, value }; } - consumeKA(stringTable?: Record) { + consumeKA(stringTable?: Record) { const header = this.consumeKAHeader(); const pairs: Record = {}; @@ -481,7 +482,7 @@ export class SCPGStream { pairs[key] = value; } } - } else throw new SyntaxError(`Unhandled KA version: ${header.version}`); + } else throw new RangeError(`Unhandled KA version: ${header.version}`); return pairs; } From 5471c7fa321ae343e49034e01bf503169084d7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 10 Dec 2023 11:51:54 -0600 Subject: [PATCH 62/74] feat: unconfirmed types --- src/core/blitz/SCPGStream.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 915349445..f1013c5bd 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -30,7 +30,7 @@ enum KAType { INT16 = 24, UINT16 = 25, ARRAY = 27, - CUSTOMIZATION_TRANSFORM = 29, + UNCONFIRMED_TRANSFORM = 29, } enum VertexType { @@ -410,15 +410,20 @@ export class SCPGStream { return stringTable[index]; } - case KAType.CUSTOMIZATION_TRANSFORM: { + case KAType.UNCONFIRMED_TRANSFORM: { if (!stringTable) throw new Error('No string table provided'); const position = this.consumeVector3(); const scale = this.consumeVector3(); const rotation = this.consumeVector3(); - const UNCONFIRMED_inset = this.consumeFloat(); + const UNCONFIRMED_scalar = this.consumeFloat(); - return { position, scale, rotation, UNCONFIRMED_inset }; + return { + position, + scale, + rotation, + UNCONFIRMED_scalar, + }; } default: From dc01eff8125c6fdfdc1967128bc863bd5504c540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 10 Dec 2023 11:57:21 -0600 Subject: [PATCH 63/74] feat: ka 0xff02 handling --- scripts/buildAssets.ts | 10 +--------- src/core/blitz/SCPGStream.ts | 38 +++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index c405d9605..4551d3d72 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -315,7 +315,7 @@ if (allTargets || targets?.includes('tankModels')) { // const scgStream = await SCPGStream.fromDVPLFile( // `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, // ); - // const sc2Data = sc2Stream.consumeSC2(); + const sc2Data = sc2Stream.consumeSC2(); // const scgData = scgStream.consumeSCG(); // writeFile( @@ -324,14 +324,6 @@ if (allTargets || targets?.includes('tankModels')) { // typeof value === 'bigint' ? value.toString() : value, // ), // ); - - try { - sc2Stream.consumeSC2(); - } catch (error) { - if (!(error as Error).message.startsWith('Unhandled KA version')) { - throw error; - } - } } }), ); diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index f1013c5bd..0b8f8cd41 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -309,20 +309,11 @@ export class SCPGStream { return this.consumeKA(); } - consumeKAHeader() { - return { - name: this.consumeAscii(2), - version: this.consumeUInt16(), - count: this.consumeUInt32(), - }; - } // TODO: change return type consumeKAValue( type: KAType = this.consumeUInt8(), stringTable?: Record, ): unknown { - console.log(KAType[type]); - switch (type) { case KAType.NONE: return undefined; @@ -439,30 +430,36 @@ export class SCPGStream { return { name, value }; } consumeKA(stringTable?: Record) { - const header = this.consumeKAHeader(); + this.consumeAscii(2); // "KA" + const version = this.consumeUInt16(); const pairs: Record = {}; - if (header.version === 1) { - for (let index = 0; index < header.count; index++) { + if (version === 0x0001) { + const count = this.consumeUInt32(); + + for (let index = 0; index < count; index++) { const { name, value } = this.consumeKAV1Pair(); pairs[name] = value; } - } else if (header.version === 2) { + } else if (version === 0x0002) { + const count = this.consumeUInt32(); const strings: string[] = []; const stringTable: Record = {}; - for (let index = 0; index < header.count; index++) { + + for (let index = 0; index < count; index++) { const length = this.consumeUInt16(); const string = this.consumeAscii(length); strings.push(string); } - for (let index = 0; index < header.count; index++) { + for (let index = 0; index < count; index++) { const id = this.consumeUInt32(); stringTable[id] = strings[index]; } const nodeCount = this.consumeUInt32(); + for (let index = 0; index < nodeCount; index++) { const keyId = this.consumeUInt32(); const value = this.consumeKAValue(undefined, stringTable); @@ -470,10 +467,12 @@ export class SCPGStream { pairs[key] = value; } - } else if (header.version === 258) { + } else if (version === 0x0102) { if (!stringTable) throw new Error('No string table provided'); - for (let index = 0; index < header.count; index++) { + const count = this.consumeUInt32(); + + for (let index = 0; index < count; index++) { const keyIndex = this.consumeUInt32(); const key = stringTable[keyIndex]; const valueType = this.consumeUInt8(); @@ -487,7 +486,10 @@ export class SCPGStream { pairs[key] = value; } } - } else throw new RangeError(`Unhandled KA version: ${header.version}`); + } else if (version === 0xff02) { + // same as 0x0102 but empty and with no count + return {}; + } else throw new RangeError(`Unhandled KA version: ${version}`); return pairs; } From d18cf625d0e952d93287c6aeda6bdcf342fb1b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 10 Dec 2023 17:03:01 -0600 Subject: [PATCH 64/74] feat: final compatibility --- scripts/buildAssets.ts | 36 +++++++++------------------------- src/core/blitz/SCPGStream.ts | 38 +++++++++++++++++------------------- 2 files changed, 27 insertions(+), 47 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 4551d3d72..dd428e460 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -298,43 +298,25 @@ if (allTargets || targets?.includes('tankModels')) { const nationVehicleId = tank.id; const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; - // if (id !== 817) continue; - // console.log(`Building model ${id} @ ${nation}/${tankIndex}`); + console.log(`Building model ${id} @ ${nation}/${tankIndex}`); const parameters = await readYAMLDVPL( `${DATA}/${DOI.tankParameters}/${nation}/${tankIndex}.yaml.dvpl`, ); const sc2Path = parameters.resourcesPath.blitzModelPath; - // const scgPath = parameters.resourcesPath.blitzModelPath.replace( - // /\.sc2$/, - // '.scg', - // ); + const scgPath = parameters.resourcesPath.blitzModelPath.replace( + /\.sc2$/, + '.scg', + ); const sc2Stream = await SCPGStream.fromDVPLFile( `${DATA}/${DOI['3d']}/${sc2Path}.dvpl`, ); - // const scgStream = await SCPGStream.fromDVPLFile( - // `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, - // ); + const scgStream = await SCPGStream.fromDVPLFile( + `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, + ); const sc2Data = sc2Stream.consumeSC2(); - // const scgData = scgStream.consumeSCG(); - - // writeFile( - // `test.json`, - // JSON.stringify(sc2Data, (key, value) => - // typeof value === 'bigint' ? value.toString() : value, - // ), - // ); + const scgData = scgStream.consumeSCG(); } }), ); - - // console.log('Committing tank icons...'); - // await commitMultipleFiles( - // 'tresabhi', - // 'blitzkrieg-assets', - // 'main', - // 'tank icons', - // changes, - // true, - // ); } diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 0b8f8cd41..ae6e5cb0b 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -123,6 +123,9 @@ export class SCPGStream { skip(size: number) { this.index += size; } + back(size: number) { + this.skip(-size); + } read(size: number) { return this.buffer.subarray(this.index, this.index + size); } @@ -147,9 +150,6 @@ export class SCPGStream { consumeAscii(size: number) { return this.consume(size).toString('ascii'); } - consumeUtf16(size: number) { - return this.consume(size).toString('utf16le'); - } consumeInt8() { return this.consume(1).readInt8(); @@ -290,12 +290,12 @@ export class SCPGStream { version: this.consumeUInt32(), nodeCount: this.consumeUInt32(), }; - const version = this.consumeKA(); - const descriptor = this.consumeSC2Descriptor(header.version); + const versionTags = this.consumeKA(); + const descriptor = this.consumeSC2Descriptor(); - return { header, version, descriptor }; + return { header, versionTags, descriptor }; } - consumeSC2Descriptor(version: number) { + consumeSC2Descriptor() { const size = this.consumeUInt32(); const fileType = this.consumeUInt32(); @@ -309,7 +309,6 @@ export class SCPGStream { return this.consumeKA(); } - // TODO: change return type consumeKAValue( type: KAType = this.consumeUInt8(), stringTable?: Record, @@ -320,8 +319,13 @@ export class SCPGStream { case KAType.FILEPATH: case KAType.STRING: { - const length = this.consumeUInt32(); - return this.consumeAscii(length); + if (stringTable) { + const id = this.consumeUInt32(); + return stringTable[id]; + } else { + const length = this.consumeUInt32(); + return this.consumeAscii(length); + } } case KAType.BYTE_ARRAY: { @@ -395,9 +399,7 @@ export class SCPGStream { case KAType.FASTNAME: { if (!stringTable) throw new Error('No string table provided'); - const index = this.consumeUInt32(); - return stringTable[index]; } @@ -423,14 +425,8 @@ export class SCPGStream { ); } } - consumeKAV1Pair(stringTable?: Record) { - const name = this.consumeKAValue(undefined, stringTable) as string; - const value = this.consumeKAValue(undefined, stringTable); - - return { name, value }; - } consumeKA(stringTable?: Record) { - this.consumeAscii(2); // "KA" + this.skip(2); // "KA" const version = this.consumeUInt16(); const pairs: Record = {}; @@ -438,7 +434,9 @@ export class SCPGStream { const count = this.consumeUInt32(); for (let index = 0; index < count; index++) { - const { name, value } = this.consumeKAV1Pair(); + const name = this.consumeKAValue(undefined, stringTable) as string; + const value = this.consumeKAValue(undefined, stringTable); + pairs[name] = value; } } else if (version === 0x0002) { From 483b625f2db4d1ce85ce3f51ad382b77d87cb2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 10 Dec 2023 17:14:05 -0600 Subject: [PATCH 65/74] feat: cleanup --- scripts/buildAssets.ts | 4 ++-- src/core/blitz/SCPGStream.ts | 15 +++------------ 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index dd428e460..8d143790d 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -314,8 +314,8 @@ if (allTargets || targets?.includes('tankModels')) { const scgStream = await SCPGStream.fromDVPLFile( `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, ); - const sc2Data = sc2Stream.consumeSC2(); - const scgData = scgStream.consumeSCG(); + const sc2 = sc2Stream.consumeSC2(); + const scg = scgStream.consumeSCG(); } }), ); diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index ae6e5cb0b..1ac7f6c71 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -81,14 +81,8 @@ interface PolygonGroup extends Omit { } const VECTOR_SIZES = [ + [VertexType.COLOR, VertexType.FLEXIBILITY, VertexType.HARD_JOINTINDEX], [ - // vector 1; basically array of 1 number - VertexType.COLOR, - VertexType.FLEXIBILITY, - VertexType.HARD_JOINTINDEX, - ], - [ - // vector 2; 2d vector VertexType.TEXCOORD0, VertexType.TEXCOORD1, VertexType.TEXCOORD2, @@ -96,10 +90,9 @@ const VECTOR_SIZES = [ VertexType.ANGLE_SIN_COS, ], [ - // vector 3; 3d vector VertexType.VERTEX, VertexType.NORMAL, - // VertexType.TANGENT, MOVED TO 4 + // VertexType.TANGENT, // moved to 4 VertexType.BINORMAL, VertexType.CUBETEXCOORD0, VertexType.CUBETEXCOORD1, @@ -107,17 +100,15 @@ const VECTOR_SIZES = [ VertexType.CUBETEXCOORD3, ], [ - // vector 4; 4d vector or something more complex - VertexType.TANGENT, // UNCONFIRMED VertexType.PIVOT4, VertexType.JOINTINDEX, VertexType.JOINTWEIGHT, + VertexType.TANGENT, // moved from 3 ], ]; export class SCPGStream { public index = 0; - constructor(public buffer: Buffer) {} skip(size: number) { From 3f40e94235164dacdb4c62e3d6ae045b72898183 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sun, 10 Dec 2023 17:22:40 -0600 Subject: [PATCH 66/74] feat: cleanup x2 --- src/core/blitz/SCPGStream.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 1ac7f6c71..9713b7b09 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -1,4 +1,4 @@ -import { range } from 'lodash'; +import { times } from 'lodash'; import { readDVPL } from './readDVPL'; import { readDVPLFile } from './readDVPLFile'; @@ -251,7 +251,7 @@ export class SCPGStream { if (types.includes(type)) { vertices.push({ type, - value: range(size + 1).map(() => verticesStream.consumeFloat()), + value: times(size + 1).map(() => verticesStream.consumeFloat()), }); return true; @@ -395,8 +395,6 @@ export class SCPGStream { } case KAType.UNCONFIRMED_TRANSFORM: { - if (!stringTable) throw new Error('No string table provided'); - const position = this.consumeVector3(); const scale = this.consumeVector3(); const rotation = this.consumeVector3(); From 662e0bb9cedb1127ecb8090f2d58dd974e42f095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:21:40 -0600 Subject: [PATCH 67/74] feat: optimizations --- src/core/blitz/SCPGStream.ts | 81 +++++++++++++----------------------- 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 9713b7b09..369890d76 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -55,11 +55,6 @@ enum VertexType { CUBETEXCOORD3, } -interface SCPGBuffer { - type: 'Buffer'; - data: number[]; -} - interface PolygonGroupRaw { '##name': 'PolygonGroup'; '#id': Buffer; @@ -76,10 +71,6 @@ interface PolygonGroupRaw { vertices: Buffer; } -interface PolygonGroup extends Omit { - indices: number[]; -} - const VECTOR_SIZES = [ [VertexType.COLOR, VertexType.FLEXIBILITY, VertexType.HARD_JOINTINDEX], [ @@ -92,7 +83,7 @@ const VECTOR_SIZES = [ [ VertexType.VERTEX, VertexType.NORMAL, - // VertexType.TANGENT, // moved to 4 + VertexType.TANGENT, VertexType.BINORMAL, VertexType.CUBETEXCOORD0, VertexType.CUBETEXCOORD1, @@ -103,7 +94,7 @@ const VECTOR_SIZES = [ VertexType.PIVOT4, VertexType.JOINTINDEX, VertexType.JOINTWEIGHT, - VertexType.TANGENT, // moved from 3 + // VertexType.TANGENT, ], ]; @@ -122,7 +113,7 @@ export class SCPGStream { } consume(size: number) { const subarray = this.read(size); - this.index += size; + this.skip(size); return subarray; } @@ -161,10 +152,7 @@ export class SCPGStream { return this.consume(2).readUInt16LE(); } consumeUInt32() { - const buffer = this.consume(4); - const value = buffer.readUInt32LE(); - - return value; + return this.consume(4).readUInt32LE(); } consumeUInt64() { return this.consume(8).readBigUInt64LE(); @@ -177,33 +165,30 @@ export class SCPGStream { return this.consume(1).readUInt8() === 1; } + consumeVectorN(size: number) { + return times(size, () => this.consumeFloat()); + } consumeVector2() { - return [this.consumeFloat(), this.consumeFloat()]; + return this.consumeVectorN(2); } consumeVector3() { - return [...this.consumeVector2(), this.consumeFloat()]; + return this.consumeVectorN(3); } consumeVector4() { - return [...this.consumeVector3(), this.consumeFloat()]; + return this.consumeVectorN(4); } + consumeMatrixN(size: number) { + return times(size, () => this.consumeVectorN(size)); + } consumeMatrix2() { - return [this.consumeVector2(), this.consumeVector2()]; + return this.consumeMatrixN(2); } consumeMatrix3() { - return [ - this.consumeVector3(), - this.consumeVector3(), - this.consumeVector3(), - ]; + return this.consumeMatrixN(3); } consumeMatrix4() { - return [ - this.consumeVector4(), - this.consumeVector4(), - this.consumeVector4(), - this.consumeVector4(), - ]; + return this.consumeMatrixN(4); } consumeSCGHeader() { @@ -229,30 +214,29 @@ export class SCPGStream { for (let index = 0; index < polygonGroupRaw.indexCount; index++) { indices.push( - polygonGroupRaw.indexFormat - ? indicesStream.consumeUInt32() - : indicesStream.consumeUInt16(), + polygonGroupRaw.indexFormat === 0 + ? indicesStream.consumeUInt16() + : indicesStream.consumeUInt32(), ); } const verticesStream = new SCPGStream(polygonGroupRaw.vertices); - const vertexFormat = polygonGroupRaw.vertexFormat - .toString(2) - .padStart(8 * 8, '0') - .split('') - .map(parseInt) - .map((bit, index) => (bit ? index : null)) + const vertexFormat = [ + ...polygonGroupRaw.vertexFormat.toString(2).padEnd(64, '0'), + ] + .map((bit, index) => (bit === '1' ? index : null)) .filter((index) => index !== null) as VertexType[]; - const vertices: { type: VertexType; value: number[] }[] = []; + const vertices: Partial>[] = []; for (let index = 0; index < polygonGroupRaw.vertexCount; index++) { vertexFormat.forEach((type) => { const resolved = VECTOR_SIZES.some((types, size) => { if (types.includes(type)) { - vertices.push({ - type, - value: times(size + 1).map(() => verticesStream.consumeFloat()), - }); + if (!(index in vertices)) vertices[index] = {}; + + vertices[index][type] = times(size + 1).map(() => + verticesStream.consumeFloat(), + ); return true; } @@ -267,12 +251,7 @@ export class SCPGStream { return { vertices, indices }; }); - return polygonGroups.map((group) => ({ - vertices: group.vertices - .filter(({ type }) => type === VertexType.VERTEX) - .map(({ value }) => value), - indices: group.indices, - })); + return polygonGroups; } consumeSC2Header() { From 2e2ab9b2d915bc4710b53f07189b3065906bff6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 12:01:50 -0600 Subject: [PATCH 68/74] fix: added binary start padding --- scripts/buildAssets.ts | 2 ++ src/core/blitz/SCPGStream.ts | 25 ++++++++++--------------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 8d143790d..526eda156 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -298,6 +298,7 @@ if (allTargets || targets?.includes('tankModels')) { const nationVehicleId = tank.id; const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; + // if (id !== 897) continue; console.log(`Building model ${id} @ ${nation}/${tankIndex}`); const parameters = await readYAMLDVPL( @@ -314,6 +315,7 @@ if (allTargets || targets?.includes('tankModels')) { const scgStream = await SCPGStream.fromDVPLFile( `${DATA}/${DOI['3d']}/${scgPath}.dvpl`, ); + const sc2 = sc2Stream.consumeSC2(); const scg = scgStream.consumeSCG(); } diff --git a/src/core/blitz/SCPGStream.ts b/src/core/blitz/SCPGStream.ts index 369890d76..5cb39fe60 100644 --- a/src/core/blitz/SCPGStream.ts +++ b/src/core/blitz/SCPGStream.ts @@ -90,12 +90,7 @@ const VECTOR_SIZES = [ VertexType.CUBETEXCOORD2, VertexType.CUBETEXCOORD3, ], - [ - VertexType.PIVOT4, - VertexType.JOINTINDEX, - VertexType.JOINTWEIGHT, - // VertexType.TANGENT, - ], + [VertexType.PIVOT4, VertexType.JOINTINDEX, VertexType.JOINTWEIGHT], ]; export class SCPGStream { @@ -221,22 +216,22 @@ export class SCPGStream { } const verticesStream = new SCPGStream(polygonGroupRaw.vertices); - const vertexFormat = [ - ...polygonGroupRaw.vertexFormat.toString(2).padEnd(64, '0'), - ] - .map((bit, index) => (bit === '1' ? index : null)) - .filter((index) => index !== null) as VertexType[]; const vertices: Partial>[] = []; + const vertexFormatBuffer = Buffer.alloc(4); + vertexFormatBuffer.writeUInt32LE(polygonGroupRaw.vertexFormat, 0); + const vertexFormat = [...vertexFormatBuffer] + .map((number) => number.toString(2)) + .join('') + .split('') + .map((bitString, index) => (bitString === '1' ? index : null)) + .filter((type) => type !== null) as VertexType[]; for (let index = 0; index < polygonGroupRaw.vertexCount; index++) { vertexFormat.forEach((type) => { const resolved = VECTOR_SIZES.some((types, size) => { if (types.includes(type)) { if (!(index in vertices)) vertices[index] = {}; - - vertices[index][type] = times(size + 1).map(() => - verticesStream.consumeFloat(), - ); + vertices[index][type] = verticesStream.consumeVectorN(size + 1); return true; } From 66dbc5b2ed8a0a3b9b72660c507432830ca3d7b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 13:40:58 -0600 Subject: [PATCH 69/74] feat: more defs --- scripts/buildAssets.ts | 204 +++++++++++++----- src/app/embeds/session/page.tsx | 4 +- .../tankopedia/components/PageTurner.tsx | 4 +- src/app/tools/tankopedia/page.tsx | 4 +- src/commands/ownedTanks.tsx | 4 +- src/core/blitz/readXMLDVPL.ts | 2 +- src/core/blitz/toUniqueId.ts | 5 + src/core/blitzkrieg/definitions/guns.ts | 8 + src/core/blitzkrieg/definitions/tanks.ts | 18 +- src/core/blitzkrieg/definitions/turrets.ts | 12 ++ 10 files changed, 192 insertions(+), 73 deletions(-) create mode 100644 src/core/blitz/toUniqueId.ts create mode 100644 src/core/blitzkrieg/definitions/guns.ts create mode 100644 src/core/blitzkrieg/definitions/turrets.ts diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 526eda156..a9c8fa8ec 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -8,16 +8,21 @@ import { SCPGStream } from '../src/core/blitz/SCPGStream'; import { readBase64DVPL } from '../src/core/blitz/readBase64DVPL'; import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; +import { toUniqueId } from '../src/core/blitz/toUniqueId'; import commitMultipleFiles, { FileChange, } from '../src/core/blitzkrieg/commitMultipleFiles'; +import { BlitzkriegGunDefinitions } from '../src/core/blitzkrieg/definitions/guns'; import { - TankDefinitions, + BlitzkriegTankDefinitions, Tier, } from '../src/core/blitzkrieg/definitions/tanks'; +import { BlitzkriegTurretDefinitions } from '../src/core/blitzkrieg/definitions/turrets'; config(); +// WARNING! MOST OF THESE TYPES ARE NOT EXHAUSTIVE! + interface VehicleDefinitionList { [key: string]: { id: number; @@ -34,13 +39,41 @@ interface VehicleDefinitionList { configurationModes: string; }; } +interface TurretDefinitionsList { + nextAvailableId: number; + ids: Record; +} +interface GunDefinitionsList { + nextAvailableId: number; + ids: Record; + shared: { + [key: string]: { + userString: string; + tags: string; + level: number; + pitchLimits: string; + }; + }; +} +interface VehicleDefinitions { + turrets0: { + [key: string]: { + userString: number; + level: number; + yawLimits: string | string[]; + guns: { + [key: string]: { + maxAmmo: number; + pitchLimits?: string | string[]; + }; + }; + }; + }; +} interface Strings { [key: string]: string; } type BlitzTankType = 'AT-SPG' | 'lightTank' | 'mediumTank' | 'heavyTank'; -/** - * Warning! This is not exhaustive. - */ interface TankParameters { resourcesPath: { smallIconPath: string; @@ -76,10 +109,12 @@ const targets = argv if (!targets && !allTargets) throw new Error('No target(s) specified'); -if (allTargets || targets?.includes('tankDefinitions')) { +if (allTargets || targets?.includes('definitions')) { console.log('Building tank definitions...'); - const tankDefinitions: TankDefinitions = {}; + const tankDefinitions: BlitzkriegTankDefinitions = {}; + const turretDefinitions: BlitzkriegTurretDefinitions = {}; + const gunDefinitions: BlitzkriegGunDefinitions = {}; const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( (nations) => nations.filter((nation) => nation !== 'common'), ); @@ -89,65 +124,120 @@ if (allTargets || targets?.includes('tankDefinitions')) { await Promise.all( nations.map(async (nation) => { - const tanks = await readXMLDVPL( + const tankList = await readXMLDVPL<{ root: VehicleDefinitionList }>( `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, ); + const turretList = await readXMLDVPL<{ + root: TurretDefinitionsList; + }>( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/components/turrets.xml.dvpl`, + ); + const gunList = await readXMLDVPL<{ + root: GunDefinitionsList; + }>( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/components/guns.xml.dvpl`, + ); - for (const tankIndex in tanks) { - const tank = tanks[tankIndex]; - const nationVehicleId = tank.id; - const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; - const name = strings[tank.userString] ?? tankIndex; - const name_short = tank.shortUserString - ? strings[tank.shortUserString] === name - ? undefined - : strings[tank.shortUserString] - : undefined; - const isPremium = - typeof tank.price === 'number' ? false : 'gold' in tank.price; - const isCollector = tank.sellPrice ? 'gold' in tank.sellPrice : false; - const tier = tank.level as Tier; - const tags = tank.tags.split(' '); - const type = blitzTankTypeToBlitzkrieg[tags[0] as BlitzTankType]; - const testing = tags.includes('testTank') ? true : undefined; + for (const tankKey in tankList.root) { + const tank = tankList.root[tankKey]; + const tankDefinition = await readXMLDVPL<{ root: VehicleDefinitions }>( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/${tankKey}.xml.dvpl`, + ); + const tankId = toUniqueId(nation, tank.id); + const tankTags = tank.tags.split(' '); + const tankTurrets = Object.keys(tankDefinition.root.turrets0).map( + (turretKey) => { + const turret = tankDefinition.root.turrets0[turretKey]; + const turretId = toUniqueId(nation, turretList.root.ids[turretKey]); + const turretGuns = Object.keys(turret.guns).map((gunKey) => + toUniqueId(nation, gunList.root.ids[gunKey]), + ); - if ((name ?? name_short) === undefined) { - console.warn(`Missing name for ${tankIndex}`); - } + turretDefinitions[turretId] = { + id: turretId, + name: + strings[turret.userString] ?? + turretKey + .replaceAll('_', ' ') + .replace(/^(Turret ([0-9] )?)+/, ''), + tier: turret.level, + yaw: (typeof turret.yawLimits === 'string' + ? turret.yawLimits + : turret.yawLimits[0] + ) + .split(' ') + .map(Number) as [number, number], + guns: turretGuns, + }; - tankDefinitions[id] = { - id, - name, - name_short, + return turretId; + }, + ); + + tankDefinitions[tankId] = { + id: tankId, + name: + (tank.shortUserString + ? strings[tank.shortUserString] + : undefined) ?? + strings[tank.userString] ?? + tankKey.replaceAll('_', ' '), nation, - tree_type: isCollector + tree_type: (tank.sellPrice ? 'gold' in tank.sellPrice : false) ? 'collector' - : isPremium + : (typeof tank.price === 'number' ? false : 'gold' in tank.price) ? 'premium' : 'researchable', - tier, - type, - testing, + tier: tank.level as Tier, + type: blitzTankTypeToBlitzkrieg[tankTags[0] as BlitzTankType], + testing: tankTags.includes('testTank') ? true : undefined, + turrets: tankTurrets, }; } + + Object.keys(gunList.root.ids).forEach((gunKey) => { + const gun = gunList.root.shared[gunKey]; + const gunId = toUniqueId(nation, gunList.root.ids[gunKey]); + + gunDefinitions[gunId] = { + id: gunId, + name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '), + tier: gun.level, + pitch: gun.pitchLimits.split(' ').map(Number) as [number, number], + }; + }); }), ); - console.log('Committing tank definitions...'); - await commitMultipleFiles( - 'tresabhi', - 'blitzkrieg-assets', - 'main', - 'tank definitions', - [ - { - content: JSON.stringify(tankDefinitions), - encoding: 'utf-8', - path: 'definitions/tanks.json', - }, - ], - true, - ); + // rmSync('dist/definitions', { force: true, recursive: true }); + // mkdirSync('dist/definitions', { recursive: true }); + // writeFile( + // 'dist/definitions/tanks.json', + // JSON.stringify(tankDefinitions, null, 2), + // ); + // writeFile( + // 'dist/definitions/turrets.json', + // JSON.stringify(turretDefinitions, null, 2), + // ); + // writeFile( + // 'dist/definitions/guns.json', + // JSON.stringify(gunDefinitions, null, 2), + // ); + // console.log('Committing tank definitions...'); + // await commitMultipleFiles( + // 'tresabhi', + // 'blitzkrieg-assets', + // 'main', + // 'tank definitions', + // [ + // { + // content: JSON.stringify(tankDefinitions), + // encoding: 'utf-8', + // path: 'definitions/tanks.json', + // }, + // ], + // true, + // ); } if ( @@ -164,12 +254,12 @@ if ( await Promise.all( nations.map(async (nation) => { - const tanks = await readXMLDVPL( + const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>( `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, ); - for (const tankIndex in tanks) { - const tank = tanks[tankIndex]; + for (const tankIndex in tanks.root) { + const tank = tanks.root[tankIndex]; const nationVehicleId = tank.id; const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; const parameters = await readYAMLDVPL( @@ -289,12 +379,12 @@ if (allTargets || targets?.includes('tankModels')) { await Promise.all( nations.map(async (nation) => { - const tanks = await readXMLDVPL( + const tanks = await readXMLDVPL<{ root: VehicleDefinitionList }>( `${DATA}/${DOI.vehicleDefinitions}/${nation}/list.xml.dvpl`, ); - for (const tankIndex in tanks) { - const tank = tanks[tankIndex]; + for (const tankIndex in tanks.root) { + const tank = tanks.root[tankIndex]; const nationVehicleId = tank.id; const id = (nationVehicleId << 8) + (NATION_IDS[nation] << 4) + 1; diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 7d50336d0..181b7e999 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -7,7 +7,7 @@ import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; import fetchBlitz from '../../../core/blitz/fetchBlitz'; import { - TankDefinition, + BlitzkriegTankDefinition, tankDefinitions, } from '../../../core/blitzkrieg/definitions/tanks'; import { tankAverages } from '../../../core/blitzstars/tankAverages'; @@ -30,7 +30,7 @@ export default function SessionPage() { list: { stats: IndividualTankStats; - tankDefinitions?: TankDefinition; + tankDefinitions?: BlitzkriegTankDefinition; career: IndividualTankStats; currentWN8?: number; careerWN8?: number; diff --git a/src/app/tools/tankopedia/components/PageTurner.tsx b/src/app/tools/tankopedia/components/PageTurner.tsx index 533268263..231a6c690 100644 --- a/src/app/tools/tankopedia/components/PageTurner.tsx +++ b/src/app/tools/tankopedia/components/PageTurner.tsx @@ -1,12 +1,12 @@ import { CaretLeftIcon, CaretRightIcon } from '@radix-ui/react-icons'; import { Button, Flex, TextField } from '@radix-ui/themes'; import { useEffect, useRef } from 'react'; -import { TankDefinition } from '../../../../core/blitzkrieg/definitions/tanks'; +import { BlitzkriegTankDefinition } from '../../../../core/blitzkrieg/definitions/tanks'; interface PageTurnerProps { page: number; setPage: (page: number) => void; - searchedList: TankDefinition[]; + searchedList: BlitzkriegTankDefinition[]; tanksPerPage: number; } diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 24fb6be16..7aa402b20 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -20,11 +20,11 @@ import { Suspense, use, useEffect, useMemo, useRef, useState } from 'react'; import PageWrapper from '../../../components/PageWrapper'; import { asset } from '../../../core/blitzkrieg/asset'; import { + BlitzkriegTankDefinition, TANK_ICONS, TANK_ICONS_COLLECTOR, TANK_ICONS_PREMIUM, TIER_ROMAN_NUMERALS, - TankDefinition, tanksDefinitionsArray, } from '../../../core/blitzkrieg/definitions/tanks'; import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; @@ -125,7 +125,7 @@ export default function Page() { 'name', 'name_short', 'id', - ] satisfies (keyof TankDefinition)[], + ] satisfies (keyof BlitzkriegTankDefinition)[], }).map(({ obj }) => obj), ); } diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 22526695f..00fb6f345 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -10,8 +10,8 @@ import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; import resolveTankName from '../core/blitz/resolveTankName'; import { + BlitzkriegTankDefinition, TIER_ROMAN_NUMERALS, - TankDefinition, Tier, tankDefinitions, } from '../core/blitzkrieg/definitions/tanks'; @@ -48,7 +48,7 @@ export const ownedTanksCommand: CommandRegistry = { ) ).filter((tank) => tank.tankDefinitions?.tier === tier); const clanAccountInfo = await getClanAccountInfo(server, id, ['clan']); - const groupedTanks: Record = {}; + const groupedTanks: Record = {}; const nations: string[] = []; filteredTanks.forEach((tank) => { diff --git a/src/core/blitz/readXMLDVPL.ts b/src/core/blitz/readXMLDVPL.ts index b40031619..9ace498ad 100644 --- a/src/core/blitz/readXMLDVPL.ts +++ b/src/core/blitz/readXMLDVPL.ts @@ -5,5 +5,5 @@ export async function readXMLDVPL(file: string) { const parser = new XMLParser(); const xml = await readStringDVPL(file); - return parser.parse(xml).root as Type; + return parser.parse(xml) as Type; } diff --git a/src/core/blitz/toUniqueId.ts b/src/core/blitz/toUniqueId.ts new file mode 100644 index 000000000..53eb45c6f --- /dev/null +++ b/src/core/blitz/toUniqueId.ts @@ -0,0 +1,5 @@ +import { NATION_IDS } from '../../constants/nations'; + +export function toUniqueId(nation: string, id: number) { + return (id << 8) + (NATION_IDS[nation] << 4) + 1; +} diff --git a/src/core/blitzkrieg/definitions/guns.ts b/src/core/blitzkrieg/definitions/guns.ts new file mode 100644 index 000000000..182c883bb --- /dev/null +++ b/src/core/blitzkrieg/definitions/guns.ts @@ -0,0 +1,8 @@ +export interface BlitzkriegGunDefinition { + id: number; + name: string; + tier: number; + pitch: [number, number]; +} + +export type BlitzkriegGunDefinitions = Record; diff --git a/src/core/blitzkrieg/definitions/tanks.ts b/src/core/blitzkrieg/definitions/tanks.ts index 801e1ac27..c9ca0f57c 100644 --- a/src/core/blitzkrieg/definitions/tanks.ts +++ b/src/core/blitzkrieg/definitions/tanks.ts @@ -2,27 +2,31 @@ import { deburr } from 'lodash'; import { TankType, TreeTypeString } from '../../../components/Tanks'; import { asset } from '../asset'; -export interface TankDefinition { +export interface BlitzkriegTankDefinition { id: number; nation: string; name: string; - name_short?: string; tree_type: TreeTypeString; tier: Tier; type: TankType; testing?: boolean; + turrets: number[]; } - -export type TankDefinitions = Record; +export type BlitzkriegTankDefinitions = Record< + number, + BlitzkriegTankDefinition +>; export const tankDefinitions = fetch(asset('definitions/tanks.json'), { cache: 'no-cache', -}).then(async (response) => response.json() as Promise); +}).then( + async (response) => response.json() as Promise, +); -const entries = new Promise(async (resolve) => { +const entries = new Promise(async (resolve) => { resolve(Object.entries(await tankDefinitions).map(([, entry]) => entry)); }); -export const tanksDefinitionsArray = new Promise( +export const tanksDefinitionsArray = new Promise( async (resolve) => { resolve((await entries).map((entry) => entry)); }, diff --git a/src/core/blitzkrieg/definitions/turrets.ts b/src/core/blitzkrieg/definitions/turrets.ts new file mode 100644 index 000000000..48bb6c050 --- /dev/null +++ b/src/core/blitzkrieg/definitions/turrets.ts @@ -0,0 +1,12 @@ +export interface BlitzkriegTurretDefinition { + id: number; + name: string; + tier: number; + yaw: [number, number]; + guns: number[]; +} + +export type BlitzkriegTurretDefinitions = Record< + number, + BlitzkriegTurretDefinition +>; From dabeab8612d8279daf78c863cb147bf58cb4f0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 14:14:26 -0600 Subject: [PATCH 70/74] feat: gun defs --- scripts/buildAssets.ts | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index a9c8fa8ec..1fe8ea164 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -52,6 +52,8 @@ interface GunDefinitionsList { tags: string; level: number; pitchLimits: string; + burst?: { count: number; rate: number }; + clip?: { count: number; rate: number }; }; }; } @@ -149,9 +151,27 @@ if (allTargets || targets?.includes('definitions')) { (turretKey) => { const turret = tankDefinition.root.turrets0[turretKey]; const turretId = toUniqueId(nation, turretList.root.ids[turretKey]); - const turretGuns = Object.keys(turret.guns).map((gunKey) => - toUniqueId(nation, gunList.root.ids[gunKey]), - ); + const turretGuns = Object.keys(turret.guns).map((gunKey) => { + const turretGunEntry = turret.guns[gunKey]; + const gunId = toUniqueId(nation, gunList.root.ids[gunKey]); + const gun = gunList.root.shared[gunKey]; + const pitchLimitsRaw = + turretGunEntry.pitchLimits ?? gun.pitchLimits; + + gunDefinitions[gunId] = { + id: gunId, + pitch: (typeof pitchLimitsRaw === 'string' + ? pitchLimitsRaw + : pitchLimitsRaw.at(-1)! + ) + .split(' ') + .map(Number) as [number, number], + name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '), + tier: gun.level, + }; + + return gunId; + }); turretDefinitions[turretId] = { id: turretId, @@ -163,7 +183,7 @@ if (allTargets || targets?.includes('definitions')) { tier: turret.level, yaw: (typeof turret.yawLimits === 'string' ? turret.yawLimits - : turret.yawLimits[0] + : turret.yawLimits.at(-1)! ) .split(' ') .map(Number) as [number, number], @@ -194,18 +214,6 @@ if (allTargets || targets?.includes('definitions')) { turrets: tankTurrets, }; } - - Object.keys(gunList.root.ids).forEach((gunKey) => { - const gun = gunList.root.shared[gunKey]; - const gunId = toUniqueId(nation, gunList.root.ids[gunKey]); - - gunDefinitions[gunId] = { - id: gunId, - name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '), - tier: gun.level, - pitch: gun.pitchLimits.split(' ').map(Number) as [number, number], - }; - }); }), ); From dcc3ab6e4e618f3986ef1fb4bab7d80343edb83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 15:12:09 -0600 Subject: [PATCH 71/74] feat: module ui --- .vscode/settings.json | 1 + scripts/buildAssets.ts | 125 ++++++++++++++----- src/app/tools/tankopedia/[id]/page.tsx | 132 ++++++++------------- src/app/tools/tankopedia/page.tsx | 11 +- src/core/blitzkrieg/definitions/guns.ts | 9 ++ src/core/blitzkrieg/definitions/shells.ts | 25 ++++ src/core/blitzkrieg/definitions/turrets.ts | 8 ++ 7 files changed, 191 insertions(+), 120 deletions(-) create mode 100644 src/core/blitzkrieg/definitions/shells.ts diff --git a/.vscode/settings.json b/.vscode/settings.json index aa8b0487b..f508f0801 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,6 +4,7 @@ "Abhi", "accountinfo", "alphatest", + "apcr", "bepaint", "BINORMAL", "blitzstars", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 1fe8ea164..8131fb517 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -13,6 +13,10 @@ import commitMultipleFiles, { FileChange, } from '../src/core/blitzkrieg/commitMultipleFiles'; import { BlitzkriegGunDefinitions } from '../src/core/blitzkrieg/definitions/guns'; +import { + BlitzkriegShellDefinitions, + ShellType, +} from '../src/core/blitzkrieg/definitions/shells'; import { BlitzkriegTankDefinitions, Tier, @@ -54,9 +58,35 @@ interface GunDefinitionsList { pitchLimits: string; burst?: { count: number; rate: number }; clip?: { count: number; rate: number }; + shots: { + [key: string]: { + speed: number; + piercingPower: string; + }; + }; }; }; } +type ShellKind = + | 'ARMOR_PIERCING' + | 'ARMOR_PIERCING_CR' + | 'HIGH_EXPLOSIVE' + | 'HOLLOW_CHARGE'; +type ShellDefinitionsList = Record< + string, + { + id: number; + userString: string; + icon: string; + kind: ShellKind; + caliber: number; + damage: { armor: number; devices: number }; + normalizationAngle: number; + ricochetAngle: number; + } +> & { + icons: Record; +}; interface VehicleDefinitions { turrets0: { [key: string]: { @@ -90,6 +120,12 @@ const blitzTankTypeToBlitzkrieg: Record = { mediumTank: 'medium', heavyTank: 'heavy', }; +const blitzShellKindToBLitzkrieg: Record = { + ARMOR_PIERCING: 'ap', + ARMOR_PIERCING_CR: 'apcr', + HIGH_EXPLOSIVE: 'he', + HOLLOW_CHARGE: 'heat', +}; const DATA = 'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data'; const LANGUAGE = 'en'; @@ -117,6 +153,7 @@ if (allTargets || targets?.includes('definitions')) { const tankDefinitions: BlitzkriegTankDefinitions = {}; const turretDefinitions: BlitzkriegTurretDefinitions = {}; const gunDefinitions: BlitzkriegGunDefinitions = {}; + const shellDefinitions: BlitzkriegShellDefinitions = {}; const nations = await readdir(`${DATA}/${DOI.vehicleDefinitions}`).then( (nations) => nations.filter((nation) => nation !== 'common'), ); @@ -139,6 +176,11 @@ if (allTargets || targets?.includes('definitions')) { }>( `${DATA}/${DOI.vehicleDefinitions}/${nation}/components/guns.xml.dvpl`, ); + const shellList = await readXMLDVPL<{ + root: ShellDefinitionsList; + }>( + `${DATA}/${DOI.vehicleDefinitions}/${nation}/components/shells.xml.dvpl`, + ); for (const tankKey in tankList.root) { const tank = tankList.root[tankKey]; @@ -157,6 +199,28 @@ if (allTargets || targets?.includes('definitions')) { const gun = gunList.root.shared[gunKey]; const pitchLimitsRaw = turretGunEntry.pitchLimits ?? gun.pitchLimits; + const gunShells = Object.keys(gun.shots).map((shellKey) => { + const turretShellEntry = gun.shots[shellKey]; + const shell = shellList.root[shellKey]; + const shellId = toUniqueId(nation, shell.id); + + shellDefinitions[shellId] = { + id: shellId, + name: + strings[shell.userString] ?? shellKey.replaceAll('_', ' '), + speed: turretShellEntry.speed, + damage: { + armor: shell.damage.armor, + devices: shell.damage.devices, + }, + caliber: shell.caliber, + normalization: shell.normalizationAngle, + ricochet: shell.ricochetAngle, + type: blitzShellKindToBLitzkrieg[shell.kind], + }; + + return shellId; + }); gunDefinitions[gunId] = { id: gunId, @@ -168,6 +232,7 @@ if (allTargets || targets?.includes('definitions')) { .map(Number) as [number, number], name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '), tier: gun.level, + shells: gunShells, }; return gunId; @@ -217,35 +282,37 @@ if (allTargets || targets?.includes('definitions')) { }), ); - // rmSync('dist/definitions', { force: true, recursive: true }); - // mkdirSync('dist/definitions', { recursive: true }); - // writeFile( - // 'dist/definitions/tanks.json', - // JSON.stringify(tankDefinitions, null, 2), - // ); - // writeFile( - // 'dist/definitions/turrets.json', - // JSON.stringify(turretDefinitions, null, 2), - // ); - // writeFile( - // 'dist/definitions/guns.json', - // JSON.stringify(gunDefinitions, null, 2), - // ); - // console.log('Committing tank definitions...'); - // await commitMultipleFiles( - // 'tresabhi', - // 'blitzkrieg-assets', - // 'main', - // 'tank definitions', - // [ - // { - // content: JSON.stringify(tankDefinitions), - // encoding: 'utf-8', - // path: 'definitions/tanks.json', - // }, - // ], - // true, - // ); + console.log('Committing tank definitions...'); + await commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'definitions', + [ + { + content: JSON.stringify(tankDefinitions), + encoding: 'utf-8', + path: 'definitions/tanks.json', + }, + { + content: JSON.stringify(turretDefinitions), + encoding: 'utf-8', + path: 'definitions/turrets.json', + }, + { + content: JSON.stringify(gunDefinitions), + encoding: 'utf-8', + path: 'definitions/guns.json', + }, + { + content: JSON.stringify(shellDefinitions), + encoding: 'utf-8', + path: 'definitions/shells.json', + }, + ], + + true, + ); } if ( diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index 82a3411a5..653a39875 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -1,107 +1,75 @@ 'use client'; -import { Checkbox, Flex, Heading } from '@radix-ui/themes'; -import { OrbitControls } from '@react-three/drei'; -import { Canvas } from '@react-three/fiber'; -import { use, useState } from 'react'; -import { - BufferAttribute, - BufferGeometry, - Mesh, - MeshStandardMaterial, - Vector3Tuple, -} from 'three'; -import model from '../../../../../test.json'; +import { Button, Flex, Heading } from '@radix-ui/themes'; +import { use, useEffect, useState } from 'react'; import { Flag } from '../../../../components/Flag'; import PageWrapper from '../../../../components/PageWrapper'; +import { gunDefinitions } from '../../../../core/blitzkrieg/definitions/guns'; +import { shellDefinitions } from '../../../../core/blitzkrieg/definitions/shells'; import { tankDefinitions } from '../../../../core/blitzkrieg/definitions/tanks'; +import { turretDefinitions } from '../../../../core/blitzkrieg/definitions/turrets'; const SIZE = 0.05; export default function Page({ params }: { params: { id: string } }) { const id = parseInt(params.id); const awaitedTankDefinitions = use(tankDefinitions); - const definition = awaitedTankDefinitions[id]; - const [display, setDisplay] = useState(model.map(() => true)); + const awaitedTurretDefinitions = use(turretDefinitions); + const awaitedGunDefinitions = use(gunDefinitions); + const awaitedShellDefinitions = use(shellDefinitions); + const tank = awaitedTankDefinitions[id]; + const [turret, setTurret] = useState( + awaitedTurretDefinitions[tank.turrets[0]], + ); + const [gun, setGun] = useState(awaitedGunDefinitions[turret.guns[0]]); + const [shell, setShell] = useState(awaitedShellDefinitions[gun.shells[0]]); + + useEffect(() => setGun(awaitedGunDefinitions[turret.guns[0]]), [turret]); + useEffect(() => setShell(awaitedShellDefinitions[gun.shells[0]]), [gun]); return ( - - {definition.name} + + {tank.name} - - + + Turrets - - + {tank.turrets.map((turretId) => ( + + ))} + - - {(model as { vertices: Vector3Tuple[]; indices: number[] }[]).map( - ({ vertices, indices }, index) => { - const geometry = new BufferGeometry(); - const verticesArray = new Float32Array(vertices.flat()); - const positionAttribute = new BufferAttribute(verticesArray, 3); - const indexAttribute = new BufferAttribute( - new Uint16Array(indices), - 1, - ); - const material = new MeshStandardMaterial({ - color: 'white', - metalness: 0.75, - // roughness: 0.2, - }); + + Guns - geometry - .setAttribute('position', positionAttribute) - .setIndex(indexAttribute) - .computeVertexNormals(); + {turret.guns.map((gunId) => ( + + ))} + - return display[index] ? ( - { - event.stopPropagation(); - ( - (event.object as Mesh).material as MeshStandardMaterial - ).color.set('red'); - }} - onPointerOut={(event) => { - event.stopPropagation(); - ( - (event.object as Mesh).material as MeshStandardMaterial - ).color.set('white'); - }} - onClick={(event) => { - event.stopPropagation(); - const newDisplay = [...display]; - newDisplay[index] = !newDisplay[index]; - setDisplay(newDisplay); - }} - /> - ) : null; - }, - )} - - + + Shells - - {model.map((group, index) => ( - { - const newDisplay = [...display]; - newDisplay[index] = value as boolean; - setDisplay(newDisplay); - }} - /> + {gun.shells.map((shellId) => ( + ))} diff --git a/src/app/tools/tankopedia/page.tsx b/src/app/tools/tankopedia/page.tsx index 7aa402b20..e99ec392b 100644 --- a/src/app/tools/tankopedia/page.tsx +++ b/src/app/tools/tankopedia/page.tsx @@ -74,11 +74,7 @@ export default function Page() { diff = a.tier - b.tier; } if (tankopediaState.sort.by === 'name') { - diff = ( - a.name_short ?? - a.name ?? - `Unknown tank ${a.id}` - ).localeCompare(b.name_short ?? b.name ?? `Unknown tank ${b.id}`); + diff = a.name.localeCompare(b.name); } return tankopediaState.sort.direction === 'ascending' ? diff : -diff; @@ -123,7 +119,6 @@ export default function Page() { go(event.target.value, searchableTanks, { keys: [ 'name', - 'name_short', 'id', ] satisfies (keyof BlitzkriegTankDefinition)[], }).map(({ obj }) => obj), @@ -307,9 +302,7 @@ export default function Page() { overflow: 'hidden', }} > - {tank.name_short ?? - tank.name ?? - `Unknown tank ${tank.id}`} + {tank.name}
diff --git a/src/core/blitzkrieg/definitions/guns.ts b/src/core/blitzkrieg/definitions/guns.ts index 182c883bb..f540645b7 100644 --- a/src/core/blitzkrieg/definitions/guns.ts +++ b/src/core/blitzkrieg/definitions/guns.ts @@ -1,8 +1,17 @@ +import { asset } from '../asset'; + export interface BlitzkriegGunDefinition { id: number; name: string; tier: number; pitch: [number, number]; + shells: number[]; } export type BlitzkriegGunDefinitions = Record; + +export const gunDefinitions = fetch(asset('definitions/guns.json'), { + cache: 'no-cache', +}).then( + async (response) => response.json() as Promise, +); diff --git a/src/core/blitzkrieg/definitions/shells.ts b/src/core/blitzkrieg/definitions/shells.ts new file mode 100644 index 000000000..03e6ffadd --- /dev/null +++ b/src/core/blitzkrieg/definitions/shells.ts @@ -0,0 +1,25 @@ +import { asset } from '../asset'; + +export type ShellType = 'ap' | 'apcr' | 'he' | 'heat'; + +export interface BlitzkriegShellDefinition { + id: number; + name: string; + speed: number; + damage: { armor: number; devices: number }; + caliber: number; + normalization: number; + ricochet: number; + type: ShellType; +} + +export type BlitzkriegShellDefinitions = Record< + number, + BlitzkriegShellDefinition +>; + +export const shellDefinitions = fetch(asset('definitions/shells.json'), { + cache: 'no-cache', +}).then( + async (response) => response.json() as Promise, +); diff --git a/src/core/blitzkrieg/definitions/turrets.ts b/src/core/blitzkrieg/definitions/turrets.ts index 48bb6c050..a1871850c 100644 --- a/src/core/blitzkrieg/definitions/turrets.ts +++ b/src/core/blitzkrieg/definitions/turrets.ts @@ -1,3 +1,5 @@ +import { asset } from '../asset'; + export interface BlitzkriegTurretDefinition { id: number; name: string; @@ -10,3 +12,9 @@ export type BlitzkriegTurretDefinitions = Record< number, BlitzkriegTurretDefinition >; + +export const turretDefinitions = fetch(asset('definitions/turrets.json'), { + cache: 'no-cache', +}).then( + async (response) => response.json() as Promise, +); From 8a2dc24f7e78cf5ab95d16195ae4d9ac60b6ad24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 16:40:22 -0600 Subject: [PATCH 72/74] feat: more ui --- src/app/tools/tankopedia/[id]/page.tsx | 233 +++++++++++++++++---- src/core/blitzkrieg/definitions/guns.ts | 3 +- src/core/blitzkrieg/definitions/turrets.ts | 3 +- 3 files changed, 197 insertions(+), 42 deletions(-) diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index 653a39875..eda2de3c6 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -1,12 +1,32 @@ 'use client'; -import { Button, Flex, Heading } from '@radix-ui/themes'; +import { ArrowLeftIcon } from '@radix-ui/react-icons'; +import { + AspectRatio, + Button, + Card, + Checkbox, + Flex, + Heading, + Inset, + Select, + Slider, + Text, + Theme, + Tooltip, +} from '@radix-ui/themes'; +import { OrbitControls } from '@react-three/drei'; +import { Canvas } from '@react-three/fiber'; +import Link from 'next/link'; import { use, useEffect, useState } from 'react'; import { Flag } from '../../../../components/Flag'; import PageWrapper from '../../../../components/PageWrapper'; import { gunDefinitions } from '../../../../core/blitzkrieg/definitions/guns'; import { shellDefinitions } from '../../../../core/blitzkrieg/definitions/shells'; -import { tankDefinitions } from '../../../../core/blitzkrieg/definitions/tanks'; +import { + TIER_ROMAN_NUMERALS, + tankDefinitions, +} from '../../../../core/blitzkrieg/definitions/tanks'; import { turretDefinitions } from '../../../../core/blitzkrieg/definitions/turrets'; const SIZE = 0.05; @@ -22,55 +42,188 @@ export default function Page({ params }: { params: { id: string } }) { awaitedTurretDefinitions[tank.turrets[0]], ); const [gun, setGun] = useState(awaitedGunDefinitions[turret.guns[0]]); - const [shell, setShell] = useState(awaitedShellDefinitions[gun.shells[0]]); + const [crew, setCrew] = useState(100); useEffect(() => setGun(awaitedGunDefinitions[turret.guns[0]]), [turret]); - useEffect(() => setShell(awaitedShellDefinitions[gun.shells[0]]), [gun]); return ( - - - {tank.name} - + + + + + + + Back to tankopedia + + - - Turrets + + {tank.name} + + + - {tank.turrets.map((turretId) => ( - - ))} - + + + + event.preventDefault()}> + - - Guns + + - {turret.guns.map((gunId) => ( - - ))} - + + + + + + - - Shells + + + Enhanced armor + + + - {gun.shells.map((shellId) => ( - - ))} + + + + Versus + + + + + + XM66F + + + + + + + Calibrated shells + + + + + + + + + + + + + Build + + + + Modules + + + + + {tank.turrets.map((turretId) => { + const thisTurret = awaitedTurretDefinitions[turretId]; + + return ( + + + + ); + })} + + + + {turret.guns.map((gunId, index) => { + const thisGun = awaitedGunDefinitions[gunId]; + + return ( + + + + ); + })} + + + + + + + + Crew + + + + {crew}% + + setCrew(crew)} + /> + + + + + + Shells + + {gun.shells.map((shellId) => { + const shell = awaitedShellDefinitions[shellId]; + + return ( + + {shell.name} ({shell.type}): {shell.damage.armor} + + ); + })} + ); diff --git a/src/core/blitzkrieg/definitions/guns.ts b/src/core/blitzkrieg/definitions/guns.ts index f540645b7..4de669219 100644 --- a/src/core/blitzkrieg/definitions/guns.ts +++ b/src/core/blitzkrieg/definitions/guns.ts @@ -1,9 +1,10 @@ import { asset } from '../asset'; +import { Tier } from './tanks'; export interface BlitzkriegGunDefinition { id: number; name: string; - tier: number; + tier: Tier; pitch: [number, number]; shells: number[]; } diff --git a/src/core/blitzkrieg/definitions/turrets.ts b/src/core/blitzkrieg/definitions/turrets.ts index a1871850c..7399a09c3 100644 --- a/src/core/blitzkrieg/definitions/turrets.ts +++ b/src/core/blitzkrieg/definitions/turrets.ts @@ -1,9 +1,10 @@ import { asset } from '../asset'; +import { Tier } from './tanks'; export interface BlitzkriegTurretDefinition { id: number; name: string; - tier: number; + tier: Tier; yaw: [number, number]; guns: number[]; } From f8f88ff8f2886c400dc24abc156fc2ac9499c291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Tue, 12 Dec 2023 18:11:55 -0600 Subject: [PATCH 73/74] fix: types --- scripts/buildAssets.ts | 4 ++-- src/app/embeds/session/page.tsx | 4 +--- src/commands/breakdown.tsx | 3 +-- src/commands/ownedTanks.tsx | 5 ++--- src/core/blitz/resolveTankName.ts | 8 -------- src/core/blitzkrieg/filtersToDescription.ts | 10 +++++++--- 6 files changed, 13 insertions(+), 21 deletions(-) delete mode 100644 src/core/blitz/resolveTankName.ts diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 8131fb517..6a31a04b9 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -231,7 +231,7 @@ if (allTargets || targets?.includes('definitions')) { .split(' ') .map(Number) as [number, number], name: strings[gun.userString] ?? gunKey.replaceAll('_', ' '), - tier: gun.level, + tier: gun.level as Tier, shells: gunShells, }; @@ -245,7 +245,7 @@ if (allTargets || targets?.includes('definitions')) { turretKey .replaceAll('_', ' ') .replace(/^(Turret ([0-9] )?)+/, ''), - tier: turret.level, + tier: turret.level as Tier, yaw: (typeof turret.yawLimits === 'string' ? turret.yawLimits : turret.yawLimits.at(-1)! diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 181b7e999..279652aee 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -299,9 +299,7 @@ export default function SessionPage() { key={stats.tank_id} minimized={!session.showCareer} title={ - tankDefinitions?.name_short ?? - tankDefinitions?.name ?? - `Unknown tank ${stats.tank_id}` + tankDefinitions?.name ?? `Unknown tank ${stats.tank_id}` } type="tank" tankType={tankDefinitions?.type} diff --git a/src/commands/breakdown.tsx b/src/commands/breakdown.tsx index bd843f41e..fe05523db 100644 --- a/src/commands/breakdown.tsx +++ b/src/commands/breakdown.tsx @@ -8,7 +8,6 @@ import { AllStats, getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; -import resolveTankName from '../core/blitz/resolveTankName'; import { tankDefinitions } from '../core/blitzkrieg/definitions/tanks'; import { filtersToDescription } from '../core/blitzkrieg/filtersToDescription'; import { getBlitzStarsLinkButton } from '../core/blitzstars/getBlitzStarsLinkButton'; @@ -195,7 +194,7 @@ async function render( type="tank" tankType={tankDefinition?.type} treeType={tankDefinition ? await getTreeType(id) : undefined} - title={await resolveTankName(id)} + title={awaitedTankDefinitions[id].name} stats={[ { title: 'Battles', diff --git a/src/commands/ownedTanks.tsx b/src/commands/ownedTanks.tsx index 00fb6f345..e92e628bf 100644 --- a/src/commands/ownedTanks.tsx +++ b/src/commands/ownedTanks.tsx @@ -8,7 +8,6 @@ import { getAccountInfo } from '../core/blitz/getAccountInfo'; import { getClanAccountInfo } from '../core/blitz/getClanAccountInfo'; import getTankStats from '../core/blitz/getTankStats'; import getTreeType from '../core/blitz/getTreeType'; -import resolveTankName from '../core/blitz/resolveTankName'; import { BlitzkriegTankDefinition, TIER_ROMAN_NUMERALS, @@ -96,7 +95,7 @@ export const ownedTanksCommand: CommandRegistry = { leftColumn.map(async (tank) => ( ( Date: Tue, 12 Dec 2023 23:35:08 -0600 Subject: [PATCH 74/74] feat: shell icons and modes --- .vscode/settings.json | 1 + next.config.js | 2 +- package.json | 2 + scripts/buildAssets.ts | 59 +- src/app/tools/tankopedia/[id]/page.tsx | 136 +- .../tankopedia/{page.css.tsx => page.css.ts} | 15 + src/core/blitzkrieg/definitions/shells.ts | 3 +- yarn.lock | 1531 ++++++++++------- 8 files changed, 1110 insertions(+), 639 deletions(-) rename src/app/tools/tankopedia/{page.css.tsx => page.css.ts} (80%) diff --git a/.vscode/settings.json b/.vscode/settings.json index f508f0801..4482684a6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,6 +5,7 @@ "accountinfo", "alphatest", "apcr", + "atgm", "bepaint", "BINORMAL", "blitzstars", diff --git a/next.config.js b/next.config.js index 4f8efe754..1bb819616 100644 --- a/next.config.js +++ b/next.config.js @@ -1,6 +1,6 @@ import { createVanillaExtractPlugin } from '@vanilla-extract/next-plugin'; -const withVanillaExtract = createVanillaExtractPlugin(); +const withVanillaExtract = createVanillaExtractPlugin({ tests: /\.css$/ }); /** @type {import('next').NextConfig} */ const nextConfig = { diff --git a/package.json b/package.json index b39449a90..7e07d52c1 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "dotenv": "^16.3.1", "esbuild": "^0.19.3", "express": "^4.18.2", + "false": "^0.0.4", "fuzzysort": "^2.0.4", "immer": "^10.0.2", "js-yaml": "^4.1.0", @@ -55,6 +56,7 @@ "react-dom": "^18.2.0", "react-fuzzysort": "^1.0.1", "satori": "^0.10.8", + "sharp": "^0.33.0", "three": "^0.159.0", "vite-node": "^0.34.5", "vitepress": "^1.0.0-rc.20", diff --git a/scripts/buildAssets.ts b/scripts/buildAssets.ts index 6a31a04b9..28698f753 100644 --- a/scripts/buildAssets.ts +++ b/scripts/buildAssets.ts @@ -2,10 +2,13 @@ import { config } from 'dotenv'; import { existsSync } from 'fs'; import { mkdir, readdir, rm } from 'fs/promises'; import { argv } from 'process'; +import sharp from 'sharp'; import { TankType } from '../src/components/Tanks'; import { NATION_IDS } from '../src/constants/nations'; import { SCPGStream } from '../src/core/blitz/SCPGStream'; import { readBase64DVPL } from '../src/core/blitz/readBase64DVPL'; +import { readDVPLFile } from '../src/core/blitz/readDVPLFile'; +import { readStringDVPL } from '../src/core/blitz/readStringDVPL'; import { readXMLDVPL } from '../src/core/blitz/readXMLDVPL'; import { readYAMLDVPL } from '../src/core/blitz/readYAMLDVPL'; import { toUniqueId } from '../src/core/blitz/toUniqueId'; @@ -122,9 +125,9 @@ const blitzTankTypeToBlitzkrieg: Record = { }; const blitzShellKindToBLitzkrieg: Record = { ARMOR_PIERCING: 'ap', - ARMOR_PIERCING_CR: 'apcr', + ARMOR_PIERCING_CR: 'ap_cr', HIGH_EXPLOSIVE: 'he', - HOLLOW_CHARGE: 'heat', + HOLLOW_CHARGE: 'hc', }; const DATA = 'C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz/Data'; @@ -137,6 +140,7 @@ const DOI = { bigIcons: 'Gfx/UI/BigTankIcons', flags: 'Gfx/Lobby/flags', '3d': '3d', + bigShellIcons: 'Gfx/Shared/tank-supply/ammunition/big', }; const allTargets = argv.includes('--all-targets'); @@ -217,6 +221,7 @@ if (allTargets || targets?.includes('definitions')) { normalization: shell.normalizationAngle, ricochet: shell.ricochetAngle, type: blitzShellKindToBLitzkrieg[shell.kind], + icon: shell.icon, }; return shellId; @@ -487,3 +492,53 @@ if (allTargets || targets?.includes('tankModels')) { }), ); } + +if (allTargets || targets?.includes('shellIcons')) { + console.log('Building shell icons...'); + + const image = sharp( + await readDVPLFile( + `${DATA}/${DOI.bigShellIcons}/texture0.packed.webp.dvpl`, + ), + ); + + const changes = await Promise.all( + (await readdir(`${DATA}/${DOI.bigShellIcons}`)) + .filter((file) => file.endsWith('_l.txt.dvpl')) + .map(async (file) => { + const name = file.match(/(.+)_l\.txt\.dvpl/)![1]; + const sizes = ( + await readStringDVPL(`${DATA}/${DOI.bigShellIcons}/${file}`) + ) + .split('\n')[4] + .split(' ') + .map(Number); + + return { + content: ( + await image + .clone() + .extract({ + left: sizes[0], + top: sizes[1], + width: sizes[2], + height: sizes[3], + }) + .toBuffer() + ).toString('base64'), + encoding: 'base64', + path: `shells/${name}.webp`, + } satisfies FileChange; + }), + ); + + console.log('Committing shell icons...'); + commitMultipleFiles( + 'tresabhi', + 'blitzkrieg-assets', + 'main', + 'shell icons', + changes, + true, + ); +} diff --git a/src/app/tools/tankopedia/[id]/page.tsx b/src/app/tools/tankopedia/[id]/page.tsx index eda2de3c6..ebbedfb6a 100644 --- a/src/app/tools/tankopedia/[id]/page.tsx +++ b/src/app/tools/tankopedia/[id]/page.tsx @@ -1,16 +1,15 @@ 'use client'; -import { ArrowLeftIcon } from '@radix-ui/react-icons'; +import { ArrowLeftIcon, CaretRightIcon } from '@radix-ui/react-icons'; import { - AspectRatio, Button, Card, Checkbox, + Dialog, Flex, Heading, - Inset, - Select, Slider, + Tabs, Text, Theme, Tooltip, @@ -21,19 +20,23 @@ import Link from 'next/link'; import { use, useEffect, useState } from 'react'; import { Flag } from '../../../../components/Flag'; import PageWrapper from '../../../../components/PageWrapper'; +import { asset } from '../../../../core/blitzkrieg/asset'; import { gunDefinitions } from '../../../../core/blitzkrieg/definitions/guns'; import { shellDefinitions } from '../../../../core/blitzkrieg/definitions/shells'; import { TIER_ROMAN_NUMERALS, tankDefinitions, + tanksDefinitionsArray, } from '../../../../core/blitzkrieg/definitions/tanks'; import { turretDefinitions } from '../../../../core/blitzkrieg/definitions/turrets'; +import * as styles from '../page.css'; -const SIZE = 0.05; +type Mode = 'model' | 'armor'; export default function Page({ params }: { params: { id: string } }) { const id = parseInt(params.id); const awaitedTankDefinitions = use(tankDefinitions); + const awaitedTanksDefinitionsArray = use(tanksDefinitionsArray); const awaitedTurretDefinitions = use(turretDefinitions); const awaitedGunDefinitions = use(gunDefinitions); const awaitedShellDefinitions = use(shellDefinitions); @@ -43,6 +46,12 @@ export default function Page({ params }: { params: { id: string } }) { ); const [gun, setGun] = useState(awaitedGunDefinitions[turret.guns[0]]); const [crew, setCrew] = useState(100); + const [versusTank, setVersusTank] = useState( + awaitedTanksDefinitionsArray[0].id, + ); + const [mode, setMode] = useState('model'); + + console.log(versusTank); useEffect(() => setGun(awaitedGunDefinitions[turret.guns[0]]), [turret]); @@ -62,16 +71,24 @@ export default function Page({ params }: { params: { id: string } }) { - {tank.name} + {tank.name}
- - - + + + setMode(value as Mode)} + > + + Model + Armor + + + +
event.preventDefault()}> @@ -80,58 +97,61 @@ export default function Page({ params }: { params: { id: string } }) { - + - +
- - - Enhanced armor - -
-
- - - - - Versus - - - - - - XM66F - - - - - - - Calibrated shells - - - - - - - + {mode === 'armor' && ( + + + Enhanced armor + + )} + + {mode === 'armor' && ( + + + + Versus + + + + + + + Do something lol + + + + + + Calibrated shells + + + + + + + + + + )}
diff --git a/src/app/tools/tankopedia/page.css.tsx b/src/app/tools/tankopedia/page.css.ts similarity index 80% rename from src/app/tools/tankopedia/page.css.tsx rename to src/app/tools/tankopedia/page.css.ts index 84e4839ef..c5cc972f4 100644 --- a/src/app/tools/tankopedia/page.css.tsx +++ b/src/app/tools/tankopedia/page.css.ts @@ -40,3 +40,18 @@ export const listingImage = style({ transform: 'translate(-25%, 10%)', }, }); + +export const enhancedArmor = style({ + '@media': { + 'screen and (min-width: 400px)': { + position: 'absolute', + right: 16, + top: 16, + }, + + 'screen and (max-width: 399px)': { + // left: 16, + // bottom: 16, + }, + }, +}); diff --git a/src/core/blitzkrieg/definitions/shells.ts b/src/core/blitzkrieg/definitions/shells.ts index 03e6ffadd..77f008855 100644 --- a/src/core/blitzkrieg/definitions/shells.ts +++ b/src/core/blitzkrieg/definitions/shells.ts @@ -1,6 +1,6 @@ import { asset } from '../asset'; -export type ShellType = 'ap' | 'apcr' | 'he' | 'heat'; +export type ShellType = 'ap' | 'ap_cr' | 'hc' | 'he'; export interface BlitzkriegShellDefinition { id: number; @@ -11,6 +11,7 @@ export interface BlitzkriegShellDefinition { normalization: number; ricochet: number; type: ShellType; + icon: string; } export type BlitzkriegShellDefinitions = Record< diff --git a/yarn.lock b/yarn.lock index 3137c4c48..15dffb0cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,109 +29,109 @@ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== -"@algolia/cache-browser-local-storage@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz#357318242fc542ffce41d6eb5b4a9b402921b0bb" - integrity sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ== +"@algolia/cache-browser-local-storage@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.21.1.tgz#ecd8e6fe9a6ecbb63c9c29a9574e47315846347e" + integrity sha512-vUkac/vgj8inyGR/IgunRjTOQ6IlBwl7afFkIfUZRqbqKKXBs+A/g5wgH+UnAlCSW8wjFRAIfCzuvSRb1/qjsQ== dependencies: - "@algolia/cache-common" "4.20.0" + "@algolia/cache-common" "4.21.1" -"@algolia/cache-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.20.0.tgz#ec52230509fce891091ffd0d890618bcdc2fa20d" - integrity sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ== +"@algolia/cache-common@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.21.1.tgz#86b9f5c8b5c21b7a6479d388e04678408a449e65" + integrity sha512-HUo4fRk8KXFMyCASW0k+Kl8iXBoRPdqAjV9OVaFibTNg1dbwnpe6eIxbSTM6AJ2X82ic/8x3GuAO8zF/E515PA== -"@algolia/cache-in-memory@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz#5f18d057bd6b3b075022df085c4f83bcca4e3e67" - integrity sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg== +"@algolia/cache-in-memory@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.21.1.tgz#dfd3249c4887250fdceb76191b05ba95b94821b3" + integrity sha512-+l2pLg6yIwRaGNtv41pGF/f/e9Qk80FeYE41f4OXS9lb5vpyrxzqM5nUaffWk/ZSFrPDuw5J2E226c//tIIffA== dependencies: - "@algolia/cache-common" "4.20.0" + "@algolia/cache-common" "4.21.1" -"@algolia/client-account@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.20.0.tgz#23ce0b4cffd63100fb7c1aa1c67a4494de5bd645" - integrity sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q== +"@algolia/client-account@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.21.1.tgz#60e5225ea4b4440219030775dcb1b9bd3ad92e54" + integrity sha512-AC6SjA9n38th73gAUqcjsuxNUChpwaflaAhPL0qO9cUICN67njpQrnYaoSVZ/yx0opG5zQFRKbpEcuPGj0XjhQ== dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/client-common" "4.21.1" + "@algolia/client-search" "4.21.1" + "@algolia/transporter" "4.21.1" -"@algolia/client-analytics@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.20.0.tgz#0aa6bef35d3a41ac3991b3f46fcd0bf00d276fa9" - integrity sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug== +"@algolia/client-analytics@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.21.1.tgz#400d7defd32e8312ccdf8cd41533055f5ab4f52a" + integrity sha512-q6AxvAcBl4fNZXZsMwRRQXcsxUv0PK5eUAz/lHDvgkMWAg6cP7Fl+WIq0fHcG7cJA4EHf2sT5fV6Z+yUlf7NfA== dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/client-common" "4.21.1" + "@algolia/client-search" "4.21.1" + "@algolia/requester-common" "4.21.1" + "@algolia/transporter" "4.21.1" -"@algolia/client-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.20.0.tgz#ca60f04466515548651c4371a742fbb8971790ef" - integrity sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ== +"@algolia/client-common@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.21.1.tgz#20798c96c1d45078648bf28dfb84e50cd13a5d94" + integrity sha512-LOH7ncYwY/x7epOgxc/MIuV7m3qzl00wIjDG5/9rgImFpkV0X+D/ndJI9DmPsIx7yaTLd5xv/XYuKLcvrUR0eQ== dependencies: - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/requester-common" "4.21.1" + "@algolia/transporter" "4.21.1" -"@algolia/client-personalization@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.20.0.tgz#ca81308e8ad0db3b27458b78355f124f29657181" - integrity sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ== +"@algolia/client-personalization@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.21.1.tgz#55ed8edb8258b2f4b05bfc37d454dca9209bb106" + integrity sha512-u2CyQjHbyVwPqM5eSXd/o+rh1Pk949P/MO6s+OxyEGg6/R2YpYvmsafVZl9Q+xqT8pFaf5QygfcqlSdMUDHV5Q== dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/client-common" "4.21.1" + "@algolia/requester-common" "4.21.1" + "@algolia/transporter" "4.21.1" -"@algolia/client-search@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.20.0.tgz#3bcce817ca6caedc835e0eaf6f580e02ee7c3e15" - integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== +"@algolia/client-search@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.21.1.tgz#b08f6ccfaf404530e3e5a38e8492a635ff15153f" + integrity sha512-3KqSmMkQmF+ACY/Ms5TdcvrcK8iqgQP/N0EPnNUUP4LMUzAACpLLTdzA+AtCuc6oaz5ITtGJBVdPUljj5Jf/Lg== dependencies: - "@algolia/client-common" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/client-common" "4.21.1" + "@algolia/requester-common" "4.21.1" + "@algolia/transporter" "4.21.1" -"@algolia/logger-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.20.0.tgz#f148ddf67e5d733a06213bebf7117cb8a651ab36" - integrity sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ== +"@algolia/logger-common@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.21.1.tgz#b0979321592af12b986aea2b7ac4fc368920860f" + integrity sha512-9AyYpR2OO9vPkkDlpTtW2/6nX+RmMd7LUwzJiAF3uN+BYUiQqgXEp+oGaH8UC0dgetmK7wJO6hw4b39cnTdEpw== -"@algolia/logger-console@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.20.0.tgz#ac443d27c4e94357f3063e675039cef0aa2de0a7" - integrity sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA== +"@algolia/logger-console@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.21.1.tgz#59bdceab3d93ed478e4cb61cfe8f951cb9ef1487" + integrity sha512-9wizQiQ8kL4DiBmT82i403UwacNuv+0hpfsfaWYZQrGjpzG+yvXETWM4AgwFZLj007esuKQiGfOPUoYFZNkGGA== dependencies: - "@algolia/logger-common" "4.20.0" + "@algolia/logger-common" "4.21.1" -"@algolia/requester-browser-xhr@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz#db16d0bdef018b93b51681d3f1e134aca4f64814" - integrity sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw== +"@algolia/requester-browser-xhr@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.21.1.tgz#c841a76f64171d3b892aea16e23d819b7f6a8e0a" + integrity sha512-9NudesJLuXtRHV+JD8fTkrsdVj/oAPQbtLnxBbSQeMduzV6+a7W+G9VuWo5fwFymCdXR8/Hb6jy8D1owQIq5Gw== dependencies: - "@algolia/requester-common" "4.20.0" + "@algolia/requester-common" "4.21.1" -"@algolia/requester-common@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.20.0.tgz#65694b2263a8712b4360fef18680528ffd435b5c" - integrity sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng== +"@algolia/requester-common@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.21.1.tgz#5fd9acce9faa8b931f91b0e86e384956874c3c43" + integrity sha512-KtX2Ep3C43XxoN3xKw755cdf9enE6gPgzh6ufZQRJBl4rYCOoXbiREU6noDYX/Nq+Q+sl03V37WAp0YgtIlh9g== -"@algolia/requester-node-http@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz#b52b182b52b0b16dec4070832267d484a6b1d5bb" - integrity sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng== +"@algolia/requester-node-http@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.21.1.tgz#a39a0003e7697009da032238d2b3134a65ec9fae" + integrity sha512-EcD8cY6Bh2iMySpqXglTKU9+pt+km1ws3xF0V7CGMIUzW1HmN/ZVhi4apCBY4tEMytbyARv0XRTPsolSC4gSSw== dependencies: - "@algolia/requester-common" "4.20.0" + "@algolia/requester-common" "4.21.1" -"@algolia/transporter@4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.20.0.tgz#7e5b24333d7cc9a926b2f6a249f87c2889b944a9" - integrity sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg== +"@algolia/transporter@4.21.1": + version "4.21.1" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.21.1.tgz#ffe43fb9d03c042aed89cec793687a41278fd35e" + integrity sha512-KGLFKz8krzOWRwcbR4FT49Grh1dES/mG8dHABEojbvrfUb6kUFxkAee/aezp2GIxuNx+gpQjRn1IzOsqbUZL0A== dependencies: - "@algolia/cache-common" "4.20.0" - "@algolia/logger-common" "4.20.0" - "@algolia/requester-common" "4.20.0" + "@algolia/cache-common" "4.21.1" + "@algolia/logger-common" "4.21.1" + "@algolia/requester-common" "4.21.1" "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -149,50 +149,50 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" -"@babel/compat-data@^7.22.9": +"@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.20.7": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" - integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g== + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" + integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" - "@babel/helper-compilation-targets" "^7.22.15" + "@babel/generator" "^7.23.6" + "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.5" - "@babel/parser" "^7.23.5" + "@babel/helpers" "^7.23.6" + "@babel/parser" "^7.23.6" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" - integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== +"@babel/generator@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" + integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== dependencies: - "@babel/types" "^7.23.5" + "@babel/types" "^7.23.6" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" - integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.15" - browserslist "^4.21.9" + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" @@ -263,19 +263,19 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.15": +"@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" - integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== +"@babel/helpers@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" + integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.5" - "@babel/types" "^7.23.5" + "@babel/traverse" "^7.23.6" + "@babel/types" "^7.23.6" "@babel/highlight@^7.23.4": version "7.23.4" @@ -286,10 +286,10 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.22.15", "@babel/parser@^7.23.3", "@babel/parser@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" - integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== +"@babel/parser@^7.22.15", "@babel/parser@^7.23.5", "@babel/parser@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== "@babel/plugin-syntax-typescript@^7.20.0": version "7.23.3" @@ -299,9 +299,9 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.5.tgz#11edb98f8aeec529b82b211028177679144242db" - integrity sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w== + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" + integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== dependencies: regenerator-runtime "^0.14.0" @@ -314,26 +314,26 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" - integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== +"@babel/traverse@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" + integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" + "@babel/generator" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" + "@babel/parser" "^7.23.6" + "@babel/types" "^7.23.6" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" - integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -427,6 +427,13 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" +"@emnapi/runtime@^0.44.0": + version "0.44.0" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-0.44.0.tgz#1ef702f846cfcd559d28eb7673919087ba5b63e3" + integrity sha512-ZX/etZEZw8DR7zAB1eVQT40lNo0jeqpb6dCgOvctB6FIQ5PoXfMuNY8+ayQfu8tNQbAB8gQWSSJupR8NxeiZXw== + dependencies: + tslib "^2.4.0" + "@emotion/hash@^0.9.0": version "0.9.1" resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" @@ -467,10 +474,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.8.tgz#fb7130103835b6d43ea499c3f30cfb2b2ed58456" - integrity sha512-B8JbS61bEunhfx8kasogFENgQfr/dIp+ggYXwTqdbMAgGDhRa3AaPpQMuQU0rNxDLECj6FhDzk1cF9WHMVwrtA== +"@esbuild/android-arm64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.9.tgz#683794bdc3d27222d3eced7b74cad15979548031" + integrity sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ== "@esbuild/android-arm@0.17.6": version "0.17.6" @@ -482,10 +489,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.8.tgz#b46e4d9e984e6d6db6c4224d72c86b7757e35bcb" - integrity sha512-31E2lxlGM1KEfivQl8Yf5aYU/mflz9g06H6S15ITUFQueMFtFjESRMoDSkvMo8thYvLBax+VKTPlpnx+sPicOA== +"@esbuild/android-arm@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.9.tgz#21a4de41f07b2af47401c601d64dfdefd056c595" + integrity sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA== "@esbuild/android-x64@0.17.6": version "0.17.6" @@ -497,10 +504,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.8.tgz#a13db9441b5a4f4e4fec4a6f8ffacfea07888db7" - integrity sha512-rdqqYfRIn4jWOp+lzQttYMa2Xar3OK9Yt2fhOhzFXqg0rVWEfSclJvZq5fZslnz6ypHvVf3CT7qyf0A5pM682A== +"@esbuild/android-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.9.tgz#e2d7674bc025ddc8699f0cc76cb97823bb63c252" + integrity sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA== "@esbuild/darwin-arm64@0.17.6": version "0.17.6" @@ -512,10 +519,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.8.tgz#49f5718d36541f40dd62bfdf84da9c65168a0fc2" - integrity sha512-RQw9DemMbIq35Bprbboyf8SmOr4UXsRVxJ97LgB55VKKeJOOdvsIPy0nFyF2l8U+h4PtBx/1kRf0BelOYCiQcw== +"@esbuild/darwin-arm64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.9.tgz#ae7a582289cc5c0bac15d4b9020a90cb7288f1e9" + integrity sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw== "@esbuild/darwin-x64@0.17.6": version "0.17.6" @@ -527,10 +534,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.8.tgz#75c5c88371eea4bfc1f9ecfd0e75104c74a481ac" - integrity sha512-3sur80OT9YdeZwIVgERAysAbwncom7b4bCI2XKLjMfPymTud7e/oY4y+ci1XVp5TfQp/bppn7xLw1n/oSQY3/Q== +"@esbuild/darwin-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.9.tgz#8a216c66dcf51addeeb843d8cfaeff712821d12b" + integrity sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ== "@esbuild/freebsd-arm64@0.17.6": version "0.17.6" @@ -542,10 +549,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.8.tgz#9d7259fea4fd2b5f7437b52b542816e89d7c8575" - integrity sha512-WAnPJSDattvS/XtPCTj1tPoTxERjcTpH6HsMr6ujTT+X6rylVe8ggxk8pVxzf5U1wh5sPODpawNicF5ta/9Tmw== +"@esbuild/freebsd-arm64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.9.tgz#63d4f603e421252c3cd836b18d01545be7c6c440" + integrity sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g== "@esbuild/freebsd-x64@0.17.6": version "0.17.6" @@ -557,10 +564,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.8.tgz#abac03e1c4c7c75ee8add6d76ec592f46dbb39e3" - integrity sha512-ICvZyOplIjmmhjd6mxi+zxSdpPTKFfyPPQMQTK/w+8eNK6WV01AjIztJALDtwNNfFhfZLux0tZLC+U9nSyA5Zg== +"@esbuild/freebsd-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.9.tgz#a3db52595be65360eae4de1d1fa3c1afd942e1e4" + integrity sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA== "@esbuild/linux-arm64@0.17.6": version "0.17.6" @@ -572,10 +579,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.8.tgz#c577932cf4feeaa43cb9cec27b89cbe0df7d9098" - integrity sha512-z1zMZivxDLHWnyGOctT9JP70h0beY54xDDDJt4VpTX+iwA77IFsE1vCXWmprajJGa+ZYSqkSbRQ4eyLCpCmiCQ== +"@esbuild/linux-arm64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.9.tgz#4ae5811ce9f8d7df5eb9edd9765ea9401a534f13" + integrity sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ== "@esbuild/linux-arm@0.17.6": version "0.17.6" @@ -587,10 +594,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.8.tgz#d6014d8b98b5cbc96b95dad3d14d75bb364fdc0f" - integrity sha512-H4vmI5PYqSvosPaTJuEppU9oz1dq2A7Mr2vyg5TF9Ga+3+MGgBdGzcyBP7qK9MrwFQZlvNyJrvz6GuCaj3OukQ== +"@esbuild/linux-arm@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.9.tgz#9807e92cfd335f46326394805ad488e646e506f2" + integrity sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw== "@esbuild/linux-ia32@0.17.6": version "0.17.6" @@ -602,10 +609,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.8.tgz#2379a0554307d19ac4a6cdc15b08f0ea28e7a40d" - integrity sha512-1a8suQiFJmZz1khm/rDglOc8lavtzEMRo0v6WhPgxkrjcU0LkHj+TwBrALwoz/OtMExvsqbbMI0ChyelKabSvQ== +"@esbuild/linux-ia32@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.9.tgz#18892c10f3106652b16f9da88a0362dc95ed46c7" + integrity sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q== "@esbuild/linux-loong64@0.17.6": version "0.17.6" @@ -617,10 +624,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.8.tgz#e2a5bbffe15748b49356a6cd7b2d5bf60c5a7123" - integrity sha512-fHZWS2JJxnXt1uYJsDv9+b60WCc2RlvVAy1F76qOLtXRO+H4mjt3Tr6MJ5l7Q78X8KgCFudnTuiQRBhULUyBKQ== +"@esbuild/linux-loong64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.9.tgz#dc2ebf9a125db0a1bba18c2bbfd4fbdcbcaf61c2" + integrity sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA== "@esbuild/linux-mips64el@0.17.6": version "0.17.6" @@ -632,10 +639,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.8.tgz#1359331e6f6214f26f4b08db9b9df661c57cfa24" - integrity sha512-Wy/z0EL5qZYLX66dVnEg9riiwls5IYnziwuju2oUiuxVc+/edvqXa04qNtbrs0Ukatg5HEzqT94Zs7J207dN5Q== +"@esbuild/linux-mips64el@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.9.tgz#4c2f7c5d901015e3faf1563c4a89a50776cb07fd" + integrity sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw== "@esbuild/linux-ppc64@0.17.6": version "0.17.6" @@ -647,10 +654,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.8.tgz#9ba436addc1646dc89dae48c62d3e951ffe70951" - integrity sha512-ETaW6245wK23YIEufhMQ3HSeHO7NgsLx8gygBVldRHKhOlD1oNeNy/P67mIh1zPn2Hr2HLieQrt6tWrVwuqrxg== +"@esbuild/linux-ppc64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.9.tgz#8385332713b4e7812869622163784a5633f76fc4" + integrity sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ== "@esbuild/linux-riscv64@0.17.6": version "0.17.6" @@ -662,10 +669,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.8.tgz#fbcf0c3a0b20f40b5fc31c3b7695f0769f9de66b" - integrity sha512-T2DRQk55SgoleTP+DtPlMrxi/5r9AeFgkhkZ/B0ap99zmxtxdOixOMI570VjdRCs9pE4Wdkz7JYrsPvsl7eESg== +"@esbuild/linux-riscv64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.9.tgz#23f1db24fa761be311874f32036c06249aa20cba" + integrity sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg== "@esbuild/linux-s390x@0.17.6": version "0.17.6" @@ -677,10 +684,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.8.tgz#989e8a05f7792d139d5564ffa7ff898ac6f20a4a" - integrity sha512-NPxbdmmo3Bk7mbNeHmcCd7R7fptJaczPYBaELk6NcXxy7HLNyWwCyDJ/Xx+/YcNH7Im5dHdx9gZ5xIwyliQCbg== +"@esbuild/linux-s390x@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.9.tgz#2dffe497726b897c9f0109e774006e25b33b4fd0" + integrity sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw== "@esbuild/linux-x64@0.17.6": version "0.17.6" @@ -692,10 +699,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.8.tgz#b187295393a59323397fe5ff51e769ec4e72212b" - integrity sha512-lytMAVOM3b1gPypL2TRmZ5rnXl7+6IIk8uB3eLsV1JwcizuolblXRrc5ShPrO9ls/b+RTp+E6gbsuLWHWi2zGg== +"@esbuild/linux-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz#ceb1d62cd830724ff5b218e5d3172a8bad59420e" + integrity sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A== "@esbuild/netbsd-x64@0.17.6": version "0.17.6" @@ -707,10 +714,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.8.tgz#c1ec0e24ea82313cb1c7bae176bd5acd5bde7137" - integrity sha512-hvWVo2VsXz/8NVt1UhLzxwAfo5sioj92uo0bCfLibB0xlOmimU/DeAEsQILlBQvkhrGjamP0/el5HU76HAitGw== +"@esbuild/netbsd-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.9.tgz#0cbca65e9ef4d3fc41502d3e055e6f49479a8f18" + integrity sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug== "@esbuild/openbsd-x64@0.17.6": version "0.17.6" @@ -722,10 +729,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.8.tgz#0c5b696ac66c6d70cf9ee17073a581a28af9e18d" - integrity sha512-/7Y7u77rdvmGTxR83PgaSvSBJCC2L3Kb1M/+dmSIvRvQPXXCuC97QAwMugBNG0yGcbEGfFBH7ojPzAOxfGNkwQ== +"@esbuild/openbsd-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.9.tgz#1f57adfbee09c743292c6758a3642e875bcad1cf" + integrity sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw== "@esbuild/sunos-x64@0.17.6": version "0.17.6" @@ -737,10 +744,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.8.tgz#2a697e1f77926ff09fcc457d8f29916d6cd48fb1" - integrity sha512-9Lc4s7Oi98GqFA4HzA/W2JHIYfnXbUYgekUP/Sm4BG9sfLjyv6GKKHKKVs83SMicBF2JwAX6A1PuOLMqpD001w== +"@esbuild/sunos-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.9.tgz#116be6adbd2c7479edeeb5f6ea0441002ab4cb9c" + integrity sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw== "@esbuild/win32-arm64@0.17.6": version "0.17.6" @@ -752,10 +759,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.8.tgz#ec029e62a2fca8c071842ecb1bc5c2dd20b066f1" - integrity sha512-rq6WzBGjSzihI9deW3fC2Gqiak68+b7qo5/3kmB6Gvbh/NYPA0sJhrnp7wgV4bNwjqM+R2AApXGxMO7ZoGhIJg== +"@esbuild/win32-arm64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.9.tgz#2be22131ab18af4693fd737b161d1ef34de8ca9d" + integrity sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg== "@esbuild/win32-ia32@0.17.6": version "0.17.6" @@ -767,10 +774,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.8.tgz#cbb9a3146bde64dc15543e48afe418c7a3214851" - integrity sha512-AIAbverbg5jMvJznYiGhrd3sumfwWs8572mIJL5NQjJa06P8KfCPWZQ0NwZbPQnbQi9OWSZhFVSUWjjIrn4hSw== +"@esbuild/win32-ia32@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.9.tgz#e10ead5a55789b167b4225d2469324538768af7c" + integrity sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg== "@esbuild/win32-x64@0.17.6": version "0.17.6" @@ -782,10 +789,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.8": - version "0.19.8" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.8.tgz#c8285183dbdb17008578dbacb6e22748709b4822" - integrity sha512-bfZ0cQ1uZs2PqpulNL5j/3w+GDhP36k1K5c38QdQg+Swy51jFZWWeIkteNsufkQxp986wnqRRsb/bHbY1WQ7TA== +"@esbuild/win32-x64@0.19.9": + version "0.19.9" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.9.tgz#b2da6219b603e3fa371a78f53f5361260d0c5585" + integrity sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ== "@fastify/busboy@^2.0.0": version "2.1.0" @@ -793,9 +800,9 @@ integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== "@floating-ui/core@^1.4.2": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.1.tgz#62707d7ec585d0929f882321a1b1f4ea9c680da5" - integrity sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw== + version "1.5.2" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" + integrity sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A== dependencies: "@floating-ui/utils" "^0.1.3" @@ -819,6 +826,119 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@img/sharp-darwin-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.0.tgz#b3e4ed1887f53faca5e95e3fd9f25181432353ed" + integrity sha512-070tEheekI1LJWTGPC9WlQEa5UoKTXzzlORBHMX4TbfUxMiL336YHR8vBEUNsjse0RJCX8dZ4ZXwT595aEF1ug== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.0" + +"@img/sharp-darwin-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.0.tgz#277714bff6e6d468162146019933a416467f3082" + integrity sha512-pu/nvn152F3qbPeUkr+4e9zVvEhD3jhwzF473veQfMPkOYo9aoWXSfdZH/E6F+nYC3qvFjbxbvdDbUtEbghLqw== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.0" + +"@img/sharp-libvips-darwin-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.0.tgz#8baf27b01dabba524e885c30287e1916ab978de7" + integrity sha512-VzYd6OwnUR81sInf3alj1wiokY50DjsHz5bvfnsFpxs5tqQxESoHtJO6xyksDs3RIkyhMWq2FufXo6GNSU9BMw== + +"@img/sharp-libvips-darwin-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.0.tgz#509113f649d3ea0e99b76d41437fc0049d8ba2f9" + integrity sha512-dD9OznTlHD6aovRswaPNEy8dKtSAmNo4++tO7uuR4o5VxbVAOoEQ1uSmN4iFAdQneTHws1lkTZeiXPrcCkh6IA== + +"@img/sharp-libvips-linux-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.0.tgz#9e131cc95f9f8aa36da9addee89efead21ad9993" + integrity sha512-xTYThiqEZEZc0PRU90yVtM3KE7lw1bKdnDQ9kCTHWbqWyHOe4NpPOtMGy27YnN51q0J5dqRrvicfPbALIOeAZA== + +"@img/sharp-libvips-linux-arm@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.0.tgz#a529f68a28ab1d219907071c41ace029121d1c4f" + integrity sha512-VwgD2eEikDJUk09Mn9Dzi1OW2OJFRQK+XlBTkUNmAWPrtj8Ly0yq05DFgu1VCMx2/DqCGQVi5A1dM9hTmxf3uw== + +"@img/sharp-libvips-linux-s390x@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.0.tgz#c26aaa9ee58b47ff901bb5f93f29c4ab3f03caf7" + integrity sha512-o9E46WWBC6JsBlwU4QyU9578G77HBDT1NInd+aERfxeOPbk0qBZHgoDsQmA2v9TbqJRWzoBPx1aLOhprBMgPjw== + +"@img/sharp-libvips-linux-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.0.tgz#7a04795fbf2668b9dd7c74bf8326cb779131d809" + integrity sha512-naldaJy4hSVhWBgEjfdBY85CAa4UO+W1nx6a1sWStHZ7EUfNiuBTTN2KUYT5dH1+p/xij1t2QSXfCiFJoC5S/Q== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.0.tgz#600e7322faa5ce124d3ae2cbf63808ea47678591" + integrity sha512-OdorplCyvmSAPsoJLldtLh3nLxRrkAAAOHsGWGDYfN0kh730gifK+UZb3dWORRa6EusNqCTjfXV4GxvgJ/nPDQ== + +"@img/sharp-libvips-linuxmusl-x64@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.0.tgz#af33a04e75f192c5396c6a41df8b7b7bf15a8006" + integrity sha512-FW8iK6rJrg+X2jKD0Ajhjv6y74lToIBEvkZhl42nZt563FfxkCYacrXZtd+q/sRQDypQLzY5WdLkVTbJoPyqNg== + +"@img/sharp-linux-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.0.tgz#d9a361c1d5344754f6038cc9d74e1dd4d217f52f" + integrity sha512-dcomVSrtgF70SyOr8RCOCQ8XGVThXwe71A1d8MGA+mXEVRJ/J6/TrCbBEJh9ddcEIIsrnrkolaEvYSHqVhswQw== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.0" + +"@img/sharp-linux-arm@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.0.tgz#e0f804033d99ce2af73c78d47eeb118e28b4af41" + integrity sha512-4horD3wMFd5a0ddbDY8/dXU9CaOgHjEHALAddXgafoR5oWq5s8X61PDgsSeh4Qupsdo6ycfPPSSNBrfVQnwwrg== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.0" + +"@img/sharp-linux-s390x@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.0.tgz#4b6d49f87364c60ae015825746f365385f1c3b54" + integrity sha512-TiVJbx38J2rNVfA309ffSOB+3/7wOsZYQEOlKqOUdWD/nqkjNGrX+YQGz7nzcf5oy2lC+d37+w183iNXRZNngQ== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.0" + +"@img/sharp-linux-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.0.tgz#a4fb262f143f468aec974aad6e53d1859a75ec90" + integrity sha512-PaZM4Zi7/Ek71WgTdvR+KzTZpBqrQOFcPe7/8ZoPRlTYYRe43k6TWsf4GVH6XKRLMYeSp8J89RfAhBrSP4itNA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.0" + +"@img/sharp-linuxmusl-arm64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.0.tgz#423a9e5e3ec1e6476dbdfd78dda91c6f062bfd67" + integrity sha512-1QLbbN0zt+32eVrg7bb1lwtvEaZwlhEsY1OrijroMkwAqlHqFj6R33Y47s2XUv7P6Ie1PwCxK/uFnNqMnkd5kg== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.0" + +"@img/sharp-linuxmusl-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.0.tgz#9d0beac9a71cd7d3bc41eef63521e60edc3820f5" + integrity sha512-CecqgB/CnkvCWFhmfN9ZhPGMLXaEBXl4o7WtA6U3Ztrlh/s7FUKX4vNxpMSYLIrWuuzjiaYdfU3+Tdqh1xaHfw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.0" + +"@img/sharp-wasm32@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.0.tgz#5b085509f04256c43f201552fce5144fe0bd66b9" + integrity sha512-Hn4js32gUX9qkISlemZBUPuMs0k/xNJebUNl/L6djnU07B/HAA2KaxRVb3HvbU5fL242hLOcp0+tR+M8dvJUFw== + dependencies: + "@emnapi/runtime" "^0.44.0" + +"@img/sharp-win32-ia32@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.0.tgz#a89bc502a70e5547cbff9451d06f9962425e7b39" + integrity sha512-5HfcsCZi3l5nPRF2q3bllMVMDXBqEWI3Q8KQONfzl0TferFE5lnsIG0A1YrntMAGqvkzdW6y1Ci1A2uTvxhfzg== + +"@img/sharp-win32-x64@0.33.0": + version "0.33.0" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.0.tgz#bfae1b82608a0d420e4b0b836ddb7dd58eaffa8e" + integrity sha512-i3DtP/2ce1yKFj4OzOnOYltOEL/+dp4dc4dJXJBv6god1AFTcmkaA99H/7SwOmkCOBQkbVvA3lCGm3/5nDtf9Q== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -868,55 +988,55 @@ resolved "https://registry.yarnpkg.com/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz#a78e137018a19933b7a1d0e887d553d4ab833d10" integrity sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q== -"@next/env@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.3.tgz#9a58b296e7ae04ffebce8a4e5bd0f87f71de86bd" - integrity sha512-7xRqh9nMvP5xrW4/+L0jgRRX+HoNRGnfJpD+5Wq6/13j3dsdzxO3BCXn7D3hMqsDb+vjZnJq+vI7+EtgrYZTeA== +"@next/env@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.4.tgz#d5cda0c4a862d70ae760e58c0cd96a8899a2e49a" + integrity sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ== -"@next/swc-darwin-arm64@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.3.tgz#b1a0440ffbf69056451947c4aea5b6d887e9fbbc" - integrity sha512-64JbSvi3nbbcEtyitNn2LEDS/hcleAFpHdykpcnrstITFlzFgB/bW0ER5/SJJwUPj+ZPY+z3e+1jAfcczRLVGw== +"@next/swc-darwin-arm64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz#27b1854c2cd04eb1d5e75081a1a792ad91526618" + integrity sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg== -"@next/swc-darwin-x64@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.3.tgz#48b527ef7eb5dbdcaf62fd107bc3a78371f36f09" - integrity sha512-RkTf+KbAD0SgYdVn1XzqE/+sIxYGB7NLMZRn9I4Z24afrhUpVJx6L8hsRnIwxz3ERE2NFURNliPjJ2QNfnWicQ== +"@next/swc-darwin-x64@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz#9940c449e757d0ee50bb9e792d2600cc08a3eb3b" + integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== -"@next/swc-linux-arm64-gnu@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.3.tgz#0a36475a38b2855ab8ea0fe8b56899bc90184c0f" - integrity sha512-3tBWGgz7M9RKLO6sPWC6c4pAw4geujSwQ7q7Si4d6bo0l6cLs4tmO+lnSwFp1Tm3lxwfMk0SgkJT7EdwYSJvcg== +"@next/swc-linux-arm64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz#0eafd27c8587f68ace7b4fa80695711a8434de21" + integrity sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w== -"@next/swc-linux-arm64-musl@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.3.tgz#25328a9f55baa09fde6364e7e47ade65c655034f" - integrity sha512-v0v8Kb8j8T23jvVUWZeA2D8+izWspeyeDGNaT2/mTHWp7+37fiNfL8bmBWiOmeumXkacM/AB0XOUQvEbncSnHA== +"@next/swc-linux-arm64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz#2b0072adb213f36dada5394ea67d6e82069ae7dd" + integrity sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ== -"@next/swc-linux-x64-gnu@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.3.tgz#594b747e3c8896b2da67bba54fcf8a6b5a410e5e" - integrity sha512-VM1aE1tJKLBwMGtyBR21yy+STfl0MapMQnNrXkxeyLs0GFv/kZqXS5Jw/TQ3TSUnbv0QPDf/X8sDXuMtSgG6eg== +"@next/swc-linux-x64-gnu@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz#68c67d20ebc8e3f6ced6ff23a4ba2a679dbcec32" + integrity sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A== -"@next/swc-linux-x64-musl@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.3.tgz#a02da58fc6ecad8cf5c5a2a96a7f6030ec7f6215" - integrity sha512-64EnmKy18MYFL5CzLaSuUn561hbO1Gk16jM/KHznYP3iCIfF9e3yULtHaMy0D8zbHfxset9LTOv6cuYKJgcOxg== +"@next/swc-linux-x64-musl@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz#67cd81b42fb2caf313f7992fcf6d978af55a1247" + integrity sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw== -"@next/swc-win32-arm64-msvc@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.3.tgz#bf2be23d3ba2ebd0d4a9376a31f783efdb677b48" - integrity sha512-WRDp8QrmsL1bbGtsh5GqQ/KWulmrnMBgbnb+59qNTW1kVi1nG/2ndZLkcbs2GX7NpFLlToLRMWSQXmPzQm4tog== +"@next/swc-win32-arm64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz#be06585906b195d755ceda28f33c633e1443f1a3" + integrity sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w== -"@next/swc-win32-ia32-msvc@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.3.tgz#839f8de85a4bf2c3c69242483ab87cb916427551" - integrity sha512-EKffQeqCrj+t6qFFhIFTRoqb2QwX1mU7iTOvMyLbYw3QtqTw9sMwjykyiMlZlrfm2a4fA84+/aeW+PMg1MjuTg== +"@next/swc-win32-ia32-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz#e76cabefa9f2d891599c3d85928475bd8d3f6600" + integrity sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg== -"@next/swc-win32-x64-msvc@14.0.3": - version "14.0.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.3.tgz#27b623612b1d0cea6efe0a0d31aa1a335fc99647" - integrity sha512-ERhKPSJ1vQrPiwrs15Pjz/rvDHZmkmvbf/BjPN/UCOI++ODftT0GtasDPi0j+y6PPJi5HsXw+dpRaXUaw4vjuQ== +"@next/swc-win32-x64-msvc@14.0.4": + version "14.0.4" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz#e74892f1a9ccf41d3bf5979ad6d3d77c07b9cba1" + integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -939,6 +1059,20 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/git@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" + integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + "@npmcli/map-workspaces@3.0.4": version "3.0.4" resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" @@ -954,6 +1088,26 @@ resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== +"@npmcli/package-json@5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-5.0.0.tgz#77d0f8b17096763ccbd8af03b7117ba6e34d6e91" + integrity sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" + integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== + dependencies: + which "^4.0.0" + "@octokit/auth-token@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" @@ -989,17 +1143,17 @@ "@octokit/types" "^12.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^19.0.2", "@octokit/openapi-types@^19.1.0": +"@octokit/openapi-types@^19.1.0": version "19.1.0" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-19.1.0.tgz#75ec7e64743870fc73e1ab4bc6ec252ecdd624dc" integrity sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw== "@octokit/plugin-paginate-rest@^9.0.0": - version "9.1.4" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.4.tgz#9eca55e3e88f15b574e072732769e933bfa88d8b" - integrity sha512-MvZx4WvfhBnt7PtH5XE7HORsO7bBk4er1FgRIUr1qJ89NR2I6bWjGyKsxk8z42FPQ34hFQm0Baanh4gzdZR4gQ== + version "9.1.5" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz#1705bcef4dcde1f4015ee58a63dc61b68648f480" + integrity sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg== dependencies: - "@octokit/types" "^12.3.0" + "@octokit/types" "^12.4.0" "@octokit/plugin-request-log@^4.0.0": version "4.0.0" @@ -1050,14 +1204,7 @@ "@octokit/plugin-request-log" "^4.0.0" "@octokit/plugin-rest-endpoint-methods" "^10.0.0" -"@octokit/types@^12.0.0", "@octokit/types@^12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.3.0.tgz#e3f8bc53f65ef551e19cc1a0fea15adadec17d2d" - integrity sha512-nJ8X2HRr234q3w/FcovDlA+ttUU4m1eJAourvfUUtwAWeqL8AsyRqfnLvVnYn3NFbUnsmzQCzLNdFerPwdmcDQ== - dependencies: - "@octokit/openapi-types" "^19.0.2" - -"@octokit/types@^12.2.0": +"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.3.0", "@octokit/types@^12.4.0": version "12.4.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.4.0.tgz#8f97b601e91ce6b9776ed8152217e77a71be7aac" integrity sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ== @@ -1166,7 +1313,7 @@ resolved "https://registry.yarnpkg.com/@pnpm/types/-/types-9.4.0.tgz#243b62eea4beab0bb65f1ecec1dfb6f739bba9bd" integrity sha512-IRDuIuNobLRQe0UyY2gbrrTzYS46tTNvOEfL6fOf0Qa8NyxUzeXz946v7fQuQE3LSBf8ENBC5SXhRmDl+mBEqA== -"@pnpm/workspace.pkgs-graph@^2.0.10": +"@pnpm/workspace.pkgs-graph@^2.0.11": version "2.0.11" resolved "https://registry.yarnpkg.com/@pnpm/workspace.pkgs-graph/-/workspace.pkgs-graph-2.0.11.tgz#37ae4e0e470c3df8252e9d91076bf7ec62e7b250" integrity sha512-VRX7E7pX92C0akCMYGzsTqJoOwQS7/8R40pAPK7smgaEpKeEgVThqnIXt+wPdseD5CzS7OzMaIWlT3WXr3O5rQ== @@ -1177,21 +1324,45 @@ ramda "npm:@pnpm/ramda@0.28.1" "@prisma/client@^5.4.1": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.6.0.tgz#1c15932250d5658fe0127e62faf4ecd96a877259" - integrity sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug== + version "5.7.0" + resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.7.0.tgz#c29dd9a16e100902eb2d2443d90fee2482d2aeac" + integrity sha512-cZmglCrfNbYpzUtz7HscVHl38e9CrUs31nrVoGUK1nIPXGgt8hT4jj2s657UXcNdQ/jBUxDgGmHyu2Nyrq1txg== + +"@prisma/debug@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.7.0.tgz#abdb2060be4fe819e73e2683cf1b039841566198" + integrity sha512-tZ+MOjWlVvz1kOEhNYMa4QUGURY+kgOUBqLHYIV8jmCsMuvA1tWcn7qtIMLzYWCbDcQT4ZS8xDgK0R2gl6/0wA== + +"@prisma/engines-version@5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9": + version "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" + resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9.tgz#777827898f1bfe6a76b17fbe7d9600cf543c4cc1" + integrity sha512-V6tgRVi62jRwTm0Hglky3Scwjr/AKFBFtS+MdbsBr7UOuiu1TKLPc6xfPiyEN1+bYqjEtjxwGsHgahcJsd1rNg== + +"@prisma/engines@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.7.0.tgz#a32e232819b66bd9dee7500b455781742dc54b2f" + integrity sha512-TkOMgMm60n5YgEKPn9erIvFX2/QuWnl3GBo6yTRyZKk5O5KQertXiNnrYgSLy0SpsKmhovEPQb+D4l0SzyE7XA== dependencies: - "@prisma/engines-version" "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" + "@prisma/debug" "5.7.0" + "@prisma/engines-version" "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" + "@prisma/fetch-engine" "5.7.0" + "@prisma/get-platform" "5.7.0" -"@prisma/engines-version@5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee": - version "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" - resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee.tgz#57b003ab5e1ea1523b5cdd7f06b24ebcf5c7fd8c" - integrity sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw== +"@prisma/fetch-engine@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.7.0.tgz#7d2795828b692b02707e7ab6876f6227a68fc309" + integrity sha512-zIn/qmO+N/3FYe7/L9o+yZseIU8ivh4NdPKSkQRIHfg2QVTVMnbhGoTcecbxfVubeTp+DjcbjS0H9fCuM4W04w== + dependencies: + "@prisma/debug" "5.7.0" + "@prisma/engines-version" "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9" + "@prisma/get-platform" "5.7.0" -"@prisma/engines@5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.6.0.tgz#82c445aa10633bbc0388aa2d6e411a0bd94c9439" - integrity sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw== +"@prisma/get-platform@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.7.0.tgz#eb81011f537c2d10c0225278cd5165a82d0b57c8" + integrity sha512-ZeV/Op4bZsWXuw5Tg05WwRI8BlKiRFhsixPcAM+5BKYSiUZiMKIi713tfT3drBq8+T0E1arNZgYSA9QYcglWNA== + dependencies: + "@prisma/debug" "5.7.0" "@radix-ui/colors@^3.0.0", "@radix-ui/colors@^3.0.0-rc.4": version "3.0.0" @@ -1751,9 +1922,9 @@ "@babel/runtime" "^7.13.10" "@radix-ui/themes@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@radix-ui/themes/-/themes-2.0.1.tgz#b5125da412966a2ad91c706da9a231780a934ee5" - integrity sha512-uO+faiGfwuIR0N9utwIfuasAmH1qRHYJtYTX2Syx0UYEtc9pPAhoCoYobZZi+J03H5WaQouvGiBN6T+UUMm+6Q== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@radix-ui/themes/-/themes-2.0.2.tgz#39514b346e4a5cef0324d1e4bbe7ab09d7419bd2" + integrity sha512-9NaIp3HkoSkyCGAnJ21PL8yuazcV2q/q3wVNJ7jU00qZfzeybYREpoik11tMRA0+DWttQhSUy1ZqD8u6YqsbkQ== dependencies: "@radix-ui/colors" "^3.0.0" "@radix-ui/primitive" "^1.0.1" @@ -1830,9 +2001,9 @@ integrity sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q== "@react-three/drei@^9.90.1": - version "9.90.1" - resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.90.1.tgz#59d8cb49fde6209a223f283cbb94865ff9b95acf" - integrity sha512-bvov7gMr0T1vCjI53v1VZs9aD6isGHnrjsHiHDlgyXTYFEnJBn7DFk5g8QqgsXmKhHEoEjyy/7xea8LLmPiBxg== + version "9.92.1" + resolved "https://registry.yarnpkg.com/@react-three/drei/-/drei-9.92.1.tgz#004c8d042b24e1a790de8982f93f38269e3d9652" + integrity sha512-XgC6Y0er7WDn1UtjZ8MwXt1UZJj84IVEcZNwkaZ1BTia21IAJsbFo6G8A6XAkNFfivY8oCslljwQnqz623RWIQ== dependencies: "@babel/runtime" "^7.11.2" "@mediapipe/tasks-vision" "0.10.8" @@ -1849,7 +2020,7 @@ meshline "^3.1.6" react-composer "^5.0.3" react-merge-refs "^1.1.0" - stats-gl "^1.0.4" + stats-gl "^2.0.0" stats.js "^0.17.0" suspend-react "^0.1.3" three-mesh-bvh "^0.6.7" @@ -1954,84 +2125,94 @@ "@resvg/resvg-js-win32-ia32-msvc" "2.6.0" "@resvg/resvg-js-win32-x64-msvc" "2.6.0" -"@rollup/rollup-android-arm-eabi@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz#0ea289f68ff248b50fea5716ca9f65f7d4dba3ae" - integrity sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA== +"@rollup/rollup-android-arm-eabi@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz#0e42b155630adaaec0f659f979ece4b7d3391329" + integrity sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q== -"@rollup/rollup-android-arm64@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz#27c8c67fc5de574874085a1b480ac65b3e18378e" - integrity sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA== +"@rollup/rollup-android-arm64@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz#6c9fe8f9eb0cd9029be93b822b1a1c2d6b31c275" + integrity sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ== -"@rollup/rollup-darwin-arm64@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz#c5735c042980c85495411af7183dd20294763bd8" - integrity sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw== +"@rollup/rollup-darwin-arm64@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz#7dcb1317a8089762c1f7e437c1e1d695b787b70f" + integrity sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g== -"@rollup/rollup-darwin-x64@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz#af844bd54abb73ca3c9cf89a31eec17861d1375d" - integrity sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg== +"@rollup/rollup-darwin-x64@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz#91d7d31d22607c4fcccce9126457d6785c57f7c7" + integrity sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA== -"@rollup/rollup-linux-arm-gnueabihf@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz#5e972f63c441eaf859551039b3f18db9b035977d" - integrity sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ== +"@rollup/rollup-linux-arm-gnueabihf@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz#f2015d6e4ff41417f2e2c55b3d9625346e355c57" + integrity sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A== -"@rollup/rollup-linux-arm64-gnu@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz#f4cfbc71e3b6fdb395b28b1472414e181515c72d" - integrity sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw== +"@rollup/rollup-linux-arm64-gnu@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz#95207444b78f235c9de62797ec2a3dcd18daf473" + integrity sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g== -"@rollup/rollup-linux-arm64-musl@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz#6a94c691830dc29bf708de7c640f494996130893" - integrity sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw== +"@rollup/rollup-linux-arm64-musl@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz#bc994c676fd3aae14aaa905040fdcde461e41ce5" + integrity sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA== -"@rollup/rollup-linux-x64-gnu@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz#f07bae3f7dc532d9ea5ab36c9071db329f9a1efb" - integrity sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA== +"@rollup/rollup-linux-riscv64-gnu@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz#67984f1d1f663610f4e1f6e638a2b07169562448" + integrity sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw== -"@rollup/rollup-linux-x64-musl@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz#357a34fdbf410af88ce48bd802bea6462bb9a8bc" - integrity sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ== +"@rollup/rollup-linux-x64-gnu@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz#48e09a455d543be986003c7c2ea37c16ff4a53d5" + integrity sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q== -"@rollup/rollup-win32-arm64-msvc@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz#b6e97fd38281667e35297033393cd1101f4a31be" - integrity sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ== +"@rollup/rollup-linux-x64-musl@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz#df8d0966b02d1bdc6447b5eb58fa18666da1f3e8" + integrity sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg== -"@rollup/rollup-win32-ia32-msvc@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz#a95db026c640c8128bfd38546d85342f2329beaf" - integrity sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw== +"@rollup/rollup-win32-arm64-msvc@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz#7cce8efc5c9239a1bafe7ac2a52743bc5734471f" + integrity sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA== -"@rollup/rollup-win32-x64-msvc@4.6.1": - version "4.6.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz#45785b5caf83200a34a9867ba50d69560880c120" - integrity sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A== +"@rollup/rollup-win32-ia32-msvc@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz#794ef4058d04f97447e4434c083b1309b2be73c2" + integrity sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw== + +"@rollup/rollup-win32-x64-msvc@4.8.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz#05057436705f0be9203c30612a48225ec70af741" + integrity sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg== "@sapphire/async-queue@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" - integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.1.tgz#f72f8f0dea05e83ba830387567dd6ef8a996537a" + integrity sha512-1RdpsmDQR/aWfp8oJzPtn4dNQrbpqSL5PIA0uAB/XwerPXUf994Ug1au1e7uGcD7ei8/F63UDjr5GWps1g/HxQ== "@sapphire/shapeshift@^3.9.3": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz#89d26713044bc21cc5e0845e61a8a328ca3c1a84" - integrity sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ== + version "3.9.4" + resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.4.tgz#427f9f19c9d32ae94c56cd08529db04e9ea626d0" + integrity sha512-SiOoCBmm8O7QuadLJnX4V0tAkhC54NIOZJtmvw+5zwnHaiulGkjY02wxCuK8Gf4V540ILmGz+UulC0U8mrOZjg== dependencies: fast-deep-equal "^3.1.3" lodash "^4.17.21" -"@sapphire/snowflake@3.5.1", "@sapphire/snowflake@^3.5.1": +"@sapphire/snowflake@3.5.1": version "3.5.1" resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== +"@sapphire/snowflake@^3.5.1": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.2.tgz#ca3d11a0011563c90b103f8ef398f2dea3e7beb4" + integrity sha512-FTm9RdyELF21PQN5dS/HLRs90XqWclHa+p0gkonc+BA2X2QKfFySHSjUbO65rmArd/ghR9Ahj2fMfedTZEqzOw== + "@shuding/opentype.js@1.4.0-beta.0": version "1.4.0-beta.0" resolved "https://registry.yarnpkg.com/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz#5d1e7e9e056f546aad41df1c5043f8f85d39e24b" @@ -2188,9 +2369,9 @@ integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== "@types/node@*", "@types/node@^20.6.5": - version "20.10.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" - integrity sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg== + version "20.10.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.4.tgz#b246fd84d55d5b1b71bf51f964bd514409347198" + integrity sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg== dependencies: undici-types "~5.26.4" @@ -2228,19 +2409,10 @@ dependencies: "@types/react" "*" -"@types/react@*": - version "18.2.42" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.42.tgz#6f6b11a904f6d96dda3c2920328a97011a00aba7" - integrity sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^18.2.22": - version "18.2.41" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.41.tgz#9eea044246bdb10510df89ef7f8422a8b6ad8fb9" - integrity sha512-CwOGr/PiLiNBxEBqpJ7fO3kocP/2SSuC9fpH5K7tusrg4xPSRT/193rzolYwQnTN02We/ATXKnb6GqA5w4fRxw== +"@types/react@*", "@types/react@^18.2.22": + version "18.2.45" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.45.tgz#253f4fac288e7e751ab3dc542000fb687422c15c" + integrity sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2395,138 +2567,138 @@ loader-utils "^2.0.0" "@vitejs/plugin-vue@^4.5.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.5.1.tgz#84815bfeb46928c03a9ed765e4a8425c22345e15" - integrity sha512-DaUzYFr+2UGDG7VSSdShKa9sIWYBa1LL8KC0MNOf2H5LjcTPjob0x8LbkqXWmAtbANJCkpiQTj66UVcQkN2s3g== + version "4.5.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz#1212d81bc83680e14448fefe55abd9fe1ed49ed1" + integrity sha512-UGR3DlzLi/SaVBPX0cnSyE37vqxU3O6chn8l0HJNzQzDia6/Au2A4xKv+iIJW8w2daf80G7TYHhi1pAUjdZ0bQ== "@vladfrangu/async_event_emitter@^2.2.2": version "2.2.4" resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz#d3537432c6db6444680a596271dff8ea407343b3" integrity sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug== -"@vue/compiler-core@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.9.tgz#df1fc7947dcef5c2e12d257eae540057707f47d1" - integrity sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ== +"@vue/compiler-core@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.11.tgz#9fa26f8c81b9b34365f94ce1ed4d0e6e6f94a2ac" + integrity sha512-h97/TGWBilnLuRaj58sxNrsUU66fwdRKLOLQ9N/5iNDfp+DZhYH9Obhe0bXxhedl8fjAgpRANpiZfbgWyruQ0w== dependencies: - "@babel/parser" "^7.23.3" - "@vue/shared" "3.3.9" + "@babel/parser" "^7.23.5" + "@vue/shared" "3.3.11" estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz#67315ea4193d9d18c7a710889b8f90f7aa3914d2" - integrity sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg== +"@vue/compiler-dom@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.11.tgz#36a76ea3a296d41bad133a6912cb0a847d969e4f" + integrity sha512-zoAiUIqSKqAJ81WhfPXYmFGwDRuO+loqLxvXmfUdR5fOitPoUiIeFI9cTTyv9MU5O1+ZZglJVTusWzy+wfk5hw== dependencies: - "@vue/compiler-core" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/compiler-core" "3.3.11" + "@vue/shared" "3.3.11" -"@vue/compiler-sfc@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz#5900906baba1a90389200d81753ad0f7ceb98a83" - integrity sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A== +"@vue/compiler-sfc@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.11.tgz#acfae240c875d067e0e2c9a4e2d910074408c73b" + integrity sha512-U4iqPlHO0KQeK1mrsxCN0vZzw43/lL8POxgpzcJweopmqtoYy9nljJzWDIQS3EfjiYhfdtdk9Gtgz7MRXnz3GA== dependencies: - "@babel/parser" "^7.23.3" - "@vue/compiler-core" "3.3.9" - "@vue/compiler-dom" "3.3.9" - "@vue/compiler-ssr" "3.3.9" - "@vue/reactivity-transform" "3.3.9" - "@vue/shared" "3.3.9" + "@babel/parser" "^7.23.5" + "@vue/compiler-core" "3.3.11" + "@vue/compiler-dom" "3.3.11" + "@vue/compiler-ssr" "3.3.11" + "@vue/reactivity-transform" "3.3.11" + "@vue/shared" "3.3.11" estree-walker "^2.0.2" magic-string "^0.30.5" - postcss "^8.4.31" + postcss "^8.4.32" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz#3b3dbfa5368165fa4ff74c060503b4087ec1beed" - integrity sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g== +"@vue/compiler-ssr@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.11.tgz#598942a73b64f2bd3f95908b104a7fbb55fc41a2" + integrity sha512-Zd66ZwMvndxRTgVPdo+muV4Rv9n9DwQ4SSgWWKWkPFebHQfVYRrVjeygmmDmPewsHyznCNvJ2P2d6iOOhdv8Qg== dependencies: - "@vue/compiler-dom" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/compiler-dom" "3.3.11" + "@vue/shared" "3.3.11" "@vue/devtools-api@^6.5.1": version "6.5.1" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz#7f71f31e40973eeee65b9a64382b13593fdbd697" integrity sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA== -"@vue/reactivity-transform@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz#5d894dd9a42a422a2db309babb385f9a2529b52f" - integrity sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg== +"@vue/reactivity-transform@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.11.tgz#2bd486f4eff60c8724309925618891e722fcfadc" + integrity sha512-fPGjH0wqJo68A0wQ1k158utDq/cRyZNlFoxGwNScE28aUFOKFEnCBsvyD8jHn+0kd0UKVpuGuaZEQ6r9FJRqCg== dependencies: - "@babel/parser" "^7.23.3" - "@vue/compiler-core" "3.3.9" - "@vue/shared" "3.3.9" + "@babel/parser" "^7.23.5" + "@vue/compiler-core" "3.3.11" + "@vue/shared" "3.3.11" estree-walker "^2.0.2" magic-string "^0.30.5" -"@vue/reactivity@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.9.tgz#e28e8071bd74edcdd9c87b667ad00e8fbd8d6920" - integrity sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw== +"@vue/reactivity@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.11.tgz#91f8e6c9ac60a595a5278c836b197628fd947a0d" + integrity sha512-D5tcw091f0nuu+hXq5XANofD0OXnBmaRqMYl5B3fCR+mX+cXJIGNw/VNawBqkjLNWETrFW0i+xH9NvDbTPVh7g== dependencies: - "@vue/shared" "3.3.9" + "@vue/shared" "3.3.11" -"@vue/runtime-core@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.9.tgz#c835b77f7dc7ae5f251e93f277b54963ea1b5c31" - integrity sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w== +"@vue/runtime-core@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.11.tgz#63defba57bc54c1dac68a95b56c2633b1419193d" + integrity sha512-g9ztHGwEbS5RyWaOpXuyIVFTschclnwhqEbdy5AwGhYOgc7m/q3NFwr50MirZwTTzX55JY8pSkeib9BX04NIpw== dependencies: - "@vue/reactivity" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/reactivity" "3.3.11" + "@vue/shared" "3.3.11" -"@vue/runtime-dom@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz#68081d981695a229d72f431fed0b0cdd9161ce53" - integrity sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ== +"@vue/runtime-dom@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.11.tgz#1146d8d280b0fec4d2e18c4a4c8f8121d0cecc09" + integrity sha512-OlhtV1PVpbgk+I2zl+Y5rQtDNcCDs12rsRg71XwaA2/Rbllw6mBLMi57VOn8G0AjOJ4Mdb4k56V37+g8ukShpQ== dependencies: - "@vue/runtime-core" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/runtime-core" "3.3.11" + "@vue/shared" "3.3.11" csstype "^3.1.2" -"@vue/server-renderer@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.9.tgz#ffb41bc9c7afafcc608d0c500e9d6b0af7d68fad" - integrity sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A== +"@vue/server-renderer@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.11.tgz#409aed8031a125791e2143552975ecd1958ad601" + integrity sha512-AIWk0VwwxCAm4wqtJyxBylRTXSy1wCLOKbWxHaHiu14wjsNYtiRCSgVuqEPVuDpErOlRdNnuRgipQfXRLjLN5A== dependencies: - "@vue/compiler-ssr" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/compiler-ssr" "3.3.11" + "@vue/shared" "3.3.11" -"@vue/shared@3.3.9": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.9.tgz#df740d26d338faf03e09ca662a8031acf66051db" - integrity sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA== +"@vue/shared@3.3.11": + version "3.3.11" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.11.tgz#f6a038e15237edefcc90dbfe7edb806dd355c7bd" + integrity sha512-u2G8ZQ9IhMWTMXaWqZycnK4UthG1fA238CD+DP4Dm4WJi5hdUKKLg0RMRaRpDPNMdkTwIDkp7WtD0Rd9BH9fLw== -"@vueuse/core@10.6.1", "@vueuse/core@^10.6.1": - version "10.6.1" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.6.1.tgz#5b16d8238054c6983b6cb7cd77a78035f098dd89" - integrity sha512-Pc26IJbqgC9VG1u6VY/xrXXfxD33hnvxBnKrLlA2LJlyHII+BSrRoTPJgGYq7qZOu61itITFUnm6QbacwZ4H8Q== +"@vueuse/core@10.7.0", "@vueuse/core@^10.6.1": + version "10.7.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.7.0.tgz#34f2f02f179dc0dcffc2be70d6b1233e011404b9" + integrity sha512-4EUDESCHtwu44ZWK3Gc/hZUVhVo/ysvdtwocB5vcauSV4B7NiGY5972WnsojB3vRNdxvAt7kzJWE2h9h7C9d5w== dependencies: "@types/web-bluetooth" "^0.0.20" - "@vueuse/metadata" "10.6.1" - "@vueuse/shared" "10.6.1" + "@vueuse/metadata" "10.7.0" + "@vueuse/shared" "10.7.0" vue-demi ">=0.14.6" "@vueuse/integrations@^10.6.1": - version "10.6.1" - resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.6.1.tgz#8358ced20d1a976422693ae3711ad29b70948504" - integrity sha512-mPDupuofMJ4DPmtX/FfP1MajmWRzYDv8WSaTCo8LQ5kFznjWgmUQ16ApjYqgMquqffNY6+IRMdMgosLDRZOSZA== + version "10.7.0" + resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.7.0.tgz#80d9608f697bd836a2231b6318700f02504d399c" + integrity sha512-rxiMYgS+91n93qXpHZF9NbHhppWY6IJyVTDxt4acyChL0zZVx7P8FAAfpF1qVK8e4wfjerhpEiMJ0IZ1GWUZ2A== dependencies: - "@vueuse/core" "10.6.1" - "@vueuse/shared" "10.6.1" + "@vueuse/core" "10.7.0" + "@vueuse/shared" "10.7.0" vue-demi ">=0.14.6" -"@vueuse/metadata@10.6.1": - version "10.6.1" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.6.1.tgz#100faa0ced3c0ab4c014fb8e66e781e85e4eb88d" - integrity sha512-qhdwPI65Bgcj23e5lpGfQsxcy0bMjCAsUGoXkJ7DsoeDUdasbZ2DBa4dinFCOER3lF4gwUv+UD2AlA11zdzMFw== +"@vueuse/metadata@10.7.0": + version "10.7.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.7.0.tgz#7b05e6cfd376aa9bb339a81e16a89c12f3e88c03" + integrity sha512-GlaH7tKP2iBCZ3bHNZ6b0cl9g0CJK8lttkBNUX156gWvNYhTKEtbweWLm9rxCPIiwzYcr/5xML6T8ZUEt+DkvA== -"@vueuse/shared@10.6.1": - version "10.6.1" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.6.1.tgz#1d9fc1e3f9083e45b59a693fc372bc50ad62a9e4" - integrity sha512-TECVDTIedFlL0NUfHWncf3zF9Gc4VfdxfQc8JFwoVZQmxpONhLxFrlm0eHQeidHj4rdTPL3KXJa0TZCk1wnc5Q== +"@vueuse/shared@10.7.0": + version "10.7.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.7.0.tgz#21e425cc5ede421e0cda38ac59a0beee6da86b1b" + integrity sha512-kc00uV6CiaTdc3i1CDC4a3lBxzaBE9AgYNtFN87B5OOscqeWElj/uza8qVDmk7/U8JbqoONLbtqiLJ5LGRuqlw== dependencies: vue-demi ">=0.14.6" @@ -2564,24 +2736,24 @@ aggregate-error@^3.0.0: indent-string "^4.0.0" algoliasearch@^4.19.1: - version "4.20.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.20.0.tgz#700c2cb66e14f8a288460036c7b2a554d0d93cf4" - integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== + version "4.21.1" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.21.1.tgz#61fd5f9d4480fca263d9c22c2cdf24ef6d37631d" + integrity sha512-Ym0MGwOcjQhZ+s1N/j0o94g3vQD0MzNpWsfJLyPVCt0zHflbi0DwYX+9GPmTJ4BzegoxWMyCPgcmpd3R+VlOzQ== dependencies: - "@algolia/cache-browser-local-storage" "4.20.0" - "@algolia/cache-common" "4.20.0" - "@algolia/cache-in-memory" "4.20.0" - "@algolia/client-account" "4.20.0" - "@algolia/client-analytics" "4.20.0" - "@algolia/client-common" "4.20.0" - "@algolia/client-personalization" "4.20.0" - "@algolia/client-search" "4.20.0" - "@algolia/logger-common" "4.20.0" - "@algolia/logger-console" "4.20.0" - "@algolia/requester-browser-xhr" "4.20.0" - "@algolia/requester-common" "4.20.0" - "@algolia/requester-node-http" "4.20.0" - "@algolia/transporter" "4.20.0" + "@algolia/cache-browser-local-storage" "4.21.1" + "@algolia/cache-common" "4.21.1" + "@algolia/cache-in-memory" "4.21.1" + "@algolia/client-account" "4.21.1" + "@algolia/client-analytics" "4.21.1" + "@algolia/client-common" "4.21.1" + "@algolia/client-personalization" "4.21.1" + "@algolia/client-search" "4.21.1" + "@algolia/logger-common" "4.21.1" + "@algolia/logger-console" "4.21.1" + "@algolia/requester-browser-xhr" "4.21.1" + "@algolia/requester-common" "4.21.1" + "@algolia/requester-node-http" "4.21.1" + "@algolia/transporter" "4.21.1" ansi-regex@^5.0.1: version "5.0.1" @@ -2744,7 +2916,7 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.9: +browserslist@^4.22.2: version "4.22.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== @@ -2842,9 +3014,9 @@ camera-controls@^2.4.2: integrity sha512-L4mxjBd3u8qiOLozdWrH2P8ZybSsDXBF7iyNyqNEFJhPUkovmuARWR8JTc1B/qlclOIg6FvZZA/0uAZMMim0mw== caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001565: - version "1.0.30001566" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz#61a8e17caf3752e3e426d4239c549ebbb37fef0d" - integrity sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA== + version "1.0.30001568" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz#53fa9297273c9a977a560663f48cbea1767518b7" + integrity sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A== ccount@^2.0.0: version "2.0.1" @@ -2868,7 +3040,7 @@ chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.2.0: +chalk@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== @@ -2922,11 +3094,27 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -color-name@^1.1.4, color-name@~1.1.4: +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" @@ -3052,9 +3240,9 @@ cssesc@^3.0.0: integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== csstype@^3.0.2, csstype@^3.0.7, csstype@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== cuint@^0.2.2: version "0.2.2" @@ -3196,6 +3384,11 @@ detect-gpu@^5.0.28: dependencies: webgl-constants "^1.1.1" +detect-libc@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -3263,9 +3456,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.601: - version "1.4.601" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.601.tgz#cac69868548aee89961ffe63ff5a7716f0685b75" - integrity sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA== + version "1.4.611" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.611.tgz#92d3a8f03110fbf5f99b054da97825f994fa480a" + integrity sha512-ZtRpDxrjHapOwxtv+nuth5ByB8clyn8crVynmRNGO3wG3LOp8RTcyZDqwaI6Ng6y8FCK2hVZmJoqwCskKbNMaw== emoji-regex@^10.2.1: version "10.3.0" @@ -3311,6 +3504,11 @@ entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -3375,32 +3573,32 @@ esbuild@^0.18.10: "@esbuild/win32-x64" "0.18.20" esbuild@^0.19.3: - version "0.19.8" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.8.tgz#ad05b72281d84483fa6b5345bd246c27a207b8f1" - integrity sha512-l7iffQpT2OrZfH2rXIp7/FkmaeZM0vxbxN9KfiCwGYuZqzMg/JdvX26R31Zxn/Pxvsrg3Y9N6XTcnknqDyyv4w== + version "0.19.9" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.9.tgz#423a8f35153beb22c0b695da1cd1e6c0c8cdd490" + integrity sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg== optionalDependencies: - "@esbuild/android-arm" "0.19.8" - "@esbuild/android-arm64" "0.19.8" - "@esbuild/android-x64" "0.19.8" - "@esbuild/darwin-arm64" "0.19.8" - "@esbuild/darwin-x64" "0.19.8" - "@esbuild/freebsd-arm64" "0.19.8" - "@esbuild/freebsd-x64" "0.19.8" - "@esbuild/linux-arm" "0.19.8" - "@esbuild/linux-arm64" "0.19.8" - "@esbuild/linux-ia32" "0.19.8" - "@esbuild/linux-loong64" "0.19.8" - "@esbuild/linux-mips64el" "0.19.8" - "@esbuild/linux-ppc64" "0.19.8" - "@esbuild/linux-riscv64" "0.19.8" - "@esbuild/linux-s390x" "0.19.8" - "@esbuild/linux-x64" "0.19.8" - "@esbuild/netbsd-x64" "0.19.8" - "@esbuild/openbsd-x64" "0.19.8" - "@esbuild/sunos-x64" "0.19.8" - "@esbuild/win32-arm64" "0.19.8" - "@esbuild/win32-ia32" "0.19.8" - "@esbuild/win32-x64" "0.19.8" + "@esbuild/android-arm" "0.19.9" + "@esbuild/android-arm64" "0.19.9" + "@esbuild/android-x64" "0.19.9" + "@esbuild/darwin-arm64" "0.19.9" + "@esbuild/darwin-x64" "0.19.9" + "@esbuild/freebsd-arm64" "0.19.9" + "@esbuild/freebsd-x64" "0.19.9" + "@esbuild/linux-arm" "0.19.9" + "@esbuild/linux-arm64" "0.19.9" + "@esbuild/linux-ia32" "0.19.9" + "@esbuild/linux-loong64" "0.19.9" + "@esbuild/linux-mips64el" "0.19.9" + "@esbuild/linux-ppc64" "0.19.9" + "@esbuild/linux-riscv64" "0.19.9" + "@esbuild/linux-s390x" "0.19.9" + "@esbuild/linux-x64" "0.19.9" + "@esbuild/netbsd-x64" "0.19.9" + "@esbuild/openbsd-x64" "0.19.9" + "@esbuild/sunos-x64" "0.19.9" + "@esbuild/win32-arm64" "0.19.9" + "@esbuild/win32-ia32" "0.19.9" + "@esbuild/win32-x64" "0.19.9" escalade@^3.1.1: version "3.1.1" @@ -3472,6 +3670,11 @@ express@^4.18.2: utils-merge "1.0.1" vary "~1.1.2" +"false@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/false/-/false-0.0.4.tgz#8f55de5af5c03f50bf68aed57ed80e3d2176a517" + integrity sha512-CPAG3ud9Cz8NvLKlsTLr/F1aoJL6tPyhNTzaDFzS5CX6id21hVuS5sBK8wlTLuvFklpvH1idvPbW8Lbri3G7qA== + fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3878,6 +4081,13 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +hosted-git-info@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" + integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== + dependencies: + lru-cache "^10.0.1" + html-void-elements@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" @@ -3961,6 +4171,18 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4013,6 +4235,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + iterable-lookahead@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/iterable-lookahead/-/iterable-lookahead-1.0.0.tgz#896dfcb78680bdb50036e97edb034c8b68a9737f" @@ -4096,17 +4323,18 @@ jsonfile@^6.0.1: graceful-fs "^4.1.6" knip@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/knip/-/knip-3.4.0.tgz#4f4d25a56be70881e22456b201da5bce2fef6e48" - integrity sha512-YGNxfwv5LK28B5rgQkzpMBKusid4lZLTtGrUXbb/j7Iqu2PAt6jIgrYejzJXmnj/FvHGjwkWm2iAp2vRttoMqA== + version "3.7.1" + resolved "https://registry.yarnpkg.com/knip/-/knip-3.7.1.tgz#2386b1f06e2d1d54b50f81fbc7cc116b783c693f" + integrity sha512-e/LyOHFE1p35DqRMI4Wz1vyLFrMP6uMlP3i2S/yaqUMt3+p6Mmn0USnOK0JNkuFUGIG9jcw63tZgBwMrY7j2IA== dependencies: "@ericcornelissen/bash-parser" "0.5.2" "@npmcli/map-workspaces" "3.0.4" + "@npmcli/package-json" "5.0.0" "@pkgjs/parseargs" "0.11.0" "@pnpm/logger" "5.0.0" - "@pnpm/workspace.pkgs-graph" "^2.0.10" + "@pnpm/workspace.pkgs-graph" "^2.0.11" "@snyk/github-codeowners" "1.1.0" - chalk "^5.2.0" + chalk "^5.3.0" easy-table "1.2.0" fast-glob "3.3.2" globby "^14.0.0" @@ -4236,9 +4464,9 @@ maath@^0.9.0: integrity sha512-aAR8hoUqPxlsU8VOxkS9y37jhUzdUxM017NpCuxFU1Gk+nMaZASZxymZrV8LRSHzRk/watlbfyNKu6XPUhCFrQ== magic-bytes.js@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.6.0.tgz#ee4354ac41a9b86f410e2690bc25dc4c264fb55d" - integrity sha512-eOGBE+NSCwU9dKKox93BPHjX4KSxIuiRY1/H1lkfxIagT0Llhs6bkRk8iqoP/0aeDl7FEZPa+ln5lay5mcNY4w== + version "1.7.0" + resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.7.0.tgz#29ca1a137b508fa656ca35fe79683bf10246e0d5" + integrity sha512-YzVU2+/hrjwx8xcgAw+ffNq3jkactpj+f1iSL4LonrFKhvnwDzHSqtFdk/MMRP53y9ScouJ7cKEnqYsJwsHoYA== magic-string@^0.16.0: version "0.16.0" @@ -4503,27 +4731,28 @@ negotiator@0.6.3: integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== next@^14.0.3: - version "14.0.3" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.3.tgz#8d801a08eaefe5974203d71092fccc463103a03f" - integrity sha512-AbYdRNfImBr3XGtvnwOxq8ekVCwbFTv/UJoLwmaX89nk9i051AEY4/HAWzU0YpaTDw8IofUpmuIlvzWF13jxIw== + version "14.0.4" + resolved "https://registry.yarnpkg.com/next/-/next-14.0.4.tgz#bf00b6f835b20d10a5057838fa2dfced1d0d84dc" + integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== dependencies: - "@next/env" "14.0.3" + "@next/env" "14.0.4" "@swc/helpers" "0.5.2" busboy "1.6.0" caniuse-lite "^1.0.30001406" + graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "14.0.3" - "@next/swc-darwin-x64" "14.0.3" - "@next/swc-linux-arm64-gnu" "14.0.3" - "@next/swc-linux-arm64-musl" "14.0.3" - "@next/swc-linux-x64-gnu" "14.0.3" - "@next/swc-linux-x64-musl" "14.0.3" - "@next/swc-win32-arm64-msvc" "14.0.3" - "@next/swc-win32-ia32-msvc" "14.0.3" - "@next/swc-win32-x64-msvc" "14.0.3" + "@next/swc-darwin-arm64" "14.0.4" + "@next/swc-darwin-x64" "14.0.4" + "@next/swc-linux-arm64-gnu" "14.0.4" + "@next/swc-linux-arm64-musl" "14.0.4" + "@next/swc-linux-x64-gnu" "14.0.4" + "@next/swc-linux-x64-musl" "14.0.4" + "@next/swc-win32-arm64-msvc" "14.0.4" + "@next/swc-win32-ia32-msvc" "14.0.4" + "@next/swc-win32-x64-msvc" "14.0.4" node-fetch@3.0.0-beta.9: version "3.0.0-beta.9" @@ -4538,16 +4767,53 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +normalize-package-data@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" + integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== + dependencies: + hosted-git-info "^7.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + npm-normalize-package-bin@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== +npm-package-arg@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-pick-manifest@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" + integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -4773,7 +5039,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.27, postcss@^8.4.31: +postcss@^8.4.27, postcss@^8.4.32: version "8.4.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== @@ -4788,14 +5054,14 @@ potpack@^1.0.1: integrity sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ== preact@^10.0.0: - version "10.19.2" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.2.tgz#841797620dba649aaac1f8be42d37c3202dcea8b" - integrity sha512-UA9DX/OJwv6YwP9Vn7Ti/vF80XL+YA5H2l7BpCtUr3ya8LWHFzpiO5R+N7dN16ujpIxhekRFuOOF82bXX7K/lg== + version "10.19.3" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899" + integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ== prettier@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" + integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== pretty-ms@8.0.0: version "8.0.0" @@ -4805,17 +5071,35 @@ pretty-ms@8.0.0: parse-ms "^3.0.0" prisma@^5.4.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.6.0.tgz#ae2c27fdfb4d53be7f7dafb50d6b8b7f55c93aa5" - integrity sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A== + version "5.7.0" + resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.7.0.tgz#3c1c56d392b5d1137de954edefa4533fa092663e" + integrity sha512-0rcfXO2ErmGAtxnuTNHQT9ztL0zZheQjOI/VNJzdq87C3TlGPQtMqtM+KCwU6XtmkoEr7vbCQqA7HF9IY0ST+Q== dependencies: - "@prisma/engines" "5.6.0" + "@prisma/engines" "5.7.0" + +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== 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" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + prop-types@^15.6.0: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -5006,6 +5290,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5031,22 +5320,23 @@ rollup@^3.27.1: fsevents "~2.3.2" rollup@^4.2.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.6.1.tgz#351501c86b5b4f976dde8c5837516452b59921f8" - integrity sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ== + version "4.8.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.8.0.tgz#365c34e85f1ed034de974dab934c1663cc69b754" + integrity sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA== optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.6.1" - "@rollup/rollup-android-arm64" "4.6.1" - "@rollup/rollup-darwin-arm64" "4.6.1" - "@rollup/rollup-darwin-x64" "4.6.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.6.1" - "@rollup/rollup-linux-arm64-gnu" "4.6.1" - "@rollup/rollup-linux-arm64-musl" "4.6.1" - "@rollup/rollup-linux-x64-gnu" "4.6.1" - "@rollup/rollup-linux-x64-musl" "4.6.1" - "@rollup/rollup-win32-arm64-msvc" "4.6.1" - "@rollup/rollup-win32-ia32-msvc" "4.6.1" - "@rollup/rollup-win32-x64-msvc" "4.6.1" + "@rollup/rollup-android-arm-eabi" "4.8.0" + "@rollup/rollup-android-arm64" "4.8.0" + "@rollup/rollup-darwin-arm64" "4.8.0" + "@rollup/rollup-darwin-x64" "4.8.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.8.0" + "@rollup/rollup-linux-arm64-gnu" "4.8.0" + "@rollup/rollup-linux-arm64-musl" "4.8.0" + "@rollup/rollup-linux-riscv64-gnu" "4.8.0" + "@rollup/rollup-linux-x64-gnu" "4.8.0" + "@rollup/rollup-linux-x64-musl" "4.8.0" + "@rollup/rollup-win32-arm64-msvc" "4.8.0" + "@rollup/rollup-win32-ia32-msvc" "4.8.0" + "@rollup/rollup-win32-x64-msvc" "4.8.0" fsevents "~2.3.2" run-parallel@^1.1.9: @@ -5113,7 +5403,7 @@ semver@^6.1.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.5, semver@^7.4.0, semver@^7.5.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.5, semver@^7.4.0, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== @@ -5164,6 +5454,35 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sharp@^0.33.0: + version "0.33.0" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.0.tgz#95f77cda3684522e210ab55a167dad6cb5fbfe4f" + integrity sha512-99DZKudjm/Rmz+M0/26t4DKpXyywAOJaayGS9boEn7FvgtG0RYBi46uPE2c+obcJRtA3AZa0QwJot63gJQ1F0Q== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + semver "^7.5.4" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.0" + "@img/sharp-darwin-x64" "0.33.0" + "@img/sharp-libvips-darwin-arm64" "1.0.0" + "@img/sharp-libvips-darwin-x64" "1.0.0" + "@img/sharp-libvips-linux-arm" "1.0.0" + "@img/sharp-libvips-linux-arm64" "1.0.0" + "@img/sharp-libvips-linux-s390x" "1.0.0" + "@img/sharp-libvips-linux-x64" "1.0.0" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.0" + "@img/sharp-libvips-linuxmusl-x64" "1.0.0" + "@img/sharp-linux-arm" "0.33.0" + "@img/sharp-linux-arm64" "0.33.0" + "@img/sharp-linux-s390x" "0.33.0" + "@img/sharp-linux-x64" "0.33.0" + "@img/sharp-linuxmusl-arm64" "0.33.0" + "@img/sharp-linuxmusl-x64" "0.33.0" + "@img/sharp-wasm32" "0.33.0" + "@img/sharp-win32-ia32" "0.33.0" + "@img/sharp-win32-x64" "0.33.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -5209,6 +5528,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + slash@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce" @@ -5237,6 +5563,32 @@ space-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -5251,10 +5603,10 @@ ssri@10.0.5: dependencies: minipass "^7.0.3" -stats-gl@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/stats-gl/-/stats-gl-1.0.7.tgz#b7fa2e0d464c8b7f4c57aa6a9bae33ed09762abe" - integrity sha512-vZI82CjefSxLC1bjw36z28v0+QE9rJKymGlXtfWu+ipW70ZEAwa4EbO4LxluAfLfpqiaAS04NzpYBRLDeAwYWQ== +stats-gl@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stats-gl/-/stats-gl-2.0.1.tgz#4626a1575af00f0c5daba41ebc8f8e29a0a1998a" + integrity sha512-EhFm1AxoSBK3MflkFawZ4jmOX1dWu0nBAtCpvGxGsondEvCpsohbpRpM8pi8UAcxG5eRsDsCiRcxdH20j3Rp9A== stats.js@^0.17.0: version "0.17.0" @@ -5272,7 +5624,6 @@ streamsearch@^1.1.0: integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -5323,7 +5674,6 @@ stringify-entities@^4.0.0: character-entities-legacy "^3.0.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: - name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -5537,9 +5887,9 @@ type-is@~1.6.18: mime-types "~2.1.24" typescript@^5.2.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" - integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== + version "5.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" + integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== ufo@^1.3.0: version "1.3.2" @@ -5694,6 +6044,14 @@ uuid@^9.0.1: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validate-npm-package-name@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" @@ -5701,6 +6059,13 @@ validate-npm-package-name@^4.0.0: dependencies: builtins "^5.0.0" +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -5753,9 +6118,9 @@ vite-node@^0.28.5: vite "^3.0.0 || ^4.0.0" vite-node@^0.34.5: - version "0.34.6" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.6.tgz#34d19795de1498562bf21541a58edcd106328a17" - integrity sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA== + version "0.34.7" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-0.34.7.tgz#9fbcaf5597826d224e6301a486027faa22c2b09c" + integrity sha512-0Yzb96QzHmqIKIs/x2q/sqG750V/EF6yDkS2p1WjJc1W2bgRSuQjf5vB9HY8h2nVb5j4pO5paS5Npcv3s69YUg== dependencies: cac "^6.7.14" debug "^4.3.4" @@ -5765,9 +6130,9 @@ vite-node@^0.34.5: vite "^3.0.0 || ^4.0.0 || ^5.0.0-0" "vite@^3.0.0 || ^4.0.0", vite@^4.1.4: - version "4.5.0" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" - integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== + version "4.5.1" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.1.tgz#3370986e1ed5dbabbf35a6c2e1fb1e18555b968a" + integrity sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA== dependencies: esbuild "^0.18.10" postcss "^8.4.27" @@ -5776,12 +6141,12 @@ vite-node@^0.34.5: fsevents "~2.3.2" "vite@^3.0.0 || ^4.0.0 || ^5.0.0-0", vite@^5.0.2: - version "5.0.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.4.tgz#d984d2aaa8bac30f1ca9b9eea9b97e052f88c307" - integrity sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg== + version "5.0.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.8.tgz#070383dcb4d4f12adde9c119b8cca0f40bf906e9" + integrity sha512-jYMALd8aeqR3yS9xlHd0OzQJndS9fH5ylVgWdB+pxTwxLKdO1pgC5Dlb398BUxpfaBxa4M9oT7j1g503Gaj5IQ== dependencies: esbuild "^0.19.3" - postcss "^8.4.31" + postcss "^8.4.32" rollup "^4.2.0" optionalDependencies: fsevents "~2.3.3" @@ -5823,15 +6188,15 @@ vue-demi@>=0.14.6: integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== vue@^3.3.8: - version "3.3.9" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.9.tgz#219a2ec68e8d4d0b0180460af0f5b9299b3f3f1f" - integrity sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w== + version "3.3.11" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.11.tgz#898d97025f73cdb5fc4e3ae3fd07a54615232140" + integrity sha512-d4oBctG92CRO1cQfVBZp6WJAs0n8AK4Xf5fNjQCBeKCvMI1efGQ5E3Alt1slFJS9fZuPcFoiAiqFvQlv1X7t/w== dependencies: - "@vue/compiler-dom" "3.3.9" - "@vue/compiler-sfc" "3.3.9" - "@vue/runtime-dom" "3.3.9" - "@vue/server-renderer" "3.3.9" - "@vue/shared" "3.3.9" + "@vue/compiler-dom" "3.3.11" + "@vue/compiler-sfc" "3.3.11" + "@vue/runtime-dom" "3.3.11" + "@vue/server-renderer" "3.3.11" + "@vue/shared" "3.3.11" watchpack@2.4.0: version "2.4.0" @@ -5870,6 +6235,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -5893,11 +6265,16 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@8.14.2, ws@^8.14.2: +ws@8.14.2: version "8.14.2" resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== +ws@^8.14.2: + version "8.15.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" + integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"