From f06fe174ea86b65f20c36c70c4752b934ff833c7 Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Sun, 2 Feb 2025 19:52:58 +0100 Subject: [PATCH 01/14] fix: actually downgrade canvas --- pnpm-lock.yaml | 104 ++++++++++++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 44 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db2269831..048085e0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@napi-rs/canvas': specifier: ^0.1.65 - version: 0.1.66 + version: 0.1.65 farming-weight: specifier: ^0.8.1 version: 0.8.1 @@ -599,68 +599,72 @@ packages: '@mongodb-js/saslprep@1.1.9': resolution: {integrity: sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==} - '@napi-rs/canvas-android-arm64@0.1.66': - resolution: {integrity: sha512-77Yq9yaUYN90zCovYOpw7LhidJiswU9wLIWWBGF6iiEJyQdt6tkiXpGRZpOMJVO70afkcdc4T7532cxMIBhk0Q==} + '@napi-rs/canvas-android-arm64@0.1.65': + resolution: {integrity: sha512-ZYwqFYEKcT5Zr8lbiaJNJj/poLaeK2TncolY914r+gD2TJNeP7ZqvE7A2SX/1C9MB4E3DQEwm3YhL3WEf0x3MQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/canvas-darwin-arm64@0.1.66': - resolution: {integrity: sha512-cz3aJ06b8BZGtwRxKTiE0OVUlB17MH8j+BnE4A5+wD9aD1guCCqECsz+k7tpXdAdTAYKRIz2pq6ZuiJ76NyUbQ==} + '@napi-rs/canvas-darwin-arm64@0.1.65': + resolution: {integrity: sha512-Pg1pfiJEyDIsX+V0QaJPRWvXbw5zmWAk3bivFCvt/5pwZb37/sT6E/RqPHT9NnqpDyKW6SriwY9ypjljysUA1Q==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/canvas-darwin-x64@0.1.66': - resolution: {integrity: sha512-szIWqJgFm2OTyGzM+hSiJOaOtjI73VYRC2KN30zZTt7i1+0sgpm5exK5ltDBPOmCdnLt7SbUfpInLj8VvxYlKA==} + '@napi-rs/canvas-darwin-x64@0.1.65': + resolution: {integrity: sha512-3Tr+/HjdJN7Z/VKIcsxV2DvDIibZCExgfYTgljCkUSFuoI7iNkOE6Dc1Q6j212EB9PeO8KmfrViBqHYT6IwWkA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.66': - resolution: {integrity: sha512-h/TZJFc6JLvp8FwbA5mu+yXiblN0iKqshU7xzd6L+ks5uNYgjS7XWLkNiyPQkMaXQgVczOJfZy7r4NSPK3V8Hg==} + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.65': + resolution: {integrity: sha512-3KP+dYObH7CVkZMZWwk1WX9jRjL+EKdQtD43H8MOI+illf+dwqLlecdQ4d9bQRIxELKJ8dyPWY4fOp/Ngufrdg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/canvas-linux-arm64-gnu@0.1.66': - resolution: {integrity: sha512-RGFUdBdi0Xmf+TfwZcB89Ap6hDYh4nzyJhXhNJIgve6ELrIPFhf7sDHvUHxjgW0YzczGoo+ophyCm03cJggu+w==} + '@napi-rs/canvas-linux-arm64-gnu@0.1.65': + resolution: {integrity: sha512-Ka3StKz7Dq7kjTF3nNJCq43UN/VlANS7qGE3dWkn1d+tQNsCRy/wRmyt1TUFzIjRqcTFMQNRbgYq84+53UBA0A==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] - '@napi-rs/canvas-linux-arm64-musl@0.1.66': - resolution: {integrity: sha512-2cFViDIZ0xQlAHyJmyym+rj3p04V16vgAiz64sCAfwOOiW6e19agv1HQWHUsro3G2lF3PaHGAnp0WRPXGqLOfg==} + '@napi-rs/canvas-linux-arm64-musl@0.1.65': + resolution: {integrity: sha512-O4xMASm2JrmqYoiDyxVWi+z5C14H+oVEag2rZ5iIA67dhWqYZB+iO7wCFpBYRj31JPBR29FOsu6X9zL+DwBFdw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] - '@napi-rs/canvas-linux-riscv64-gnu@0.1.66': - resolution: {integrity: sha512-Vm5ZWS2RDPeBpnfx83eJpZfJT07xl0jqp8d83PklKqiDNa3BmDZZ/uuI40/ICgejGLymXXYo5N21b7oAxhRTSA==} + '@napi-rs/canvas-linux-riscv64-gnu@0.1.65': + resolution: {integrity: sha512-dblWDaA59ZU8bPbkfM+riSke7sFbNZ70LEevUdI5rgiFEUzYUQlU34gSBzemTACj5rCWt1BYeu0GfkLSjNMBSw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] - '@napi-rs/canvas-linux-x64-gnu@0.1.66': - resolution: {integrity: sha512-/ptGBhErNBCgWff3khtuEjhiiYWf70oWvBPRj8y5EMB0nLYpve7RxxFnavVvxN49kJ0MQHRIwgfyd47RSOOKPw==} + '@napi-rs/canvas-linux-x64-gnu@0.1.65': + resolution: {integrity: sha512-wsp+atutw13OJXGU3DDkdngtBDoEg01IuK5xMe0L6VFPV8maGkh17CXze078OD5QJOc6kFyw3DDscMLOPF8+oA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@napi-rs/canvas-linux-x64-musl@0.1.66': - resolution: {integrity: sha512-XunvXisTkIG+bpq6BcXmsUstoLX3RLS6N9Uz9Pg9RpWIMeM6ObR5shr3NgpGRJq93769I1hS4mJW0DX2Au3WBw==} + '@napi-rs/canvas-linux-x64-musl@0.1.65': + resolution: {integrity: sha512-odX+nN+IozWzhdj31INcHz3Iy9+EckNw+VqsZcaUxZOTu7/3FmktRNI6aC1qe5minZNv1m05YOS1FVf7fvmjlA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] - '@napi-rs/canvas-win32-x64-msvc@0.1.66': - resolution: {integrity: sha512-3n34watNFqpwACDA+pt4jfQD6zR8PzfK86FBajdsgDVVZhSp6ohgbbJv+eUrXM08VUtjxTq7+U4sWspTu9+4Ug==} + '@napi-rs/canvas-win32-x64-msvc@0.1.65': + resolution: {integrity: sha512-RZQX3luWnlNWgdMnLMQ1hyfQraeAn9lnxWWVCHuUM4tAWEV8UDdeb7cMwmJW7eyt8kAosmjeHt3cylQMHOxGFg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/canvas@0.1.66': - resolution: {integrity: sha512-NE/eQKLbUS+LCbMHRa5HnR7cc1Q4ibg/qfLUN4Ukl3CC0lq6LfHE0YbvFm/l4i5RyyS+aUjL+8IuZDD9EH3amg==} + '@napi-rs/canvas@0.1.65': + resolution: {integrity: sha512-YcFhXQcp+b2d38zFOJNbpyPHnIL7KAEkhJQ+UeeKI5IpE9B8Cpf/M6RiHPQXSsSqnYbrfFylnW49dyh2oeSblQ==} engines: {node: '>= 10'} '@nodelib/fs.scandir@2.1.5': @@ -781,41 +785,49 @@ packages: resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.34.0': resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.34.0': resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.34.0': resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.34.0': resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.34.0': resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.34.0': resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.34.0': resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==} @@ -826,6 +838,7 @@ packages: resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.34.0': resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==} @@ -924,12 +937,14 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@tailwindcss/oxide-linux-arm64-musl@4.0.3': resolution: {integrity: sha512-YlzRxx7N1ampfgSKzEDw0iwDkJXUInR4cgNEqmR4TzHkU2Vhg59CGPJrTI7dxOBofD8+O35R13Nk9Ytyv0JUFg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@tailwindcss/oxide-linux-x64-gnu@4.0.3': resolution: {integrity: sha512-Xfc3z/li6XkuD7Hs+Uk6pjyCXnfnd9zuQTKOyDTZJ544xc2yoMKUkuDw6Et9wb31MzU2/c0CIUpTDa71lL9KHw==} @@ -942,6 +957,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': resolution: {integrity: sha512-qHPDMl+UUwsk1RMJMgAXvhraWqUUT+LR/tkXix5RA39UGxtTrHwsLIN1AhNxI5i2RFXAXfmFXDqZCdyQ4dWmAQ==} @@ -2889,48 +2905,48 @@ snapshots: dependencies: sparse-bitfield: 3.0.3 - '@napi-rs/canvas-android-arm64@0.1.66': + '@napi-rs/canvas-android-arm64@0.1.65': optional: true - '@napi-rs/canvas-darwin-arm64@0.1.66': + '@napi-rs/canvas-darwin-arm64@0.1.65': optional: true - '@napi-rs/canvas-darwin-x64@0.1.66': + '@napi-rs/canvas-darwin-x64@0.1.65': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.66': + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.65': optional: true - '@napi-rs/canvas-linux-arm64-gnu@0.1.66': + '@napi-rs/canvas-linux-arm64-gnu@0.1.65': optional: true - '@napi-rs/canvas-linux-arm64-musl@0.1.66': + '@napi-rs/canvas-linux-arm64-musl@0.1.65': optional: true - '@napi-rs/canvas-linux-riscv64-gnu@0.1.66': + '@napi-rs/canvas-linux-riscv64-gnu@0.1.65': optional: true - '@napi-rs/canvas-linux-x64-gnu@0.1.66': + '@napi-rs/canvas-linux-x64-gnu@0.1.65': optional: true - '@napi-rs/canvas-linux-x64-musl@0.1.66': + '@napi-rs/canvas-linux-x64-musl@0.1.65': optional: true - '@napi-rs/canvas-win32-x64-msvc@0.1.66': + '@napi-rs/canvas-win32-x64-msvc@0.1.65': optional: true - '@napi-rs/canvas@0.1.66': + '@napi-rs/canvas@0.1.65': optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.66 - '@napi-rs/canvas-darwin-arm64': 0.1.66 - '@napi-rs/canvas-darwin-x64': 0.1.66 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.66 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.66 - '@napi-rs/canvas-linux-arm64-musl': 0.1.66 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.66 - '@napi-rs/canvas-linux-x64-gnu': 0.1.66 - '@napi-rs/canvas-linux-x64-musl': 0.1.66 - '@napi-rs/canvas-win32-x64-msvc': 0.1.66 + '@napi-rs/canvas-android-arm64': 0.1.65 + '@napi-rs/canvas-darwin-arm64': 0.1.65 + '@napi-rs/canvas-darwin-x64': 0.1.65 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.65 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.65 + '@napi-rs/canvas-linux-arm64-musl': 0.1.65 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.65 + '@napi-rs/canvas-linux-x64-gnu': 0.1.65 + '@napi-rs/canvas-linux-x64-musl': 0.1.65 + '@napi-rs/canvas-win32-x64-msvc': 0.1.65 '@nodelib/fs.scandir@2.1.5': dependencies: From 39d1e328da49793252c0ef50ccd48481ed83e644 Mon Sep 17 00:00:00 2001 From: Robert Kovac Date: Sun, 2 Feb 2025 20:15:28 +0100 Subject: [PATCH 02/14] refactor: replace SlothPixel with Hypixel (#110) * start * refactro(stats): switch from slothpixel API to Hypixel's --- src/hooks.server.ts | 5 - src/lib/server/constants/accessories.ts | 7 +- src/lib/server/constants/bukkitToId.ts | 465 +++++++++++++++++++++++ src/lib/server/constants/update-items.ts | 15 +- src/lib/server/db/mongo.ts | 8 +- src/lib/server/db/mongo/update-items.ts | 50 ++- tools/data/bukkitToId.ts | 465 +++++++++++++++++++++++ tools/formatItems.ts | 45 +++ 8 files changed, 1032 insertions(+), 28 deletions(-) create mode 100644 src/lib/server/constants/bukkitToId.ts create mode 100644 tools/data/bukkitToId.ts create mode 100644 tools/formatItems.ts diff --git a/src/hooks.server.ts b/src/hooks.server.ts index e50e0423a..61eb3bacc 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,5 +1,3 @@ -import { updateCollections } from "$constants/update-collections"; -import { updateItems } from "$constants/update-items"; import { init as resourcesInit } from "$lib/server/custom_resources"; import { indexCollectons } from "$lib/server/db/mongo/index-collections"; import { intializeNEURepository, parseNEURepository } from "$lib/server/helper/NotEnoughUpdates/parseNEURepository"; @@ -20,9 +18,6 @@ export const init: ServerInit = async () => { await startMongo()?.then(() => { console.log("[MONGO] MongoDB successfully connected"); - updateItems(); - updateCollections(); - indexCollectons(); }); diff --git a/src/lib/server/constants/accessories.ts b/src/lib/server/constants/accessories.ts index 98ddc1bfc..05938c281 100644 --- a/src/lib/server/constants/accessories.ts +++ b/src/lib/server/constants/accessories.ts @@ -1,7 +1,7 @@ // CREDITS: https://github.com/MattTheCuber (Modified) import { ITEMS } from "$lib/shared/constants/items"; import type { SpecialAccessory, SpecialAccessoryConstant, allAccessories } from "$types/stats"; -import { updateItems } from "./update-items"; +import { updateItemsConstants } from "./update-items"; let ACCESSORIES = [] as allAccessories[]; function getAccessories() { @@ -15,8 +15,9 @@ function getAccessories() { ACCESSORIES = output; } -if (ITEMS.size === 0) { - await updateItems(); +if (ITEMS.size === 0 || ACCESSORIES.length === 0) { + await updateItemsConstants(); + getAccessories(); } setTimeout(getAccessories, 60 * 60 * 1000); // 1 hour diff --git a/src/lib/server/constants/bukkitToId.ts b/src/lib/server/constants/bukkitToId.ts new file mode 100644 index 000000000..6d506f6a8 --- /dev/null +++ b/src/lib/server/constants/bukkitToId.ts @@ -0,0 +1,465 @@ +export const BUKKIT_TO_ID = { + AIR: 0, + STONE: 1, + GRASS: 2, + DIRT: 3, + COBBLESTONE: 4, + WOOD: 5, + SAPLING: 6, + BEDROCK: 7, + WATER: 8, + STATIONARY_WATER: 9, + LAVA: 10, + STATIONARY_LAVA: 11, + SAND: 12, + GRAVEL: 13, + GOLD_ORE: 14, + IRON_ORE: 15, + COAL_ORE: 16, + LOG: 17, + LEAVES: 18, + SPONGE: 19, + GLASS: 20, + LAPIS_ORE: 21, + LAPIS_BLOCK: 22, + DISPENSER: 23, + SANDSTONE: 24, + NOTE_BLOCK: 25, + BED_BLOCK: 26, + POWERED_RAIL: 27, + DETECTOR_RAIL: 28, + PISTON_STICKY_BASE: 29, + WEB: 30, + LONG_GRASS: 31, + DEAD_BUSH: 32, + PISTON_BASE: 33, + PISTON_EXTENSION: 34, + WOOL: 35, + PISTON_MOVING_PIECE: 36, + YELLOW_FLOWER: 37, + RED_ROSE: 38, + BROWN_MUSHROOM: 39, + RED_MUSHROOM: 40, + GOLD_BLOCK: 41, + IRON_BLOCK: 42, + DOUBLE_STEP: 43, + STEP: 44, + BRICK: 45, + TNT: 46, + BOOKSHELF: 47, + MOSSY_COBBLESTONE: 48, + OBSIDIAN: 49, + TORCH: 50, + FIRE: 51, + MOB_SPAWNER: 52, + WOOD_STAIRS: 53, + CHEST: 54, + REDSTONE_WIRE: 55, + DIAMOND_ORE: 56, + DIAMOND_BLOCK: 57, + WORKBENCH: 58, + CROPS: 59, + SOIL: 60, + FURNACE: 61, + BURNING_FURNACE: 62, + SIGN_POST: 63, + WOODEN_DOOR: 64, + LADDER: 65, + RAILS: 66, + COBBLESTONE_STAIRS: 67, + WALL_SIGN: 68, + LEVER: 69, + STONE_PLATE: 70, + IRON_DOOR_BLOCK: 71, + WOOD_PLATE: 72, + REDSTONE_ORE: 73, + GLOWING_REDSTONE_ORE: 74, + REDSTONE_TORCH_OFF: 75, + REDSTONE_TORCH_ON: 76, + STONE_BUTTON: 77, + SNOW: 78, + ICE: 79, + SNOW_BLOCK: 80, + CACTUS: 81, + CLAY: 82, + SUGAR_CANE_BLOCK: 83, + JUKEBOX: 84, + FENCE: 85, + PUMPKIN: 86, + NETHERRACK: 87, + SOUL_SAND: 88, + GLOWSTONE: 89, + PORTAL: 90, + JACK_O_LANTERN: 91, + CAKE_BLOCK: 92, + DIODE_BLOCK_OFF: 93, + DIODE_BLOCK_ON: 94, + STAINED_GLASS: 95, + TRAP_DOOR: 96, + MONSTER_EGGS: 97, + SMOOTH_BRICK: 98, + HUGE_MUSHROOM_1: 99, + HUGE_MUSHROOM_2: 100, + IRON_FENCE: 101, + THIN_GLASS: 102, + MELON_BLOCK: 103, + PUMPKIN_STEM: 104, + MELON_STEM: 105, + VINE: 106, + FENCE_GATE: 107, + BRICK_STAIRS: 108, + SMOOTH_STAIRS: 109, + MYCEL: 110, + WATER_LILY: 111, + NETHER_BRICK: 112, + NETHER_FENCE: 113, + NETHER_BRICK_STAIRS: 114, + NETHER_WARTS: 115, + ENCHANTMENT_TABLE: 116, + BREWING_STAND: 117, + CAULDRON: 118, + ENDER_PORTAL: 119, + ENDER_PORTAL_FRAME: 120, + ENDER_STONE: 121, + DRAGON_EGG: 122, + REDSTONE_LAMP_OFF: 123, + REDSTONE_LAMP_ON: 124, + WOOD_DOUBLE_STEP: 125, + WOOD_STEP: 126, + COCOA: 127, + SANDSTONE_STAIRS: 128, + EMERALD_ORE: 129, + ENDER_CHEST: 130, + TRIPWIRE_HOOK: 131, + TRIPWIRE: 132, + EMERALD_BLOCK: 133, + SPRUCE_WOOD_STAIRS: 134, + BIRCH_WOOD_STAIRS: 135, + JUNGLE_WOOD_STAIRS: 136, + COMMAND: 137, + BEACON: 138, + COBBLE_WALL: 139, + FLOWER_POT: 140, + CARROT: 141, + POTATO: 142, + WOOD_BUTTON: 143, + SKULL: 144, + ANVIL: 145, + TRAPPED_CHEST: 146, + GOLD_PLATE: 147, + IRON_PLATE: 148, + REDSTONE_COMPARATOR_OFF: 149, + REDSTONE_COMPARATOR_ON: 150, + DAYLIGHT_DETECTOR: 151, + REDSTONE_BLOCK: 152, + QUARTZ_ORE: 153, + HOPPER: 154, + QUARTZ_BLOCK: 155, + QUARTZ_STAIRS: 156, + ACTIVATOR_RAIL: 157, + DROPPER: 158, + STAINED_CLAY: 159, + STAINED_GLASS_PANE: 160, + LEAVES_2: 161, + LOG_2: 162, + ACACIA_STAIRS: 163, + DARK_OAK_STAIRS: 164, + SLIME_BLOCK: 165, + BARRIER: 166, + IRON_TRAPDOOR: 167, + PRISMARINE: 168, + SEA_LANTERN: 169, + HAY_BLOCK: 170, + CARPET: 171, + HARD_CLAY: 172, + COAL_BLOCK: 173, + PACKED_ICE: 174, + DOUBLE_PLANT: 175, + STANDING_BANNER: 176, + WALL_BANNER: 177, + DAYLIGHT_DETECTOR_INVERTED: 178, + RED_SANDSTONE: 179, + RED_SANDSTONE_STAIRS: 180, + DOUBLE_STONE_SLAB2: 181, + STONE_SLAB2: 182, + SPRUCE_FENCE_GATE: 183, + BIRCH_FENCE_GATE: 184, + JUNGLE_FENCE_GATE: 185, + DARK_OAK_FENCE_GATE: 186, + ACACIA_FENCE_GATE: 187, + SPRUCE_FENCE: 188, + BIRCH_FENCE: 189, + JUNGLE_FENCE: 190, + DARK_OAK_FENCE: 191, + ACACIA_FENCE: 192, + SPRUCE_DOOR: 193, + BIRCH_DOOR: 194, + JUNGLE_DOOR: 195, + ACACIA_DOOR: 196, + DARK_OAK_DOOR: 197, + END_ROD: 198, + CHORUS_PLANT: 199, + CHORUS_FLOWER: 200, + PURPUR_BLOCK: 201, + PURPUR_PILLAR: 202, + PURPUR_STAIRS: 203, + PURPUR_DOUBLE_SLAB: 204, + PURPUR_SLAB: 205, + END_BRICKS: 206, + BEETROOT_BLOCK: 207, + GRASS_PATH: 208, + END_GATEWAY: 209, + COMMAND_REPEATING: 210, + COMMAND_CHAIN: 211, + FROSTED_ICE: 212, + MAGMA: 213, + NETHER_WART_BLOCK: 214, + RED_NETHER_BRICK: 215, + BONE_BLOCK: 216, + STRUCTURE_VOID: 217, + OBSERVER: 218, + WHITE_SHULKER_BOX: 219, + ORANGE_SHULKER_BOX: 220, + MAGENTA_SHULKER_BOX: 221, + LIGHT_BLUE_SHULKER_BOX: 222, + YELLOW_SHULKER_BOX: 223, + LIME_SHULKER_BOX: 224, + PINK_SHULKER_BOX: 225, + GRAY_SHULKER_BOX: 226, + SILVER_SHULKER_BOX: 227, + CYAN_SHULKER_BOX: 228, + PURPLE_SHULKER_BOX: 229, + BLUE_SHULKER_BOX: 230, + BROWN_SHULKER_BOX: 231, + GREEN_SHULKER_BOX: 232, + RED_SHULKER_BOX: 233, + BLACK_SHULKER_BOX: 234, + WHITE_GLAZED_TERRACOTTA: 235, + ORANGE_GLAZED_TERRACOTTA: 236, + MAGENTA_GLAZED_TERRACOTTA: 237, + LIGHT_BLUE_GLAZED_TERRACOTTA: 238, + YELLOW_GLAZED_TERRACOTTA: 239, + LIME_GLAZED_TERRACOTTA: 240, + PINK_GLAZED_TERRACOTTA: 241, + GRAY_GLAZED_TERRACOTTA: 242, + SILVER_GLAZED_TERRACOTTA: 243, + CYAN_GLAZED_TERRACOTTA: 244, + PURPLE_GLAZED_TERRACOTTA: 245, + BLUE_GLAZED_TERRACOTTA: 246, + BROWN_GLAZED_TERRACOTTA: 247, + GREEN_GLAZED_TERRACOTTA: 248, + RED_GLAZED_TERRACOTTA: 249, + BLACK_GLAZED_TERRACOTTA: 250, + CONCRETE: 251, + CONCRETE_POWDER: 252, + STRUCTURE_BLOCK: 255, + IRON_SPADE: 256, + IRON_PICKAXE: 257, + IRON_AXE: 258, + FLINT_AND_STEEL: 259, + APPLE: 260, + BOW: 261, + ARROW: 262, + COAL: 263, + DIAMOND: 264, + IRON_INGOT: 265, + GOLD_INGOT: 266, + IRON_SWORD: 267, + WOOD_SWORD: 268, + WOOD_SPADE: 269, + WOOD_PICKAXE: 270, + WOOD_AXE: 271, + STONE_SWORD: 272, + STONE_SPADE: 273, + STONE_PICKAXE: 274, + STONE_AXE: 275, + DIAMOND_SWORD: 276, + DIAMOND_SPADE: 277, + DIAMOND_PICKAXE: 278, + DIAMOND_AXE: 279, + STICK: 280, + BOWL: 281, + MUSHROOM_SOUP: 282, + GOLD_SWORD: 283, + GOLD_SPADE: 284, + GOLD_PICKAXE: 285, + GOLD_AXE: 286, + STRING: 287, + FEATHER: 288, + SULPHUR: 289, + WOOD_HOE: 290, + STONE_HOE: 291, + IRON_HOE: 292, + DIAMOND_HOE: 293, + GOLD_HOE: 294, + SEEDS: 295, + WHEAT: 296, + BREAD: 297, + LEATHER_HELMET: 298, + LEATHER_CHESTPLATE: 299, + LEATHER_LEGGINGS: 300, + LEATHER_BOOTS: 301, + CHAINMAIL_HELMET: 302, + CHAINMAIL_CHESTPLATE: 303, + CHAINMAIL_LEGGINGS: 304, + CHAINMAIL_BOOTS: 305, + IRON_HELMET: 306, + IRON_CHESTPLATE: 307, + IRON_LEGGINGS: 308, + IRON_BOOTS: 309, + DIAMOND_HELMET: 310, + DIAMOND_CHESTPLATE: 311, + DIAMOND_LEGGINGS: 312, + DIAMOND_BOOTS: 313, + GOLD_HELMET: 314, + GOLD_CHESTPLATE: 315, + GOLD_LEGGINGS: 316, + GOLD_BOOTS: 317, + FLINT: 318, + PORK: 319, + GRILLED_PORK: 320, + PAINTING: 321, + GOLDEN_APPLE: 322, + SIGN: 323, + WOOD_DOOR: 324, + BUCKET: 325, + WATER_BUCKET: 326, + LAVA_BUCKET: 327, + MINECART: 328, + SADDLE: 329, + IRON_DOOR: 330, + REDSTONE: 331, + SNOW_BALL: 332, + BOAT: 333, + LEATHER: 334, + MILK_BUCKET: 335, + CLAY_BRICK: 336, + CLAY_BALL: 337, + SUGAR_CANE: 338, + PAPER: 339, + BOOK: 340, + SLIME_BALL: 341, + STORAGE_MINECART: 342, + POWERED_MINECART: 343, + EGG: 344, + COMPASS: 345, + FISHING_ROD: 346, + WATCH: 347, + GLOWSTONE_DUST: 348, + RAW_FISH: 349, + COOKED_FISH: 350, + INK_SACK: 351, + BONE: 352, + SUGAR: 353, + CAKE: 354, + BED: 355, + DIODE: 356, + COOKIE: 357, + MAP: 358, + SHEARS: 359, + MELON: 360, + PUMPKIN_SEEDS: 361, + MELON_SEEDS: 362, + RAW_BEEF: 363, + COOKED_BEEF: 364, + RAW_CHICKEN: 365, + COOKED_CHICKEN: 366, + ROTTEN_FLESH: 367, + ENDER_PEARL: 368, + BLAZE_ROD: 369, + GHAST_TEAR: 370, + GOLD_NUGGET: 371, + NETHER_STALK: 372, + POTION: 373, + GLASS_BOTTLE: 374, + SPIDER_EYE: 375, + FERMENTED_SPIDER_EYE: 376, + BLAZE_POWDER: 377, + MAGMA_CREAM: 378, + BREWING_STAND_ITEM: 379, + CAULDRON_ITEM: 380, + EYE_OF_ENDER: 381, + SPECKLED_MELON: 382, + MONSTER_EGG: 383, + EXP_BOTTLE: 384, + FIREBALL: 385, + BOOK_AND_QUILL: 386, + WRITTEN_BOOK: 387, + EMERALD: 388, + ITEM_FRAME: 389, + FLOWER_POT_ITEM: 390, + CARROT_ITEM: 391, + POTATO_ITEM: 392, + BAKED_POTATO: 393, + POISONOUS_POTATO: 394, + EMPTY_MAP: 395, + GOLDEN_CARROT: 396, + SKULL_ITEM: 397, + CARROT_STICK: 398, + NETHER_STAR: 399, + PUMPKIN_PIE: 400, + FIREWORK: 401, + FIREWORK_CHARGE: 402, + ENCHANTED_BOOK: 403, + REDSTONE_COMPARATOR: 404, + NETHER_BRICK_ITEM: 405, + QUARTZ: 406, + EXPLOSIVE_MINECART: 407, + HOPPER_MINECART: 408, + PRISMARINE_SHARD: 409, + PRISMARINE_CRYSTALS: 410, + RABBIT: 411, + COOKED_RABBIT: 412, + RABBIT_STEW: 413, + RABBIT_FOOT: 414, + RABBIT_HIDE: 415, + ARMOR_STAND: 416, + IRON_BARDING: 417, + GOLD_BARDING: 418, + DIAMOND_BARDING: 419, + LEASH: 420, + NAME_TAG: 421, + COMMAND_MINECART: 422, + MUTTON: 423, + COOKED_MUTTON: 424, + BANNER: 425, + END_CRYSTAL: 426, + SPRUCE_DOOR_ITEM: 427, + BIRCH_DOOR_ITEM: 428, + JUNGLE_DOOR_ITEM: 429, + ACACIA_DOOR_ITEM: 430, + DARK_OAK_DOOR_ITEM: 431, + CHORUS_FRUIT: 432, + CHORUS_FRUIT_POPPED: 433, + BEETROOT: 434, + BEETROOT_SEEDS: 435, + BEETROOT_SOUP: 436, + DRAGONS_BREATH: 437, + SPLASH_POTION: 438, + SPECTRAL_ARROW: 439, + TIPPED_ARROW: 440, + LINGERING_POTION: 441, + SHIELD: 442, + ELYTRA: 443, + BOAT_SPRUCE: 444, + BOAT_BIRCH: 445, + BOAT_JUNGLE: 446, + BOAT_ACACIA: 447, + BOAT_DARK_OAK: 448, + TOTEM: 449, + SHULKER_SHELL: 450, + IRON_NUGGET: 452, + KNOWLEDGE_BOOK: 453, + GOLD_RECORD: 2256, + GREEN_RECORD: 2257, + RECORD_3: 2258, + RECORD_4: 2259, + RECORD_5: 2260, + RECORD_6: 2261, + RECORD_7: 2262, + RECORD_8: 2263, + RECORD_9: 2264, + RECORD_10: 2265, + RECORD_11: 2266, + RECORD_12: 2267 +} as Record; diff --git a/src/lib/server/constants/update-items.ts b/src/lib/server/constants/update-items.ts index fd6d96bed..75ebcc155 100644 --- a/src/lib/server/constants/update-items.ts +++ b/src/lib/server/constants/update-items.ts @@ -3,24 +3,25 @@ import MONGO from "$lib/server/db/mongo"; import { ITEMS } from "$lib/shared/constants/items"; import type { DatabaseItem } from "$types/global"; -export async function updateItems() { +export async function updateItemsConstants() { if (building) return; + const timeNow = Date.now(); const items = await MONGO.collection("items").findOne({}); if (items?.items === undefined) { return; } - for (const item of items.items) { - const skyBlockItem = item as DatabaseItem; - if (skyBlockItem.skyblock_id === undefined) { + for (const item of Object.values(items.items)) { + const skyblockItem = item as DatabaseItem; + if (skyblockItem.skyblock_id === undefined) { return; } - ITEMS.set(skyBlockItem.skyblock_id, skyBlockItem); + ITEMS.set(skyblockItem.skyblock_id, skyblockItem); } - console.log("[ITEMS] Updated items"); + console.log(`[ITEMS] Updated items in ${(Date.now() - timeNow).toLocaleString()}ms`); } -setTimeout(updateItems, 1000 * 60 * 60 * 12); // 12 hours +setTimeout(updateItemsConstants, 1000 * 60 * 60 * 12); // 12 hours diff --git a/src/lib/server/db/mongo.ts b/src/lib/server/db/mongo.ts index fbae0c8e8..9894a4534 100644 --- a/src/lib/server/db/mongo.ts +++ b/src/lib/server/db/mongo.ts @@ -1,4 +1,5 @@ import { building } from "$app/environment"; +import { updateItemsConstants } from "$constants/update-items"; import { MONGO_DATABASE, MONGO_HOST, MONGO_PORT } from "$env/static/private"; import { MongoClient, type Db } from "mongodb"; import { updateCollections } from "./mongo/update-collections"; @@ -6,12 +7,13 @@ import { updateItems } from "./mongo/update-items"; const client = !building ? new MongoClient(`mongodb://${MONGO_HOST}:${MONGO_PORT}/${MONGO_DATABASE}`) : null; -export function startMongo() { +export async function startMongo() { if (building) return; console.log("[MONGO] Starting mongo..."); - updateItems(); - updateCollections(); + await updateItems(); + await updateItemsConstants(); + await updateCollections(); return client?.connect() as Promise; } diff --git a/src/lib/server/db/mongo/update-items.ts b/src/lib/server/db/mongo/update-items.ts index 15e6a0bcf..0adbedf7a 100644 --- a/src/lib/server/db/mongo/update-items.ts +++ b/src/lib/server/db/mongo/update-items.ts @@ -1,10 +1,24 @@ import { building } from "$app/environment"; +import { BUKKIT_TO_ID } from "$constants/bukkitToId"; +import { updateItemsConstants } from "$constants/update-items"; +import type { DatabaseItem } from "$types/stats"; import MONGO from "../mongo"; const headers = { Accept: "application/json", "User-Agent": "SkyCrypt" }; const updateInterval = 1000 * 60 * 60 * 12; // 12 hours const cacheInternal = 10 * 60 * 1000; // 10 minutes +function getSkinHash(base64: string) { + let texture = null; + try { + texture = JSON.parse(Buffer.from(base64, "base64").toString()).textures.SKIN.url.split("/").pop(); + } catch { + // Do nothing + } + + return texture; +} + export async function updateItems() { if (building) return; @@ -13,32 +27,48 @@ export async function updateItems() { const cache = await MONGO.collection("items").findOne({}); if (cache && cache.lastUpdated > Date.now() - cacheInternal) { console.log(`[ITEMS] Fetched items in ${(Date.now() - timeNow).toLocaleString()}ms (cached)`); + + await updateItemsConstants(); return; } - const response = await fetch("https://api.slothpixel.me/api/skyblock/items", { + const response = await fetch("https://api.hypixel.net/resources/skyblock/items", { headers: headers }); const data = await response.json(); - const items = Object.keys(data).map((skyblockId) => { - const skyblockItem = data[skyblockId]; + const items = {} as Record; + for (const item of data.items) { + const { id, name, tier, category, skin, durability, ...rest } = item; - const item = { - skyblock_id: skyblockId, - id: data.item_id, - damage: 0, - tier: "common" + const obj = { + skyblock_id: id, + id, + name, + item_id: BUKKIT_TO_ID[item?.material] || 0, + ...rest, + tier: item.tier ? item.tier.toLowerCase() : "common", + damage: item.durability || 0 }; - return Object.assign(item, skyblockItem); - }); + if (category) { + obj.category = category.toLowerCase(); + } + + if (skin) { + obj.texture = getSkinHash(skin.value); + } + + items[id] = obj; + } const output = { lastUpdated: Date.now(), items }; await MONGO.collection("items").updateOne({}, { $set: output }, { upsert: true }); console.log(`[ITEMS] Fetched items in ${(Date.now() - timeNow).toLocaleString()}ms`); + + await updateItemsConstants(); } catch (e) { console.error(e); } diff --git a/tools/data/bukkitToId.ts b/tools/data/bukkitToId.ts new file mode 100644 index 000000000..bd98acc84 --- /dev/null +++ b/tools/data/bukkitToId.ts @@ -0,0 +1,465 @@ +export const BUKKIT_TO_ID = { + AIR: 0, + STONE: 1, + GRASS: 2, + DIRT: 3, + COBBLESTONE: 4, + WOOD: 5, + SAPLING: 6, + BEDROCK: 7, + WATER: 8, + STATIONARY_WATER: 9, + LAVA: 10, + STATIONARY_LAVA: 11, + SAND: 12, + GRAVEL: 13, + GOLD_ORE: 14, + IRON_ORE: 15, + COAL_ORE: 16, + LOG: 17, + LEAVES: 18, + SPONGE: 19, + GLASS: 20, + LAPIS_ORE: 21, + LAPIS_BLOCK: 22, + DISPENSER: 23, + SANDSTONE: 24, + NOTE_BLOCK: 25, + BED_BLOCK: 26, + POWERED_RAIL: 27, + DETECTOR_RAIL: 28, + PISTON_STICKY_BASE: 29, + WEB: 30, + LONG_GRASS: 31, + DEAD_BUSH: 32, + PISTON_BASE: 33, + PISTON_EXTENSION: 34, + WOOL: 35, + PISTON_MOVING_PIECE: 36, + YELLOW_FLOWER: 37, + RED_ROSE: 38, + BROWN_MUSHROOM: 39, + RED_MUSHROOM: 40, + GOLD_BLOCK: 41, + IRON_BLOCK: 42, + DOUBLE_STEP: 43, + STEP: 44, + BRICK: 45, + TNT: 46, + BOOKSHELF: 47, + MOSSY_COBBLESTONE: 48, + OBSIDIAN: 49, + TORCH: 50, + FIRE: 51, + MOB_SPAWNER: 52, + WOOD_STAIRS: 53, + CHEST: 54, + REDSTONE_WIRE: 55, + DIAMOND_ORE: 56, + DIAMOND_BLOCK: 57, + WORKBENCH: 58, + CROPS: 59, + SOIL: 60, + FURNACE: 61, + BURNING_FURNACE: 62, + SIGN_POST: 63, + WOODEN_DOOR: 64, + LADDER: 65, + RAILS: 66, + COBBLESTONE_STAIRS: 67, + WALL_SIGN: 68, + LEVER: 69, + STONE_PLATE: 70, + IRON_DOOR_BLOCK: 71, + WOOD_PLATE: 72, + REDSTONE_ORE: 73, + GLOWING_REDSTONE_ORE: 74, + REDSTONE_TORCH_OFF: 75, + REDSTONE_TORCH_ON: 76, + STONE_BUTTON: 77, + SNOW: 78, + ICE: 79, + SNOW_BLOCK: 80, + CACTUS: 81, + CLAY: 82, + SUGAR_CANE_BLOCK: 83, + JUKEBOX: 84, + FENCE: 85, + PUMPKIN: 86, + NETHERRACK: 87, + SOUL_SAND: 88, + GLOWSTONE: 89, + PORTAL: 90, + JACK_O_LANTERN: 91, + CAKE_BLOCK: 92, + DIODE_BLOCK_OFF: 93, + DIODE_BLOCK_ON: 94, + STAINED_GLASS: 95, + TRAP_DOOR: 96, + MONSTER_EGGS: 97, + SMOOTH_BRICK: 98, + HUGE_MUSHROOM_1: 99, + HUGE_MUSHROOM_2: 100, + IRON_FENCE: 101, + THIN_GLASS: 102, + MELON_BLOCK: 103, + PUMPKIN_STEM: 104, + MELON_STEM: 105, + VINE: 106, + FENCE_GATE: 107, + BRICK_STAIRS: 108, + SMOOTH_STAIRS: 109, + MYCEL: 110, + WATER_LILY: 111, + NETHER_BRICK: 112, + NETHER_FENCE: 113, + NETHER_BRICK_STAIRS: 114, + NETHER_WARTS: 115, + ENCHANTMENT_TABLE: 116, + BREWING_STAND: 117, + CAULDRON: 118, + ENDER_PORTAL: 119, + ENDER_PORTAL_FRAME: 120, + ENDER_STONE: 121, + DRAGON_EGG: 122, + REDSTONE_LAMP_OFF: 123, + REDSTONE_LAMP_ON: 124, + WOOD_DOUBLE_STEP: 125, + WOOD_STEP: 126, + COCOA: 127, + SANDSTONE_STAIRS: 128, + EMERALD_ORE: 129, + ENDER_CHEST: 130, + TRIPWIRE_HOOK: 131, + TRIPWIRE: 132, + EMERALD_BLOCK: 133, + SPRUCE_WOOD_STAIRS: 134, + BIRCH_WOOD_STAIRS: 135, + JUNGLE_WOOD_STAIRS: 136, + COMMAND: 137, + BEACON: 138, + COBBLE_WALL: 139, + FLOWER_POT: 140, + CARROT: 141, + POTATO: 142, + WOOD_BUTTON: 143, + SKULL: 144, + ANVIL: 145, + TRAPPED_CHEST: 146, + GOLD_PLATE: 147, + IRON_PLATE: 148, + REDSTONE_COMPARATOR_OFF: 149, + REDSTONE_COMPARATOR_ON: 150, + DAYLIGHT_DETECTOR: 151, + REDSTONE_BLOCK: 152, + QUARTZ_ORE: 153, + HOPPER: 154, + QUARTZ_BLOCK: 155, + QUARTZ_STAIRS: 156, + ACTIVATOR_RAIL: 157, + DROPPER: 158, + STAINED_CLAY: 159, + STAINED_GLASS_PANE: 160, + LEAVES_2: 161, + LOG_2: 162, + ACACIA_STAIRS: 163, + DARK_OAK_STAIRS: 164, + SLIME_BLOCK: 165, + BARRIER: 166, + IRON_TRAPDOOR: 167, + PRISMARINE: 168, + SEA_LANTERN: 169, + HAY_BLOCK: 170, + CARPET: 171, + HARD_CLAY: 172, + COAL_BLOCK: 173, + PACKED_ICE: 174, + DOUBLE_PLANT: 175, + STANDING_BANNER: 176, + WALL_BANNER: 177, + DAYLIGHT_DETECTOR_INVERTED: 178, + RED_SANDSTONE: 179, + RED_SANDSTONE_STAIRS: 180, + DOUBLE_STONE_SLAB2: 181, + STONE_SLAB2: 182, + SPRUCE_FENCE_GATE: 183, + BIRCH_FENCE_GATE: 184, + JUNGLE_FENCE_GATE: 185, + DARK_OAK_FENCE_GATE: 186, + ACACIA_FENCE_GATE: 187, + SPRUCE_FENCE: 188, + BIRCH_FENCE: 189, + JUNGLE_FENCE: 190, + DARK_OAK_FENCE: 191, + ACACIA_FENCE: 192, + SPRUCE_DOOR: 193, + BIRCH_DOOR: 194, + JUNGLE_DOOR: 195, + ACACIA_DOOR: 196, + DARK_OAK_DOOR: 197, + END_ROD: 198, + CHORUS_PLANT: 199, + CHORUS_FLOWER: 200, + PURPUR_BLOCK: 201, + PURPUR_PILLAR: 202, + PURPUR_STAIRS: 203, + PURPUR_DOUBLE_SLAB: 204, + PURPUR_SLAB: 205, + END_BRICKS: 206, + BEETROOT_BLOCK: 207, + GRASS_PATH: 208, + END_GATEWAY: 209, + COMMAND_REPEATING: 210, + COMMAND_CHAIN: 211, + FROSTED_ICE: 212, + MAGMA: 213, + NETHER_WART_BLOCK: 214, + RED_NETHER_BRICK: 215, + BONE_BLOCK: 216, + STRUCTURE_VOID: 217, + OBSERVER: 218, + WHITE_SHULKER_BOX: 219, + ORANGE_SHULKER_BOX: 220, + MAGENTA_SHULKER_BOX: 221, + LIGHT_BLUE_SHULKER_BOX: 222, + YELLOW_SHULKER_BOX: 223, + LIME_SHULKER_BOX: 224, + PINK_SHULKER_BOX: 225, + GRAY_SHULKER_BOX: 226, + SILVER_SHULKER_BOX: 227, + CYAN_SHULKER_BOX: 228, + PURPLE_SHULKER_BOX: 229, + BLUE_SHULKER_BOX: 230, + BROWN_SHULKER_BOX: 231, + GREEN_SHULKER_BOX: 232, + RED_SHULKER_BOX: 233, + BLACK_SHULKER_BOX: 234, + WHITE_GLAZED_TERRACOTTA: 235, + ORANGE_GLAZED_TERRACOTTA: 236, + MAGENTA_GLAZED_TERRACOTTA: 237, + LIGHT_BLUE_GLAZED_TERRACOTTA: 238, + YELLOW_GLAZED_TERRACOTTA: 239, + LIME_GLAZED_TERRACOTTA: 240, + PINK_GLAZED_TERRACOTTA: 241, + GRAY_GLAZED_TERRACOTTA: 242, + SILVER_GLAZED_TERRACOTTA: 243, + CYAN_GLAZED_TERRACOTTA: 244, + PURPLE_GLAZED_TERRACOTTA: 245, + BLUE_GLAZED_TERRACOTTA: 246, + BROWN_GLAZED_TERRACOTTA: 247, + GREEN_GLAZED_TERRACOTTA: 248, + RED_GLAZED_TERRACOTTA: 249, + BLACK_GLAZED_TERRACOTTA: 250, + CONCRETE: 251, + CONCRETE_POWDER: 252, + STRUCTURE_BLOCK: 255, + IRON_SPADE: 256, + IRON_PICKAXE: 257, + IRON_AXE: 258, + FLINT_AND_STEEL: 259, + APPLE: 260, + BOW: 261, + ARROW: 262, + COAL: 263, + DIAMOND: 264, + IRON_INGOT: 265, + GOLD_INGOT: 266, + IRON_SWORD: 267, + WOOD_SWORD: 268, + WOOD_SPADE: 269, + WOOD_PICKAXE: 270, + WOOD_AXE: 271, + STONE_SWORD: 272, + STONE_SPADE: 273, + STONE_PICKAXE: 274, + STONE_AXE: 275, + DIAMOND_SWORD: 276, + DIAMOND_SPADE: 277, + DIAMOND_PICKAXE: 278, + DIAMOND_AXE: 279, + STICK: 280, + BOWL: 281, + MUSHROOM_SOUP: 282, + GOLD_SWORD: 283, + GOLD_SPADE: 284, + GOLD_PICKAXE: 285, + GOLD_AXE: 286, + STRING: 287, + FEATHER: 288, + SULPHUR: 289, + WOOD_HOE: 290, + STONE_HOE: 291, + IRON_HOE: 292, + DIAMOND_HOE: 293, + GOLD_HOE: 294, + SEEDS: 295, + WHEAT: 296, + BREAD: 297, + LEATHER_HELMET: 298, + LEATHER_CHESTPLATE: 299, + LEATHER_LEGGINGS: 300, + LEATHER_BOOTS: 301, + CHAINMAIL_HELMET: 302, + CHAINMAIL_CHESTPLATE: 303, + CHAINMAIL_LEGGINGS: 304, + CHAINMAIL_BOOTS: 305, + IRON_HELMET: 306, + IRON_CHESTPLATE: 307, + IRON_LEGGINGS: 308, + IRON_BOOTS: 309, + DIAMOND_HELMET: 310, + DIAMOND_CHESTPLATE: 311, + DIAMOND_LEGGINGS: 312, + DIAMOND_BOOTS: 313, + GOLD_HELMET: 314, + GOLD_CHESTPLATE: 315, + GOLD_LEGGINGS: 316, + GOLD_BOOTS: 317, + FLINT: 318, + PORK: 319, + GRILLED_PORK: 320, + PAINTING: 321, + GOLDEN_APPLE: 322, + SIGN: 323, + WOOD_DOOR: 324, + BUCKET: 325, + WATER_BUCKET: 326, + LAVA_BUCKET: 327, + MINECART: 328, + SADDLE: 329, + IRON_DOOR: 330, + REDSTONE: 331, + SNOW_BALL: 332, + BOAT: 333, + LEATHER: 334, + MILK_BUCKET: 335, + CLAY_BRICK: 336, + CLAY_BALL: 337, + SUGAR_CANE: 338, + PAPER: 339, + BOOK: 340, + SLIME_BALL: 341, + STORAGE_MINECART: 342, + POWERED_MINECART: 343, + EGG: 344, + COMPASS: 345, + FISHING_ROD: 346, + WATCH: 347, + GLOWSTONE_DUST: 348, + RAW_FISH: 349, + COOKED_FISH: 350, + INK_SACK: 351, + BONE: 352, + SUGAR: 353, + CAKE: 354, + BED: 355, + DIODE: 356, + COOKIE: 357, + MAP: 358, + SHEARS: 359, + MELON: 360, + PUMPKIN_SEEDS: 361, + MELON_SEEDS: 362, + RAW_BEEF: 363, + COOKED_BEEF: 364, + RAW_CHICKEN: 365, + COOKED_CHICKEN: 366, + ROTTEN_FLESH: 367, + ENDER_PEARL: 368, + BLAZE_ROD: 369, + GHAST_TEAR: 370, + GOLD_NUGGET: 371, + NETHER_STALK: 372, + POTION: 373, + GLASS_BOTTLE: 374, + SPIDER_EYE: 375, + FERMENTED_SPIDER_EYE: 376, + BLAZE_POWDER: 377, + MAGMA_CREAM: 378, + BREWING_STAND_ITEM: 379, + CAULDRON_ITEM: 380, + EYE_OF_ENDER: 381, + SPECKLED_MELON: 382, + MONSTER_EGG: 383, + EXP_BOTTLE: 384, + FIREBALL: 385, + BOOK_AND_QUILL: 386, + WRITTEN_BOOK: 387, + EMERALD: 388, + ITEM_FRAME: 389, + FLOWER_POT_ITEM: 390, + CARROT_ITEM: 391, + POTATO_ITEM: 392, + BAKED_POTATO: 393, + POISONOUS_POTATO: 394, + EMPTY_MAP: 395, + GOLDEN_CARROT: 396, + SKULL_ITEM: 397, + CARROT_STICK: 398, + NETHER_STAR: 399, + PUMPKIN_PIE: 400, + FIREWORK: 401, + FIREWORK_CHARGE: 402, + ENCHANTED_BOOK: 403, + REDSTONE_COMPARATOR: 404, + NETHER_BRICK_ITEM: 405, + QUARTZ: 406, + EXPLOSIVE_MINECART: 407, + HOPPER_MINECART: 408, + PRISMARINE_SHARD: 409, + PRISMARINE_CRYSTALS: 410, + RABBIT: 411, + COOKED_RABBIT: 412, + RABBIT_STEW: 413, + RABBIT_FOOT: 414, + RABBIT_HIDE: 415, + ARMOR_STAND: 416, + IRON_BARDING: 417, + GOLD_BARDING: 418, + DIAMOND_BARDING: 419, + LEASH: 420, + NAME_TAG: 421, + COMMAND_MINECART: 422, + MUTTON: 423, + COOKED_MUTTON: 424, + BANNER: 425, + END_CRYSTAL: 426, + SPRUCE_DOOR_ITEM: 427, + BIRCH_DOOR_ITEM: 428, + JUNGLE_DOOR_ITEM: 429, + ACACIA_DOOR_ITEM: 430, + DARK_OAK_DOOR_ITEM: 431, + CHORUS_FRUIT: 432, + CHORUS_FRUIT_POPPED: 433, + BEETROOT: 434, + BEETROOT_SEEDS: 435, + BEETROOT_SOUP: 436, + DRAGONS_BREATH: 437, + SPLASH_POTION: 438, + SPECTRAL_ARROW: 439, + TIPPED_ARROW: 440, + LINGERING_POTION: 441, + SHIELD: 442, + ELYTRA: 443, + BOAT_SPRUCE: 444, + BOAT_BIRCH: 445, + BOAT_JUNGLE: 446, + BOAT_ACACIA: 447, + BOAT_DARK_OAK: 448, + TOTEM: 449, + SHULKER_SHELL: 450, + IRON_NUGGET: 452, + KNOWLEDGE_BOOK: 453, + GOLD_RECORD: 2256, + GREEN_RECORD: 2257, + RECORD_3: 2258, + RECORD_4: 2259, + RECORD_5: 2260, + RECORD_6: 2261, + RECORD_7: 2262, + RECORD_8: 2263, + RECORD_9: 2264, + RECORD_10: 2265, + RECORD_11: 2266, + RECORD_12: 2267 +}; diff --git a/tools/formatItems.ts b/tools/formatItems.ts new file mode 100644 index 000000000..a41168e40 --- /dev/null +++ b/tools/formatItems.ts @@ -0,0 +1,45 @@ +import { BUKKIT_TO_ID } from "./data/bukkitToId"; + +function getSkinHash(base64: string) { + let texture = null; + try { + texture = JSON.parse(Buffer.from(base64, "base64").toString()).textures.SKIN.url.split("/").pop(); + } catch { + // Do nothing + } + + return texture; +} + +async function getItems() { + const data = await fetch("https://api.hypixel.net/resources/skyblock/items"); + const response = await data.json(); + + const items = {}; + for (const item of response.items) { + const { id, name, tier, category, skin, durability, ...rest } = item; + + const obj = { + id, + name, + item_id: BUKKIT_TO_ID[item?.material] || 0, + ...rest, + tier: item.tier ? item.tier.toLowerCase() : "common", + damage: item.durability || 0 + }; + + if (category) { + obj.category = category.toLowerCase(); + } + + if (skin) { + obj.texture = getSkinHash(skin.value); + } + + items[id] = obj; + } + + console.log(items); +} + +getItems(); From f0a7c33865ac9f19f344e23f3c2d5e4d0d6aed00 Mon Sep 17 00:00:00 2001 From: MartinNemi03 Date: Sun, 2 Feb 2025 23:08:26 +0100 Subject: [PATCH 03/14] Update website.yml --- .github/workflows/website.yml | 39 ++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 64a0f155a..16994cc20 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -5,7 +5,6 @@ on: paths: ["src/**", ".github/workflows/website.yml"] env: - NODE_VERSION: "22" CONTAINER_REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} @@ -82,3 +81,41 @@ jobs: - name: Svelte Build run: pnpm run build + + package: + name: Package into Container + if: | + (github.ref == 'refs/heads/prod' || github.ref == 'refs/heads/dev') + && github.repository_owner == 'SkyCryptWebsite' + && github.event_name != 'pull_request' + needs: [conflicts, analyze, formatting-checks, build] + runs-on: ubuntu-latest + + permissions: + packages: write + contents: read + + steps: + - name: Git checkout + uses: actions/checkout@v3 + + - name: Registry login + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ${{ env.CONTAINER_REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.CONTAINER_REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Build and Push + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} From 0e62b5c3ebbc738cab81c6ba6d0c4b5f75f089c0 Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Tue, 4 Feb 2025 15:17:47 +0100 Subject: [PATCH 04/14] fix(stats/enchanting): gameData being undefined --- src/lib/server/stats/enchanting.ts | 9 ++++++--- src/lib/types/raw/profile/lib.d.ts | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib/server/stats/enchanting.ts b/src/lib/server/stats/enchanting.ts index c251e18a7..77cfae7ac 100644 --- a/src/lib/server/stats/enchanting.ts +++ b/src/lib/server/stats/enchanting.ts @@ -33,13 +33,16 @@ export function getEnchanting(userProfile: Member) { const output = { data: {} } as Enchanting; for (const key in constants.EXPERIMENTS.games) { const gameData = userProfile.experimentation[key]; + if (gameData === undefined) { + continue; + } output.data[key] = { name: constants.EXPERIMENTS.games[key].name, stats: { - lastAttempt: gameData.last_attempt, - lastClaimed: gameData.last_claimed, - bonusClicks: gameData.bonus_clicks, + lastAttempt: gameData.last_attempt ?? 0, + lastClaimed: gameData.last_claimed ?? 0, + bonusClicks: gameData.bonus_clicks ?? 0, games: formatGameData(gameData, key) } }; diff --git a/src/lib/types/raw/profile/lib.d.ts b/src/lib/types/raw/profile/lib.d.ts index c7e24694a..2607a4ec2 100644 --- a/src/lib/types/raw/profile/lib.d.ts +++ b/src/lib/types/raw/profile/lib.d.ts @@ -439,9 +439,9 @@ export type ForgeProcess = { export type Experimentation = Record; export type ExperimentationGame = { - last_attempt: number; - last_claimed: number; - bonus_clicks: number; + last_attempt?: number; + last_claimed?: number; + bonus_clicks?: number; [string: string]: number; }; From 063b80ba426f4d8c9a086a71b10ef6588208c3fc Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Tue, 4 Feb 2025 16:17:52 +0100 Subject: [PATCH 05/14] fix: packs, and some small changes --- src/hooks.server.ts | 9 +++++---- src/lib/server/constants/museum.ts | 5 +---- src/lib/server/constants/update-collections.ts | 7 ++++--- src/lib/server/constants/update-items.ts | 2 +- src/lib/server/custom_resources.ts | 7 +++---- src/lib/server/db/mongo.ts | 3 --- src/lib/server/db/mongo/index-collections.ts | 5 ++++- src/lib/server/db/mongo/update-collections.ts | 4 ++++ src/lib/server/db/redis.ts | 1 - .../helper/NotEnoughUpdates/parseNEURepository.ts | 2 +- .../helper/NotEnoughUpdates/updateNEURepository.ts | 11 ++--------- 11 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 61eb3bacc..6c5c2473e 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -8,14 +8,15 @@ import { startRedis } from "./lib/server/db/redis"; export const init: ServerInit = async () => { console.log("[SkyCrypt] Starting..."); + const timeNow = performance.now(); - await intializeNEURepository().then(async () => { + await intializeNEURepository().then(() => { parseNEURepository(); }); await resourcesInit(); - await startMongo()?.then(() => { + await startMongo().then(() => { console.log("[MONGO] MongoDB successfully connected"); indexCollectons(); @@ -25,9 +26,9 @@ export const init: ServerInit = async () => { console.log("[REDIS] Redis successfully connected"); }); - await getPrices().then(() => { + await getPrices(true).then(() => { console.log("[NETWORTH] Prices successfully fetched!"); }); - console.log("[SkyCrypt] Started!"); + console.log(`[SkyCrypt] Started in ${(performance.now() - timeNow).toFixed(2)}ms`); }; diff --git a/src/lib/server/constants/museum.ts b/src/lib/server/constants/museum.ts index 1579b1b98..8d9381897 100644 --- a/src/lib/server/constants/museum.ts +++ b/src/lib/server/constants/museum.ts @@ -15,8 +15,7 @@ function sortMuseumItems(museum: MuseumConstants, armorSetId: string) { } async function retrieveMuseumItems() { - const timeNow = Date.now(); - // ! INFO: This is needed, the museum = { ... } doens't work for some reason? + // ! INFO: This is needed, the MUSEUM = { ... } doesn't work with vite reloading for some reason? MUSEUM.armor_to_id = {}; MUSEUM.armor_sets = {}; MUSEUM.children = {}; @@ -65,8 +64,6 @@ async function retrieveMuseumItems() { } } } - - console.log(`[MUSEUM] Updated museum items in ${Date.now() - timeNow}ms`); } const MUSEUM: MuseumConstants = { diff --git a/src/lib/server/constants/update-collections.ts b/src/lib/server/constants/update-collections.ts index fb4df726e..f2f5c5731 100644 --- a/src/lib/server/constants/update-collections.ts +++ b/src/lib/server/constants/update-collections.ts @@ -4,11 +4,12 @@ import MONGO from "$lib/server/db/mongo"; export const COLLECTIONS = new Map(); -export async function updateCollections() { +export async function updateCollectionConstants() { if (building) return; const collections = await MONGO.collection("collections").findOne({}); if (collections?.collections == null) { + console.log(collections); return; } @@ -21,7 +22,7 @@ export async function updateCollections() { COLLECTIONS.set(category, collections.collections[category] as Collection); } - console.log("[COLLECTIONS] Updated collections"); + console.log("[COLLECTIONS] Updated collection constants"); } -setTimeout(updateCollections, 1000 * 60 * 60 * 12); // 12 hours +setTimeout(updateCollectionConstants, 1000 * 60 * 60 * 12); // 12 hours diff --git a/src/lib/server/constants/update-items.ts b/src/lib/server/constants/update-items.ts index 75ebcc155..710d4dbc6 100644 --- a/src/lib/server/constants/update-items.ts +++ b/src/lib/server/constants/update-items.ts @@ -21,7 +21,7 @@ export async function updateItemsConstants() { ITEMS.set(skyblockItem.skyblock_id, skyblockItem); } - console.log(`[ITEMS] Updated items in ${(Date.now() - timeNow).toLocaleString()}ms`); + console.log(`[ITEMS] Updated item constants in ${(Date.now() - timeNow).toLocaleString()}ms`); } setTimeout(updateItemsConstants, 1000 * 60 * 60 * 12); // 12 hours diff --git a/src/lib/server/custom_resources.ts b/src/lib/server/custom_resources.ts index a83ef929e..0cc29a321 100644 --- a/src/lib/server/custom_resources.ts +++ b/src/lib/server/custom_resources.ts @@ -430,11 +430,10 @@ async function loadResourcePacks() { regex = mm.makeRe(regexString.substring(9), { nocase: true }); } else if (regexString.startsWith("pattern:")) { if (regexString === "pattern:*" || regexString.trim() === "pattern:") { - texture.match = []; - break; + regex = new RegExp(".*"); + } else { + regex = mm.makeRe(regexString.substring(9)); } - - regex = mm.makeRe(regexString.substring(9)); } else if (regexString.startsWith("iregex:")) { regex = new RegExp(regexString.substring(7), "i"); } else if (regexString.startsWith("regex:")) { diff --git a/src/lib/server/db/mongo.ts b/src/lib/server/db/mongo.ts index 9894a4534..e4e1a7906 100644 --- a/src/lib/server/db/mongo.ts +++ b/src/lib/server/db/mongo.ts @@ -1,5 +1,4 @@ import { building } from "$app/environment"; -import { updateItemsConstants } from "$constants/update-items"; import { MONGO_DATABASE, MONGO_HOST, MONGO_PORT } from "$env/static/private"; import { MongoClient, type Db } from "mongodb"; import { updateCollections } from "./mongo/update-collections"; @@ -9,10 +8,8 @@ const client = !building ? new MongoClient(`mongodb://${MONGO_HOST}:${MONGO_PORT export async function startMongo() { if (building) return; - console.log("[MONGO] Starting mongo..."); await updateItems(); - await updateItemsConstants(); await updateCollections(); return client?.connect() as Promise; diff --git a/src/lib/server/db/mongo/index-collections.ts b/src/lib/server/db/mongo/index-collections.ts index bd3842a30..f09aa27e7 100644 --- a/src/lib/server/db/mongo/index-collections.ts +++ b/src/lib/server/db/mongo/index-collections.ts @@ -4,7 +4,10 @@ import MONGO from "$lib/server/db/mongo"; export async function indexCollectons() { if (building) return; - await MONGO.collection("emojis").createIndex({ uuid: 1 }, { unique: true }); + if ((await MONGO.collection("emojis").indexExists("uuid_1")) === true) { + return; + } + await MONGO.collection("emojis").createIndex({ uuid: 1 }, { unique: true }); console.log("[MONGO] Collections indexed"); } diff --git a/src/lib/server/db/mongo/update-collections.ts b/src/lib/server/db/mongo/update-collections.ts index 6ac8d9093..1f5d167cb 100644 --- a/src/lib/server/db/mongo/update-collections.ts +++ b/src/lib/server/db/mongo/update-collections.ts @@ -1,4 +1,5 @@ import { building } from "$app/environment"; +import { updateCollectionConstants } from "$constants/update-collections"; import type { Collection } from "$lib/server/constants/collections"; import MONGO from "../mongo"; @@ -32,6 +33,7 @@ export async function updateCollections() { if (cache && cache.lastUpdated > Date.now() - cacheInternal) { console.log(`[COLLECTIONS] Fetched collections in ${(Date.now() - timeNow).toLocaleString()}ms (cached)`); + await updateCollectionConstants(); return; } @@ -61,6 +63,8 @@ export async function updateCollections() { await MONGO.collection("collections").updateOne({}, { $set: output }, { upsert: true }); console.log(`[COLLECTIONS] Fetched collections in ${(Date.now() - timeNow).toLocaleString()}ms`); + + await updateCollectionConstants(); } catch (e) { console.error(e); } diff --git a/src/lib/server/db/redis.ts b/src/lib/server/db/redis.ts index 9f1e51048..3347c18b7 100644 --- a/src/lib/server/db/redis.ts +++ b/src/lib/server/db/redis.ts @@ -9,6 +9,5 @@ export const REDIS = createClient({ export async function startRedis() { if (REDIS.isReady || REDIS.isOpen || building) return; - console.log("[REDIS] Starting redis..."); return REDIS.connect(); } diff --git a/src/lib/server/helper/NotEnoughUpdates/parseNEURepository.ts b/src/lib/server/helper/NotEnoughUpdates/parseNEURepository.ts index 734570afa..21a5fab26 100644 --- a/src/lib/server/helper/NotEnoughUpdates/parseNEURepository.ts +++ b/src/lib/server/helper/NotEnoughUpdates/parseNEURepository.ts @@ -17,7 +17,7 @@ export async function intializeNEURepository() { fs.mkdirSync("NotEnoughUpdates-REPO", { recursive: true }); } - if (dev) { + if (dev && !fs.existsSync("NotEnoughUpdates-REPO/.git")) { console.log(`[NOT-ENOUGH-UPDATES] Initializing NEU repository.`); try { await simpleGit().submoduleUpdate(["--init", "--recursive"]); diff --git a/src/lib/server/helper/NotEnoughUpdates/updateNEURepository.ts b/src/lib/server/helper/NotEnoughUpdates/updateNEURepository.ts index 1ee9114d0..96972c1a8 100644 --- a/src/lib/server/helper/NotEnoughUpdates/updateNEURepository.ts +++ b/src/lib/server/helper/NotEnoughUpdates/updateNEURepository.ts @@ -1,4 +1,4 @@ -import { building, dev } from "$app/environment"; +import { building } from "$app/environment"; import fs from "node:fs"; import { simpleGit } from "simple-git"; @@ -19,14 +19,7 @@ export async function updateNotEnoughUpdatesRepository() { if (diffSummary.files.length > 0) { console.log(`[NOT-ENOUGH-UPDATES] Updating submodule...`); - // If dev, this is a valid submodule - if (dev) { - await gitSubmodule.submoduleUpdate(["--init", "--recursive"]); - await gitSubmodule.fetch(); - } else { - // If not dev, this is just a normal cloned repository - await gitSubmodule.pull(); - } + await gitSubmodule.pull(); console.log(`[NOT-ENOUGH-UPDATES] Updated submodule!`); } else { From 34658eb1744518673e447cf1ab6a6508f88bedaf Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Tue, 4 Feb 2025 21:08:52 +0100 Subject: [PATCH 06/14] feat(stats/garden): add Garden --- src/lib/server/constants/farming.ts | 13 ++ src/lib/server/constants/skills.ts | 5 +- src/lib/server/helper.ts | 21 +++ .../helper/NotEnoughUpdates/parsers/garden.ts | 30 +++-- src/lib/server/stats/farming.ts | 5 +- src/lib/server/stats/garden.ts | 124 ++++++++++++++++++ src/lib/server/stats/leveling/leveling.ts | 49 ++++--- .../processed/NotEnoughUpdates/garden.d.ts | 2 +- src/lib/types/processed/profile/farming.d.ts | 1 + src/lib/types/processed/profile/garden.d.ts | 31 +++++ src/lib/types/raw/profile/garden.d.ts | 24 ++++ src/lib/types/raw/profile/lib.d.ts | 6 + .../garden/[paramProfile=profile]/+server.ts | 4 +- 13 files changed, 283 insertions(+), 32 deletions(-) create mode 100644 src/lib/types/processed/profile/garden.d.ts create mode 100644 src/lib/types/raw/profile/garden.d.ts diff --git a/src/lib/server/constants/farming.ts b/src/lib/server/constants/farming.ts index ba7cd4b86..ee996673e 100644 --- a/src/lib/server/constants/farming.ts +++ b/src/lib/server/constants/farming.ts @@ -12,3 +12,16 @@ export const CROPS = { WHEAT: "Wheat", MELON: "Melon" } as Record; + +export const CROP_TO_ID = { + WHEAT: "WHEAT", + CARROT_ITEM: "CARROT", + POTATO_ITEM: "POTATO", + MELON: "MELON", + PUMPKIN: "PUMPKIN", + SUGAR_CANE: "SUGAR_CANE", + CACTUS: "CACTUS", + MUSHROOM_COLLECTION: "MUSHROOM", + NETHER_STALK: "NETHER_WART", + "INK_SACK:3": "COCOA_BEANS" +} as Record; diff --git a/src/lib/server/constants/skills.ts b/src/lib/server/constants/skills.ts index 2edca1475..ee61e3e02 100644 --- a/src/lib/server/constants/skills.ts +++ b/src/lib/server/constants/skills.ts @@ -130,7 +130,7 @@ export const SOCIAL_XP = { 25: 50000 }; -export const LEVELING_XP = { +export const DEFAULT_LEVELING_XP = { 1: 50, 2: 125, 3: 200, @@ -232,5 +232,6 @@ export const SKILL_ICONS = { mage: "/api/item/BLAZE_ROD", archer: "/api/item/BOW", berserk: "/api/item/IRON_SWORD", - tank: "/api/leather/chestplate/955e3b" + tank: "/api/leather/chestplate/955e3b", + garden: "/api/item/DOUBLE_PLANT" } as Record; diff --git a/src/lib/server/helper.ts b/src/lib/server/helper.ts index b30f626f0..c42db29de 100644 --- a/src/lib/server/helper.ts +++ b/src/lib/server/helper.ts @@ -202,3 +202,24 @@ export function formatTimestamp(timestamp: number, formatType: string = "MMM d, return format(new Date(Number(timestamp)), formatType); } + +export function sortByRarity(object: Record) { + return Object.keys(object) + .sort((a, b) => constants.RARITIES.indexOf(a) - constants.RARITIES.indexOf(b)) + .reduce( + (acc, key) => { + acc[key] = object[key]; + return acc; + }, + {} as Record + ); +} + +export function formatXPTable(xpTable: number[]) { + const output = {} as Record; + for (const [level, xp] of Object.entries(xpTable)) { + output[Number(level) + 1] = xp; + } + + return output; +} diff --git a/src/lib/server/helper/NotEnoughUpdates/parsers/garden.ts b/src/lib/server/helper/NotEnoughUpdates/parsers/garden.ts index c286606a3..98af5d728 100644 --- a/src/lib/server/helper/NotEnoughUpdates/parsers/garden.ts +++ b/src/lib/server/helper/NotEnoughUpdates/parsers/garden.ts @@ -1,22 +1,16 @@ +import { formatXPTable, getRawLore, sortByRarity } from "$lib/server/helper"; import type { NEUGardenRaw } from "$types/global"; import type { NEUGardenConstants } from "$types/processed/NotEnoughUpdates/garden"; function getPlotLayout(plots: NEUGardenRaw["plots"]) { - return Object.keys(plots).sort((aId, bId) => { + const sortedPlots = Object.keys(plots).sort((aId, bId) => { const a = plots[aId]; const b = plots[bId]; return a.y === b.y ? a.x - b.x : a.y - b.y; }); -} - -function formatXPTable(xpTable: NEUGardenRaw["garden_exp"]) { - const output = {} as Record; - for (const [level, xp] of Object.entries(xpTable)) { - output[Number(level) + 1] = xp; - } - return output; + return Object.fromEntries(sortedPlots.map((plotId) => [plotId, getRawLore(plots[plotId].name)])); } function formatCropMilestones(milestones: NEUGardenRaw["crop_milestones"]) { @@ -28,12 +22,26 @@ function formatCropMilestones(milestones: NEUGardenRaw["crop_milestones"]) { return output; } +function getMaxVisitors(visitors: NEUGardenRaw["visitors"]) { + const values = Object.values(visitors); + const maxVisitors = {} as Record; + + for (const value of values) { + maxVisitors[value.toLowerCase()] = (maxVisitors[value.toLowerCase()] ?? 0) + 1; + } + + return sortByRarity(maxVisitors); +} + export function formatGardenConstants(gardenData: NEUGardenRaw) { return { - visitors: gardenData.visitors, - plots: getPlotLayout(gardenData.plots), + visitors: Object.fromEntries(Object.entries(gardenData.visitors as Record).map(([key, value]) => [key.toLowerCase(), value.toLowerCase()])) as Record, + maxVisitors: getMaxVisitors(gardenData.visitors), + plotLayout: getPlotLayout(gardenData.plots), gardenXp: formatXPTable(gardenData.garden_exp), cropMilestones: formatCropMilestones(gardenData.crop_milestones), + cropUpgrades: formatXPTable(gardenData.crop_upgrades), + composterUpgrades: gardenData.composter_upgrades, barnSkins: gardenData.barn, plotCosts: gardenData.plot_costs } as NEUGardenConstants; diff --git a/src/lib/server/stats/farming.ts b/src/lib/server/stats/farming.ts index 01e4dcde5..9962e65f5 100644 --- a/src/lib/server/stats/farming.ts +++ b/src/lib/server/stats/farming.ts @@ -50,8 +50,9 @@ function getFarmingWeight(profile: Profile, userProfile: Member, formattedMedals export function getFarming(profile: Profile, userProfile: Member) { const output = { - uniqueGolds: (userProfile.jacobs_contest?.unique_brackets?.gold || []).length, - pelts: userProfile.quests?.trapper_quest?.pelt_count || 0, + uniqueGolds: (userProfile.jacobs_contest?.unique_brackets?.gold ?? []).length, + pelts: userProfile.quests?.trapper_quest?.pelt_count ?? 0, + copper: userProfile.garden_player_data?.copper ?? 0, medals: {}, contests: {} } as Farming; diff --git a/src/lib/server/stats/garden.ts b/src/lib/server/stats/garden.ts index e69de29bb..51e9f9419 100644 --- a/src/lib/server/stats/garden.ts +++ b/src/lib/server/stats/garden.ts @@ -0,0 +1,124 @@ +import { CROP_TO_ID, CROPS } from "$constants/farming"; +import type { GardenResponse } from "$types/global"; +import { sortByRarity } from "../helper"; +import { NEU_CONSTANTS } from "../helper/NotEnoughUpdates/parseNEURepository"; +import { getLevelByXp, getSkillExperience } from "./leveling/leveling"; + +function getVisitorRarities(gardenData: GardenResponse) { + const output = {} as Record; + for (const [key, value] of Object.entries(gardenData.commission_data.visits ?? {})) { + const rarity = NEU_CONSTANTS.get("garden").visitors[key] ?? "unknown"; + + const visited = output[rarity]?.visited ?? 0; + const completed = output[rarity]?.completed ?? 0; + const unique = output[rarity]?.unique ?? []; + + output[rarity] = { + visited: visited + value, + completed: completed + (gardenData.commission_data.completed?.[key] ?? 0), + unique: unique.includes(key) ? unique : [...unique, key], + maxUnique: NEU_CONSTANTS.get("garden").maxVisitors[rarity] + }; + } + + return sortByRarity(Object.fromEntries(Object.entries(output).map(([key, value]) => [key, { ...value, unique: value.unique.length }]))); +} + +function getVisitors(gardenData: GardenResponse) { + const output = { + visited: Object.values(gardenData.commission_data.visits ?? {}).reduce((a, b) => a + b, 0), + completed: gardenData.commission_data.total_completed ?? 0, + uniqueVisitors: gardenData.commission_data.unique_npcs_served ?? 0, + visitors: getVisitorRarities(gardenData) + }; + + return output; +} + +function getCropMilestones(gardenData: GardenResponse) { + const output = []; + for (const id in CROPS) { + const amount = gardenData.resources_collected?.[id]; + output.push({ + name: CROPS[id], + texture: `/api/item/${id}`, + level: getLevelByXp(amount, { type: `GARDEN_CROP_MILESTONE:${CROP_TO_ID[id]}`.toLowerCase() }) + }); + } + + return output; +} + +function getCropUpgrades(gardenData: GardenResponse) { + const output = []; + for (const id in CROPS) { + const amount = getSkillExperience("crop_upgrades", gardenData.crop_upgrade_levels?.[id] ?? 0); + + output.push({ + name: CROPS[id], + texture: `/api/item/${id}`, + level: getLevelByXp(amount, { type: "crop_upgrades" }) + }); + } + + return output; +} + +function getComposterUpgrades(gardenData: GardenResponse) { + const output = {} as Record; + for (const key in NEU_CONSTANTS.get("garden").composterUpgrades) { + output[key] = gardenData.composter_data.upgrades?.[key] ?? 0; + } + + return output; +} + +function getPlotLayout(gardenData: GardenResponse) { + const output = []; + + const PLOT_LAYOUT = NEU_CONSTANTS.get("garden").plotLayout; + for (const [plotId, plotName] of Object.entries(PLOT_LAYOUT)) { + const index = Object.keys(PLOT_LAYOUT).indexOf(plotId); + const checkPlots = [ + PLOT_LAYOUT[Number(index) - 5], // above + PLOT_LAYOUT[Number(index) + 1], // right + PLOT_LAYOUT[Number(index) + 5], // below + PLOT_LAYOUT[Number(index) - 1] // left + ]; + + let hasAdjacentUnlocked = false; + for (const checkPlot of checkPlots) { + if (!checkPlot) { + continue; + } + + if (gardenData.unlocked_plots_ids?.includes(checkPlot)) { + hasAdjacentUnlocked = true; + break; + } + } + + const plotIndex = output.length; + if (plotIndex === 12) { + const item = NEU_CONSTANTS.get("garden").barnSkins[gardenData.selected_barn_skin] ?? NEU_CONSTANTS.get("garden").barnSkins["default_1"]; + output.push({ display_name: `Barn Skin: ${item.name}`, texture_path: `/api/item/${item.item.replace("-", ":")}` }); + continue; + } + + const textureId = gardenData.unlocked_plots_ids?.includes(plotId) ? "GRASS" : hasAdjacentUnlocked ? "WOOD_BUTTON" : "STAINED_GLASS_PANE:14"; + output.push({ display_name: `Plot ${plotName}`, texture_path: `/api/item/${textureId}` }); + } + + return output; +} + +export function formatGarden(gardenData: GardenResponse) { + return { + level: getLevelByXp(gardenData.garden_experience, { type: "garden" }), + visitors: getVisitors(gardenData), + cropMilestones: getCropMilestones(gardenData), + cropUpgrades: getCropUpgrades(gardenData), + composter: getComposterUpgrades(gardenData), + plot: getPlotLayout(gardenData) + }; +} diff --git a/src/lib/server/stats/leveling/leveling.ts b/src/lib/server/stats/leveling/leveling.ts index e7b0754fc..d42a23d1b 100644 --- a/src/lib/server/stats/leveling/leveling.ts +++ b/src/lib/server/stats/leveling/leveling.ts @@ -1,28 +1,35 @@ import * as constants from "$lib/server/constants/skills"; +import { NEU_CONSTANTS } from "$lib/server/helper/NotEnoughUpdates/parseNEURepository"; import type { Member, Profile } from "$types/global"; import type { Player } from "$types/raw/player/lib"; import type { Extra } from "$types/stats"; +type XPTable = { [key: number]: number }; /** * gets the xp table for the given type * @param {string} type * @returns {{[key: number]: number}} */ -function getXpTable(type: string): { [key: number]: number } { - switch (type) { - case "runecrafting": - return constants.RUNECRAFTING_XP; - case "social": - return constants.SOCIAL_XP; - case "dungeoneering": - return constants.DUNGEONEERING_XP; - case "hotm": - return constants.HOTM_XP; - case "skyblock_level": - return constants.SKYBLOCK_XP; - default: - return constants.LEVELING_XP; - } +function getXpTable(type: string) { + const SKILL_TABLES = { + default: constants.DEFAULT_LEVELING_XP, + runecrafting: constants.RUNECRAFTING_XP, + social: constants.SOCIAL_XP, + dungeoneering: constants.DUNGEONEERING_XP, + hotm: constants.HOTM_XP, + skyblock_level: constants.SKYBLOCK_XP, + garden: NEU_CONSTANTS.get("garden").gardenXp, + crop_upgrades: NEU_CONSTANTS.get("garden").cropUpgrades, + ...Object.entries(NEU_CONSTANTS.get("garden").cropMilestones).reduce( + (acc, [key, value]) => { + acc[`GARDEN_CROP_MILESTONE:${key}`.toLowerCase()] = value as XPTable; + return acc; + }, + {} as Record + ) + } as Record; + + return SKILL_TABLES[type] ?? constants.DEFAULT_LEVELING_XP; } /** @@ -224,3 +231,15 @@ export function getXpByLevel( // maxExperience }; } + +/** + * Calculates the total experience required to reach a certain level in a skill. + * @param {string} skill The ID of the skill used to determine the xp table. + * @param {number} level The target level. + * @returns {number} The total experience required. + */ +export function getSkillExperience(skill: string, level: number) { + const skillTable = getXpTable(skill); + + return Object.entries(skillTable).reduce((acc, [key, value]) => (Number(key) <= level ? acc + value : acc), 0); +} diff --git a/src/lib/types/processed/NotEnoughUpdates/garden.d.ts b/src/lib/types/processed/NotEnoughUpdates/garden.d.ts index dd2c9cd09..03a47c0f8 100644 --- a/src/lib/types/processed/NotEnoughUpdates/garden.d.ts +++ b/src/lib/types/processed/NotEnoughUpdates/garden.d.ts @@ -2,7 +2,7 @@ import type { NEUGardenRawBarnSkin, NEUGardenRawPlotCost } from "$types/global"; export type NEUGardenConstants = { visitors: Record; - plots: string[]; + plotLayout: Record; gardenXp: Record; cropMilestones: Record>; barnSkins: Record; diff --git a/src/lib/types/processed/profile/farming.d.ts b/src/lib/types/processed/profile/farming.d.ts index d3d164094..f9a2a00fc 100644 --- a/src/lib/types/processed/profile/farming.d.ts +++ b/src/lib/types/processed/profile/farming.d.ts @@ -1,5 +1,6 @@ export type Farming = { uniqueGolds: number; + copper: number; pelts: number; medals: Record< string, diff --git a/src/lib/types/processed/profile/garden.d.ts b/src/lib/types/processed/profile/garden.d.ts new file mode 100644 index 000000000..b3598b1b0 --- /dev/null +++ b/src/lib/types/processed/profile/garden.d.ts @@ -0,0 +1,31 @@ +import type { ProcessedSkyBlockItem, Skill } from "$types/global"; + +export type Garden = { + level: Skill; + visitors: { + visited: number; + completed: number; + uniqueVisitors: number; + visitors: Record< + string, + { + visited: number; + completed: number; + unique: number; + maxUnqiue: number; + } + >; + }; + cropMilestones: { + name: string; + texture: string; + level: skill; + }[]; + cropUpgrades: { + name: string; + texture: string; + level: skill; + }[]; + composter: Record; + plot: ProcessedSkyBlockItem[]; +}; diff --git a/src/lib/types/raw/profile/garden.d.ts b/src/lib/types/raw/profile/garden.d.ts new file mode 100644 index 000000000..325d911f1 --- /dev/null +++ b/src/lib/types/raw/profile/garden.d.ts @@ -0,0 +1,24 @@ +export type GardenResponse = { + uuid: string; + unlocked_plots_ids: string[]; + commission_data: { + visits?: Record; + completed?: Record; + total_completed?: number; + unique_npcs_served?: number; + }; + resources_collected: Record; + composter_data: { + organic_matter?: number; + fuel_units?: number; + compost_units?: number; + compost_items?: number; + conversion_ticks?: number; + last_save?: number; + upgrades?: Record; + }; + garden_experience: number; + selected_barn_skin: string; + crop_upgrade_levels: Record; + unlocked_barn_skins: string[]; +}; diff --git a/src/lib/types/raw/profile/lib.d.ts b/src/lib/types/raw/profile/lib.d.ts index 2607a4ec2..eff5441bf 100644 --- a/src/lib/types/raw/profile/lib.d.ts +++ b/src/lib/types/raw/profile/lib.d.ts @@ -1,4 +1,5 @@ import type { Pet } from "$types/global"; +export * from "./garden"; export type Options = { cacheOnly: boolean; @@ -62,6 +63,7 @@ export type Member = { coop_invitation?: { confirmed: boolean; }; + garden_player_data?: MemberGardenData; }; export type Medal = "gold" | "silver" | "bronze"; @@ -461,3 +463,7 @@ export type MuseumItems = { export type AccessoryBagStorage = { selected_power?: string; }; + +export type MemberGardenData = { + copper?: number; +}; diff --git a/src/routes/api/garden/[paramProfile=profile]/+server.ts b/src/routes/api/garden/[paramProfile=profile]/+server.ts index 6de7652d5..e5d9b4c38 100644 --- a/src/routes/api/garden/[paramProfile=profile]/+server.ts +++ b/src/routes/api/garden/[paramProfile=profile]/+server.ts @@ -1,4 +1,5 @@ import { getGarden } from "$lib/server/lib"; +import { formatGarden } from "$lib/server/stats/garden"; import { json } from "@sveltejs/kit"; import type { RequestHandler } from "./$types"; @@ -6,6 +7,7 @@ export const GET: RequestHandler = async ({ params }) => { const { paramProfile } = params; const garden = await getGarden(paramProfile); + const gardenData = formatGarden(garden); - return json(garden); + return json(gardenData); }; From 0015f71a36df4017cb28fd35ed17d8c822ef51a6 Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Wed, 5 Feb 2025 11:58:38 +0100 Subject: [PATCH 07/14] feat(stats/mining): add glacite tunnels --- src/lib/server/constants/mining.ts | 9 +++++ src/lib/server/stats/mining.ts | 43 ++++++++++++++++----- src/lib/types/processed/profile/mining.d.ts | 20 ++++++++++ src/lib/types/raw/profile/lib.d.ts | 8 ++++ 4 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/lib/server/constants/mining.ts b/src/lib/server/constants/mining.ts index e0c12b199..872ae0cc3 100644 --- a/src/lib/server/constants/mining.ts +++ b/src/lib/server/constants/mining.ts @@ -2056,3 +2056,12 @@ export const FORGE = { SKELETON_KEY: { name: "Skeleton Key", duration: 1800000 }, PORTABLE_CAMPFIRE: { name: "Portable Campfire", duration: 1800000 } } as Record; + +export const FOSSILS = ["CLAW", "SPINE", "CLUBBED", "UGLY", "HELIX", "FOOTPRINT", "WEBBED", "TUSK"]; + +export const CORPSES = { + lapis: "/api/item/LAPIS_ARMOR_HELMET", + umber: "/api/item/ARMOR_OF_YOG_HELMET", + tungsten: "/api/item/MINERAL_HELMET", + vanguard: "/api/item/VANGUARD_HELMET" +} as Record; diff --git a/src/lib/server/stats/mining.ts b/src/lib/server/stats/mining.ts index ab722e8a6..97d93e8ad 100644 --- a/src/lib/server/stats/mining.ts +++ b/src/lib/server/stats/mining.ts @@ -1,24 +1,20 @@ import * as constants from "$lib/server/constants/constants"; +import * as helper from "$lib/server/helper"; import { getLevelByXp } from "$lib/server/stats/leveling/leveling"; import type { Member } from "$types/global"; import type { Player } from "$types/raw/player/lib"; import { getHotmItems } from "./hotm"; import { stripItems } from "./items/stripping"; -/** - * @param {number} hotmTier - * @param {number} potmTier - * @returns {number} - */ export function calcHotmTokens(hotmTier: number, potmTier: number) { let tokens = 0; for (let tier = 1; tier <= hotmTier; tier++) { - tokens += constants.HOTM.rewards.hotm[tier]?.token_of_the_mountain || 0; + tokens += constants.HOTM.rewards.hotm[tier]?.token_of_the_mountain ?? 0; } for (let tier = 1; tier <= potmTier; tier++) { - tokens += (constants.HOTM.rewards.potm[tier]?.token_of_the_mountain || 0) as number; + tokens += (constants.HOTM.rewards.potm[tier]?.token_of_the_mountain ?? 0) as number; } return tokens; @@ -72,6 +68,34 @@ function getForge(userProfile: Member) { return output; } +function getGlaciteTunnels(userProfile: Member) { + const glaciteData = userProfile.glacite_player_data ?? {}; + const corpseIds = Object.keys(constants.CORPSES); + + return { + mineshaftsEntered: glaciteData.mineshafts_entered ?? 0, + fossilDust: glaciteData.fossil_dust ?? 0, + corpses: { + found: corpseIds.reduce((acc, corpse) => acc + (glaciteData.corpses_looted?.[corpse] ?? 0), 0), + max: corpseIds.length, + corpses: corpseIds.map((corpse) => ({ + name: helper.titleCase(corpse), + amount: glaciteData.corpses_looted?.[corpse] ?? 0, + texture_path: constants.CORPSES[corpse] + })) + }, + fossils: { + found: (glaciteData.fossils_donated ?? []).length, + max: constants.FOSSILS.length, + fossils: constants.FOSSILS.map((fossil) => ({ + name: helper.titleCase(fossil), + found: (glaciteData.fossils_donated ?? []).includes(fossil), + texture_path: `/api/item/${fossil === "HELIX" ? fossil : `${fossil}_FOSSIL`}` + })) + } + }; +} + export function getMining(userProfile: Member, player: Player, packs: string[]) { const HOTM = getLevelByXp(userProfile.mining_core?.experience, { type: "hotm" }); const totalTokens = calcHotmTokens(HOTM.level, userProfile.mining_core?.nodes?.special_0 ?? 0); @@ -96,7 +120,7 @@ export function getMining(userProfile: Member, player: Player, packs: string[]) }, commissions: { milestone: getCommissionMilestone(userProfile), - completions: player.achievements.skyblock_hard_working_miner || 0 + completions: player.achievements?.skyblock_hard_working_miner ?? 0 }, crystalHollows: { crystalHollowsLastAccess: userProfile.mining_core?.greater_mines_last_access, @@ -121,6 +145,7 @@ export function getMining(userProfile: Member, player: Player, packs: string[]) } }, forge: getForge(userProfile), - hotm: stripItems(getHotmItems(userProfile, packs)) + hotm: stripItems(getHotmItems(userProfile, packs)), + glaciteTunnels: getGlaciteTunnels(userProfile) }; } diff --git a/src/lib/types/processed/profile/mining.d.ts b/src/lib/types/processed/profile/mining.d.ts index efb589445..b169149d5 100644 --- a/src/lib/types/processed/profile/mining.d.ts +++ b/src/lib/types/processed/profile/mining.d.ts @@ -88,4 +88,24 @@ export type MiningStats = { }; forge: ForgeItem[]; hotm: ProcessedItem[]; + glaciteTunnels: { + mineshaftsEntered: number; + fossilDust: number; + corpses: { + found: number; + corpses: { + name: string; + amount: number; + texture_path: string; + }[]; + }; + fossils: { + found: number; + fossils: { + name: string; + found: boolean; + texture_path: string; + }[]; + }; + }; }; diff --git a/src/lib/types/raw/profile/lib.d.ts b/src/lib/types/raw/profile/lib.d.ts index eff5441bf..de77387a6 100644 --- a/src/lib/types/raw/profile/lib.d.ts +++ b/src/lib/types/raw/profile/lib.d.ts @@ -64,6 +64,7 @@ export type Member = { confirmed: boolean; }; garden_player_data?: MemberGardenData; + glacite_player_data: GlacitePlayerData; }; export type Medal = "gold" | "silver" | "bronze"; @@ -467,3 +468,10 @@ export type AccessoryBagStorage = { export type MemberGardenData = { copper?: number; }; + +export type GlacitePlayerData = { + fossils_donated: string[]; + fossil_dust: number; + corpses_looted: Record; + mineshafts_entered: number; +}; From cf834e0a94c0b8ddde6bc9b5cc7b19c6ede88ca9 Mon Sep 17 00:00:00 2001 From: DuckySoLucky Date: Wed, 5 Feb 2025 12:16:39 +0100 Subject: [PATCH 08/14] refactor(rendering): small changes to the way we handle /item/ endpoint --- src/lib/server/helper.ts | 2 +- src/lib/server/helper/renderer.ts | 15 ++++++++++++++- src/lib/server/stats/pets.ts | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/lib/server/helper.ts b/src/lib/server/helper.ts index c42db29de..048983bcb 100644 --- a/src/lib/server/helper.ts +++ b/src/lib/server/helper.ts @@ -137,7 +137,7 @@ export async function applyResourcePack(item: ProcessedItem, packs: string[]) { const url = json.textures.SKIN.url; const uuid = url.split("/").pop(); - item.texture_path = `/api/head/${uuid}?v6`; + item.texture_path = `/api/head/${uuid}`; } catch (e) { console.error(e); } diff --git a/src/lib/server/helper/renderer.ts b/src/lib/server/helper/renderer.ts index 566e93f08..da1147e3b 100644 --- a/src/lib/server/helper/renderer.ts +++ b/src/lib/server/helper/renderer.ts @@ -464,7 +464,20 @@ export async function renderItem(skyblockId: string | undefined, query: ItemQuer helper.applyResourcePack(item, query.packs); if (item.texture_path && item.texture_path.includes("/api/")) { - outputTexture.image = item.texture_path; + if (item.texture_path.startsWith("/api/leather/")) { + const args = item.texture_path.split("/"); + const color = args.pop(); + const type = args.pop(); + + outputTexture.image = await getArmor(type, color); + } else if (item.texture_path.startsWith("/api/head/")) { + const args = item.texture_path.split("/"); + const id = args.pop(); + + outputTexture.image = await getHead(id); + } else { + outputTexture.image = outputTexture.texture_path; + } } else if (item.texture_path !== undefined && item.texture_path.endsWith("/skull-3.png") === false) { outputTexture.image = await fs.readFile(`static/${item.texture_path}`); } else if (item.texture !== undefined && item.texture) { diff --git a/src/lib/server/stats/pets.ts b/src/lib/server/stats/pets.ts index 73ad9808d..5ef01e596 100644 --- a/src/lib/server/stats/pets.ts +++ b/src/lib/server/stats/pets.ts @@ -160,7 +160,7 @@ function getProfilePets(userProfile: Member, pets: Pet[]) { const skinData = pet.skin ? NEU_ITEMS.get(`PET_SKIN_${pet.skin}`) : null; const texture = helper.getHeadTextureUUID((skinData ?? petData).nbttag.SkullOwner.Properties.textures[0].Value); - outputPet.texture_path = `/api/head/${texture}?v6`; + outputPet.texture_path = `/api/head/${texture}`; if (outputPet.skin) { outputPet.display_name += " ✦"; } From 64896743597945bb06cdd0bec0b603ca89ec8e18 Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 00:03:16 +0100 Subject: [PATCH 09/14] feat(stats/inventory): implement debounced search for inventory items --- src/lib/sections/stats/Inventory.svelte | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/sections/stats/Inventory.svelte b/src/lib/sections/stats/Inventory.svelte index 1620ef677..bb56bbc45 100644 --- a/src/lib/sections/stats/Inventory.svelte +++ b/src/lib/sections/stats/Inventory.svelte @@ -5,6 +5,7 @@ import type { ProcessedSkyBlockItem } from "$lib/types/stats"; import { Avatar, ScrollArea, Tabs } from "bits-ui"; import Image from "lucide-svelte/icons/image"; + import { Debounced } from "runed"; import { cubicInOut } from "svelte/easing"; import { crossfade, fade } from "svelte/transition"; @@ -19,6 +20,8 @@ let openTab = $state("inv"); let searchValue = $state(""); + const debouncedSearchValue = new Debounced(() => searchValue, 300); + const ctx = getProfileCtx(); const profile = $derived(ctx.profile); @@ -119,14 +122,14 @@ }); const searchedItems = $derived.by(() => { - const search = searchValue.trim(); + const search = debouncedSearchValue.current.trim(); if (!search) return []; const searchedItem = allItems .map((item) => { const tab = tabs.find((t) => t.items.includes(item)); return { item, sourceTab: { name: tab?.id || "", icon: tab?.icon || "" } }; }) - .filter((item) => item.item.display_name?.toLowerCase().includes(searchValue.toLowerCase())) + .filter((item) => item.item.display_name?.toLowerCase().includes(debouncedSearchValue.current.toLowerCase())) .slice(0, 45); return searchedItem; }); From 465e06a61deeaa05845b060c35fa1a3441db9bd3 Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:09:45 +0100 Subject: [PATCH 10/14] style: update colors to use OKLCH color space --- src/lib/components/Navbar.svelte | 2 +- src/lib/layouts/stats/PlayerProfile.svelte | 4 ++-- src/lib/sections/stats/skills/fishing.svelte | 8 ++++---- src/routes/+error.svelte | 2 +- src/routes/+page.svelte | 4 ++-- src/routes/stats/[ign]/[[profile]]/+error.svelte | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/components/Navbar.svelte b/src/lib/components/Navbar.svelte index 90b9d2555..990079b9d 100644 --- a/src/lib/components/Navbar.svelte +++ b/src/lib/components/Navbar.svelte @@ -84,7 +84,7 @@
-
+
{#each $sectionOrderPreferences as section} handleSectionClick(section.name)}> {section.name?.replaceAll("_", " ")} diff --git a/src/lib/layouts/stats/PlayerProfile.svelte b/src/lib/layouts/stats/PlayerProfile.svelte index 42a5f2cd7..dc5baf016 100644 --- a/src/lib/layouts/stats/PlayerProfile.svelte +++ b/src/lib/layouts/stats/PlayerProfile.svelte @@ -36,7 +36,7 @@
Stats for - +
{profile.rank?.rankText} @@ -62,7 +62,7 @@ on - + {profile.profile_cute_name} diff --git a/src/lib/sections/stats/skills/fishing.svelte b/src/lib/sections/stats/skills/fishing.svelte index 7d820b611..55918db62 100644 --- a/src/lib/sections/stats/skills/fishing.svelte +++ b/src/lib/sections/stats/skills/fishing.svelte @@ -112,19 +112,19 @@
-
+
{format(trophyFish.bronze)}
-
+
{format(trophyFish.silver)}
-
+
{format(trophyFish.gold)}
-
+
{format(trophyFish.diamond)}
diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte index 06a964c61..bb19acccc 100644 --- a/src/routes/+error.svelte +++ b/src/routes/+error.svelte @@ -7,7 +7,7 @@

Oops! Something went wrong

Try again or contact us if the problem persists.

- Go home + Go home

{page.status}: {page.error?.message}

diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index bb3111b85..664aa4633 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -54,7 +54,7 @@ {/if}
- 0 && isTainted($tainted?.query) && $errors.query !== undefined) || $submitting}> + 0 && isTainted($tainted?.query) && $errors.query !== undefined) || $submitting}> {#if $submitting} {:else} @@ -133,7 +133,7 @@ if (!options?.favorite) return; favorites.set($favorites.filter((uuid) => uuid !== user.id)); }}> - +
diff --git a/src/routes/stats/[ign]/[[profile]]/+error.svelte b/src/routes/stats/[ign]/[[profile]]/+error.svelte index 69cb70dc3..40243a708 100644 --- a/src/routes/stats/[ign]/[[profile]]/+error.svelte +++ b/src/routes/stats/[ign]/[[profile]]/+error.svelte @@ -8,7 +8,7 @@

Oops! Something went wrong

An error occurred while trying to fetch the stats for '{page.params.ign}'

Try again or contact us if the problem persists.

- Go home + Go home

{page.status}: {page.error?.message}

From 87c6ddfd383ab5ace4e4e8a7d34631bec868789b Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:12:51 +0100 Subject: [PATCH 11/14] remove unneeded font.css file --- src/fonts.css | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/fonts.css diff --git a/src/fonts.css b/src/fonts.css deleted file mode 100644 index 68fb70320..000000000 --- a/src/fonts.css +++ /dev/null @@ -1 +0,0 @@ -@import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap") layer(utilities); From ba42b9cfcb7012637b0cd344717126258452bb5c Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:12:58 +0100 Subject: [PATCH 12/14] refactor(service-worker): remove debug log from install event --- src/service-worker.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/service-worker.js b/src/service-worker.js index 1c9be2c26..d962da984 100644 --- a/src/service-worker.js +++ b/src/service-worker.js @@ -17,7 +17,6 @@ const ASSETS = [ ]; sw.addEventListener("install", (event) => { - console.log("installing with prerendered", prerendered); // Create a new cache and add all files to it async function addFilesToCache() { const cache = await caches.open(CACHE); From 6ce9ddf465003828605ee44b8203177d621ed74f Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:15:16 +0100 Subject: [PATCH 13/14] chore(deps): update package dependencies to latest versions --- package.json | 14 +- pnpm-lock.yaml | 669 +++++++++++++++++++++++++++++++------------------ 2 files changed, 428 insertions(+), 255 deletions(-) diff --git a/package.json b/package.json index 97cdd4818..187642762 100644 --- a/package.json +++ b/package.json @@ -20,15 +20,15 @@ "@eslint/compat": "^1.2.6", "@eslint/js": "^9.19.0", "@sveltejs/adapter-node": "^5.2.12", - "@sveltejs/kit": "^2.16.1", + "@sveltejs/kit": "^2.17.1", "@sveltejs/vite-plugin-svelte": "^5.0.3", - "@tailwindcss/vite": "^4.0.3", + "@tailwindcss/vite": "^4.0.4", "@types/eslint": "^9.6.1", "@types/fs-extra": "^11.0.4", "@types/lodash": "^4.17.15", "@types/micromatch": "^4.0.9", "@types/mongo-sanitize": "^1.0.3", - "@types/node": "^22.13.0", + "@types/node": "^22.13.1", "@types/relaxed-json": "^1.0.4", "@types/upng-js": "^2.1.5", "bits-ui": "^0.22.0", @@ -55,7 +55,7 @@ "simple-git": "^3.27.0", "skinview3d": "^3.1.0", "skyhelper-networth": "^1.27.1", - "svelte": "5.19.6", + "svelte": "5.19.8", "svelte-check": "^4.1.4", "svelte-dnd-action": "^0.9.57", "svelte-interactions": "^0.2.0", @@ -66,14 +66,14 @@ "svelte-tiny-virtual-list": "^2.1.2", "sveltekit-superforms": "^2.23.1", "tailwind-merge": "^3.0.1", - "tailwindcss": "^4.0.3", + "tailwindcss": "^4.0.4", "tslib": "^2.8.1", "typescript": "^5.7.3", - "typescript-eslint": "^8.22.0", + "typescript-eslint": "^8.23.0", "upng-js": "^2.1.0", "util": "^0.12.5", "vaul-svelte": "1.0.0-next.3", - "vite": "^6.0.11", + "vite": "^6.1.0", "zod": "^3.24.1" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 048085e0a..2781a26ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,16 +38,16 @@ importers: version: 9.19.0 '@sveltejs/adapter-node': specifier: ^5.2.12 - version: 5.2.12(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1))) + version: 5.2.12(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1))) '@sveltejs/kit': - specifier: ^2.16.1 - version: 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + specifier: ^2.17.1 + version: 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + version: 5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) '@tailwindcss/vite': - specifier: ^4.0.3 - version: 4.0.3(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + specifier: ^4.0.4 + version: 4.0.4(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 @@ -64,8 +64,8 @@ importers: specifier: ^1.0.3 version: 1.0.3 '@types/node': - specifier: ^22.13.0 - version: 22.13.0 + specifier: ^22.13.1 + version: 22.13.1 '@types/relaxed-json': specifier: ^1.0.4 version: 1.0.4 @@ -74,7 +74,7 @@ importers: version: 2.1.5 bits-ui: specifier: ^0.22.0 - version: 0.22.0(svelte@5.19.6) + version: 0.22.0(svelte@5.19.8) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -89,10 +89,10 @@ importers: version: 10.0.1(eslint@9.19.0(jiti@2.4.2)) eslint-plugin-svelte: specifier: ^2.46.1 - version: 2.46.1(eslint@9.19.0(jiti@2.4.2))(svelte@5.19.6) + version: 2.46.1(eslint@9.19.0(jiti@2.4.2))(svelte@5.19.8) formsnap: specifier: ^2.0.0 - version: 2.0.0(svelte@5.19.6)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.6)(typescript@5.7.3)) + version: 2.0.0(svelte@5.19.8)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3)) fs-extra: specifier: ^11.3.0 version: 11.3.0 @@ -104,7 +104,7 @@ importers: version: 4.17.21 lucide-svelte: specifier: ^0.474.0 - version: 0.474.0(svelte@5.19.6) + version: 0.474.0(svelte@5.19.8) micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -122,10 +122,10 @@ importers: version: 3.4.2 prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.3.3(prettier@3.4.2)(svelte@5.19.6) + version: 3.3.3(prettier@3.4.2)(svelte@5.19.8) prettier-plugin-tailwindcss: specifier: ^0.6.11 - version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.6))(prettier@3.4.2) + version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8))(prettier@3.4.2) pretty-ms: specifier: ^9.2.0 version: 9.2.0 @@ -134,7 +134,7 @@ importers: version: 1.0.3 runed: specifier: ^0.23.2 - version: 0.23.2(svelte@5.19.6) + version: 0.23.2(svelte@5.19.8) simple-git: specifier: ^3.27.0 version: 3.27.0 @@ -145,41 +145,41 @@ importers: specifier: ^1.27.1 version: 1.27.1 svelte: - specifier: 5.19.6 - version: 5.19.6 + specifier: 5.19.8 + version: 5.19.8 svelte-check: specifier: ^4.1.4 - version: 4.1.4(picomatch@4.0.2)(svelte@5.19.6)(typescript@5.7.3) + version: 4.1.4(picomatch@4.0.2)(svelte@5.19.8)(typescript@5.7.3) svelte-dnd-action: specifier: ^0.9.57 - version: 0.9.57(svelte@5.19.6) + version: 0.9.57(svelte@5.19.8) svelte-interactions: specifier: ^0.2.0 - version: 0.2.0(svelte@5.19.6) + version: 0.2.0(svelte@5.19.8) svelte-persisted-store: specifier: ^0.12.0 - version: 0.12.0(svelte@5.19.6) + version: 0.12.0(svelte@5.19.8) svelte-preprocess: specifier: ^6.0.3 - version: 6.0.3(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.19.6)(typescript@5.7.3) + version: 6.0.3(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.19.8)(typescript@5.7.3) svelte-seo: specifier: ^1.6.1 version: 1.6.1(typescript@5.7.3) svelte-sonner: specifier: ^0.3.28 - version: 0.3.28(svelte@5.19.6) + version: 0.3.28(svelte@5.19.8) svelte-tiny-virtual-list: specifier: ^2.1.2 version: 2.1.2 sveltekit-superforms: specifier: ^2.23.1 - version: 2.23.1(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.6)(typescript@5.7.3) + version: 2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3) tailwind-merge: specifier: ^3.0.1 version: 3.0.1 tailwindcss: - specifier: ^4.0.3 - version: 4.0.3 + specifier: ^4.0.4 + version: 4.0.4 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -187,8 +187,8 @@ importers: specifier: ^5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.22.0 - version: 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + specifier: ^8.23.0 + version: 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) upng-js: specifier: ^2.1.0 version: 2.1.0 @@ -197,10 +197,10 @@ importers: version: 0.12.5 vaul-svelte: specifier: 1.0.0-next.3 - version: 1.0.0-next.3(svelte@5.19.6) + version: 1.0.0-next.3(svelte@5.19.8) vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) + specifier: ^6.1.0 + version: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) zod: specifier: ^3.24.1 version: 3.24.1 @@ -628,21 +628,18 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@napi-rs/canvas-linux-arm64-musl@0.1.65': resolution: {integrity: sha512-O4xMASm2JrmqYoiDyxVWi+z5C14H+oVEag2rZ5iIA67dhWqYZB+iO7wCFpBYRj31JPBR29FOsu6X9zL+DwBFdw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@napi-rs/canvas-linux-riscv64-gnu@0.1.65': resolution: {integrity: sha512-dblWDaA59ZU8bPbkfM+riSke7sFbNZ70LEevUdI5rgiFEUzYUQlU34gSBzemTACj5rCWt1BYeu0GfkLSjNMBSw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@napi-rs/canvas-linux-x64-gnu@0.1.65': resolution: {integrity: sha512-wsp+atutw13OJXGU3DDkdngtBDoEg01IuK5xMe0L6VFPV8maGkh17CXze078OD5QJOc6kFyw3DDscMLOPF8+oA==} @@ -655,7 +652,6 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@napi-rs/canvas-win32-x64-msvc@0.1.65': resolution: {integrity: sha512-RZQX3luWnlNWgdMnLMQ1hyfQraeAn9lnxWWVCHuUM4tAWEV8UDdeb7cMwmJW7eyt8kAosmjeHt3cylQMHOxGFg==} @@ -756,105 +752,191 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.34.4': + resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.34.0': resolution: {integrity: sha512-yVh0Kf1f0Fq4tWNf6mWcbQBCLDpDrDEl88lzPgKhrgTcDrTtlmun92ywEF9dCjmYO3EFiSuJeeo9cYRxl2FswA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.34.4': + resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.34.0': resolution: {integrity: sha512-gCs0ErAZ9s0Osejpc3qahTsqIPUDjSKIyxK/0BGKvL+Tn0n3Kwvj8BrCv7Y5sR1Ypz1K2qz9Ny0VvkVyoXBVUQ==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.34.4': + resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.34.0': resolution: {integrity: sha512-aIB5Anc8hngk15t3GUkiO4pv42ykXHfmpXGS+CzM9CTyiWyT8HIS5ygRAy7KcFb/wiw4Br+vh1byqcHRTfq2tQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.34.4': + resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==} + cpu: [x64] + os: [darwin] + '@rollup/rollup-freebsd-arm64@4.34.0': resolution: {integrity: sha512-kpdsUdMlVJMRMaOf/tIvxk8TQdzHhY47imwmASOuMajg/GXpw8GKNd8LNwIHE5Yd1onehNpcUB9jHY6wgw9nHQ==} cpu: [arm64] os: [freebsd] + '@rollup/rollup-freebsd-arm64@4.34.4': + resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==} + cpu: [arm64] + os: [freebsd] + '@rollup/rollup-freebsd-x64@4.34.0': resolution: {integrity: sha512-D0RDyHygOBCQiqookcPevrvgEarN0CttBecG4chOeIYCNtlKHmf5oi5kAVpXV7qs0Xh/WO2RnxeicZPtT50V0g==} cpu: [x64] os: [freebsd] + '@rollup/rollup-freebsd-x64@4.34.4': + resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.34.0': resolution: {integrity: sha512-mCIw8j5LPDXmCOW8mfMZwT6F/Kza03EnSr4wGYEswrEfjTfVsFOxvgYfuRMxTuUF/XmRb9WSMD5GhCWDe2iNrg==} cpu: [arm] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==} + cpu: [arm] + os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.34.0': resolution: {integrity: sha512-AwwldAu4aCJPob7zmjuDUMvvuatgs8B/QiVB0KwkUarAcPB3W+ToOT+18TQwY4z09Al7G0BvCcmLRop5zBLTag==} cpu: [arm] os: [linux] - libc: [musl] + + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==} + cpu: [arm] + os: [linux] '@rollup/rollup-linux-arm64-gnu@4.34.0': resolution: {integrity: sha512-e7kDUGVP+xw05pV65ZKb0zulRploU3gTu6qH1qL58PrULDGxULIS0OSDQJLH7WiFnpd3ZKUU4VM3u/Z7Zw+e7Q==} cpu: [arm64] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-arm64-gnu@4.34.4': + resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==} + cpu: [arm64] + os: [linux] '@rollup/rollup-linux-arm64-musl@4.34.0': resolution: {integrity: sha512-SXYJw3zpwHgaBqTXeAZ31qfW/v50wq4HhNVvKFhRr5MnptRX2Af4KebLWR1wpxGJtLgfS2hEPuALRIY3LPAAcA==} cpu: [arm64] os: [linux] - libc: [musl] + + '@rollup/rollup-linux-arm64-musl@4.34.4': + resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==} + cpu: [arm64] + os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.34.0': resolution: {integrity: sha512-e5XiCinINCI4RdyU3sFyBH4zzz7LiQRvHqDtRe9Dt8o/8hTBaYpdPimayF00eY2qy5j4PaaWK0azRgUench6WQ==} cpu: [loong64] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==} + cpu: [loong64] + os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': resolution: {integrity: sha512-3SWN3e0bAsm9ToprLFBSro8nJe6YN+5xmB11N4FfNf92wvLye/+Rh5JGQtKOpwLKt6e61R1RBc9g+luLJsc23A==} cpu: [ppc64] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==} + cpu: [ppc64] + os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.34.0': resolution: {integrity: sha512-B1Oqt3GLh7qmhvfnc2WQla4NuHlcxAD5LyueUi5WtMc76ZWY+6qDtQYqnxARx9r+7mDGfamD+8kTJO0pKUJeJA==} cpu: [riscv64] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==} + cpu: [riscv64] + os: [linux] '@rollup/rollup-linux-s390x-gnu@4.34.0': resolution: {integrity: sha512-UfUCo0h/uj48Jq2lnhX0AOhZPSTAq3Eostas+XZ+GGk22pI+Op1Y6cxQ1JkUuKYu2iU+mXj1QjPrZm9nNWV9rg==} cpu: [s390x] os: [linux] - libc: [glibc] + + '@rollup/rollup-linux-s390x-gnu@4.34.4': + resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==} + cpu: [s390x] + os: [linux] '@rollup/rollup-linux-x64-gnu@4.34.0': resolution: {integrity: sha512-chZLTUIPbgcpm+Z7ALmomXW8Zh+wE2icrG+K6nt/HenPLmtwCajhQC5flNSk1Xy5EDMt/QAOz2MhzfOfJOLSiA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.34.4': + resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.34.0': resolution: {integrity: sha512-jo0UolK70O28BifvEsFD/8r25shFezl0aUk2t0VJzREWHkq19e+pcLu4kX5HiVXNz5qqkD+aAq04Ct8rkxgbyQ==} cpu: [x64] os: [linux] - libc: [musl] + + '@rollup/rollup-linux-x64-musl@4.34.4': + resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==} + cpu: [x64] + os: [linux] '@rollup/rollup-win32-arm64-msvc@4.34.0': resolution: {integrity: sha512-Vmg0NhAap2S54JojJchiu5An54qa6t/oKT7LmDaWggpIcaiL8WcWHEN6OQrfTdL6mQ2GFyH7j2T5/3YPEDOOGA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.34.4': + resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.34.0': resolution: {integrity: sha512-CV2aqhDDOsABKHKhNcs1SZFryffQf8vK2XrxP6lxC99ELZAdvsDgPklIBfd65R8R+qvOm1SmLaZ/Fdq961+m7A==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.34.4': + resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.34.0': resolution: {integrity: sha512-g2ASy1QwHP88y5KWvblUolJz9rN+i4ZOsYzkEwcNfaNooxNUXG+ON6F5xFo0NIItpHqxcdAyls05VXpBnludGw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.34.4': + resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==} + cpu: [x64] + os: [win32] + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -872,8 +954,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/kit@2.16.1': - resolution: {integrity: sha512-2pF5sgGJx9brYZ/9nNDYnh5KX0JguPF14dnvvtf/MqrvlWrDj/e7Rk3LBJPecFLLK1GRs6ZniD24gFPqZm/NFw==} + '@sveltejs/kit@2.17.1': + resolution: {integrity: sha512-CpoGSLqE2MCmcQwA2CWJvOsZ9vW+p/1H3itrFykdgajUNAEyQPbsaSn7fZb6PLHQwe+07njxje9ss0fjZoCAyw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -899,84 +981,81 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tailwindcss/node@4.0.3': - resolution: {integrity: sha512-QsVJokOl0pJ4AbJV33D2npvLcHGPWi5MOSZtrtE0GT3tSx+3D0JE2lokLA8yHS1x3oCY/3IyRyy7XX6tmzid7A==} + '@tailwindcss/node@4.0.4': + resolution: {integrity: sha512-VLFq80IyoV1hsHPcCm1mmlyPyUT6NlovQLoO2y7PGm84mW94ZrNJ7ax5H6K4M7Aj/fdMfem5IX7Ka+LXWZpDGg==} - '@tailwindcss/oxide-android-arm64@4.0.3': - resolution: {integrity: sha512-S8XOTQuMnpijZRlPm5HBzPJjZ28quB+40LSRHjRnQF6rRYKsvpr1qkY7dfwsetNdd+kMLOMDsvmuT8WnqqETvg==} + '@tailwindcss/oxide-android-arm64@4.0.4': + resolution: {integrity: sha512-hiGUA8d15ynH/LdurQNObnuTjri7i4ApAzhesusNxoz4br7vhZ6QO5CFgniYAYNZvf8Q8wCTBg0nj61RalBeVQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.0.3': - resolution: {integrity: sha512-smrY2DpzhXvgDhZtQlYAl8+vxJ04lv2/64C1eiRxvsRT2nkw/q+zA1/eAYKvUHat6cIuwqDku3QucmrUT6pCeg==} + '@tailwindcss/oxide-darwin-arm64@4.0.4': + resolution: {integrity: sha512-vTca+ysNl8BYmYJTni9pLC+L3S4bvrj0ai1eUV3yYXYa5Cpugr5Fni6ylV0gcTZOyETm2RCCJ/0azU6MgqE6HA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.0.3': - resolution: {integrity: sha512-NTz8x/LcGUjpZAWUxz0ZuzHao90Wj9spoQgomwB+/hgceh5gcJDfvaBYqxLFpKzVglpnbDSq1Fg0p0zI4oa5Pg==} + '@tailwindcss/oxide-darwin-x64@4.0.4': + resolution: {integrity: sha512-rxPWb5AQJ/aAM/5UDCjaQaMYIcrZHe/Dr9xZu9+P9nJf3WAweNsGi+e+SW9EYGRiF3hkBtP2dvxVNAkTiEbNQQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.0.3': - resolution: {integrity: sha512-yQc9Q0JCOp3kkAV8gKgDctXO60IkQhHpqGB+KgOccDtD5UmN6Q5+gd+lcsDyQ7N8dRuK1fAud51xQpZJgKfm7g==} + '@tailwindcss/oxide-freebsd-x64@4.0.4': + resolution: {integrity: sha512-UOnRHzlS5V5cxaMgBo6rk1E92tTDUtO/falc9vOpNiRdWhNcofYNN9zvZP63Wuo5FC6/XCyAnJo6OXUm18TwrQ==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': - resolution: {integrity: sha512-e1ivVMLSnxTOU1O3npnxN16FEyWM/g3SuH2pP6udxXwa0/SnSAijRwcAYRpqIlhVKujr158S8UeHxQjC4fGl4w==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.4': + resolution: {integrity: sha512-0Ry9Qfnf22rmJwHxsCFmHQIl5RZw+yOUUGHaqNT42REL8r308cU/bi4UqdrjqVRfAlu51gOGxTRf2NRueczuIA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': - resolution: {integrity: sha512-PLrToqQqX6sdJ9DmMi8IxZWWrfjc9pdi9AEEPTrtMts3Jm9HBi1WqEeF1VwZZ2aW9TXloE5OwA35zuuq1Bhb/Q==} + '@tailwindcss/oxide-linux-arm64-gnu@4.0.4': + resolution: {integrity: sha512-5a7WD30nVdI7Rl1ohZ0Ojj9t5yRnZkJBizvh3uIW52h9UeNpon8TfoknF6rU/TwD32dQ0Cjo5CcCHtQ2wW9PCA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.0.3': - resolution: {integrity: sha512-YlzRxx7N1ampfgSKzEDw0iwDkJXUInR4cgNEqmR4TzHkU2Vhg59CGPJrTI7dxOBofD8+O35R13Nk9Ytyv0JUFg==} + '@tailwindcss/oxide-linux-arm64-musl@4.0.4': + resolution: {integrity: sha512-m6s5jKSqos07l6NtHFd49Ljcaw4jIWHE7jq6eNPNz9SCzQqRzs4esP1t7jH8UljQ7JffKOl7yZPwK5Nf+irliw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.0.3': - resolution: {integrity: sha512-Xfc3z/li6XkuD7Hs+Uk6pjyCXnfnd9zuQTKOyDTZJ544xc2yoMKUkuDw6Et9wb31MzU2/c0CIUpTDa71lL9KHw==} + '@tailwindcss/oxide-linux-x64-gnu@4.0.4': + resolution: {integrity: sha512-K5dBjGHzby9eyUBwy9YHFhKY+5i8fzIBZM1NBWp6L2xpM7OzW9WJDgNcgESkZami9g+EozkQLt3ZmMZHAieXkw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.0.3': - resolution: {integrity: sha512-ugKVqKzwa/cjmqSQG17aS9DYrEcQ/a5NITcgmOr3JLW4Iz64C37eoDlkC8tIepD3S/Td/ywKAolTQ8fKbjEL4g==} + '@tailwindcss/oxide-linux-x64-musl@4.0.4': + resolution: {integrity: sha512-J8sskt+fA5ooq+kxy0Tf4E2TRWZD9Y8j3K+pnBwp9zdilLmSd8OHrB3e0/rO78KveZ6BE9ae75cKOWrT6wONmw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] - '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': - resolution: {integrity: sha512-qHPDMl+UUwsk1RMJMgAXvhraWqUUT+LR/tkXix5RA39UGxtTrHwsLIN1AhNxI5i2RFXAXfmFXDqZCdyQ4dWmAQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.0.4': + resolution: {integrity: sha512-flFaaMc77NQbz0Fq73wBs9EH2lX1Oc2Z/3JuxoewpnGHpAGJ/j05tvBNMyTaGrKcHvf/+dk+mCDxb6+PmzGgnQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.0.3': - resolution: {integrity: sha512-+ujwN4phBGyOsPyLgGgeCyUm4Mul+gqWVCIGuSXWgrx9xVUnf6LVXrw0BDBc9Aq1S2qMyOTX4OkCGbZeoIo8Qw==} + '@tailwindcss/oxide-win32-x64-msvc@4.0.4': + resolution: {integrity: sha512-WzMA0aL/24/JyNrv2Yhr/Og24QGRPWJMjRyCJ4HRoGMs6/8svOQKrnnZ/9LUFwn56irAndFBjWWnlaqykH+g5Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.0.3': - resolution: {integrity: sha512-FFcp3VNvRjjmFA39ORM27g2mbflMQljhvM7gxBAujHxUy4LXlKa6yMF9wbHdTbPqTONiCyyOYxccvJyVyI/XBg==} + '@tailwindcss/oxide@4.0.4': + resolution: {integrity: sha512-vPpu30KFLiGyPOoElkYt8WRvzGKVrrOz49KpfiGGtnQGmyUpL8VCbJzzEEcpKT5BpaaQidhFok+OXscf6hHjOQ==} engines: {node: '>= 10'} - '@tailwindcss/vite@4.0.3': - resolution: {integrity: sha512-Qj6rSO+EvXnNDymloKZ11D54JJTnDrkRWJBzNHENDxjt0HtrCZJbSLIrcJ/WdaoU4othrel/oFqHpO/doxIS/Q==} + '@tailwindcss/vite@4.0.4': + resolution: {integrity: sha512-zrWGbluPeXeoetUQoDFmt1dQIeiOBThfznla7zPIqST69rMmiDD4SZwJrHVoL5CvXz06AYQXz/M/jELSakL7Rg==} peerDependencies: vite: ^5.2.0 || ^6 @@ -1010,8 +1089,8 @@ packages: '@types/mongo-sanitize@1.0.3': resolution: {integrity: sha512-Crd9RpMJKNxl4fBfGyBUOJZc0TCTjirlZC61GDVPlauDvcclqAY7/7fnJHs+2T1P0eAEf4W4QtwbCIoHMfvXrw==} - '@types/node@22.13.0': - resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} '@types/relaxed-json@1.0.4': resolution: {integrity: sha512-MulPaZU5Hh81T8ROYhsWlC7tJuuapwUT1/wX1qS8/koMI8Ypf3tyEunFZKzewoLsjutDpuf4kXVhxkF82ZtXzg==} @@ -1056,51 +1135,51 @@ packages: '@types/json-schema': optional: true - '@typescript-eslint/eslint-plugin@8.22.0': - resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} + '@typescript-eslint/eslint-plugin@8.23.0': + resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.22.0': - resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} + '@typescript-eslint/parser@8.23.0': + resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.22.0': - resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} + '@typescript-eslint/scope-manager@8.23.0': + resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.22.0': - resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} + '@typescript-eslint/type-utils@8.23.0': + resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.22.0': - resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} + '@typescript-eslint/types@8.23.0': + resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.22.0': - resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} + '@typescript-eslint/typescript-estree@8.23.0': + resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.22.0': - resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} + '@typescript-eslint/utils@8.23.0': + resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.22.0': - resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} + '@typescript-eslint/visitor-keys@8.23.0': + resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vinejs/compiler@3.0.0': @@ -1347,8 +1426,8 @@ packages: effect@3.12.7: resolution: {integrity: sha512-BsDTgSjLbL12g0+vGn5xkOgOVhRSaR3VeHmjcUb0gLvpXACJ9OgmlfeH+/FaAZwM5+omIF3I/j1gC5KJrbK1Aw==} - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} engines: {node: '>=10.13.0'} es-define-property@1.0.1: @@ -2171,6 +2250,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.34.4: + resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2200,6 +2284,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} @@ -2377,8 +2466,8 @@ packages: peerDependencies: svelte: ^5.0.0 - svelte@5.19.6: - resolution: {integrity: sha512-6ydekB3qyqUal+UhfMjmVOjRGtxysR8vuiMhi2nwuBtPJWnctVlsGspjVFB05qmR+TXI1emuqtZt81c0XiFleA==} + svelte@5.19.8: + resolution: {integrity: sha512-56Vd/nwJrljV0w7RCV1A8sB4/yjSbWW5qrGDTAzp7q42OxwqEWT+6obWzDt41tHjIW+C9Fs2ygtejjJrXR+ZPA==} engines: {node: '>=18'} sveltekit-superforms@2.23.1: @@ -2393,8 +2482,8 @@ packages: tailwind-merge@3.0.1: resolution: {integrity: sha512-AvzE8FmSoXC7nC+oU5GlQJbip2UO7tmOhOfQyOmPhrStOGXHU08j8mZEHZ4BmCqY5dWTCo4ClWkNyRNx1wpT0g==} - tailwindcss@4.0.3: - resolution: {integrity: sha512-ImmZF0Lon5RrQpsEAKGxRvHwCvMgSC4XVlFRqmbzTEDb/3wvin9zfEZrMwgsa3yqBbPqahYcVI6lulM2S7IZAA==} + tailwindcss@4.0.4: + resolution: {integrity: sha512-/ezDLEkOLf1lXkr9F2iI5BHJbexJpty5zkV2B8bGHCqAdbc9vk85Jgdkq+ZOvNkNPa3yAaqJ8DjRt584Bc84kw==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -2448,8 +2537,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typescript-eslint@8.22.0: - resolution: {integrity: sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==} + typescript-eslint@8.23.0: + resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2503,8 +2592,8 @@ packages: peerDependencies: svelte: ^5.0.0 - vite@6.0.11: - resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + vite@6.1.0: + resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2891,7 +2980,7 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@melt-ui/svelte@0.76.2(svelte@5.19.6)': + '@melt-ui/svelte@0.76.2(svelte@5.19.8)': dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 @@ -2899,7 +2988,7 @@ snapshots: dequal: 2.0.3 focus-trap: 7.6.4 nanoid: 5.0.9 - svelte: 5.19.6 + svelte: 5.19.8 '@mongodb-js/saslprep@1.1.9': dependencies: @@ -3030,60 +3119,117 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.34.0': optional: true + '@rollup/rollup-android-arm-eabi@4.34.4': + optional: true + '@rollup/rollup-android-arm64@4.34.0': optional: true + '@rollup/rollup-android-arm64@4.34.4': + optional: true + '@rollup/rollup-darwin-arm64@4.34.0': optional: true + '@rollup/rollup-darwin-arm64@4.34.4': + optional: true + '@rollup/rollup-darwin-x64@4.34.0': optional: true + '@rollup/rollup-darwin-x64@4.34.4': + optional: true + '@rollup/rollup-freebsd-arm64@4.34.0': optional: true + '@rollup/rollup-freebsd-arm64@4.34.4': + optional: true + '@rollup/rollup-freebsd-x64@4.34.0': optional: true + '@rollup/rollup-freebsd-x64@4.34.4': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.34.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.34.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.34.4': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.34.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-arm64-musl@4.34.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.34.4': + optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.34.0': optional: true + '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.34.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.34.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.34.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-x64-gnu@4.34.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.34.4': + optional: true + '@rollup/rollup-linux-x64-musl@4.34.0': optional: true + '@rollup/rollup-linux-x64-musl@4.34.4': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.34.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.34.4': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.34.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.34.4': + optional: true + '@rollup/rollup-win32-x64-msvc@4.34.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.34.4': + optional: true + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -3098,17 +3244,17 @@ snapshots: '@sinclair/typebox@0.34.15': optional: true - '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))': + '@sveltejs/adapter-node@5.2.12(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))': dependencies: '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.0) '@rollup/plugin-json': 6.1.0(rollup@4.34.0) '@rollup/plugin-node-resolve': 16.0.0(rollup@4.34.0) - '@sveltejs/kit': 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) rollup: 4.34.0 - '@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1))': + '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -3120,28 +3266,28 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.7.1 sirv: 3.0.0 - svelte: 5.19.6 - vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) + svelte: 5.19.8 + vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) debug: 4.4.0 - svelte: 5.19.6 - vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) + svelte: 5.19.8 + vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.19.6 - vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) - vitefu: 1.0.5(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + svelte: 5.19.8 + vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) + vitefu: 1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) transitivePeerDependencies: - supports-color @@ -3149,66 +3295,66 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.0.3': + '@tailwindcss/node@4.0.4': dependencies: - enhanced-resolve: 5.18.0 + enhanced-resolve: 5.18.1 jiti: 2.4.2 - tailwindcss: 4.0.3 + tailwindcss: 4.0.4 - '@tailwindcss/oxide-android-arm64@4.0.3': + '@tailwindcss/oxide-android-arm64@4.0.4': optional: true - '@tailwindcss/oxide-darwin-arm64@4.0.3': + '@tailwindcss/oxide-darwin-arm64@4.0.4': optional: true - '@tailwindcss/oxide-darwin-x64@4.0.3': + '@tailwindcss/oxide-darwin-x64@4.0.4': optional: true - '@tailwindcss/oxide-freebsd-x64@4.0.3': + '@tailwindcss/oxide-freebsd-x64@4.0.4': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.3': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.4': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.0.3': + '@tailwindcss/oxide-linux-arm64-gnu@4.0.4': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.0.3': + '@tailwindcss/oxide-linux-arm64-musl@4.0.4': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.0.3': + '@tailwindcss/oxide-linux-x64-gnu@4.0.4': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.0.3': + '@tailwindcss/oxide-linux-x64-musl@4.0.4': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.0.3': + '@tailwindcss/oxide-win32-arm64-msvc@4.0.4': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.0.3': + '@tailwindcss/oxide-win32-x64-msvc@4.0.4': optional: true - '@tailwindcss/oxide@4.0.3': + '@tailwindcss/oxide@4.0.4': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.3 - '@tailwindcss/oxide-darwin-arm64': 4.0.3 - '@tailwindcss/oxide-darwin-x64': 4.0.3 - '@tailwindcss/oxide-freebsd-x64': 4.0.3 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.3 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.3 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.3 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.3 - '@tailwindcss/oxide-linux-x64-musl': 4.0.3 - '@tailwindcss/oxide-win32-arm64-msvc': 4.0.3 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.3 - - '@tailwindcss/vite@4.0.3(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1))': - dependencies: - '@tailwindcss/node': 4.0.3 - '@tailwindcss/oxide': 4.0.3 + '@tailwindcss/oxide-android-arm64': 4.0.4 + '@tailwindcss/oxide-darwin-arm64': 4.0.4 + '@tailwindcss/oxide-darwin-x64': 4.0.4 + '@tailwindcss/oxide-freebsd-x64': 4.0.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.0.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.0.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.0.4 + '@tailwindcss/oxide-linux-x64-musl': 4.0.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.0.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.0.4 + + '@tailwindcss/vite@4.0.4(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1))': + dependencies: + '@tailwindcss/node': 4.0.4 + '@tailwindcss/oxide': 4.0.4 lightningcss: 1.29.1 - tailwindcss: 4.0.3 - vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) + tailwindcss: 4.0.4 + vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) '@types/braces@3.0.5': {} @@ -3224,13 +3370,13 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/json-schema@7.0.15': {} '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 '@types/lodash@4.17.15': {} @@ -3240,7 +3386,7 @@ snapshots: '@types/mongo-sanitize@1.0.3': {} - '@types/node@22.13.0': + '@types/node@22.13.1': dependencies: undici-types: 6.20.0 @@ -3284,14 +3430,14 @@ snapshots: '@types/json-schema': 7.0.15 optional: true - '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/type-utils': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/type-utils': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.23.0 eslint: 9.19.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 5.3.2 @@ -3301,27 +3447,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.23.0 debug: 4.4.0 eslint: 9.19.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.22.0': + '@typescript-eslint/scope-manager@8.23.0': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/visitor-keys': 8.23.0 - '@typescript-eslint/type-utils@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) debug: 4.4.0 eslint: 9.19.0(jiti@2.4.2) ts-api-utils: 2.0.1(typescript@5.7.3) @@ -3329,36 +3475,36 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.22.0': {} + '@typescript-eslint/types@8.23.0': {} - '@typescript-eslint/typescript-estree@8.22.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/visitor-keys': 8.22.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/visitor-keys': 8.23.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.0 + semver: 7.7.1 ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': + '@typescript-eslint/utils@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.22.0 - '@typescript-eslint/types': 8.22.0 - '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.23.0 + '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) eslint: 9.19.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.22.0': + '@typescript-eslint/visitor-keys@8.23.0': dependencies: - '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/types': 8.23.0 eslint-visitor-keys: 4.2.0 '@vinejs/compiler@3.0.0': @@ -3435,22 +3581,22 @@ snapshots: base64-js@1.5.1: {} - bits-ui@0.22.0(svelte@5.19.6): + bits-ui@0.22.0(svelte@5.19.8): dependencies: '@internationalized/date': 3.7.0 - '@melt-ui/svelte': 0.76.2(svelte@5.19.6) + '@melt-ui/svelte': 0.76.2(svelte@5.19.8) nanoid: 5.0.9 - svelte: 5.19.6 + svelte: 5.19.8 - bits-ui@1.0.0-next.84(svelte@5.19.6): + bits-ui@1.0.0-next.84(svelte@5.19.8): dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 '@internationalized/date': 3.7.0 esm-env: 1.2.2 - runed: 0.23.2(svelte@5.19.6) - svelte: 5.19.6 - svelte-toolbelt: 0.7.1(svelte@5.19.6) + runed: 0.23.2(svelte@5.19.8) + svelte: 5.19.8 + svelte-toolbelt: 0.7.1(svelte@5.19.8) brace-expansion@1.1.11: dependencies: @@ -3608,7 +3754,7 @@ snapshots: fast-check: 3.23.2 optional: true - enhanced-resolve@5.18.0: + enhanced-resolve@5.18.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -3669,7 +3815,7 @@ snapshots: dependencies: eslint: 9.19.0(jiti@2.4.2) - eslint-plugin-svelte@2.46.1(eslint@9.19.0(jiti@2.4.2))(svelte@5.19.6): + eslint-plugin-svelte@2.46.1(eslint@9.19.0(jiti@2.4.2))(svelte@5.19.8): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2)) '@jridgewell/sourcemap-codec': 1.5.0 @@ -3682,9 +3828,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 semver: 7.7.0 - svelte-eslint-parser: 0.43.0(svelte@5.19.6) + svelte-eslint-parser: 0.43.0(svelte@5.19.8) optionalDependencies: - svelte: 5.19.6 + svelte: 5.19.8 transitivePeerDependencies: - ts-node @@ -3846,11 +3992,11 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - formsnap@2.0.0(svelte@5.19.6)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.6)(typescript@5.7.3)): + formsnap@2.0.0(svelte@5.19.8)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3)): dependencies: - svelte: 5.19.6 - svelte-toolbelt: 0.5.0(svelte@5.19.6) - sveltekit-superforms: 2.23.1(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.6)(typescript@5.7.3) + svelte: 5.19.8 + svelte-toolbelt: 0.5.0(svelte@5.19.8) + sveltekit-superforms: 2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3) fs-extra@11.3.0: dependencies: @@ -4099,9 +4245,9 @@ snapshots: lodash@4.17.21: {} - lucide-svelte@0.474.0(svelte@5.19.6): + lucide-svelte@0.474.0(svelte@5.19.8): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 magic-string@0.30.17: dependencies: @@ -4240,16 +4386,16 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.6): + prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8): dependencies: prettier: 3.4.2 - svelte: 5.19.6 + svelte: 5.19.8 - prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.6))(prettier@3.4.2): + prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8))(prettier@3.4.2): dependencies: prettier: 3.4.2 optionalDependencies: - prettier-plugin-svelte: 3.3.3(prettier@3.4.2)(svelte@5.19.6) + prettier-plugin-svelte: 3.3.3(prettier@3.4.2)(svelte@5.19.8) prettier@3.4.2: {} @@ -4348,14 +4494,39 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.34.0 fsevents: 2.3.3 + rollup@4.34.4: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.4 + '@rollup/rollup-android-arm64': 4.34.4 + '@rollup/rollup-darwin-arm64': 4.34.4 + '@rollup/rollup-darwin-x64': 4.34.4 + '@rollup/rollup-freebsd-arm64': 4.34.4 + '@rollup/rollup-freebsd-x64': 4.34.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 + '@rollup/rollup-linux-arm-musleabihf': 4.34.4 + '@rollup/rollup-linux-arm64-gnu': 4.34.4 + '@rollup/rollup-linux-arm64-musl': 4.34.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 + '@rollup/rollup-linux-riscv64-gnu': 4.34.4 + '@rollup/rollup-linux-s390x-gnu': 4.34.4 + '@rollup/rollup-linux-x64-gnu': 4.34.4 + '@rollup/rollup-linux-x64-musl': 4.34.4 + '@rollup/rollup-win32-arm64-msvc': 4.34.4 + '@rollup/rollup-win32-ia32-msvc': 4.34.4 + '@rollup/rollup-win32-x64-msvc': 4.34.4 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - runed@0.23.2(svelte@5.19.6): + runed@0.23.2(svelte@5.19.8): dependencies: esm-env: 1.2.2 - svelte: 5.19.6 + svelte: 5.19.8 sade@1.8.1: dependencies: @@ -4375,6 +4546,8 @@ snapshots: semver@7.7.0: {} + semver@7.7.1: {} + set-cookie-parser@2.7.1: {} set-function-length@1.2.2: @@ -4489,23 +4662,23 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.1.4(picomatch@4.0.2)(svelte@5.19.6)(typescript@5.7.3): + svelte-check@4.1.4(picomatch@4.0.2)(svelte@5.19.8)(typescript@5.7.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.3(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.19.6 + svelte: 5.19.8 typescript: 5.7.3 transitivePeerDependencies: - picomatch - svelte-dnd-action@0.9.57(svelte@5.19.6): + svelte-dnd-action@0.9.57(svelte@5.19.8): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 - svelte-eslint-parser@0.43.0(svelte@5.19.6): + svelte-eslint-parser@0.43.0(svelte@5.19.8): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -4513,19 +4686,19 @@ snapshots: postcss: 8.5.1 postcss-scss: 4.0.9(postcss@8.5.1) optionalDependencies: - svelte: 5.19.6 + svelte: 5.19.8 - svelte-interactions@0.2.0(svelte@5.19.6): + svelte-interactions@0.2.0(svelte@5.19.8): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 - svelte-persisted-store@0.12.0(svelte@5.19.6): + svelte-persisted-store@0.12.0(svelte@5.19.8): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 - svelte-preprocess@6.0.3(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.19.6)(typescript@5.7.3): + svelte-preprocess@6.0.3(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.19.8)(typescript@5.7.3): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 optionalDependencies: postcss: 8.5.1 postcss-load-config: 3.1.4(postcss@8.5.1) @@ -4537,32 +4710,32 @@ snapshots: transitivePeerDependencies: - typescript - svelte-sonner@0.3.28(svelte@5.19.6): + svelte-sonner@0.3.28(svelte@5.19.8): dependencies: - svelte: 5.19.6 + svelte: 5.19.8 svelte-tiny-virtual-list@2.1.2: {} - svelte-toolbelt@0.4.6(svelte@5.19.6): + svelte-toolbelt@0.4.6(svelte@5.19.8): dependencies: clsx: 2.1.1 style-to-object: 1.0.8 - svelte: 5.19.6 + svelte: 5.19.8 - svelte-toolbelt@0.5.0(svelte@5.19.6): + svelte-toolbelt@0.5.0(svelte@5.19.8): dependencies: clsx: 2.1.1 style-to-object: 1.0.8 - svelte: 5.19.6 + svelte: 5.19.8 - svelte-toolbelt@0.7.1(svelte@5.19.6): + svelte-toolbelt@0.7.1(svelte@5.19.8): dependencies: clsx: 2.1.1 - runed: 0.23.2(svelte@5.19.6) + runed: 0.23.2(svelte@5.19.8) style-to-object: 1.0.8 - svelte: 5.19.6 + svelte: 5.19.8 - svelte@5.19.6: + svelte@5.19.8: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -4579,12 +4752,12 @@ snapshots: magic-string: 0.30.17 zimmerframe: 1.1.2 - sveltekit-superforms@2.23.1(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.6)(typescript@5.7.3): + sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3): dependencies: - '@sveltejs/kit': 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.6)(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)) + '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)))(svelte@5.19.8)(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)) devalue: 5.1.1 memoize-weak: 1.0.2 - svelte: 5.19.6 + svelte: 5.19.8 ts-deepmerge: 7.0.2 optionalDependencies: '@exodus/schemasafe': 1.3.0 @@ -4610,7 +4783,7 @@ snapshots: tailwind-merge@3.0.1: {} - tailwindcss@4.0.3: {} + tailwindcss@4.0.4: {} tapable@2.2.1: {} @@ -4653,11 +4826,11 @@ snapshots: type-fest@2.19.0: optional: true - typescript-eslint@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): + typescript-eslint@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/parser': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) - '@typescript-eslint/utils': 8.22.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/parser': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) + '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.7.3) eslint: 9.19.0(jiti@2.4.2) typescript: 5.7.3 transitivePeerDependencies: @@ -4702,26 +4875,26 @@ snapshots: validator@13.12.0: optional: true - vaul-svelte@1.0.0-next.3(svelte@5.19.6): + vaul-svelte@1.0.0-next.3(svelte@5.19.8): dependencies: - bits-ui: 1.0.0-next.84(svelte@5.19.6) - svelte: 5.19.6 - svelte-toolbelt: 0.4.6(svelte@5.19.6) + bits-ui: 1.0.0-next.84(svelte@5.19.8) + svelte: 5.19.8 + svelte-toolbelt: 0.4.6(svelte@5.19.8) - vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1): + vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1): dependencies: esbuild: 0.24.2 postcss: 8.5.1 - rollup: 4.34.0 + rollup: 4.34.4 optionalDependencies: - '@types/node': 22.13.0 + '@types/node': 22.13.1 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.29.1 - vitefu@1.0.5(vite@6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1)): + vitefu@1.0.5(vite@6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1)): optionalDependencies: - vite: 6.0.11(@types/node@22.13.0)(jiti@2.4.2)(lightningcss@1.29.1) + vite: 6.1.0(@types/node@22.13.1)(jiti@2.4.2)(lightningcss@1.29.1) webidl-conversions@7.0.0: {} From e7157ca7685d74ab8fb6d500ed2b7a364941ac7b Mon Sep 17 00:00:00 2001 From: DarthGigi <47110839+DarthGigi@users.noreply.github.com> Date: Thu, 6 Feb 2025 19:21:20 +0100 Subject: [PATCH 14/14] style: update font-icomoon to use Montserrat --- src/app.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.css b/src/app.css index 7af781256..82d364c96 100644 --- a/src/app.css +++ b/src/app.css @@ -42,7 +42,7 @@ } /* Fonts */ - --font-icomoon: "icomoon", var(--font-sans); + --font-icomoon: "icomoon", "Montserrat"; --font-sans: "Montserrat", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; }