From f384cae4820a0289015168785ed920f0230e6034 Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Thu, 4 Dec 2025 20:54:04 -0600 Subject: [PATCH 1/7] wip restructuring and adding separate page layouts back --- apps/web/package.json | 4 +- apps/web/pnpm-lock.yaml | 1315 +++++++++++++++++ apps/web/src/app.css | 20 + .../lib/components/changelog/Changelog.svelte | 177 ++- .../components/changelog/EntityPreview.svelte | 2 + .../components/changelog/EntityTooltip.svelte | 112 +- .../changelog/PatchPreviewCard.svelte | 95 ++ .../web/src/lib/components/changelog/index.ts | 1 + .../src/lib/components/ui/badge/badge.svelte | 14 +- .../ui/chart/chart-container.svelte | 80 + .../components/ui/chart/chart-style.svelte | 39 + .../components/ui/chart/chart-tooltip.svelte | 163 ++ .../lib/components/ui/chart/chart-utils.ts | 77 + apps/web/src/lib/components/ui/chart/index.ts | 11 + apps/web/src/lib/queries/keys.ts | 42 + apps/web/src/lib/server/changelog-utils.ts | 10 +- apps/web/src/lib/utils/filterChanges.ts | 9 +- apps/web/src/routes/+layout.server.ts | 14 + apps/web/src/routes/+layout.svelte | 18 +- apps/web/src/routes/+page.server.ts | 17 +- .../web/src/routes/api/change/[id]/+server.ts | 60 + .../web/src/routes/api/hero/[slug]/+server.ts | 63 + .../web/src/routes/api/item/[slug]/+server.ts | 48 + .../src/routes/change/[id]/+page.server.ts | 63 + apps/web/src/routes/change/[id]/+page.svelte | 102 ++ .../src/routes/hero/[slug]/+page.server.ts | 55 + apps/web/src/routes/hero/[slug]/+page.svelte | 171 +++ .../src/routes/item/[slug]/+page.server.ts | 44 + apps/web/src/routes/item/[slug]/+page.svelte | 176 +++ libs/db/src/schema.ts | 2 + libs/scraper/src/builder.ts | 8 + libs/scraper/src/changelogParser.ts | 31 +- libs/scraper/src/index.ts | 7 + libs/scraper/src/static.ts | 95 +- libs/scraper/src/types/assets.ts | 2 + libs/utils/src/index.ts | 1 + libs/utils/src/slug.ts | 13 + 37 files changed, 3026 insertions(+), 135 deletions(-) create mode 100644 apps/web/pnpm-lock.yaml create mode 100644 apps/web/src/lib/components/changelog/PatchPreviewCard.svelte create mode 100644 apps/web/src/lib/components/ui/chart/chart-container.svelte create mode 100644 apps/web/src/lib/components/ui/chart/chart-style.svelte create mode 100644 apps/web/src/lib/components/ui/chart/chart-tooltip.svelte create mode 100644 apps/web/src/lib/components/ui/chart/chart-utils.ts create mode 100644 apps/web/src/lib/components/ui/chart/index.ts create mode 100644 apps/web/src/lib/queries/keys.ts create mode 100644 apps/web/src/routes/+layout.server.ts create mode 100644 apps/web/src/routes/api/change/[id]/+server.ts create mode 100644 apps/web/src/routes/api/hero/[slug]/+server.ts create mode 100644 apps/web/src/routes/api/item/[slug]/+server.ts create mode 100644 apps/web/src/routes/change/[id]/+page.server.ts create mode 100644 apps/web/src/routes/change/[id]/+page.svelte create mode 100644 apps/web/src/routes/hero/[slug]/+page.server.ts create mode 100644 apps/web/src/routes/hero/[slug]/+page.svelte create mode 100644 apps/web/src/routes/item/[slug]/+page.server.ts create mode 100644 apps/web/src/routes/item/[slug]/+page.svelte create mode 100644 libs/utils/src/slug.ts diff --git a/apps/web/package.json b/apps/web/package.json index 9f09d4e..d65abcf 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -7,5 +7,7 @@ "@sveltejs/kit": "2.49.3", "svelte": "5.46.1" }, - "devDependencies": {} + "devDependencies": { + "layerchart": "2.0.0-next.27" + } } diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml new file mode 100644 index 0000000..7f136a6 --- /dev/null +++ b/apps/web/pnpm-lock.yaml @@ -0,0 +1,1315 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@sveltejs/kit': + specifier: '*' + version: 2.49.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.4)(vite@7.2.6))(svelte@5.45.4)(vite@7.2.6) + svelte: + specifier: '*' + version: 5.45.4 + devDependencies: + layerchart: + specifier: 2.0.0-next.27 + version: 2.0.0-next.27(svelte@5.45.4) + +packages: + + '@dagrejs/dagre@1.1.8': + resolution: {integrity: sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==} + + '@dagrejs/graphlib@2.2.4': + resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} + engines: {node: '>17.0.0'} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@layerstack/svelte-actions@1.0.1-next.12': + resolution: {integrity: sha512-dndWTlYu8b1u6vw2nrO7NssccoACArGG75WoNlyVC13KuENZlWdKE9Q79/wlnbq00NeQMNKMjJwRMsrKQj2ULA==} + + '@layerstack/svelte-state@0.1.0-next.17': + resolution: {integrity: sha512-z7e6mPJnypD80LEI/UDuH0bI6s8/nut06MB7rEkRcEfHJekhKSJgFhMnrYzLED7Mc2gTTD0X/wcYlakauWlU8A==} + + '@layerstack/tailwind@2.0.0-next.15': + resolution: {integrity: sha512-7tqKE3OV7/ybeDOORX++USYYCBJa7IgTya2czFpzbgXGo7CQDVyuv+0J1DggjRcEqhhXQA4MUhgnhcRaZvHxWg==} + + '@layerstack/utils@2.0.0-next.12': + resolution: {integrity: sha512-fhGZUlSr3N+D44BYm37WKMGSEFyZBW+dwIqtGU8Cl54mR4TLQ/UwyGhdpgIHyH/x/8q1abE0fP0Dn6ZsrDE3BA==} + + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@sveltejs/acorn-typescript@1.0.8': + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/kit@2.49.1': + resolution: {integrity: sha512-vByReCTTdlNM80vva8alAQC80HcOiHLkd8XAxIiKghKSHcqeNfyhp3VsYAV8VSiPKu4Jc8wWCfsZNAIvd1uCqA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.2.1': + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo-voronoi@2.1.0: + resolution: {integrity: sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate-path@2.3.0: + resolution: {integrity: sha512-tZYtGXxBmbgHsIc9Wms6LS5u4w6KbP8C09a4/ZYc4KLMYYqub57rRBUgpUr2CIarIrJEpdAWWxWQvofgaMpbKQ==} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-tile@1.0.0: + resolution: {integrity: sha512-79fnTKpPMPDS5xQ0xuS9ir0165NEwwkFpe/DSOmc2Gl9ldYzKKRDWogmTTE8wAJ8NA7PMapNfEcyKhI9Lxdu5Q==} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-tricontour@1.1.0: + resolution: {integrity: sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ==} + engines: {node: '>=12'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + devalue@5.5.0: + resolution: {integrity: sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + + esrap@2.2.1: + resolution: {integrity: sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layerchart@2.0.0-next.27: + resolution: {integrity: sha512-yt28xU8WzXq0AliX7eiC0JKZGQtO8M9FmHvt8sESNitSc/yC+fYeTghaO9lMRwcYCmi6D1NjbFyD9mWFeazNIQ==} + peerDependencies: + svelte: ^5.0.0 + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + runed@0.28.0: + resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} + peerDependencies: + svelte: ^5.7.0 + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + svelte@5.45.4: + resolution: {integrity: sha512-1/Y6ZfAQ30GjebMrDFM8ktL1WZ0ylljLabotDAFN41MTrDOY4gGzDDYnIKV+p8YXcnxEEDpVfVWE+I6u69jJ7A==} + engines: {node: '>=18'} + + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + + vite@7.2.6: + resolution: {integrity: sha512-tI2l/nFHC5rLh7+5+o7QjKjSR04ivXDF4jcgV0f/bTQ+OJiITy5S6gaynVsEM+7RqzufMnVbIon6Sr5x1SDYaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + +snapshots: + + '@dagrejs/dagre@1.1.8': + dependencies: + '@dagrejs/graphlib': 2.2.4 + + '@dagrejs/graphlib@2.2.4': {} + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@layerstack/svelte-actions@1.0.1-next.12': + dependencies: + '@floating-ui/dom': 1.7.4 + '@layerstack/utils': 2.0.0-next.12 + d3-scale: 4.0.2 + + '@layerstack/svelte-state@0.1.0-next.17': + dependencies: + '@layerstack/utils': 2.0.0-next.12 + + '@layerstack/tailwind@2.0.0-next.15': + dependencies: + '@layerstack/utils': 2.0.0-next.12 + clsx: 2.1.1 + d3-array: 3.2.4 + lodash-es: 4.17.21 + tailwind-merge: 3.4.0 + + '@layerstack/utils@2.0.0-next.12': + dependencies: + d3-array: 3.2.4 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + lodash-es: 4.17.21 + + '@polka/url@1.0.0-next.29': {} + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@standard-schema/spec@1.0.0': {} + + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/kit@2.49.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.4)(vite@7.2.6))(svelte@5.45.4)(vite@7.2.6)': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.4)(vite@7.2.6) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.5.0 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.2 + sirv: 3.0.2 + svelte: 5.45.4 + vite: 7.2.6 + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.4)(vite@7.2.6))(svelte@5.45.4)(vite@7.2.6)': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.4)(vite@7.2.6) + debug: 4.4.3 + svelte: 5.45.4 + vite: 7.2.6 + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.4)(vite@7.2.6)': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.4)(vite@7.2.6))(svelte@5.45.4)(vite@7.2.6) + debug: 4.4.3 + deepmerge: 4.3.1 + magic-string: 0.30.21 + svelte: 5.45.4 + vite: 7.2.6 + vitefu: 1.1.1(vite@7.2.6) + transitivePeerDependencies: + - supports-color + + '@types/cookie@0.6.0': {} + + '@types/estree@1.0.8': {} + + acorn@8.15.0: {} + + aria-query@5.3.2: {} + + axobject-query@4.1.0: {} + + clsx@2.1.1: {} + + commander@7.2.0: {} + + cookie@0.6.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo-voronoi@2.1.0: + dependencies: + d3-array: 3.2.4 + d3-delaunay: 6.0.4 + d3-geo: 3.1.1 + d3-tricontour: 1.1.0 + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate-path@2.3.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-tile@1.0.0: {} + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-tricontour@1.1.0: + dependencies: + d3-delaunay: 6.0.4 + d3-scale: 4.0.2 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deepmerge@4.3.1: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + devalue@5.5.0: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + esm-env@1.2.2: {} + + esrap@2.2.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + kleur@4.1.5: {} + + layerchart@2.0.0-next.27(svelte@5.45.4): + dependencies: + '@dagrejs/dagre': 1.1.8 + '@layerstack/svelte-actions': 1.0.1-next.12 + '@layerstack/svelte-state': 0.1.0-next.17 + '@layerstack/tailwind': 2.0.0-next.15 + '@layerstack/utils': 2.0.0-next.12 + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-delaunay: 6.0.4 + d3-dsv: 3.0.1 + d3-force: 3.0.0 + d3-geo: 3.1.1 + d3-geo-voronoi: 2.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-interpolate-path: 2.3.0 + d3-path: 3.1.0 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-sankey: 0.12.3 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-shape: 3.2.0 + d3-tile: 1.0.0 + d3-time: 3.1.0 + lodash-es: 4.17.21 + memoize: 10.2.0 + runed: 0.28.0(svelte@5.45.4) + svelte: 5.45.4 + + locate-character@3.0.0: {} + + lodash-es@4.17.21: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + memoize@10.2.0: + dependencies: + mimic-function: 5.0.1 + + mimic-function@5.0.1: {} + + mri@1.2.0: {} + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + robust-predicates@3.0.2: {} + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + + runed@0.28.0(svelte@5.45.4): + dependencies: + esm-env: 1.2.2 + svelte: 5.45.4 + + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safer-buffer@2.1.2: {} + + set-cookie-parser@2.7.2: {} + + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + + source-map-js@1.2.1: {} + + svelte@5.45.4: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.5.0 + esm-env: 1.2.2 + esrap: 2.2.1 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + + tailwind-merge@3.4.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + totalist@3.0.1: {} + + vite@7.2.6: + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@1.1.1(vite@7.2.6): + optionalDependencies: + vite: 7.2.6 + + zimmerframe@1.1.4: {} diff --git a/apps/web/src/app.css b/apps/web/src/app.css index 55b48d6..2276524 100644 --- a/apps/web/src/app.css +++ b/apps/web/src/app.css @@ -92,6 +92,16 @@ --editorial-accent: var(--accent-500); --editorial-divider: var(--border-default); + /* Hero Types */ + --type-marksman: oklch(0.75 0.15 55); + --type-mystic: oklch(0.65 0.2 300); + --type-brawler: oklch(0.6 0.2 25); + + /* Item Categories */ + --item-weapon: oklch(0.65 0.2 40); + --item-vitality: oklch(0.65 0.2 140); + --item-spirit: oklch(0.65 0.2 290); + --chart-1: var(--color-orange-500); --chart-2: var(--color-teal-500); --chart-3: var(--color-slate-600); @@ -151,6 +161,16 @@ --editorial-accent: var(--accent-500); --editorial-divider: var(--border-default); + /* Hero Types */ + --type-marksman: oklch(0.75 0.15 55); + --type-mystic: oklch(0.65 0.2 300); + --type-brawler: oklch(0.6 0.2 25); + + /* Item Categories */ + --item-weapon: oklch(0.65 0.2 40); + --item-vitality: oklch(0.65 0.2 140); + --item-spirit: oklch(0.65 0.2 290); + --chart-1: var(--color-blue-500); --chart-2: var(--color-emerald-500); --chart-3: var(--color-yellow-500); diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index 711268b..cda812e 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -1,8 +1,6 @@ -
- + // Track card index for animations - only animate initial load + let cardIndex = $state(0); + const initialLoadSize = changelogs.length; + +
{#if query.isError}
@@ -192,97 +183,101 @@ {/if} {#if query.isPending && !query.data} -
- {#each { length: 3 }, i (i)} - +
+ {#each { length: 6 }, i (i)} +
{/each}
{/if} - + {#if !query.isError && query.data} -
- {#each filteredChangelogs as entry, entryIndex (entry.id)} +
+ {#each filteredChangelogs as entry (entry.id)} {@const showNotes = shouldShowGeneralNotes(entry, filterState)} {#if entry.updates && entry.updates.length > 0} - {#each entry.updates.slice().reverse() as update, updateIndex (update.id)} + {#each entry.updates.slice().reverse() as update (update.id)} {#if !isFiltered || (getVisibleHeroNames(update, filterState)?.size ?? 0) > 0 || (getVisibleItemNames(update, filterState)?.size ?? 0) > 0} - - + - +
{/if} {/each} {/if} {#if !isFiltered || (getVisibleHeroNames(entry, filterState)?.size ?? 0) > 0 || (getVisibleItemNames(entry, filterState)?.size ?? 0) > 0 || showNotes} - - + - +
{/if} {:else} -
-
- +
+
+
-

No changes found

-

+

No changes found

+

No changelog entries match your current filters. Try adjusting your search or clearing the filters.

{/each} +
-
- {#if query.isFetchingNextPage} -
-
-
- {:else if query.hasNextPage} - - {:else if !query.hasNextPage && filteredChangelogs.length > 0} -

All changes loaded

- {/if} -
+
+ {#if query.isFetchingNextPage} +
+
+
+ {:else if query.hasNextPage} + + {:else if !query.hasNextPage && filteredChangelogs.length > 0} +

All changes loaded

+ {/if}
{/if}
diff --git a/apps/web/src/lib/components/changelog/EntityPreview.svelte b/apps/web/src/lib/components/changelog/EntityPreview.svelte index b7499fc..f02b43a 100644 --- a/apps/web/src/lib/components/changelog/EntityPreview.svelte +++ b/apps/web/src/lib/components/changelog/EntityPreview.svelte @@ -35,6 +35,8 @@ name={entity.alt} imageSrc={entity.src} type={entity.type} + heroType={entity.heroType} + itemCategory={entity.itemCategory} onSelect={() => handleSelect(entity)} > import * as HoverCard from '$lib/components/ui/hover-card'; + import Badge from '$lib/components/ui/badge/badge.svelte'; + import type { BadgeVariant } from '$lib/components/ui/badge/badge.svelte'; import type { Snippet } from 'svelte'; + import ArrowRight from '@lucide/svelte/icons/arrow-right'; + import { toSlug } from '@deadlog/utils'; + import { useQueryClient } from '@tanstack/svelte-query'; + import { queryKeys } from '$lib/queries/keys'; interface Props { name: string; imageSrc?: string; type?: 'hero' | 'item'; + heroType?: string | null; + itemCategory?: 'weapon' | 'ability' | 'upgrade'; onSelect?: () => void; children: Snippet; } - let { name, imageSrc, type = 'hero', onSelect, children }: Props = $props(); + let { + name, + imageSrc, + type = 'hero', + heroType, + itemCategory, + onSelect, + children + }: Props = $props(); + + const queryClient = useQueryClient(); + const slug = $derived(toSlug(name)); + const entityUrl = $derived(`/${type}/${slug}`); + + // Track the specific slug that was last prefetched to handle prop changes + let lastPrefetchedSlug = $state(''); + let debounceTimer: ReturnType; + + function attemptPrefetch() { + // Prevent duplicate fetching for the same entity + if (lastPrefetchedSlug === slug) return; + + const queryKey = type === 'hero' ? queryKeys.hero(slug) : queryKeys.item(slug); + + // Check if we already have fresh data in cache + const state = queryClient.getQueryState(queryKey); + if (state?.data && state.dataUpdatedAt > Date.now() - 1000 * 60 * 60) { + lastPrefetchedSlug = slug; + return; + } + + const apiUrl = `/api/${type}/${slug}`; + + queryClient.prefetchQuery({ + queryKey, + queryFn: () => fetch(apiUrl).then((r) => r.json()), + staleTime: 60 * 60 * 1000 // 1 hour - matches QueryClient default + }); + + lastPrefetchedSlug = slug; + } + + function handleInteraction() { + clearTimeout(debounceTimer); + // Small delay to prevent spamming while moving mouse across grid + debounceTimer = setTimeout(attemptPrefetch, 200); + } + + function handleLeave() { + clearTimeout(debounceTimer); + } + + const badgeVariant = $derived.by((): BadgeVariant => { + if (type === 'hero' && heroType) { + return heroType.toLowerCase() as BadgeVariant; + } + if (type === 'item' && itemCategory) { + const categoryMap: Record = { + weapon: 'weapon', + ability: 'vitality', + upgrade: 'spirit' + }; + return categoryMap[itemCategory] || 'default'; + } + return 'default'; + }); + + const badgeLabel = $derived.by(() => { + if (type === 'hero' && heroType) { + return heroType; + } + if (type === 'item' && itemCategory) { + const labelMap: Record = { + weapon: 'Weapon', + ability: 'Vitality', + upgrade: 'Spirit' + }; + return labelMap[itemCategory] || itemCategory; + } + return null; + }); {@render children()} - +
{#if imageSrc}
@@ -33,11 +125,23 @@ />
{/if} -
-

{name}

+
+
+

{name}

+ {#if badgeLabel} + {badgeLabel} + {/if} +

Click to filter by {type}

+ + View all changes + +
diff --git a/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte new file mode 100644 index 0000000..59a6087 --- /dev/null +++ b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte @@ -0,0 +1,95 @@ + + +{#snippet iconRow(entities: EntityIcon[], overflow: number)} +
+ {#each entities as entity (entity.id)} + {entity.alt} + {/each} + {#if overflow > 0} + + +{overflow} + + {/if} +
+{/snippet} + + + + +
+ +
+ + + + {author.slice(0, 2).toUpperCase()} + + + +
+
+ +
+ {#if displayHeroes.length > 0} + {@render iconRow(displayHeroes, heroOverflow)} + {/if} + {#if displayItems.length > 0} + {@render iconRow(displayItems, itemOverflow)} + {/if} +
+ +
+ View changes + +
+
+
+
diff --git a/apps/web/src/lib/components/changelog/index.ts b/apps/web/src/lib/components/changelog/index.ts index 53c5934..93d941e 100644 --- a/apps/web/src/lib/components/changelog/index.ts +++ b/apps/web/src/lib/components/changelog/index.ts @@ -6,3 +6,4 @@ export { default as EntityPreview } from './EntityPreview.svelte'; export { default as EntityTooltip } from './EntityTooltip.svelte'; export { default as ExpandButton } from './ExpandButton.svelte'; export { default as NoteWithPatterns } from './NoteWithPatterns.svelte'; +export { default as PatchPreviewCard } from './PatchPreviewCard.svelte'; diff --git a/apps/web/src/lib/components/ui/badge/badge.svelte b/apps/web/src/lib/components/ui/badge/badge.svelte index e7c727d..df9f1c3 100644 --- a/apps/web/src/lib/components/ui/badge/badge.svelte +++ b/apps/web/src/lib/components/ui/badge/badge.svelte @@ -11,7 +11,19 @@ 'bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90 border-transparent', destructive: 'bg-destructive [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/70 border-transparent text-white', - outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground' + outline: 'text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground', + marksman: + 'bg-[var(--type-marksman)] border-transparent text-white [a&]:hover:opacity-90', + mystic: + 'bg-[var(--type-mystic)] border-transparent text-white [a&]:hover:opacity-90', + brawler: + 'bg-[var(--type-brawler)] border-transparent text-white [a&]:hover:opacity-90', + weapon: + 'bg-[var(--item-weapon)] border-transparent text-white [a&]:hover:opacity-90', + vitality: + 'bg-[var(--item-vitality)] border-transparent text-white [a&]:hover:opacity-90', + spirit: + 'bg-[var(--item-spirit)] border-transparent text-white [a&]:hover:opacity-90' } }, defaultVariants: { diff --git a/apps/web/src/lib/components/ui/chart/chart-container.svelte b/apps/web/src/lib/components/ui/chart/chart-container.svelte new file mode 100644 index 0000000..f65945b --- /dev/null +++ b/apps/web/src/lib/components/ui/chart/chart-container.svelte @@ -0,0 +1,80 @@ + + +
+ + {@render children?.()} +
diff --git a/apps/web/src/lib/components/ui/chart/chart-style.svelte b/apps/web/src/lib/components/ui/chart/chart-style.svelte new file mode 100644 index 0000000..6523096 --- /dev/null +++ b/apps/web/src/lib/components/ui/chart/chart-style.svelte @@ -0,0 +1,39 @@ + + +{#if themeContents} + {#key id} + + {themeContents} + + {/key} +{/if} diff --git a/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte b/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte new file mode 100644 index 0000000..478ac4a --- /dev/null +++ b/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte @@ -0,0 +1,163 @@ + + +{#snippet TooltipLabel()} + {#if formattedLabel} +
+ {#if typeof formattedLabel === 'function'} + {@render formattedLabel()} + {:else} + {formattedLabel} + {/if} +
+ {/if} +{/snippet} + + +
+ {#if !nestLabel} + {@render TooltipLabel()} + {/if} +
+ {#each tooltipCtx.payload as item, i (item.key + i)} + {@const key = `${nameKey || item.key || item.name || 'value'}`} + {@const itemConfig = getPayloadConfigFromPayload(chart.config, item, key)} + {@const indicatorColor = color || item.payload?.color || item.color} +
svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:size-2.5', + indicator === 'dot' && 'items-center' + )} + > + {#if formatter && item.value !== undefined && item.name} + {@render formatter({ + value: item.value, + name: item.name, + item, + index: i, + payload: tooltipCtx.payload + })} + {:else} + {#if itemConfig?.icon} + + {:else if !hideIndicator} +
+ {/if} +
+
+ {#if nestLabel} + {@render TooltipLabel()} + {/if} + + {itemConfig?.label || item.name} + +
+ {#if item.value !== undefined} + + {item.value.toLocaleString()} + + {/if} +
+ {/if} +
+ {/each} +
+
+
diff --git a/apps/web/src/lib/components/ui/chart/chart-utils.ts b/apps/web/src/lib/components/ui/chart/chart-utils.ts new file mode 100644 index 0000000..026c382 --- /dev/null +++ b/apps/web/src/lib/components/ui/chart/chart-utils.ts @@ -0,0 +1,77 @@ +import type { Tooltip } from 'layerchart'; +import { + getContext, + setContext, + type Component, + type ComponentProps, + type Snippet +} from 'svelte'; + +export const THEMES = { light: '', dark: '.dark' } as const; + +export type ChartConfig = Record< + string, + { + label?: string; + icon?: Component; + } & ( + | { color?: string; theme?: never } + | { color?: never; theme: Record } + ) +>; + +export type ExtractSnippetParams = T extends Snippet<[infer P]> ? P : never; + +export type TooltipPayload = ExtractSnippetParams< + ComponentProps['children'] +>['payload'][number]; + +// Helper to extract item config from a payload. +export function getPayloadConfigFromPayload( + config: ChartConfig, + payload: TooltipPayload, + key: string +) { + if (typeof payload !== 'object' || payload === null) return undefined; + + const payloadPayload = + 'payload' in payload && + typeof payload.payload === 'object' && + payload.payload !== null + ? payload.payload + : undefined; + + let configLabelKey: string = key; + + if (payload.key === key) { + configLabelKey = payload.key; + } else if (payload.name === key) { + configLabelKey = payload.name; + } else if (key in payload && typeof payload[key as keyof typeof payload] === 'string') { + configLabelKey = payload[key as keyof typeof payload] as string; + } else if ( + payloadPayload !== undefined && + key in payloadPayload && + typeof payloadPayload[key as keyof typeof payloadPayload] === 'string' + ) { + configLabelKey = payloadPayload[key as keyof typeof payloadPayload] as string; + } + + return configLabelKey in config + ? config[configLabelKey] + : config[key as keyof typeof config]; +} + +interface ChartContextValue { + config: ChartConfig; +} + +const chartContextKey = Symbol('chart-context'); + +export function setChartContext(value: ChartContextValue) { + return setContext(chartContextKey, value); +} + +export function useChart() { + return getContext(chartContextKey); +} diff --git a/apps/web/src/lib/components/ui/chart/index.ts b/apps/web/src/lib/components/ui/chart/index.ts new file mode 100644 index 0000000..5f65d07 --- /dev/null +++ b/apps/web/src/lib/components/ui/chart/index.ts @@ -0,0 +1,11 @@ +import ChartContainer from './chart-container.svelte'; +import ChartTooltip from './chart-tooltip.svelte'; + +export { getPayloadConfigFromPayload, type ChartConfig } from './chart-utils.js'; + +export { + ChartContainer, + ChartTooltip, + ChartContainer as Container, + ChartTooltip as Tooltip +}; diff --git a/apps/web/src/lib/queries/keys.ts b/apps/web/src/lib/queries/keys.ts new file mode 100644 index 0000000..5ee01f8 --- /dev/null +++ b/apps/web/src/lib/queries/keys.ts @@ -0,0 +1,42 @@ +/** + * Centralized query key factory for TanStack Query + * Ensures consistent keys across prefetching, queries, and invalidation + */ + +// Filter types for changelog queries +export interface ChangelogFilters { + hero?: string[]; + item?: string[]; + q?: string; +} + +export const queryKeys = { + all: ['deadlog'] as const, + + // Meta / Static data for dropdowns and navigation + meta: () => [...queryKeys.all, 'meta'] as const, + heroList: () => [...queryKeys.meta(), 'heroes'] as const, + itemList: () => [...queryKeys.meta(), 'items'] as const, + + // Changelogs (unified for home page and filtered views) + // Using same key structure allows cache sharing between + // main feed filters and entity detail pages + changelogs: () => [...queryKeys.all, 'changelogs'] as const, + changelogsList: (filters: ChangelogFilters = {}) => + [...queryKeys.changelogs(), 'list', filters] as const, + + // Hero detail pages + heroes: () => [...queryKeys.all, 'heroes'] as const, + hero: (slug: string) => [...queryKeys.heroes(), slug] as const, + + // Item detail pages + items: () => [...queryKeys.all, 'items'] as const, + item: (slug: string) => [...queryKeys.items(), slug] as const, + + // Individual change pages + changes: () => [...queryKeys.all, 'changes'] as const, + change: (id: string) => [...queryKeys.changes(), id] as const +}; + +// Type helpers for query keys +export type QueryKeys = typeof queryKeys; diff --git a/apps/web/src/lib/server/changelog-utils.ts b/apps/web/src/lib/server/changelog-utils.ts index e1f3523..1013b4d 100644 --- a/apps/web/src/lib/server/changelog-utils.ts +++ b/apps/web/src/lib/server/changelog-utils.ts @@ -1,11 +1,15 @@ -import { getChangelogIcons, type ScrapedChangelog } from '@deadlog/scraper'; +import { + getChangelogIcons, + type ScrapedChangelog, + type EntityIcon +} from '@deadlog/scraper'; import type { DrizzleDB } from '@deadlog/db'; import { parseCSV } from '$lib/stores/searchParams.svelte'; export interface ChangelogWithIcons extends ScrapedChangelog { icons: { - heroes: { id: number; src: string; alt: string; type: 'hero' | 'item' }[]; - items: { id: number; src: string; alt: string; type: 'hero' | 'item' }[]; + heroes: EntityIcon[]; + items: EntityIcon[]; }; date: Date; fullContent: string; diff --git a/apps/web/src/lib/utils/filterChanges.ts b/apps/web/src/lib/utils/filterChanges.ts index dbd3667..0031616 100644 --- a/apps/web/src/lib/utils/filterChanges.ts +++ b/apps/web/src/lib/utils/filterChanges.ts @@ -1,5 +1,5 @@ import type { ChangelogContentJson, Note } from '@deadlog/db'; -import type { EntityType } from '@deadlog/scraper'; +import type { EntityType, EntityIcon } from '@deadlog/scraper'; import { ENTITY_TYPES } from '@deadlog/scraper'; export interface FilterState { @@ -8,13 +8,6 @@ export interface FilterState { searchQuery: string; } -interface EntityIcon { - id: number; - src: string; - alt: string; - type: EntityType; -} - export interface FilteredChangelog { id: string; title: string; diff --git a/apps/web/src/routes/+layout.server.ts b/apps/web/src/routes/+layout.server.ts new file mode 100644 index 0000000..36ea95a --- /dev/null +++ b/apps/web/src/routes/+layout.server.ts @@ -0,0 +1,14 @@ +import { getAllHeroes, getAllItems } from '@deadlog/scraper'; +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async ({ locals }) => { + const [heroes, items] = await Promise.all([ + getAllHeroes(locals.db), + getAllItems(locals.db) + ]); + + return { + heroes, + items + }; +}; diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte index 6903301..d02e9f3 100644 --- a/apps/web/src/routes/+layout.svelte +++ b/apps/web/src/routes/+layout.svelte @@ -5,13 +5,27 @@ import { Footer } from '$lib/components/ui/footer'; import * as Tooltip from '$lib/components/ui/tooltip'; import { QueryClient, QueryClientProvider } from '@tanstack/svelte-query'; + import { browser } from '$app/environment'; import { setSearchParams } from '$lib/stores/searchParams.svelte'; const queryClient = new QueryClient({ defaultOptions: { queries: { - staleTime: Infinity, - refetchOnWindowFocus: false + // Note: We use SvelteKit load functions for SSR, so queries start in browser. + // The initialData pattern hydrates the cache from SSR data. + enabled: browser, + // Changelog data is mostly static - 1 hour stale time is appropriate + // Individual past changelogs could use Infinity, but this is a good default + staleTime: 60 * 60 * 1000, + // Keep unused data in cache for 30 minutes for smooth back-navigation + gcTime: 30 * 60 * 1000, + // Changelogs are static reading content - no need to refetch on focus + refetchOnWindowFocus: false, + // Refetch when reconnecting to network (useful for mobile) + refetchOnReconnect: true, + // Retry failed requests up to 3 times with exponential backoff + retry: 3, + retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000) } } }); diff --git a/apps/web/src/routes/+page.server.ts b/apps/web/src/routes/+page.server.ts index 9966af5..c3c2043 100644 --- a/apps/web/src/routes/+page.server.ts +++ b/apps/web/src/routes/+page.server.ts @@ -2,12 +2,11 @@ import { queryChangelogs, getChangelogsCount, getChangelogPosition, - getAllHeroes, - getAllItems, getHeroByName, getItemByName, formatDate } from '@deadlog/scraper'; +import { toSlug } from '@deadlog/utils'; import type { PageServerLoad } from './$types'; import { enrichChangelogs, @@ -18,17 +17,11 @@ import { export const prerender = false; -function toSlug(name: string): string { - return name.toLowerCase().replace(/\s+/g, '-'); -} - -export const load: PageServerLoad = async ({ locals, url }) => { +export const load: PageServerLoad = async ({ locals, url, parent }) => { const { hero, item, q, change } = parseApiParams(url); - const [heroes, items] = await Promise.all([ - getAllHeroes(locals.db), - getAllItems(locals.db) - ]); + // Get heroes and items from layout data + const { heroes, items } = await parent(); const heroIds = resolveHeroIds(hero, heroes); const itemIds = resolveItemIds(item, items); @@ -100,8 +93,6 @@ export const load: PageServerLoad = async ({ locals, url }) => { return { changelogs: enriched, - heroes, - items, totalCount, initialLoadCount: initialLoadLimit, lastUpdate: (allChangelogs[0]?.date ?? new Date()).toISOString(), diff --git a/apps/web/src/routes/api/change/[id]/+server.ts b/apps/web/src/routes/api/change/[id]/+server.ts new file mode 100644 index 0000000..9d4eb72 --- /dev/null +++ b/apps/web/src/routes/api/change/[id]/+server.ts @@ -0,0 +1,60 @@ +import { json, error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { + getChangelogById, + getChangelogIcons, + getAllHeroes, + getAllItems +} from '@deadlog/scraper'; + +export const GET: RequestHandler = async ({ params, locals, setHeaders }) => { + try { + const changelog = await getChangelogById(locals.db, params.id); + + if (!changelog) { + throw error(404, { message: 'Changelog not found' }); + } + + // Cache successful lookups - changelog data rarely changes + setHeaders({ + 'cache-control': 'public, max-age=3600, stale-while-revalidate=86400' + }); + + const [iconsMap, heroes, items] = await Promise.all([ + getChangelogIcons(locals.db, [changelog.id]), + getAllHeroes(locals.db), + getAllItems(locals.db) + ]); + + const icons = iconsMap[changelog.id] ?? { heroes: [], items: [] }; + + const heroMap: Record }> = {}; + for (const hero of heroes) { + if (hero.id) { + heroMap[hero.id] = { name: hero.name, images: hero.images }; + } + } + + const itemMap: Record = {}; + for (const item of items) { + if (item.id) { + itemMap[item.id] = { name: item.name, image: item.image }; + } + } + + return json({ + changelog: { + ...changelog, + date: new Date(changelog.pubDate).toISOString(), + icons + }, + heroMap, + itemMap + }); + } catch (err) { + // Re-throw SvelteKit errors (404s, etc.) + if (err && typeof err === 'object' && 'status' in err) throw err; + console.error('API Error fetching changelog:', err); + throw error(500, 'Internal Server Error'); + } +}; diff --git a/apps/web/src/routes/api/hero/[slug]/+server.ts b/apps/web/src/routes/api/hero/[slug]/+server.ts new file mode 100644 index 0000000..d015229 --- /dev/null +++ b/apps/web/src/routes/api/hero/[slug]/+server.ts @@ -0,0 +1,63 @@ +import { json, error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { + getHeroBySlug, + getChangelogsByHeroId, + getChangelogIcons +} from '@deadlog/scraper'; + +// Helper to extract the best available hero image +function getHeroImage(hero: { images: Record }): string { + return ( + hero.images?.icon_hero_card_webp || + hero.images?.icon_hero_card || + hero.images?.icon_image_small_webp || + hero.images?.icon_image_small || + (hero.images ? Object.values(hero.images)[0] : '') || + '' + ); +} + +export const GET: RequestHandler = async ({ params, locals, setHeaders }) => { + try { + const hero = await getHeroBySlug(locals.db, params.slug); + + if (!hero) { + throw error(404, { message: 'Hero not found' }); + } + + // Cache successful lookups - changelog data rarely changes + setHeaders({ + 'cache-control': 'public, max-age=3600, stale-while-revalidate=86400' + }); + + const changelogs = await getChangelogsByHeroId(locals.db, hero.id); + + // Return early if no changelogs to avoid empty icon query + if (changelogs.length === 0) { + return json({ + hero: { ...hero, image: getHeroImage(hero) }, + changelogs: [] + }); + } + + const changelogIds = changelogs.map((c) => c.id); + const iconsMap = await getChangelogIcons(locals.db, changelogIds); + + const enrichedChangelogs = changelogs.map((changelog) => ({ + ...changelog, + date: new Date(changelog.pubDate).toISOString(), + icons: iconsMap[changelog.id] ?? { heroes: [], items: [] } + })); + + return json({ + hero: { ...hero, image: getHeroImage(hero) }, + changelogs: enrichedChangelogs + }); + } catch (err) { + // Re-throw SvelteKit errors (404s, etc.) + if (err && typeof err === 'object' && 'status' in err) throw err; + console.error('API Error fetching hero:', err); + throw error(500, 'Internal Server Error'); + } +}; diff --git a/apps/web/src/routes/api/item/[slug]/+server.ts b/apps/web/src/routes/api/item/[slug]/+server.ts new file mode 100644 index 0000000..4c6c2e6 --- /dev/null +++ b/apps/web/src/routes/api/item/[slug]/+server.ts @@ -0,0 +1,48 @@ +import { json, error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { + getItemBySlug, + getChangelogsByItemId, + getChangelogIcons +} from '@deadlog/scraper'; + +export const GET: RequestHandler = async ({ params, locals, setHeaders }) => { + try { + const item = await getItemBySlug(locals.db, params.slug); + + if (!item) { + throw error(404, { message: 'Item not found' }); + } + + // Cache successful lookups - changelog data rarely changes + setHeaders({ + 'cache-control': 'public, max-age=3600, stale-while-revalidate=86400' + }); + + const changelogs = await getChangelogsByItemId(locals.db, item.id); + + // Return early if no changelogs to avoid empty icon query + if (changelogs.length === 0) { + return json({ item, changelogs: [] }); + } + + const changelogIds = changelogs.map((c) => c.id); + const iconsMap = await getChangelogIcons(locals.db, changelogIds); + + const enrichedChangelogs = changelogs.map((changelog) => ({ + ...changelog, + date: new Date(changelog.pubDate).toISOString(), + icons: iconsMap[changelog.id] ?? { heroes: [], items: [] } + })); + + return json({ + item, + changelogs: enrichedChangelogs + }); + } catch (err) { + // Re-throw SvelteKit errors (404s, etc.) + if (err && typeof err === 'object' && 'status' in err) throw err; + console.error('API Error fetching item:', err); + throw error(500, 'Internal Server Error'); + } +}; diff --git a/apps/web/src/routes/change/[id]/+page.server.ts b/apps/web/src/routes/change/[id]/+page.server.ts new file mode 100644 index 0000000..ca756cd --- /dev/null +++ b/apps/web/src/routes/change/[id]/+page.server.ts @@ -0,0 +1,63 @@ +import { + getAllChangelogIds, + getChangelogById, + getChangelogIcons, + getAllHeroes, + getAllItems, + formatDate +} from '@deadlog/scraper'; +import { error } from '@sveltejs/kit'; +import type { PageServerLoad, EntryGenerator } from './$types'; + +export const prerender = true; + +export const entries: EntryGenerator = async () => { + const { getLibsqlDb } = await import('@deadlog/db'); + const db = getLibsqlDb(); + const ids = await getAllChangelogIds(db); + return ids.map((id) => ({ id })); +}; + +export const load: PageServerLoad = async ({ params, locals }) => { + const changelog = await getChangelogById(locals.db, params.id); + + if (!changelog) { + throw error(404, 'Changelog not found'); + } + + const [iconsMap, heroes, items] = await Promise.all([ + getChangelogIcons(locals.db, [changelog.id]), + getAllHeroes(locals.db), + getAllItems(locals.db) + ]); + + const icons = iconsMap[changelog.id] || { heroes: [], items: [] }; + const date = new Date(changelog.pubDate); + + const heroMap: Record }> = {}; + for (const hero of heroes) { + if (hero.id) { + heroMap[hero.id] = { name: hero.name, images: hero.images }; + } + } + + const itemMap: Record = {}; + for (const item of items) { + if (item.id) { + itemMap[item.id] = { name: item.name, image: item.image }; + } + } + + return { + changelog: { + ...changelog, + date, + icons + }, + heroMap, + itemMap, + title: `${formatDate(date)} Update - Deadlog`, + description: `View the ${formatDate(date)} Deadlock changelog`, + image: `https://deadlog.io/assets/meta/change/${params.id}.png` + }; +}; diff --git a/apps/web/src/routes/change/[id]/+page.svelte b/apps/web/src/routes/change/[id]/+page.svelte new file mode 100644 index 0000000..6650ef1 --- /dev/null +++ b/apps/web/src/routes/change/[id]/+page.svelte @@ -0,0 +1,102 @@ + + + + +
+ + + Back to all changes + + +
+
+
+
+

+ {formatDate(changelog.date)} +

+
+ + + + {changelog.author.slice(0, 2).toUpperCase()} + + + + By {changelog.author} at {formatTime( + changelog.date + )} + +
+
+ + +
+ + {#if changelog.icons} +
+ {#if changelog.icons.heroes.length > 0} + + {/if} + {#if changelog.icons.items.length > 0} + + {/if} +
+ {/if} +
+ + +
+
diff --git a/apps/web/src/routes/hero/[slug]/+page.server.ts b/apps/web/src/routes/hero/[slug]/+page.server.ts new file mode 100644 index 0000000..2f80002 --- /dev/null +++ b/apps/web/src/routes/hero/[slug]/+page.server.ts @@ -0,0 +1,55 @@ +import { + getAllHeroSlugs, + getHeroBySlug, + getChangelogsByHeroId, + getChangelogIcons +} from '@deadlog/scraper'; +import { error } from '@sveltejs/kit'; +import type { PageServerLoad, EntryGenerator } from './$types'; + +export const prerender = true; + +export const entries: EntryGenerator = async () => { + const { getLibsqlDb } = await import('@deadlog/db'); + const db = getLibsqlDb(); + const slugs = await getAllHeroSlugs(db); + return slugs.map((slug) => ({ slug })); +}; + +export const load: PageServerLoad = async ({ params, locals }) => { + const hero = await getHeroBySlug(locals.db, params.slug); + + if (!hero) { + throw error(404, 'Hero not found'); + } + + const changelogs = await getChangelogsByHeroId(locals.db, hero.id); + + const changelogIds = changelogs.map((c) => c.id); + const iconsMap = await getChangelogIcons(locals.db, changelogIds); + + const enrichedChangelogs = changelogs.map((changelog) => ({ + ...changelog, + date: new Date(changelog.pubDate), + icons: iconsMap[changelog.id] || { heroes: [], items: [] } + })); + + const heroImage = + hero.images.icon_hero_card_webp || + hero.images.icon_hero_card || + hero.images.icon_image_small_webp || + hero.images.icon_image_small || + Object.values(hero.images)[0] || + ''; + + return { + hero: { + ...hero, + image: heroImage + }, + changelogs: enrichedChangelogs, + title: `${hero.name} Changelog - Deadlog`, + description: `View all ${hero.name} balance changes and updates in Deadlock`, + image: `https://deadlog.io/assets/meta/hero/${params.slug}.png` + }; +}; diff --git a/apps/web/src/routes/hero/[slug]/+page.svelte b/apps/web/src/routes/hero/[slug]/+page.svelte new file mode 100644 index 0000000..70c3bfc --- /dev/null +++ b/apps/web/src/routes/hero/[slug]/+page.svelte @@ -0,0 +1,171 @@ + + + + +
+ + + Back to all changes + + +
+
+ {#if hero.image} +
+ + {#if hero.heroType} +
+ {/if} + + {hero.name} +
+ {/if} +
+

+ {hero.name} +

+
+ {#if hero.heroType} + + {hero.heroType} + + {/if} + + {changelogs.length} change{changelogs.length !== 1 ? 's' : ''} + +
+
+
+
+ +
+

+ Change History +

+ + {#if changelogs.length > 0} +
+ {#each changelogs as changelog, i (changelog.id)} +
+ +
+ {/each} +
+ {:else} +
+

+ No recorded changes for {hero.name} yet. +

+
+ {/if} +
+
diff --git a/apps/web/src/routes/item/[slug]/+page.server.ts b/apps/web/src/routes/item/[slug]/+page.server.ts new file mode 100644 index 0000000..d57be4d --- /dev/null +++ b/apps/web/src/routes/item/[slug]/+page.server.ts @@ -0,0 +1,44 @@ +import { + getAllItemSlugs, + getItemBySlug, + getChangelogsByItemId, + getChangelogIcons +} from '@deadlog/scraper'; +import { error } from '@sveltejs/kit'; +import type { PageServerLoad, EntryGenerator } from './$types'; + +export const prerender = true; + +export const entries: EntryGenerator = async () => { + const { getLibsqlDb } = await import('@deadlog/db'); + const db = getLibsqlDb(); + const slugs = await getAllItemSlugs(db); + return slugs.map((slug) => ({ slug })); +}; + +export const load: PageServerLoad = async ({ params, locals }) => { + const item = await getItemBySlug(locals.db, params.slug); + + if (!item) { + throw error(404, 'Item not found'); + } + + const changelogs = await getChangelogsByItemId(locals.db, item.id); + + const changelogIds = changelogs.map((c) => c.id); + const iconsMap = await getChangelogIcons(locals.db, changelogIds); + + const enrichedChangelogs = changelogs.map((changelog) => ({ + ...changelog, + date: new Date(changelog.pubDate), + icons: iconsMap[changelog.id] || { heroes: [], items: [] } + })); + + return { + item, + changelogs: enrichedChangelogs, + title: `${item.name} Changes - Deadlog`, + description: `View all ${item.name} balance changes and updates in Deadlock`, + image: `https://deadlog.io/assets/meta/item/${params.slug}.png` + }; +}; diff --git a/apps/web/src/routes/item/[slug]/+page.svelte b/apps/web/src/routes/item/[slug]/+page.svelte new file mode 100644 index 0000000..a541113 --- /dev/null +++ b/apps/web/src/routes/item/[slug]/+page.svelte @@ -0,0 +1,176 @@ + + + + +
+ + + Back to all changes + + +
+
+ {#if item.image} + {item.name} + {/if} +
+

+ {item.name} +

+
+ + {typeLabels[item.type] || item.type} + + + {changelogs.length} change{changelogs.length !== 1 ? 's' : ''} + +
+
+
+
+ +
+

+ Change History +

+ + {#if changelogs.length > 0} +
+ {#each changelogs as changelog, i (changelog.id)} +
+ +
+ {/each} +
+ {:else} +
+

+ No recorded changes for {item.name} yet. +

+
+ {/if} +
+
diff --git a/libs/db/src/schema.ts b/libs/db/src/schema.ts index 724bc8b..c72b176 100644 --- a/libs/db/src/schema.ts +++ b/libs/db/src/schema.ts @@ -83,6 +83,7 @@ export const selectChangelogSchema = createSelectSchema(changelogs, { export const heroes = sqliteTable('heroes', { id: integer('id').primaryKey(), name: text('name').notNull(), + slug: text('slug').notNull().unique(), className: text('class_name').notNull(), heroType: text('hero_type'), images: text('images', { mode: 'json' }).notNull().$type>(), @@ -102,6 +103,7 @@ export const selectHeroSchema = createSelectSchema(heroes, { export const items = sqliteTable('items', { id: integer('id').primaryKey(), name: text('name').notNull(), + slug: text('slug').notNull().unique(), className: text('class_name').notNull(), type: text('type', { enum: ['weapon', 'ability', 'upgrade'] }).notNull(), image: text('image').notNull(), diff --git a/libs/scraper/src/builder.ts b/libs/scraper/src/builder.ts index 28af620..38405ea 100644 --- a/libs/scraper/src/builder.ts +++ b/libs/scraper/src/builder.ts @@ -19,6 +19,8 @@ import { parseAuthorName } from './authorParser'; import { scrapeChangelogPage, scrapeMultipleChangelogPosts } from './scraper'; import { parseHtmlToJson } from './changelogParser'; +import { toSlug } from '@deadlog/utils'; + const buildDatabaseOptionsSchema = z.object({ outputDir: z.string().default('./dist/data') }); @@ -75,6 +77,7 @@ export async function buildDatabase( CREATE TABLE IF NOT EXISTS heroes ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, + slug TEXT NOT NULL UNIQUE, class_name TEXT NOT NULL, hero_type TEXT, images TEXT NOT NULL, @@ -86,6 +89,7 @@ export async function buildDatabase( CREATE TABLE IF NOT EXISTS items ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, + slug TEXT NOT NULL UNIQUE, class_name TEXT NOT NULL, type TEXT NOT NULL, image TEXT NOT NULL, @@ -156,6 +160,7 @@ export async function buildDatabase( const heroData = insertHeroSchema.parse({ id: hero.id, name: hero.name, + slug: toSlug(hero.name), className: hero.class_name, heroType: hero.hero_type ?? null, images: hero.images, @@ -200,6 +205,7 @@ export async function buildDatabase( const itemData = insertItemSchema.parse({ id: item.id, name: item.name, + slug: toSlug(item.name), className: item.class_name, type: item.type, image: @@ -444,6 +450,8 @@ export async function buildDatabase( await db.run( sql`CREATE INDEX IF NOT EXISTS idx_changelog_items_item_id ON changelog_items(item_id)` ); + await db.run(sql`CREATE INDEX IF NOT EXISTS idx_heroes_slug ON heroes(slug)`); + await db.run(sql`CREATE INDEX IF NOT EXISTS idx_items_slug ON items(slug)`); client.close(); diff --git a/libs/scraper/src/changelogParser.ts b/libs/scraper/src/changelogParser.ts index a595fd6..e0b6c5d 100644 --- a/libs/scraper/src/changelogParser.ts +++ b/libs/scraper/src/changelogParser.ts @@ -84,13 +84,17 @@ const changeIconSchema = z.discriminatedUnion('type', [ src: z.string().url(), alt: z.string(), type: z.literal(ENTITY_TYPES.HERO), - id: z.number() + id: z.number(), + heroType: z.string().nullable().optional(), + itemCategory: z.enum(['weapon', 'ability', 'upgrade']).optional() }), z.object({ src: z.string().url(), alt: z.string(), type: z.literal(ENTITY_TYPES.ITEM), - id: z.number() + id: z.number(), + heroType: z.string().nullable().optional(), + itemCategory: z.enum(['weapon', 'ability', 'upgrade']).optional() }) ]); @@ -145,12 +149,31 @@ function extractIconsForEntity( if (regex.test(textContent)) { const image = getImage(entity); if (image) { - const result = changeIconSchema.safeParse({ + const iconData: { + src: string; + alt: string; + type: EntityType; + id: number; + heroType?: string | null; + itemCategory?: 'weapon' | 'ability' | 'upgrade'; + } = { src: image, alt: entity.name, type, id: entity.id - }); + }; + + // Add heroType for heroes + if ('heroType' in entity) { + iconData.heroType = entity.heroType; + } + + // Add itemCategory for items + if ('type' in entity && entity.type) { + iconData.itemCategory = entity.type; + } + + const result = changeIconSchema.safeParse(iconData); if (result.success) { icons.push(result.data); diff --git a/libs/scraper/src/index.ts b/libs/scraper/src/index.ts index 5070138..0eade08 100644 --- a/libs/scraper/src/index.ts +++ b/libs/scraper/src/index.ts @@ -2,6 +2,7 @@ export { queryChangelogs, getAllChangelogs, + getAllChangelogIds, getChangelogsCount, getChangelogPosition, getChangelogById, @@ -9,7 +10,13 @@ export { getAllHeroes, getAllItems, getHeroByName, + getHeroBySlug, + getAllHeroSlugs, getItemByName, + getItemBySlug, + getAllItemSlugs, + getChangelogsByHeroId, + getChangelogsByItemId, getChangelogIcons } from './static'; diff --git a/libs/scraper/src/static.ts b/libs/scraper/src/static.ts index 35e165d..6d002ef 100644 --- a/libs/scraper/src/static.ts +++ b/libs/scraper/src/static.ts @@ -1,6 +1,6 @@ import { eq, sql, desc, gt } from 'drizzle-orm'; import type { ScrapedChangelog } from './deadlock'; -import type { EnrichedHero, EnrichedItem } from './types/assets'; +import type { EnrichedHero, EnrichedItem, EntityIcon } from './types/assets'; import { getLibsqlDb, type DrizzleDB, schema } from '@deadlog/db'; export { getLibsqlDb as getDb }; @@ -15,6 +15,11 @@ export async function getAllChangelogs(db: DrizzleDB) { return results; } +export async function getAllChangelogIds(db: DrizzleDB): Promise { + const results = await db.select().from(schema.changelogs).all(); + return results.map((r) => r.id); +} + export async function queryChangelogs( db: DrizzleDB, options: { @@ -157,6 +162,24 @@ export async function getHeroByName( return result ?? null; } +export async function getHeroBySlug( + db: DrizzleDB, + slug: string +): Promise { + const result = await db + .select() + .from(schema.heroes) + .where(eq(schema.heroes.slug, slug)) + .get(); + + return result ?? null; +} + +export async function getAllHeroSlugs(db: DrizzleDB): Promise { + const results = await db.select().from(schema.heroes).all(); + return results.map((r) => r.slug); +} + export async function getItemByName( db: DrizzleDB, name: string @@ -170,12 +193,66 @@ export async function getItemByName( return result ?? null; } -interface EntityIcon { - id: number; - src: string; - alt: string; - type: 'hero' | 'item'; +export async function getItemBySlug( + db: DrizzleDB, + slug: string +): Promise { + const result = await db + .select() + .from(schema.items) + .where(eq(schema.items.slug, slug)) + .get(); + + return result ?? null; +} + +export async function getAllItemSlugs(db: DrizzleDB): Promise { + const results = await db.select().from(schema.items).all(); + return results.map((r) => r.slug); +} + +export async function getChangelogsByHeroId( + db: DrizzleDB, + heroId: number, + limit = 50 +): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const results = await (db as any) + .selectDistinct({ changelogs: schema.changelogs }) + .from(schema.changelogs) + .innerJoin( + schema.changelogHeroes, + eq(schema.changelogs.id, schema.changelogHeroes.changelogId) + ) + .where(eq(schema.changelogHeroes.heroId, heroId)) + .orderBy(desc(schema.changelogs.pubDate)) + .limit(limit) + .all(); + + return results.map((r: { changelogs: ScrapedChangelog }) => r.changelogs); } + +export async function getChangelogsByItemId( + db: DrizzleDB, + itemId: number, + limit = 50 +): Promise { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const results = await (db as any) + .selectDistinct({ changelogs: schema.changelogs }) + .from(schema.changelogs) + .innerJoin( + schema.changelogItems, + eq(schema.changelogs.id, schema.changelogItems.changelogId) + ) + .where(eq(schema.changelogItems.itemId, itemId)) + .orderBy(desc(schema.changelogs.pubDate)) + .limit(limit) + .all(); + + return results.map((r: { changelogs: ScrapedChangelog }) => r.changelogs); +} + interface ChangelogIcons { heroes: EntityIcon[]; items: EntityIcon[]; @@ -222,7 +299,8 @@ export async function getChangelogIcons( Object.values(images)[0] ?? '', alt: r.heroes.name, - type: 'hero' + type: 'hero', + heroType: r.heroes.heroType }); } @@ -232,7 +310,8 @@ export async function getChangelogIcons( id: r.items.id, src: r.items.image, alt: r.items.name, - type: 'item' + type: 'item', + itemCategory: r.items.type }); } diff --git a/libs/scraper/src/types/assets.ts b/libs/scraper/src/types/assets.ts index b73710d..88ff584 100644 --- a/libs/scraper/src/types/assets.ts +++ b/libs/scraper/src/types/assets.ts @@ -15,6 +15,8 @@ export interface EntityIcon { src: string; alt: string; type: EntityType; + heroType?: string | null; + itemCategory?: 'weapon' | 'ability' | 'upgrade'; } // Schema for stat values that have a value and display name diff --git a/libs/utils/src/index.ts b/libs/utils/src/index.ts index 77298d8..98c6765 100644 --- a/libs/utils/src/index.ts +++ b/libs/utils/src/index.ts @@ -1 +1,2 @@ export { formatDate, formatTime } from './dateFormatters'; +export { toSlug } from './slug'; diff --git a/libs/utils/src/slug.ts b/libs/utils/src/slug.ts new file mode 100644 index 0000000..fc61050 --- /dev/null +++ b/libs/utils/src/slug.ts @@ -0,0 +1,13 @@ +/** + * Converts a name to a URL-safe slug. + * Example: "Lady Geist" -> "lady-geist" + */ +export function toSlug(name: string): string { + return name + .toLowerCase() + .trim() + .replace(/[^a-z0-9\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, ''); +} From 6d2c8500661c960e0747ffe2da86700c25d74bc1 Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Fri, 12 Dec 2025 12:08:38 -0600 Subject: [PATCH 2/7] chore: bump deps --- flake.lock | 18 +- pnpm-lock.yaml | 502 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 480 insertions(+), 40 deletions(-) diff --git a/flake.lock b/flake.lock index be4a76e..2faf313 100644 --- a/flake.lock +++ b/flake.lock @@ -75,11 +75,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1764560356, - "narHash": "sha256-M5aFEFPppI4UhdOxwdmceJ9bDJC4T6C6CzCK1E2FZyo=", + "lastModified": 1765363881, + "narHash": "sha256-3C3xWn8/2Zzr7sxVBmpc1H1QfxjNfta5IMFe3O9ZEPw=", "owner": "nixos", "repo": "nixpkgs", - "rev": "6c8f0cca84510cc79e09ea99a299c9bc17d03cb6", + "rev": "d2b1213bf5ec5e62d96b003ab4b5cbc42abfc0d0", "type": "github" }, "original": { @@ -103,11 +103,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1759417375, - "narHash": "sha256-O7eHcgkQXJNygY6AypkF9tFhsoDQjpNEojw3eFs73Ow=", + "lastModified": 1764947035, + "narHash": "sha256-EYHSjVM4Ox4lvCXUMiKKs2vETUSL5mx+J2FfutM7T9w=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "dc704e6102e76aad573f63b74c742cd96f8f1e6c", + "rev": "a672be65651c80d3f592a89b3945466584a22069", "type": "github" }, "original": { @@ -159,11 +159,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1763988335, - "narHash": "sha256-QlcnByMc8KBjpU37rbq5iP7Cp97HvjRP0ucfdh+M4Qc=", + "lastModified": 1765464257, + "narHash": "sha256-dixPWKiHzh80PtD0aLuxYNQ0xP+843dfXG/yM3OzaYQ=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "50b9238891e388c9fdc6a5c49e49c42533a1b5ce", + "rev": "09e45f2598e1a8499c3594fe11ec2943f34fe509", "type": "github" }, "original": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1005e57..7690927 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -79,7 +79,7 @@ importers: version: 2.1.1 deadlock-api-client: specifier: github:deadlock-api/openapi-clients#path:typescript/api - version: deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/902abb2506c94b2cb2a91f26847543172742becf#path:typescript/api + version: deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/5db828d376e567b3f2853d75904ea9fadf895437#path:typescript/api drizzle-kit: specifier: 0.31.8 version: 0.31.8 @@ -183,6 +183,81 @@ importers: specifier: 4.3.5 version: 4.3.5 + apps/web: + dependencies: + '@deadlog/db': + specifier: workspace:* + version: link:../../libs/db + '@deadlog/scraper': + specifier: workspace:* + version: link:../../libs/scraper + '@deadlog/utils': + specifier: workspace:* + version: link:../../libs/utils + '@sveltejs/kit': + specifier: 2.49.3 + version: 2.49.3(@sveltejs/vite-plugin-svelte@6.2.3(svelte@5.46.1)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + svelte: + specifier: 5.46.1 + version: 5.46.1 + devDependencies: + layerchart: + specifier: 2.0.0-next.27 + version: 2.0.0-next.27(svelte@5.46.1) + + libs/db: + dependencies: + '@libsql/client': + specifier: 0.17.0 + version: 0.17.0 + drizzle-orm: + specifier: 0.45.1 + version: 0.45.1(@cloudflare/workers-types@4.20260108.0)(@libsql/client@0.17.0) + devDependencies: + '@types/node': + specifier: 24.10.4 + version: 24.10.4 + drizzle-kit: + specifier: 0.31.8 + version: 0.31.8 + + libs/meta: + dependencies: + '@deadlog/db': + specifier: workspace:* + version: link:../db + '@deadlog/scraper': + specifier: workspace:* + version: link:../scraper + '@deadlog/utils': + specifier: workspace:* + version: link:../utils + devDependencies: + '@types/node': + specifier: 24.10.4 + version: 24.10.4 + + libs/scraper: + dependencies: + '@deadlog/db': + specifier: workspace:* + version: link:../db + '@deadlog/utils': + specifier: workspace:* + version: link:../utils + deadlock-api-client: + specifier: github:deadlock-api/openapi-clients#path:typescript/api + version: deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/902abb2506c94b2cb2a91f26847543172742becf#path:typescript/api + devDependencies: + '@types/node': + specifier: 24.10.4 + version: 24.10.4 + happy-dom: + specifier: 20.1.0 + version: 20.1.0 + + libs/utils: {} + packages: '@adobe/css-tools@4.4.4': @@ -775,11 +850,18 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@dagrejs/dagre@1.1.8': + resolution: {integrity: sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==} + + '@dagrejs/graphlib@2.2.4': + resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} + engines: {node: '>17.0.0'} + '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} @@ -1485,6 +1567,18 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@layerstack/svelte-actions@1.0.1-next.12': + resolution: {integrity: sha512-dndWTlYu8b1u6vw2nrO7NssccoACArGG75WoNlyVC13KuENZlWdKE9Q79/wlnbq00NeQMNKMjJwRMsrKQj2ULA==} + + '@layerstack/svelte-state@0.1.0-next.17': + resolution: {integrity: sha512-z7e6mPJnypD80LEI/UDuH0bI6s8/nut06MB7rEkRcEfHJekhKSJgFhMnrYzLED7Mc2gTTD0X/wcYlakauWlU8A==} + + '@layerstack/tailwind@2.0.0-next.15': + resolution: {integrity: sha512-7tqKE3OV7/ybeDOORX++USYYCBJa7IgTya2czFpzbgXGo7CQDVyuv+0J1DggjRcEqhhXQA4MUhgnhcRaZvHxWg==} + + '@layerstack/utils@2.0.0-next.12': + resolution: {integrity: sha512-fhGZUlSr3N+D44BYm37WKMGSEFyZBW+dwIqtGU8Cl54mR4TLQ/UwyGhdpgIHyH/x/8q1abE0fP0Dn6ZsrDE3BA==} + '@libsql/client@0.17.0': resolution: {integrity: sha512-TLjSU9Otdpq0SpKHl1tD1Nc9MKhrsZbCFGot3EbCxRa8m1E5R1mMwoOjKMMM31IyF7fr+hPNHLpYfwbMKNusmg==} @@ -1799,8 +1893,8 @@ packages: cpu: [x64] os: [win32] - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sinclair/typebox@0.34.47': + resolution: {integrity: sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==} '@sindresorhus/is@7.1.1': resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} @@ -2287,8 +2381,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.32: - resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} + baseline-browser-mapping@2.9.12: + resolution: {integrity: sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw==} hasBin: true big-integer@1.6.52: @@ -2314,8 +2408,8 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2333,8 +2427,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001757: - resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} + caniuse-lite@1.0.30001763: + resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} chai@6.2.1: resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} @@ -2397,6 +2491,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -2439,10 +2537,117 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo-voronoi@2.1.0: + resolution: {integrity: sha512-kqE4yYuOjPbKdBXG0xztCacPwkVSK2REF1opSNrnqqtXJmNcM++UbwQ8SxvwP6IQTj9RvIjjK4qeiVsEfj0Z2Q==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate-path@2.3.0: + resolution: {integrity: sha512-tZYtGXxBmbgHsIc9Wms6LS5u4w6KbP8C09a4/ZYc4KLMYYqub57rRBUgpUr2CIarIrJEpdAWWxWQvofgaMpbKQ==} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-tile@1.0.0: + resolution: {integrity: sha512-79fnTKpPMPDS5xQ0xuS9ir0165NEwwkFpe/DSOmc2Gl9ldYzKKRDWogmTTE8wAJ8NA7PMapNfEcyKhI9Lxdu5Q==} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-tricontour@1.1.0: + resolution: {integrity: sha512-G7gHKj89n2owmkGb6WX6ixcnQ0Kf/0wpa9VIh9DGdbHu8wdrlaHU4ir3/bFNERl8N8nn4G7e7qbtBG8N9caihQ==} + engines: {node: '>=12'} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/5db828d376e567b3f2853d75904ea9fadf895437#path:typescript/api: + resolution: {path: typescript/api, tarball: https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/5db828d376e567b3f2853d75904ea9fadf895437} + version: 0.1.0 + deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/902abb2506c94b2cb2a91f26847543172742becf#path:typescript/api: resolution: {path: typescript/api, tarball: https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/902abb2506c94b2cb2a91f26847543172742becf} version: 0.1.0 @@ -2470,6 +2675,9 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -2619,8 +2827,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.263: - resolution: {integrity: sha512-DrqJ11Knd+lo+dv+lltvfMDLU27g14LMdH2b0O3Pio4uk0x+z7OR+JrmyacTPN2M8w3BrZ7/RTwG3R9B7irPlg==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2935,6 +3143,10 @@ packages: headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2964,6 +3176,13 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -3085,6 +3304,11 @@ packages: known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + layerchart@2.0.0-next.27: + resolution: {integrity: sha512-yt28xU8WzXq0AliX7eiC0JKZGQtO8M9FmHvt8sESNitSc/yC+fYeTghaO9lMRwcYCmi6D1NjbFyD9mWFeazNIQ==} + peerDependencies: + svelte: ^5.0.0 + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3182,6 +3406,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} @@ -3206,6 +3433,10 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + memoize@10.2.0: + resolution: {integrity: sha512-DeC6b7QBrZsRs3Y02A6A7lQyzFbsQbqgjI6UW0GigGWV+u1s25TycMr0XHZE4cJce7rY/vyw2ctMQqfDkIhUEA==} + engines: {node: '>=18'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3223,6 +3454,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3635,6 +3870,9 @@ packages: rettime@0.7.0: resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + rollup@4.53.3: resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3676,6 +3914,9 @@ packages: zod: optional: true + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -3683,6 +3924,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -4001,8 +4245,8 @@ packages: until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4283,7 +4527,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -4982,9 +5226,15 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@dagrejs/dagre@1.1.8': + dependencies: + '@dagrejs/graphlib': 2.2.4 + + '@dagrejs/graphlib@2.2.4': {} + '@drizzle-team/brocli@0.10.2': {} - '@emnapi/core@1.7.1': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 @@ -5417,7 +5667,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.41 + '@sinclair/typebox': 0.34.47 '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -5443,6 +5693,31 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@layerstack/svelte-actions@1.0.1-next.12': + dependencies: + '@floating-ui/dom': 1.7.4 + '@layerstack/utils': 2.0.0-next.12 + d3-scale: 4.0.2 + + '@layerstack/svelte-state@0.1.0-next.17': + dependencies: + '@layerstack/utils': 2.0.0-next.12 + + '@layerstack/tailwind@2.0.0-next.15': + dependencies: + '@layerstack/utils': 2.0.0-next.12 + clsx: 2.1.1 + d3-array: 3.2.4 + lodash-es: 4.17.21 + tailwind-merge: 3.4.0 + + '@layerstack/utils@2.0.0-next.12': + dependencies: + d3-array: 3.2.4 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + lodash-es: 4.17.21 + '@libsql/client@0.17.0': dependencies: '@libsql/core': 0.17.0 @@ -5520,7 +5795,7 @@ snapshots: '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.7.1 + '@emnapi/core': 1.8.1 '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.9.0 @@ -5763,7 +6038,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true - '@sinclair/typebox@0.34.41': {} + '@sinclair/typebox@0.34.47': {} '@sindresorhus/is@7.1.1': {} @@ -6280,7 +6555,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.32: {} + baseline-browser-mapping@2.9.12: {} big-integer@1.6.52: {} @@ -6314,13 +6589,13 @@ snapshots: dependencies: balanced-match: 1.0.2 - browserslist@4.28.0: + browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.8.32 - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.263 + baseline-browser-mapping: 2.9.12 + caniuse-lite: 1.0.30001763 + electron-to-chromium: 1.5.267 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-from@1.1.2: {} @@ -6336,7 +6611,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001757: {} + caniuse-lite@1.0.30001763: {} chai@6.2.1: {} @@ -6394,6 +6669,8 @@ snapshots: commander@2.20.3: {} + commander@7.2.0: {} + commondir@1.0.1: {} concat-map@0.0.1: {} @@ -6406,7 +6683,7 @@ snapshots: core-js-compat@3.47.0: dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 cosmiconfig@7.1.0: dependencies: @@ -6434,8 +6711,114 @@ snapshots: csstype@3.2.3: {} + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo-voronoi@2.1.0: + dependencies: + d3-array: 3.2.4 + d3-delaunay: 6.0.4 + d3-geo: 3.1.1 + d3-tricontour: 1.1.0 + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate-path@2.3.0: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-tile@1.0.0: {} + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-tricontour@1.1.0: + dependencies: + d3-delaunay: 6.0.4 + d3-scale: 4.0.2 + data-uri-to-buffer@4.0.1: {} + deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/5db828d376e567b3f2853d75904ea9fadf895437#path:typescript/api: + dependencies: + axios: 1.13.2 + transitivePeerDependencies: + - debug + deadlock_api_client@https://codeload.github.com/deadlock-api/openapi-clients/tar.gz/902abb2506c94b2cb2a91f26847543172742becf#path:typescript/api: dependencies: axios: 1.13.2 @@ -6456,6 +6839,10 @@ snapshots: define-lazy-prop@2.0.0: {} + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} dequal@2.0.3: {} @@ -6512,7 +6899,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.263: {} + electron-to-chromium@1.5.267: {} emoji-regex@8.0.0: {} @@ -6896,6 +7283,10 @@ snapshots: headers-polyfill@4.0.3: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -6915,6 +7306,10 @@ snapshots: inline-style-parser@0.2.7: {} + internmap@1.0.1: {} + + internmap@2.0.3: {} + is-arrayish@0.2.1: {} is-arrayish@0.3.4: {} @@ -7007,6 +7402,37 @@ snapshots: known-css-properties@0.37.0: {} + layerchart@2.0.0-next.27(svelte@5.46.1): + dependencies: + '@dagrejs/dagre': 1.1.8 + '@layerstack/svelte-actions': 1.0.1-next.12 + '@layerstack/svelte-state': 0.1.0-next.17 + '@layerstack/tailwind': 2.0.0-next.15 + '@layerstack/utils': 2.0.0-next.12 + d3-array: 3.2.4 + d3-color: 3.1.0 + d3-delaunay: 6.0.4 + d3-dsv: 3.0.1 + d3-force: 3.0.0 + d3-geo: 3.1.1 + d3-geo-voronoi: 2.1.0 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-interpolate-path: 2.3.0 + d3-path: 3.1.0 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-sankey: 0.12.3 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-shape: 3.2.0 + d3-tile: 1.0.0 + d3-time: 3.1.0 + lodash-es: 4.17.21 + memoize: 10.2.0 + runed: 0.28.0(svelte@5.46.1) + svelte: 5.46.1 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7088,6 +7514,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.debounce@4.0.8: {} lodash.merge@4.6.2: {} @@ -7109,6 +7537,10 @@ snapshots: math-intrinsics@1.1.0: {} + memoize@10.2.0: + dependencies: + mimic-function: 5.0.1 + mime-db@1.52.0: {} mime-types@2.1.35: @@ -7119,6 +7551,8 @@ snapshots: mimic-fn@2.1.0: {} + mimic-function@5.0.1: {} + min-indent@1.0.1: {} miniflare@4.20260103.0: @@ -7510,6 +7944,8 @@ snapshots: rettime@0.7.0: {} + robust-predicates@3.0.2: {} + rollup@4.53.3: dependencies: '@types/estree': 1.0.8 @@ -7572,12 +8008,16 @@ snapshots: '@sveltejs/kit': 2.49.3(@sveltejs/vite-plugin-svelte@6.2.3(svelte@5.46.1)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) zod: 4.3.5 + rw@1.3.3: {} + sade@1.8.1: dependencies: mri: 1.2.0 safe-buffer@5.2.1: {} + safer-buffer@2.1.2: {} + schema-dts@1.1.5: {} semver@6.3.1: {} @@ -7888,9 +8328,9 @@ snapshots: until-async@3.0.2: {} - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 From 7f42a86eb975e7d6f264b9c3c6b25e759c38fb3c Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Sat, 13 Dec 2025 11:03:42 -0600 Subject: [PATCH 3/7] wip --- .../lib/components/changelog/Changelog.svelte | 190 ++++++++++++------ .../changelog/LatestUpdateBanner.svelte | 126 ++++++++++++ .../changelog/PatchPreviewCard.svelte | 85 ++++---- .../components/changelog/PatchTimeline.svelte | 65 ++++++ .../web/src/lib/components/changelog/index.ts | 2 + .../src/lib/components/header/Header.svelte | 10 +- .../components/ui/chart/chart-tooltip.svelte | 2 +- .../web/src/lib/stores/searchParams.svelte.ts | 15 ++ apps/web/src/routes/+page.server.ts | 14 +- apps/web/src/routes/+page.svelte | 53 +++++ apps/web/src/routes/hero/[slug]/+page.svelte | 23 ++- apps/web/src/routes/item/[slug]/+page.svelte | 21 +- eslint.config.js | 10 +- libs/scraper/src/static.ts | 8 +- 14 files changed, 497 insertions(+), 127 deletions(-) create mode 100644 apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte create mode 100644 apps/web/src/lib/components/changelog/PatchTimeline.svelte diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index cda812e..720da1b 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -1,6 +1,7 @@
@@ -193,72 +253,72 @@
{/if} - + {#if !query.isError && query.data} -
- {#each filteredChangelogs as entry (entry.id)} - {@const showNotes = shouldShowGeneralNotes(entry, filterState)} - - {#if entry.updates && entry.updates.length > 0} - {#each entry.updates.slice().reverse() as update (update.id)} - {#if !isFiltered || (getVisibleHeroNames(update, filterState)?.size ?? 0) > 0 || (getVisibleItemNames(update, filterState)?.size ?? 0) > 0} - {@const shouldAnimate = cardIndex < initialLoadSize} - {@const currentIndex = cardIndex++} -
- -
- {/if} - {/each} - {/if} + {#if flattenedEntries.length > 0} + + {#if latestEntry} +
+ +
+ {/if} - {#if !isFiltered || (getVisibleHeroNames(entry, filterState)?.size ?? 0) > 0 || (getVisibleItemNames(entry, filterState)?.size ?? 0) > 0 || showNotes} - {@const shouldAnimate = cardIndex < initialLoadSize} - {@const currentIndex = cardIndex++} -
- + + {#if historyEntries.length > 0} +
+
+ +

+ Change History +

- {/if} - {:else} -
-
- -
-

No changes found

-

- No changelog entries match your current filters. Try adjusting your search or - clearing the filters. -

- +
- {/each} -
+ +
+ {#each historyEntries as entry, i (entry.id)} + {@const shouldAnimate = i < initialLoadSize - 1} +
+ +
+ {/each} +
+ {/if} + {:else} +
+
+ +
+

No changes found

+

+ No changelog entries match your current filters. Try adjusting your search or + clearing the filters. +

+ +
+ {/if}
{#if query.isFetchingNextPage} diff --git a/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte b/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte new file mode 100644 index 0000000..ded0d6a --- /dev/null +++ b/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte @@ -0,0 +1,126 @@ + + + +
+ +
+ +
+ +
+
+ + + Latest Update + +
+ +
+ +
+ + + + {author.slice(0, 2).toUpperCase()} + + + {author} +
+
+ + +
+ {#if heroes.length > 0} + + {heroes.length} hero{heroes.length !== 1 ? 'es' : ''} + + {/if} + {#if items.length > 0} + + {items.length} item{items.length !== 1 ? 's' : ''} + + {/if} +
+
+ + +
+ {#if displayEntities.length > 0} +
+
+ {#each displayEntities as entity, i (entity.id)} + {entity.alt} + {/each} +
+ {#if entityOverflow > 0} + + +{entityOverflow} + + {/if} +
+ {/if} + +
+ View full changelog + +
+
+
+
+
diff --git a/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte index 59a6087..b53aa78 100644 --- a/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte +++ b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte @@ -2,6 +2,7 @@ import type { EntityIcon } from '$lib/utils/types'; import * as Card from '$lib/components/ui/card'; import * as Avatar from '$lib/components/ui/avatar'; + import { Badge } from '$lib/components/ui/badge'; import { formatDate } from '@deadlog/utils'; import ArrowRight from '@lucide/svelte/icons/arrow-right'; @@ -18,46 +19,23 @@ let { id, date, author, authorImage, icons }: Props = $props(); - const maxIconsPerRow = 6; + const maxOverlappingIcons = 8; const heroes = $derived(icons?.heroes ?? []); const items = $derived(icons?.items ?? []); - const displayHeroes = $derived(heroes.slice(0, maxIconsPerRow)); - const heroOverflow = $derived(Math.max(0, heroes.length - maxIconsPerRow)); - - const displayItems = $derived(items.slice(0, maxIconsPerRow)); - const itemOverflow = $derived(Math.max(0, items.length - maxIconsPerRow)); + // Combine heroes and items for overlapping display + const allEntities = $derived([...heroes, ...items]); + const displayEntities = $derived(allEntities.slice(0, maxOverlappingIcons)); + const entityOverflow = $derived(Math.max(0, allEntities.length - maxOverlappingIcons)); -{#snippet iconRow(entities: EntityIcon[], overflow: number)} -
- {#each entities as entity (entity.id)} - {entity.alt} - {/each} - {#if overflow > 0} - - +{overflow} - - {/if} -
-{/snippet} - - + +
-
- {#if displayHeroes.length > 0} - {@render iconRow(displayHeroes, heroOverflow)} + + {#if displayEntities.length > 0} +
+
+ {#each displayEntities as entity, i (entity.id)} + {entity.alt} + {/each} +
+ {#if entityOverflow > 0} + + +{entityOverflow} + + {/if} +
+ {/if} + + +
+ {#if heroes.length > 0} + + {heroes.length} hero{heroes.length !== 1 ? 'es' : ''} + {/if} - {#if displayItems.length > 0} - {@render iconRow(displayItems, itemOverflow)} + {#if items.length > 0} + + {items.length} item{items.length !== 1 ? 's' : ''} + {/if}
+
View changes
diff --git a/apps/web/src/lib/components/changelog/PatchTimeline.svelte b/apps/web/src/lib/components/changelog/PatchTimeline.svelte new file mode 100644 index 0000000..b8bf051 --- /dev/null +++ b/apps/web/src/lib/components/changelog/PatchTimeline.svelte @@ -0,0 +1,65 @@ + + +{#if sortedPatches.length > 1} +
+
+ {#each sortedPatches as patch, i (patch.id)} + + + + {#snippet child({ props })} + + {/snippet} + + +

{formatDate(patch.date)}

+
+ + + {#if i < sortedPatches.length - 1} +
+ {/if} + {/each} +
+
+ {#if firstDate && lastDate} + {formatMonth(firstDate)} + {formatMonth(lastDate)} + {/if} +
+
+{/if} diff --git a/apps/web/src/lib/components/changelog/index.ts b/apps/web/src/lib/components/changelog/index.ts index 93d941e..4a36038 100644 --- a/apps/web/src/lib/components/changelog/index.ts +++ b/apps/web/src/lib/components/changelog/index.ts @@ -5,5 +5,7 @@ export { default as ChangelogSkeleton } from './ChangelogSkeleton.svelte'; export { default as EntityPreview } from './EntityPreview.svelte'; export { default as EntityTooltip } from './EntityTooltip.svelte'; export { default as ExpandButton } from './ExpandButton.svelte'; +export { default as LatestUpdateBanner } from './LatestUpdateBanner.svelte'; export { default as NoteWithPatterns } from './NoteWithPatterns.svelte'; export { default as PatchPreviewCard } from './PatchPreviewCard.svelte'; +export { default as PatchTimeline } from './PatchTimeline.svelte'; diff --git a/apps/web/src/lib/components/header/Header.svelte b/apps/web/src/lib/components/header/Header.svelte index 938f20e..8c180d3 100644 --- a/apps/web/src/lib/components/header/Header.svelte +++ b/apps/web/src/lib/components/header/Header.svelte @@ -25,7 +25,15 @@
- +
+ + +
diff --git a/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte b/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte index 478ac4a..bd2c831 100644 --- a/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte +++ b/apps/web/src/lib/components/ui/chart/chart-tooltip.svelte @@ -9,7 +9,7 @@ import { getTooltipContext, Tooltip as TooltipPrimitive } from 'layerchart'; import type { Snippet } from 'svelte'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unused-vars function defaultFormatter(value: any, _payload: TooltipPayload[]) { return `${value}`; } diff --git a/apps/web/src/lib/stores/searchParams.svelte.ts b/apps/web/src/lib/stores/searchParams.svelte.ts index 068cb94..1e79fb9 100644 --- a/apps/web/src/lib/stores/searchParams.svelte.ts +++ b/apps/web/src/lib/stores/searchParams.svelte.ts @@ -1,5 +1,6 @@ import { page } from '$app/state'; import { goto } from '$app/navigation'; +import { building } from '$app/environment'; import { getContext, hasContext, setContext } from 'svelte'; import { z } from 'zod'; @@ -36,8 +37,16 @@ export function parseSearchParams(url: URL): SearchParams { }; } +/** Check if we can safely access URL search params (not during prerendering) */ +function canAccessSearchParams(): boolean { + // During build/prerender, URL search params aren't available + if (building) return false; + return true; +} + class SearchParamsStore { get hero(): string[] { + if (!canAccessSearchParams()) return []; return parseCSV(page.url.searchParams.get('hero')); } @@ -46,6 +55,7 @@ class SearchParamsStore { } get item(): string[] { + if (!canAccessSearchParams()) return []; return parseCSV(page.url.searchParams.get('item')); } @@ -54,6 +64,7 @@ class SearchParamsStore { } get change(): number | undefined { + if (!canAccessSearchParams()) return undefined; const val = page.url.searchParams.get('change'); return val ? Number(val) : undefined; } @@ -63,6 +74,7 @@ class SearchParamsStore { } get q(): string { + if (!canAccessSearchParams()) return ''; return page.url.searchParams.get('q') ?? ''; } @@ -71,6 +83,7 @@ class SearchParamsStore { } #updateParam(key: string, value: string | null) { + if (!canAccessSearchParams()) return; const url = new URL(page.url); if (value === null) { url.searchParams.delete(key); @@ -81,6 +94,7 @@ class SearchParamsStore { } update(values: Partial<{ hero: string[]; item: string[]; change: number; q: string }>) { + if (!canAccessSearchParams()) return; const url = new URL(page.url); if ('hero' in values) { @@ -119,6 +133,7 @@ class SearchParamsStore { } reset() { + if (!canAccessSearchParams()) return; goto('?', { replaceState: false, keepFocus: true, noScroll: true }); } diff --git a/apps/web/src/routes/+page.server.ts b/apps/web/src/routes/+page.server.ts index c3c2043..0da0ef9 100644 --- a/apps/web/src/routes/+page.server.ts +++ b/apps/web/src/routes/+page.server.ts @@ -26,7 +26,7 @@ export const load: PageServerLoad = async ({ locals, url, parent }) => { const heroIds = resolveHeroIds(hero, heroes); const itemIds = resolveItemIds(item, items); - let initialLoadLimit = 5; + let initialLoadLimit = 12; if (change) { const position = await getChangelogPosition(locals.db, String(change)); initialLoadLimit = position + 1 + 5; @@ -91,11 +91,23 @@ export const load: PageServerLoad = async ({ locals, url, parent }) => { } } + // Get latest patch summary for hero banner + const latestPatch = enriched[0]; + const latestPatchSummary = latestPatch + ? { + id: latestPatch.id, + date: latestPatch.date, + heroCount: latestPatch.icons?.heroes?.length ?? 0, + itemCount: latestPatch.icons?.items?.length ?? 0 + } + : null; + return { changelogs: enriched, totalCount, initialLoadCount: initialLoadLimit, lastUpdate: (allChangelogs[0]?.date ?? new Date()).toISOString(), + latestPatchSummary, title: pageMeta.title, description: pageMeta.description, image: pageMeta.image diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte index d119310..ca610ef 100644 --- a/apps/web/src/routes/+page.svelte +++ b/apps/web/src/routes/+page.svelte @@ -2,6 +2,9 @@ import { MetaTags } from 'svelte-meta-tags'; import { Changelog } from '$lib/components/changelog'; import { ScrollToTop } from '$lib/components/scroll-to-top'; + import { Badge } from '$lib/components/ui/badge'; + import { formatDate } from '@deadlog/utils'; + import ArrowRight from '@lucide/svelte/icons/arrow-right'; import type { PageData } from './$types'; import { getSearchParams } from '$lib/stores/searchParams.svelte'; @@ -9,8 +12,12 @@ const title = $derived(data.title); const description = $derived(data.description); const image = $derived(data.image); + const latestPatch = $derived(data.latestPatchSummary); const params = getSearchParams(); + const isFiltered = $derived( + params.hero.length > 0 || params.item.length > 0 || params.q.length > 0 + ); const canonical = $derived.by(() => params.toURLSearchParams().toString() === '' ? 'https://deadlog.io' @@ -42,5 +49,51 @@ image }} /> + + +{#if !isFiltered && latestPatch} +
+
+ +
+ +
+
+

+ Latest Update +

+

+ {formatDate(latestPatch.date)} +

+
+ {#if latestPatch.heroCount > 0} + + {latestPatch.heroCount} hero{latestPatch.heroCount !== 1 ? 'es' : ''} + + {/if} + {#if latestPatch.itemCount > 0} + + {latestPatch.itemCount} item{latestPatch.itemCount !== 1 ? 's' : ''} + + {/if} +
+
+ + + View full patch + + +
+
+
+{/if} + diff --git a/apps/web/src/routes/hero/[slug]/+page.svelte b/apps/web/src/routes/hero/[slug]/+page.svelte index 70c3bfc..ec761a0 100644 --- a/apps/web/src/routes/hero/[slug]/+page.svelte +++ b/apps/web/src/routes/hero/[slug]/+page.svelte @@ -1,7 +1,7 @@
@@ -34,7 +27,9 @@ >
-

+

{formatDate(date)}

@@ -62,7 +57,7 @@
diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index 720da1b..3d1e045 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -1,6 +1,6 @@
@@ -258,20 +246,24 @@ {#if flattenedEntries.length > 0} {#if latestEntry} -
+
{/if} {#if historyEntries.length > 0} -
+

@@ -281,23 +273,20 @@

-
+
{#each historyEntries as entry, i (entry.id)} - {@const shouldAnimate = i < initialLoadSize - 1} -
- -
+ {/each}
{/if} @@ -335,7 +324,7 @@ > Load more changes - {:else if !query.hasNextPage && filteredChangelogs.length > 0} + {:else if !query.hasNextPage && flattenedEntries.length > 0}

All changes loaded

{/if}
diff --git a/apps/web/src/lib/components/changelog/ChangelogContent.svelte b/apps/web/src/lib/components/changelog/ChangelogContent.svelte index 220f026..62417c1 100644 --- a/apps/web/src/lib/components/changelog/ChangelogContent.svelte +++ b/apps/web/src/lib/components/changelog/ChangelogContent.svelte @@ -3,7 +3,6 @@ import { NoteWithPatterns } from '.'; import * as Accordion from '$lib/components/ui/accordion'; import type { ChangelogContentJson } from '@deadlog/db'; - import { getFilteredGeneralNotes } from '$lib/utils/filterChanges'; import { getSearchParams } from '$lib/stores/searchParams.svelte'; import { getHeroImageFromMap, getItemImageFromMap } from '$lib/utils/entityImages'; @@ -11,24 +10,12 @@ contentJson?: ChangelogContentJson | null; heroMap?: Record }>; itemMap?: Record; - showFullChange?: boolean; - forceShowNotes?: boolean; } - let { - contentJson, - heroMap = {}, - itemMap = {}, - showFullChange = false, - forceShowNotes = false - }: Props = $props(); + let { contentJson, heroMap = {}, itemMap = {} }: Props = $props(); const params = getSearchParams(); - let showAllNotes = $state(false); - const hasParams = $derived( - params.hero.length > 0 || params.item.length > 0 || params.change || params.q - ); const hasHeroFilter = $derived(params.hero.length > 0); const hasItemFilter = $derived(params.item.length > 0); @@ -52,31 +39,6 @@ const getHeroImage = (heroId?: number) => getHeroImageFromMap(heroId, heroMap); const getItemImage = (itemId?: number) => getItemImageFromMap(itemId, itemMap); - - const filteredGeneralNotes = $derived.by(() => { - if (!contentJson || !hasParams || showFullChange || showAllNotes) { - return null; - } - return getFilteredGeneralNotes( - { id: '', title: '', date: new Date(), author: '', contentJson }, - { - selectedHeroNames: new Set(params.hero), - selectedItemNames: new Set(params.item), - searchQuery: params.q - } - ); - }); - - const displayedNotes = $derived.by(() => { - if (!contentJson?.notes) return []; - if (filteredGeneralNotes === null) return contentJson.notes; - return filteredGeneralNotes; - }); - - const hasHiddenNotes = $derived.by(() => { - if (!contentJson?.notes || filteredGeneralNotes === null) return false; - return contentJson.notes.length > filteredGeneralNotes.length; - });
@@ -86,12 +48,12 @@ value={['general', 'heroes', 'items', 'abilities']} class="space-y-4" > - {#if (!hasParams || showFullChange || forceShowNotes) && contentJson.notes.length > 0} + {#if contentJson.notes.length > 0}

General Changes ({displayedNotes.length})({contentJson.notes.length})

@@ -100,34 +62,12 @@ >
    - {#each displayedNotes as note, i (i)} + {#each contentJson.notes as note, i (i)}
  • {/each}
- {#if hasHiddenNotes && !showAllNotes} - - {:else if hasHiddenNotes && showAllNotes} - - {/if}
{/if} @@ -185,7 +125,7 @@ {/if} - {#if (!hasParams || showFullChange) && Object.keys(contentJson.abilities).length > 0} + {#if Object.keys(contentJson.abilities).length > 0}

@@ -257,8 +197,4 @@ @apply leading-relaxed; } } - - .show-more-btn { - @apply text-primary mt-4 text-sm font-medium transition-all duration-200 hover:translate-x-1 hover:opacity-80; - } diff --git a/apps/web/src/lib/components/changelog/ChangelogEntry.svelte b/apps/web/src/lib/components/changelog/ChangelogEntry.svelte deleted file mode 100644 index bf2b250..0000000 --- a/apps/web/src/lib/components/changelog/ChangelogEntry.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - -
- - - {#if entryIndex > 0} -
- {/if} - - {@render children()} -
diff --git a/apps/web/src/lib/components/changelog/ExpandButton.svelte b/apps/web/src/lib/components/changelog/ExpandButton.svelte deleted file mode 100644 index 3efb1f4..0000000 --- a/apps/web/src/lib/components/changelog/ExpandButton.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - -
- -
diff --git a/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte b/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte index ded0d6a..aa6c00a 100644 --- a/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte +++ b/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte @@ -1,10 +1,18 @@ - -
+ + +
-
- - diff --git a/apps/web/src/lib/components/changelog/index.ts b/apps/web/src/lib/components/changelog/index.ts index 4a36038..9066c58 100644 --- a/apps/web/src/lib/components/changelog/index.ts +++ b/apps/web/src/lib/components/changelog/index.ts @@ -1,10 +1,8 @@ export { default as Changelog } from './Changelog.svelte'; export { default as ChangelogContent } from './ChangelogContent.svelte'; -export { default as ChangelogEntry } from './ChangelogEntry.svelte'; export { default as ChangelogSkeleton } from './ChangelogSkeleton.svelte'; export { default as EntityPreview } from './EntityPreview.svelte'; export { default as EntityTooltip } from './EntityTooltip.svelte'; -export { default as ExpandButton } from './ExpandButton.svelte'; export { default as LatestUpdateBanner } from './LatestUpdateBanner.svelte'; export { default as NoteWithPatterns } from './NoteWithPatterns.svelte'; export { default as PatchPreviewCard } from './PatchPreviewCard.svelte'; diff --git a/apps/web/src/lib/utils/clipboard.ts b/apps/web/src/lib/utils/clipboard.ts new file mode 100644 index 0000000..365ec26 --- /dev/null +++ b/apps/web/src/lib/utils/clipboard.ts @@ -0,0 +1,18 @@ +import { toast } from 'svelte-sonner'; + +/** + * Copies the given text to clipboard and shows a success toast. + */ +export async function copyToClipboard(text: string, message = 'Copied to clipboard') { + await navigator.clipboard.writeText(text); + toast.success(message); +} + +/** + * Copies a changelog link to clipboard. Handles event propagation. + */ +export async function copyChangelogLink(e: MouseEvent, changeId: string) { + e.preventDefault(); + e.stopPropagation(); + await copyToClipboard(`${window.location.origin}/change/${changeId}`); +} diff --git a/apps/web/src/lib/utils/filterChanges.test.ts b/apps/web/src/lib/utils/filterChanges.test.ts index 37d6c73..4ef82da 100644 --- a/apps/web/src/lib/utils/filterChanges.test.ts +++ b/apps/web/src/lib/utils/filterChanges.test.ts @@ -2,8 +2,7 @@ import { describe, it, expect } from 'vitest'; import { getVisibleHeroNames, getVisibleItemNames, - shouldShowGeneralNotes, - getFilteredGeneralNotes + shouldShowGeneralNotes } from './filterChanges'; import type { ChangelogContentJson } from '@deadlog/db'; @@ -547,186 +546,4 @@ describe('filterChanges', () => { expect(result).toBe(true); }); }); - - describe('getFilteredGeneralNotes', () => { - it('should return null when no filters are applied', () => { - const result = getFilteredGeneralNotes(mockChangelogs[0], { - selectedHeroNames: new Set(), - selectedItemNames: new Set(), - searchQuery: '' - }); - - expect(result).toBeNull(); - }); - - it('should filter notes that mention selected hero', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'General bug fixes', patterns: [] }, - { text: 'Infernus balance adjustment', patterns: [] }, - { text: 'Map improvements', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(['Infernus']), - selectedItemNames: new Set(), - searchQuery: '' - }); - - expect(result).toHaveLength(1); - expect(result?.[0].text).toBe('Infernus balance adjustment'); - }); - - it('should filter notes that mention selected item', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'General bug fixes', patterns: [] }, - { text: 'Metal Skin cost reduced', patterns: [] }, - { text: 'Map improvements', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(), - selectedItemNames: new Set(['Metal Skin']), - searchQuery: '' - }); - - expect(result).toHaveLength(1); - expect(result?.[0].text).toBe('Metal Skin cost reduced'); - }); - - it('should filter notes by search query', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'General bug fixes', patterns: [] }, - { text: 'Performance improvements', patterns: [] }, - { text: 'Map improvements', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(), - selectedItemNames: new Set(), - searchQuery: 'performance' - }); - - expect(result).toHaveLength(1); - expect(result?.[0].text).toBe('Performance improvements'); - }); - - it('should return empty array when no notes match filters', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'General bug fixes', patterns: [] }, - { text: 'Map improvements', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(['Infernus']), - selectedItemNames: new Set(), - searchQuery: '' - }); - - expect(result).toEqual([]); - }); - - it('should be case insensitive when filtering', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'INFERNUS was buffed', patterns: [] }, - { text: 'Map improvements', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(['Infernus']), - selectedItemNames: new Set(), - searchQuery: '' - }); - - expect(result).toHaveLength(1); - expect(result?.[0].text).toBe('INFERNUS was buffed'); - }); - - it('should filter notes matching multiple heroes', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'Infernus buff applied', patterns: [] }, - { text: 'Seven nerf applied', patterns: [] }, - { text: 'General changes', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(['Infernus', 'Seven']), - selectedItemNames: new Set(), - searchQuery: '' - }); - - expect(result).toHaveLength(2); - }); - - it('should combine hero and item filters', () => { - const changeWithMixedNotes = { - ...mockChangelogs[0], - contentJson: { - notes: [ - { text: 'Infernus buff applied', patterns: [] }, - { text: 'Metal Skin cost reduced', patterns: [] }, - { text: 'General changes', patterns: [] } - ], - heroes: {}, - items: {}, - abilities: {} - } as ChangelogContentJson - }; - - const result = getFilteredGeneralNotes(changeWithMixedNotes, { - selectedHeroNames: new Set(['Infernus']), - selectedItemNames: new Set(['Metal Skin']), - searchQuery: '' - }); - - expect(result).toHaveLength(2); - }); - }); }); diff --git a/apps/web/src/lib/utils/filterChanges.ts b/apps/web/src/lib/utils/filterChanges.ts index 0031616..718b65c 100644 --- a/apps/web/src/lib/utils/filterChanges.ts +++ b/apps/web/src/lib/utils/filterChanges.ts @@ -190,54 +190,3 @@ export function shouldShowGeneralNotes( return false; } - -export function getFilteredGeneralNotes( - changelog: FilteredChangelog, - filterState: FilterState -): Note[] | null { - const { selectedHeroNames, selectedItemNames, searchQuery } = filterState; - const hasHeroFilter = selectedHeroNames.size > 0; - const hasItemFilter = selectedItemNames.size > 0; - const hasSearchQuery = searchQuery.trim().length > 0; - - if (!hasHeroFilter && !hasItemFilter && !hasSearchQuery) { - return null; - } - - const notes = changelog.contentJson?.notes; - if (!notes || notes.length === 0) { - return null; - } - - const entityNames: string[] = []; - - if (hasHeroFilter) { - for (const heroName of selectedHeroNames) { - entityNames.push(heroName.toLowerCase()); - } - } - - if (hasItemFilter) { - for (const itemName of selectedItemNames) { - entityNames.push(itemName.toLowerCase()); - } - } - - const query = searchQuery.toLowerCase().trim(); - - const filteredNotes = notes.filter((note) => { - const noteText = note.text.toLowerCase(); - - if (hasSearchQuery && noteText.includes(query)) { - return true; - } - - if (entityNames.length > 0) { - return entityNames.some((entityName) => noteText.includes(entityName)); - } - - return false; - }); - - return filteredNotes.length > 0 ? filteredNotes : []; -} diff --git a/apps/web/src/routes/change/[id]/+page.svelte b/apps/web/src/routes/change/[id]/+page.svelte index 6650ef1..a85e6e7 100644 --- a/apps/web/src/routes/change/[id]/+page.svelte +++ b/apps/web/src/routes/change/[id]/+page.svelte @@ -91,12 +91,6 @@ {/if} - +

From c7299198b7ca324659f0619b5b050475e2f12185 Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Mon, 15 Dec 2025 12:16:39 -0600 Subject: [PATCH 5/7] wip --- .../{change-card => }/ChangeCard.svelte | 2 +- .../components/changelog/ChangeHeader.svelte | 67 ------ .../changelog/ChangeListItem.svelte | 90 -------- .../lib/components/changelog/Changelog.svelte | 151 ++----------- .../components/changelog/ChangelogCard.svelte | 200 ++++++++++++++++++ .../changelog/ChangelogContent.svelte | 2 +- .../changelog/ChangelogSkeleton.svelte | 50 ----- .../changelog/LatestUpdateBanner.svelte | 126 ----------- .../components/changelog/change-card/index.ts | 1 - .../web/src/lib/components/changelog/index.ts | 3 +- .../components/gutter-line/GutterLine.svelte | 1 - .../components/gutter-line/GutterNode.svelte | 24 --- .../src/lib/components/gutter-line/index.ts | 2 - .../src/lib/components/header/Header.svelte | 4 +- .../ui/toggle-group/toggle-group.svelte | 8 +- apps/web/src/routes/+page.svelte | 52 ----- 16 files changed, 231 insertions(+), 552 deletions(-) rename apps/web/src/lib/components/changelog/{change-card => }/ChangeCard.svelte (97%) delete mode 100644 apps/web/src/lib/components/changelog/ChangeHeader.svelte delete mode 100644 apps/web/src/lib/components/changelog/ChangeListItem.svelte create mode 100644 apps/web/src/lib/components/changelog/ChangelogCard.svelte delete mode 100644 apps/web/src/lib/components/changelog/ChangelogSkeleton.svelte delete mode 100644 apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte delete mode 100644 apps/web/src/lib/components/changelog/change-card/index.ts delete mode 100644 apps/web/src/lib/components/gutter-line/GutterLine.svelte delete mode 100644 apps/web/src/lib/components/gutter-line/GutterNode.svelte delete mode 100644 apps/web/src/lib/components/gutter-line/index.ts diff --git a/apps/web/src/lib/components/changelog/change-card/ChangeCard.svelte b/apps/web/src/lib/components/changelog/ChangeCard.svelte similarity index 97% rename from apps/web/src/lib/components/changelog/change-card/ChangeCard.svelte rename to apps/web/src/lib/components/changelog/ChangeCard.svelte index 359c365..e9e8c9e 100644 --- a/apps/web/src/lib/components/changelog/change-card/ChangeCard.svelte +++ b/apps/web/src/lib/components/changelog/ChangeCard.svelte @@ -1,5 +1,5 @@ - -
-
- -
-

- {formatDate(date)} -

-
- - - - {author.slice(0, 2).toUpperCase()} - - - - By {author} at {formatTime(date)} - -
-
- -
-
- {#if icons?.heroes} - - {/if} - {#if icons?.items} - - {/if} -
- -
-
diff --git a/apps/web/src/lib/components/changelog/ChangeListItem.svelte b/apps/web/src/lib/components/changelog/ChangeListItem.svelte deleted file mode 100644 index a76d0de..0000000 --- a/apps/web/src/lib/components/changelog/ChangeListItem.svelte +++ /dev/null @@ -1,90 +0,0 @@ - - -
- - - {#if entryIndex > 0} -
- {/if} - - - - - -
- {#if browser} - - {/if} -
-
-
-
diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index 3d1e045..50c838b 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -1,7 +1,6 @@ -
+
{#if query.isError}
@@ -231,65 +157,30 @@ {/if} {#if query.isPending && !query.data} -
- {#each { length: 6 }, i (i)} +
+ {#each { length: 12 }, i (i)}
{/each}
{/if} - {#if !query.isError && query.data} - {#if flattenedEntries.length > 0} - - {#if latestEntry} -
- 0} +
+ {#each filteredChangelogs as entry, i (entry.id)} + -
- {/if} - - - {#if historyEntries.length > 0} -
-
- -

- Change History -

-
-
-
- -
- {#each historyEntries as entry, i (entry.id)} - - {/each} -
- {/if} + {/each} +
{:else}
@@ -324,7 +215,7 @@ > Load more changes - {:else if !query.hasNextPage && flattenedEntries.length > 0} + {:else if !query.hasNextPage && filteredChangelogs.length > 0}

All changes loaded

{/if}
diff --git a/apps/web/src/lib/components/changelog/ChangelogCard.svelte b/apps/web/src/lib/components/changelog/ChangelogCard.svelte new file mode 100644 index 0000000..82c635a --- /dev/null +++ b/apps/web/src/lib/components/changelog/ChangelogCard.svelte @@ -0,0 +1,200 @@ + + +{#if isLatest} + +
+ +
+

+ Latest Update +

+

+ {formatDate(date)} +

+
+ + + + {author.slice(0, 2).toUpperCase()} + + + {author} +
+ + {#if heroIcons.length > 0} +
+
+ {#each heroIcons as icon (icon.id)} + {icon.alt} + {/each} +
+ {#if heroRemaining > 0} + +{heroRemaining} + {/if} +
+ {/if} + + {#if itemIcons.length > 0} +
+
+ {#each itemIcons as icon (icon.id)} + {icon.alt} + {/each} +
+ {#if itemRemaining > 0} + +{itemRemaining} + {/if} +
+ {/if} + +
+ {#if heroCount > 0} + {heroCount} hero{heroCount !== 1 ? 'es' : ''} + {/if} + {#if itemCount > 0} + {itemCount} item{itemCount !== 1 ? 's' : ''} + {/if} +
+
+ +
+ + View full patch + + +
+
+{:else} + +
+ +
+
+

+ {formatDate(date)} +

+
+ + + + {author.slice(0, 2).toUpperCase()} + + + {author} +
+
+
+ + {#if heroIcons.length > 0} +
+
+ {#each heroIcons as icon (icon.id)} + {icon.alt} + {/each} +
+ {#if heroRemaining > 0} + +{heroRemaining} + {/if} +
+ {/if} + + {#if itemIcons.length > 0} +
0} + class:mt-auto={heroIcons.length === 0} + > +
+ {#each itemIcons as icon (icon.id)} + {icon.alt} + {/each} +
+ {#if itemRemaining > 0} + +{itemRemaining} + {/if} +
+ {/if} + +
+ {#if heroCount > 0} + {heroCount} hero{heroCount !== 1 ? 'es' : ''} + {/if} + {#if itemCount > 0} + {itemCount} item{itemCount !== 1 ? 's' : ''} + {/if} +
+
+{/if} diff --git a/apps/web/src/lib/components/changelog/ChangelogContent.svelte b/apps/web/src/lib/components/changelog/ChangelogContent.svelte index 62417c1..a808155 100644 --- a/apps/web/src/lib/components/changelog/ChangelogContent.svelte +++ b/apps/web/src/lib/components/changelog/ChangelogContent.svelte @@ -1,5 +1,5 @@ - - - - -
-
- - - -
- - -
-
- - -
-
- - - -
-
-
- - -
- - - - -
- - - -
-
diff --git a/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte b/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte deleted file mode 100644 index aa6c00a..0000000 --- a/apps/web/src/lib/components/changelog/LatestUpdateBanner.svelte +++ /dev/null @@ -1,126 +0,0 @@ - - -
- - - - -
- - - -
-
- -
-
- - - Latest Update - -
-

- {formatDate(date)} -

-
- - - - {author.slice(0, 2).toUpperCase()} - - - - By {author} at {formatTime( - date - )} - -
-
- -
-
- {#if icons?.heroes} - - {/if} - {#if icons?.items} - - {/if} -
- -
-
- -
- {#if browser} - - {/if} -
-
-
-
diff --git a/apps/web/src/lib/components/changelog/change-card/index.ts b/apps/web/src/lib/components/changelog/change-card/index.ts deleted file mode 100644 index 38f5296..0000000 --- a/apps/web/src/lib/components/changelog/change-card/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as ChangeCard } from './ChangeCard.svelte'; diff --git a/apps/web/src/lib/components/changelog/index.ts b/apps/web/src/lib/components/changelog/index.ts index 9066c58..7980235 100644 --- a/apps/web/src/lib/components/changelog/index.ts +++ b/apps/web/src/lib/components/changelog/index.ts @@ -1,9 +1,8 @@ export { default as Changelog } from './Changelog.svelte'; +export { default as ChangelogCard } from './ChangelogCard.svelte'; export { default as ChangelogContent } from './ChangelogContent.svelte'; -export { default as ChangelogSkeleton } from './ChangelogSkeleton.svelte'; export { default as EntityPreview } from './EntityPreview.svelte'; export { default as EntityTooltip } from './EntityTooltip.svelte'; -export { default as LatestUpdateBanner } from './LatestUpdateBanner.svelte'; export { default as NoteWithPatterns } from './NoteWithPatterns.svelte'; export { default as PatchPreviewCard } from './PatchPreviewCard.svelte'; export { default as PatchTimeline } from './PatchTimeline.svelte'; diff --git a/apps/web/src/lib/components/gutter-line/GutterLine.svelte b/apps/web/src/lib/components/gutter-line/GutterLine.svelte deleted file mode 100644 index 87dde33..0000000 --- a/apps/web/src/lib/components/gutter-line/GutterLine.svelte +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/web/src/lib/components/gutter-line/GutterNode.svelte b/apps/web/src/lib/components/gutter-line/GutterNode.svelte deleted file mode 100644 index 14eaea9..0000000 --- a/apps/web/src/lib/components/gutter-line/GutterNode.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - -
- {#if bigUpdate} - - {:else} -
- {/if} -
diff --git a/apps/web/src/lib/components/gutter-line/index.ts b/apps/web/src/lib/components/gutter-line/index.ts deleted file mode 100644 index 479f45c..0000000 --- a/apps/web/src/lib/components/gutter-line/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as GutterLine } from './GutterLine.svelte'; -export { default as GutterNode } from './GutterNode.svelte'; diff --git a/apps/web/src/lib/components/header/Header.svelte b/apps/web/src/lib/components/header/Header.svelte index 8c180d3..a9f4ba9 100644 --- a/apps/web/src/lib/components/header/Header.svelte +++ b/apps/web/src/lib/components/header/Header.svelte @@ -18,9 +18,7 @@ class="font-display text-primary group-hover:text-primary/90 text-2xl tracking-tight transition-colors duration-300" >deadlog.io - + deadlock changelog viewer diff --git a/apps/web/src/lib/components/ui/toggle-group/toggle-group.svelte b/apps/web/src/lib/components/ui/toggle-group/toggle-group.svelte index f69f176..d9b72bc 100644 --- a/apps/web/src/lib/components/ui/toggle-group/toggle-group.svelte +++ b/apps/web/src/lib/components/ui/toggle-group/toggle-group.svelte @@ -24,8 +24,12 @@ }: ToggleGroupPrimitive.RootProps & ToggleVariants = $props(); setToggleGroupCtx({ - variant, - size + get variant() { + return variant; + }, + get size() { + return size; + } }); diff --git a/apps/web/src/routes/+page.svelte b/apps/web/src/routes/+page.svelte index ca610ef..67d9bc0 100644 --- a/apps/web/src/routes/+page.svelte +++ b/apps/web/src/routes/+page.svelte @@ -2,9 +2,6 @@ import { MetaTags } from 'svelte-meta-tags'; import { Changelog } from '$lib/components/changelog'; import { ScrollToTop } from '$lib/components/scroll-to-top'; - import { Badge } from '$lib/components/ui/badge'; - import { formatDate } from '@deadlog/utils'; - import ArrowRight from '@lucide/svelte/icons/arrow-right'; import type { PageData } from './$types'; import { getSearchParams } from '$lib/stores/searchParams.svelte'; @@ -12,12 +9,8 @@ const title = $derived(data.title); const description = $derived(data.description); const image = $derived(data.image); - const latestPatch = $derived(data.latestPatchSummary); const params = getSearchParams(); - const isFiltered = $derived( - params.hero.length > 0 || params.item.length > 0 || params.q.length > 0 - ); const canonical = $derived.by(() => params.toURLSearchParams().toString() === '' ? 'https://deadlog.io' @@ -50,50 +43,5 @@ }} /> - -{#if !isFiltered && latestPatch} -
-
- -
- -
-
-

- Latest Update -

-

- {formatDate(latestPatch.date)} -

-
- {#if latestPatch.heroCount > 0} - - {latestPatch.heroCount} hero{latestPatch.heroCount !== 1 ? 'es' : ''} - - {/if} - {#if latestPatch.itemCount > 0} - - {latestPatch.itemCount} item{latestPatch.itemCount !== 1 ? 's' : ''} - - {/if} -
-
- - - View full patch - - -
-
-
-{/if} - From dbf84617d383308237f4f69d0281e90b5e5921ae Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Mon, 15 Dec 2025 17:56:06 -0600 Subject: [PATCH 6/7] wip --- .../lib/components/changelog/Changelog.svelte | 86 +-------- .../changelog/ChangelogContent.svelte | 161 +++++++--------- .../components/filter-bar/FilterInput.svelte | 128 +++--------- .../filter-bar/filterState.svelte.ts | 113 +++++++++++ .../src/lib/hooks/useChangelogQuery.svelte.ts | 100 ++++++++++ apps/web/src/lib/utils/filterChanges.ts | 182 ++++++++---------- 6 files changed, 404 insertions(+), 366 deletions(-) create mode 100644 apps/web/src/lib/components/filter-bar/filterState.svelte.ts create mode 100644 apps/web/src/lib/hooks/useChangelogQuery.svelte.ts diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index 50c838b..563b5de 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -13,8 +13,7 @@ getSelectedHeroObjects, getSelectedItemObjects } from '$lib/utils/selectedEntities.svelte'; - import { createInfiniteQuery } from '@tanstack/svelte-query'; - import { useIntersectionObserver } from 'runed'; + import { useChangelogQuery } from '$lib/hooks/useChangelogQuery.svelte'; import AlertCircle from '@lucide/svelte/icons/alert-circle'; import Frown from '@lucide/svelte/icons/frown'; @@ -24,78 +23,13 @@ const initialLoadCount = $derived(page.data.initialLoadCount ?? 12); const totalCount = $derived(page.data.totalCount ?? 0); - interface PageData { - changelogs: FilteredChangelog[]; - hasMore: boolean; - } - interface InfiniteData { - pages: PageData[]; - pageParams: number[]; - } - - const query = createInfiniteQuery< - PageData, - Error, - InfiniteData, - (string | string[])[], - number - >(() => ({ - queryKey: ['changelogs', params.hero, params.item, params.q], - enabled: true, - initialData: { - pages: [ - { - changelogs, - hasMore: - totalCount > 0 - ? totalCount > initialLoadCount - : changelogs.length === initialLoadCount - } - ], - pageParams: [0] - }, - queryFn: async ({ pageParam }) => { - const limit = 12; - const offset = initialLoadCount + (pageParam - 1) * limit; - const searchParams = params.toURLSearchParams(); - searchParams.set('limit', String(limit)); - searchParams.set('offset', String(offset)); - - const url = `/api/changelogs?${searchParams.toString()}`; - const response = await fetch(url); - - if (!response.ok) { - throw new Error(`Failed to fetch changelogs: ${response.statusText}`); - } - - return (await response.json()) as PageData; - }, - getNextPageParam: (lastPage, pages) => { - return lastPage.hasMore ? pages.length : undefined; - }, - initialPageParam: 0 - })); - - let trigger = $state(null); - - useIntersectionObserver( - () => trigger, - (entries) => { - const entry = entries[0]; - if (!entry) return; + const queryState = useChangelogQuery({ + getInitialChangelogs: () => changelogs, + getInitialLoadCount: () => initialLoadCount, + getTotalCount: () => totalCount + }); - if ( - entry.isIntersecting && - query.hasNextPage && - !query.isFetchingNextPage && - !query.isFetching && - query.status !== 'error' - ) { - query.fetchNextPage(); - } - }, - { threshold: 0.1 } - ); + const query = $derived(queryState.query); const filterState = $derived.by( (): FilterState => ({ @@ -112,9 +46,7 @@ ); const filteredChangelogs = $derived.by(() => { - const allChangelogs = ((query.data?.pages || []) as PageData[]).flatMap( - (page) => page.changelogs - ); + const allChangelogs = (query.data?.pages ?? []).flatMap((p) => p.changelogs); if (!isFiltered) return allChangelogs; @@ -200,7 +132,7 @@
{/if} -
+
{#if query.isFetchingNextPage}
getItemImageFromMap(itemId, itemMap); +{#snippet section(value: string, title: string, count: number, children: Snippet)} + + +

+ {title} ({count}) +

+
+
+ + {@render children()} + +
+{/snippet} + +{#snippet generalContent()} +
    + {#each contentJson?.notes ?? [] as note, i (i)} +
  • + +
  • + {/each} +
+{/snippet} + +{#snippet heroesContent()} +
+ {#each visibleHeroes as [heroName, heroData] (heroName)} + + {/each} +
+{/snippet} + +{#snippet itemsContent()} +
+ {#each visibleItems as [itemName, itemData] (itemName)} + + {/each} +
+{/snippet} + +{#snippet abilitiesContent()} +
+ {#each Object.entries(contentJson?.abilities ?? {}) as [abilityName, abilityData] (abilityName)} + + {/each} +
+{/snippet} +
{#if contentJson} {#if contentJson.notes.length > 0} - - -

- General Changes ({contentJson.notes.length}) -

-
-
- -
    - {#each contentJson.notes as note, i (i)} -
  • - -
  • - {/each} -
-
-
+ {@render section( + 'general', + 'General Changes', + contentJson.notes.length, + generalContent + )} {/if} {#if visibleHeroes.length > 0} - - -

- Hero Changes ({visibleHeroes.length}) -

-
-
- -
- {#each visibleHeroes as [heroName, heroData] (heroName)} - - {/each} -
-
-
+ {@render section('heroes', 'Hero Changes', visibleHeroes.length, heroesContent)} {/if} {#if visibleItems.length > 0} - - -

- Item Changes ({visibleItems.length}) -

-
-
- -
- {#each visibleItems as [itemName, itemData] (itemName)} - - {/each} -
-
-
+ {@render section('items', 'Item Changes', visibleItems.length, itemsContent)} {/if} {#if Object.keys(contentJson.abilities).length > 0} - - -

- Ability Changes ({Object.keys(contentJson.abilities).length}) -

-
-
- -
- {#each Object.entries(contentJson.abilities) as [abilityName, abilityData] (abilityName)} - - {/each} -
-
-
+ {@render section( + 'abilities', + 'Ability Changes', + Object.keys(contentJson.abilities).length, + abilitiesContent + )} {/if}
{/if} diff --git a/apps/web/src/lib/components/filter-bar/FilterInput.svelte b/apps/web/src/lib/components/filter-bar/FilterInput.svelte index b7e9481..36bba16 100644 --- a/apps/web/src/lib/components/filter-bar/FilterInput.svelte +++ b/apps/web/src/lib/components/filter-bar/FilterInput.svelte @@ -16,116 +16,36 @@ getSelectedItemObjects } from '$lib/utils/selectedEntities.svelte'; import { getHeroImage, getItemImage } from '$lib/utils/entityImages'; - import { toggleArray } from '$lib/utils/toggle'; + import { FilterState } from './filterState.svelte'; const params = getSearchParams(); const selectedHeroObjects = $derived(getSelectedHeroObjects()); const selectedItemObjects = $derived(getSelectedItemObjects()); - const heroes = $derived(page.data.heroes ?? []); - const items = $derived(page.data.items ?? []); + const filterState = new FilterState( + () => page.data.heroes ?? [], + () => page.data.items ?? [] + ); let open = $state(false); let sheetOpen = $state(false); - let inputValue = $state(params.q); - let filterMode = $state<'all' | 'heroes' | 'items'>('all'); - - const filteredHeroes = $derived( - heroes - .filter((hero: EnrichedHero) => { - if (!hero.isReleased) return false; - if (filterMode === 'items') return false; - if (!inputValue) return true; - return hero.name.toLowerCase().includes(inputValue.toLowerCase()); - }) - .sort((a: EnrichedHero, b: EnrichedHero) => { - const aSelected = params.hero.includes(a.name); - const bSelected = params.hero.includes(b.name); - if (aSelected && !bSelected) return -1; - if (!aSelected && bSelected) return 1; - return a.name.localeCompare(b.name); - }) - ); - - const filteredItems = $derived( - items - .filter((item: EnrichedItem) => { - if (filterMode === 'heroes') return false; - if (!item.name || item.name.trim() === '' || item.name.includes('_')) - return false; - if (!item.isReleased) return false; - if (!inputValue) return true; - return item.name.toLowerCase().includes(inputValue.toLowerCase()); - }) - .sort((a: EnrichedItem, b: EnrichedItem) => { - const aSelected = params.item.includes(a.name); - const bSelected = params.item.includes(b.name); - if (aSelected && !bSelected) return -1; - if (!aSelected && bSelected) return 1; - return a.name.localeCompare(b.name); - }) - ); - - type MergedEntity = - | { type: 'hero'; data: EnrichedHero; isSelected: boolean } - | { type: 'item'; data: EnrichedItem; isSelected: boolean }; - - const mergedList = $derived.by(() => { - if (filterMode !== 'all') return []; - - const heroEntities: MergedEntity[] = filteredHeroes.map((hero: EnrichedHero) => ({ - type: 'hero' as const, - data: hero, - isSelected: params.hero.includes(hero.name) - })); - - const itemEntities = filteredItems.map( - (item: EnrichedItem) => - ({ - type: 'item' as const, - data: item, - isSelected: params.item.includes(item.name) - }) satisfies MergedEntity - ); - - return [...heroEntities, ...itemEntities].sort((a, b) => { - if (a.isSelected && !b.isSelected) return -1; - if (!a.isSelected && b.isSelected) return 1; - return a.data.name.localeCompare(b.data.name); - }); - }); - - function selectHero(heroId: number) { - const hero = heroes.find((h: EnrichedHero) => h.id === heroId); - if (hero) { - params.hero = toggleArray(params.hero, hero.name); - } - } - - function selectItem(itemId: number) { - const item = items.find((i: EnrichedItem) => i.id === itemId); - if (item) { - params.item = toggleArray(params.item, item.name); - } - } function clearAll() { open = false; - inputValue = ''; - params.reset(); + filterState.clearAll(); } function handleSubmit(e: Event) { e.preventDefault(); - params.update({ q: inputValue }); + filterState.updateSearch(); open = false; } {#snippet filterContent()}
- + All Heroes Items @@ -134,13 +54,13 @@ - {#if (filterMode === 'all' && mergedList.length === 0) || (filterMode !== 'all' && filteredHeroes.length === 0 && filteredItems.length === 0)} + {#if (filterState.filterMode === 'all' && filterState.mergedList.length === 0) || (filterState.filterMode !== 'all' && filterState.filteredHeroes.length === 0 && filterState.filteredItems.length === 0)} No results found. - {:else if filterMode === 'all'} + {:else if filterState.filterMode === 'all'} - {#each mergedList as entity (entity.type === 'hero' ? `hero-${entity.data.id}` : `item-${entity.data.id}`)} + {#each filterState.mergedList as entity (entity.type === 'hero' ? `hero-${entity.data.id}` : `item-${entity.data.id}`)} entity.type === 'hero' - ? selectHero(entity.data.id) - : selectItem(entity.data.id)} + ? filterState.selectHero(entity.data.id) + : filterState.selectItem(entity.data.id)} /> {/each} {:else} - {#if filteredHeroes.length > 0} + {#if filterState.filteredHeroes.length > 0} - {#each filteredHeroes as hero (hero.id)} + {#each filterState.filteredHeroes as hero (hero.id)} selectHero(hero.id)} + onSelect={() => filterState.selectHero(hero.id)} /> {/each} {/if} - {#if filteredItems.length > 0} + {#if filterState.filteredItems.length > 0} - {#each filteredItems as item (item.id)} + {#each filterState.filteredItems as item (item.id)} selectItem(item.id)} + onSelect={() => filterState.selectItem(item.id)} /> {/each} @@ -196,7 +116,7 @@ selectHero(hero.id)} + onRemove={() => filterState.selectHero(hero.id)} badgeColor="hero" /> {/each} @@ -204,7 +124,7 @@ selectItem(item.id)} + onRemove={() => filterState.selectItem(item.id)} badgeColor="item" /> {/each} @@ -214,7 +134,7 @@ type="text" placeholder="Add more filters or search..." class="placeholder:text-muted-foreground hidden min-w-0 flex-1 bg-transparent outline-none sm:block sm:min-w-[200px]" - bind:value={inputValue} + bind:value={filterState.inputValue} onfocus={() => (open = true)} onkeydown={(e) => !open && e.key !== 'Escape' && (open = true)} /> diff --git a/apps/web/src/lib/components/filter-bar/filterState.svelte.ts b/apps/web/src/lib/components/filter-bar/filterState.svelte.ts new file mode 100644 index 0000000..b971f76 --- /dev/null +++ b/apps/web/src/lib/components/filter-bar/filterState.svelte.ts @@ -0,0 +1,113 @@ +import { getSearchParams } from '$lib/stores/searchParams.svelte'; +import type { EnrichedHero, EnrichedItem } from '$lib/utils/types'; +import { toggleArray } from '$lib/utils/toggle'; + +export type FilterMode = 'all' | 'heroes' | 'items'; + +export type MergedEntity = + | { type: 'hero'; data: EnrichedHero; isSelected: boolean } + | { type: 'item'; data: EnrichedItem; isSelected: boolean }; + +export class FilterState { + filterMode = $state('all'); + inputValue = $state(''); + + #params = getSearchParams(); + #getHeroes: () => EnrichedHero[]; + #getItems: () => EnrichedItem[]; + + constructor(getHeroes: () => EnrichedHero[], getItems: () => EnrichedItem[]) { + this.#getHeroes = getHeroes; + this.#getItems = getItems; + this.inputValue = this.#params.q; + } + + filteredHeroes = $derived.by(() => { + return this.#getHeroes() + .filter((hero) => { + if (!hero.isReleased) return false; + if (this.filterMode === 'items') return false; + if (!this.inputValue) return true; + return hero.name.toLowerCase().includes(this.inputValue.toLowerCase()); + }) + .sort((a, b) => { + const aSelected = this.#params.hero.includes(a.name); + const bSelected = this.#params.hero.includes(b.name); + if (aSelected && !bSelected) return -1; + if (!aSelected && bSelected) return 1; + return a.name.localeCompare(b.name); + }); + }); + + filteredItems = $derived.by(() => { + return this.#getItems() + .filter((item) => { + if (this.filterMode === 'heroes') return false; + if (!item.name || item.name.trim() === '' || item.name.includes('_')) + return false; + if (!item.isReleased) return false; + if (!this.inputValue) return true; + return item.name.toLowerCase().includes(this.inputValue.toLowerCase()); + }) + .sort((a, b) => { + const aSelected = this.#params.item.includes(a.name); + const bSelected = this.#params.item.includes(b.name); + if (aSelected && !bSelected) return -1; + if (!aSelected && bSelected) return 1; + return a.name.localeCompare(b.name); + }); + }); + + mergedList = $derived.by((): MergedEntity[] => { + if (this.filterMode !== 'all') return []; + + const heroes: MergedEntity[] = this.filteredHeroes.map((hero) => ({ + type: 'hero', + data: hero, + isSelected: this.#params.hero.includes(hero.name) + })); + + const items: MergedEntity[] = this.filteredItems.map((item) => ({ + type: 'item', + data: item, + isSelected: this.#params.item.includes(item.name) + })); + + return [...heroes, ...items].sort((a, b) => { + if (a.isSelected && !b.isSelected) return -1; + if (!a.isSelected && b.isSelected) return 1; + return a.data.name.localeCompare(b.data.name); + }); + }); + + isHeroSelected(heroName: string): boolean { + return this.#params.hero.includes(heroName); + } + + isItemSelected(itemName: string): boolean { + return this.#params.item.includes(itemName); + } + + selectHero(heroId: number) { + const hero = this.#getHeroes().find((h) => h.id === heroId); + if (hero) { + this.#params.hero = toggleArray(this.#params.hero, hero.name); + } + } + + selectItem(itemId: number) { + const item = this.#getItems().find((i) => i.id === itemId); + if (item) { + this.#params.item = toggleArray(this.#params.item, item.name); + } + } + + clearAll() { + this.inputValue = ''; + this.#params.reset(); + } + + updateSearch() { + this.#params.update({ q: this.inputValue }); + } +} diff --git a/apps/web/src/lib/hooks/useChangelogQuery.svelte.ts b/apps/web/src/lib/hooks/useChangelogQuery.svelte.ts new file mode 100644 index 0000000..e2e7670 --- /dev/null +++ b/apps/web/src/lib/hooks/useChangelogQuery.svelte.ts @@ -0,0 +1,100 @@ +import { createInfiniteQuery } from '@tanstack/svelte-query'; +import { useIntersectionObserver } from 'runed'; +import type { FilteredChangelog } from '$lib/utils/filterChanges'; +import { getSearchParams } from '$lib/stores/searchParams.svelte'; +import { queryKeys } from '$lib/queries/keys'; + +interface PageData { + changelogs: FilteredChangelog[]; + hasMore: boolean; +} + +interface InfiniteData { + pages: PageData[]; + pageParams: number[]; +} + +interface UseChangelogQueryOptions { + getInitialChangelogs: () => FilteredChangelog[]; + getInitialLoadCount: () => number; + getTotalCount: () => number; +} + +const PAGE_SIZE = 12; + +export function useChangelogQuery(options: UseChangelogQueryOptions) { + const params = getSearchParams(); + let trigger = $state(null); + + const query = createInfiniteQuery< + PageData, + Error, + InfiniteData, + ReturnType, + number + >(() => ({ + queryKey: queryKeys.changelogsList({ + hero: params.hero, + item: params.item, + q: params.q + }), + enabled: true, + initialData: { + pages: [ + { + changelogs: options.getInitialChangelogs(), + hasMore: + options.getTotalCount() > 0 + ? options.getTotalCount() > options.getInitialLoadCount() + : options.getInitialChangelogs().length === options.getInitialLoadCount() + } + ], + pageParams: [0] + }, + queryFn: async ({ pageParam }) => { + const offset = options.getInitialLoadCount() + (pageParam - 1) * PAGE_SIZE; + const searchParams = params.toURLSearchParams(); + searchParams.set('limit', String(PAGE_SIZE)); + searchParams.set('offset', String(offset)); + + const response = await fetch(`/api/changelogs?${searchParams.toString()}`); + + if (!response.ok) { + throw new Error(`Failed to fetch changelogs: ${response.statusText}`); + } + + return (await response.json()) as PageData; + }, + getNextPageParam: (lastPage, pages) => (lastPage.hasMore ? pages.length : undefined), + initialPageParam: 0 + })); + + useIntersectionObserver( + () => trigger, + (entries) => { + const entry = entries[0]; + if ( + entry?.isIntersecting && + query.hasNextPage && + !query.isFetchingNextPage && + !query.isFetching && + query.status !== 'error' + ) { + query.fetchNextPage(); + } + }, + { threshold: 0.1 } + ); + + return { + get query() { + return query; + }, + get trigger() { + return trigger; + }, + set trigger(el: HTMLDivElement | null) { + trigger = el; + } + }; +} diff --git a/apps/web/src/lib/utils/filterChanges.ts b/apps/web/src/lib/utils/filterChanges.ts index 718b65c..96c0717 100644 --- a/apps/web/src/lib/utils/filterChanges.ts +++ b/apps/web/src/lib/utils/filterChanges.ts @@ -1,6 +1,5 @@ import type { ChangelogContentJson, Note } from '@deadlog/db'; -import type { EntityType, EntityIcon } from '@deadlog/scraper'; -import { ENTITY_TYPES } from '@deadlog/scraper'; +import type { EntityIcon } from '@deadlog/scraper'; export interface FilterState { selectedHeroNames: ReadonlySet; @@ -24,99 +23,100 @@ export interface FilteredChangelog { majorUpdate?: boolean; } -type EntityKey = 'heroes' | 'items'; +type EntityContentMap = Readonly< + Record +>; -interface EntityData { - id?: number; - notes?: readonly Note[]; -} - -type EntityContentMap = Readonly>; - -function collectContentNames( - content?: EntityContentMap, - selectedNames?: ReadonlySet, - searchQuery?: string +/** Collect entity names from content, optionally filtering by selection and/or search query */ +function collectNames( + content: EntityContentMap | undefined, + selected?: ReadonlySet, + query?: string ): Set { - const names = new Set(); - if (!content) return names; + if (!content) return new Set(); - const query = searchQuery?.toLowerCase().trim(); + const normalizedQuery = query?.toLowerCase().trim(); + const result = new Set(); - for (const [entityName, entityData] of Object.entries(content)) { - // Check if this entity is selected (if filter exists) - if (selectedNames && !selectedNames.has(entityName)) continue; + for (const [name, data] of Object.entries(content)) { + if (selected && !selected.has(name)) continue; - if (query) { - const nameMatches = entityName.toLowerCase().includes(query); - const notesMatch = entityData.notes?.some((note) => - note.text.toLowerCase().includes(query) + if (normalizedQuery) { + const matchesName = name.toLowerCase().includes(normalizedQuery); + const matchesNotes = data.notes?.some((n) => + n.text.toLowerCase().includes(normalizedQuery) ); - if (nameMatches || notesMatch) { - names.add(entityName); - } - } else { - names.add(entityName); + if (!matchesName && !matchesNotes) continue; } + + result.add(name); } - return names; + return result; +} + +/** Check if search query matches changelog title or general notes */ +function matchesGeneralContent(changelog: FilteredChangelog, query: string): boolean { + const q = query.toLowerCase().trim(); + if (!q) return false; + return ( + changelog.title.toLowerCase().includes(q) || + changelog.contentJson?.notes?.some((n) => n.text.toLowerCase().includes(q)) || + false + ); } -function getVisibleEntityNames( +/** Core logic for getting visible entity names based on filters */ +function getVisibleNames( changelog: FilteredChangelog, - filterState: FilterState, - entityType: EntityType, - selectedNames: ReadonlySet, - otherSelectedNames: ReadonlySet + entityKey: 'heroes' | 'items', + selected: ReadonlySet, + otherSelected: ReadonlySet, + searchQuery: string ): Set | null { - const { searchQuery } = filterState; - const entityKey: EntityKey = entityType === ENTITY_TYPES.HERO ? 'heroes' : 'items'; + const hasFilter = selected.size > 0; + const hasOtherFilter = otherSelected.size > 0; + const query = searchQuery.trim(); - const hasFilter = selectedNames.size > 0; - const hasOtherFilter = otherSelectedNames.size > 0; - const hasSearchQuery = searchQuery.trim().length > 0; - - if (!hasFilter && !hasSearchQuery) { - return hasOtherFilter ? new Set() : null; + // No filters active - show all (null) or none if other type is filtered + if (!hasFilter && !query) { + return hasOtherFilter ? new Set() : null; } const content = changelog.contentJson?.[entityKey] as EntityContentMap | undefined; - const query = searchQuery.toLowerCase().trim(); - if (hasFilter && !hasSearchQuery) { - return collectContentNames(content, selectedNames); + // Only entity filter (no search) - show selected entities + if (hasFilter && !query) { + return collectNames(content, selected); } - if ( - changelog.title.toLowerCase().includes(query) || - changelog.contentJson?.notes?.some((note) => note.text.toLowerCase().includes(query)) - ) { - return collectContentNames(content); + // Search matches title/general notes - show all entities of this type + if (matchesGeneralContent(changelog, query)) { + return collectNames(content); } - const visibleNames = collectContentNames(content, undefined, query); - + // Search by query, then intersect with selection if needed + const matched = collectNames(content, undefined, query); if (hasFilter) { - const filtered = new Set(); - for (const name of visibleNames) { - if (selectedNames.has(name)) filtered.add(name); + const intersected = new Set(); + for (const name of matched) { + if (selected.has(name)) intersected.add(name); } - return filtered; + return intersected; } - return visibleNames.size > 0 ? visibleNames : null; + return matched.size > 0 ? matched : null; } export function getVisibleHeroNames( changelog: FilteredChangelog, filterState: FilterState ): Set | null { - return getVisibleEntityNames( + return getVisibleNames( changelog, - filterState, - ENTITY_TYPES.HERO, + 'heroes', filterState.selectedHeroNames, - filterState.selectedItemNames + filterState.selectedItemNames, + filterState.searchQuery ); } @@ -124,30 +124,28 @@ export function getVisibleItemNames( changelog: FilteredChangelog, filterState: FilterState ): Set | null { - return getVisibleEntityNames( + return getVisibleNames( changelog, - filterState, - ENTITY_TYPES.ITEM, + 'items', filterState.selectedItemNames, - filterState.selectedHeroNames + filterState.selectedHeroNames, + filterState.searchQuery ); } -function isEntityInGeneralNotesOnly( +/** Check if entity is mentioned in general notes but doesn't have its own section */ +function isMentionedOnlyInGeneralNotes( changelog: FilteredChangelog, entityName: string, - entityType: EntityType + entityKey: 'heroes' | 'items' ): boolean { - const entityKey: EntityKey = entityType === ENTITY_TYPES.HERO ? 'heroes' : 'items'; - const content = changelog.contentJson?.[entityKey]; - const hasContentSection = content && entityName in content; - if (hasContentSection) return false; + if (content && entityName in content) return false; return ( - changelog.contentJson?.notes?.some((note) => - note.text.toLowerCase().includes(entityName.toLowerCase()) - ) || false + changelog.contentJson?.notes?.some((n) => + n.text.toLowerCase().includes(entityName.toLowerCase()) + ) ?? false ); } @@ -156,36 +154,24 @@ export function shouldShowGeneralNotes( filterState: FilterState ): boolean { const { selectedHeroNames, selectedItemNames, searchQuery } = filterState; - const hasHeroFilter = selectedHeroNames.size > 0; - const hasItemFilter = selectedItemNames.size > 0; - const hasSearchQuery = searchQuery.trim().length > 0; + const query = searchQuery.trim(); - if (!hasHeroFilter && !hasItemFilter && !hasSearchQuery) { + // No filters - don't highlight general notes + if (!selectedHeroNames.size && !selectedItemNames.size && !query) { return false; } - if (hasSearchQuery) { - const query = searchQuery.toLowerCase().trim(); - const matchesGeneralNotes = changelog.contentJson?.notes?.some((note) => - note.text.toLowerCase().includes(query) - ); - if (matchesGeneralNotes) return true; + // Search query matches general notes + if (query && matchesGeneralContent(changelog, query)) { + return true; } - if (hasHeroFilter) { - for (const heroName of selectedHeroNames) { - if (isEntityInGeneralNotesOnly(changelog, heroName, ENTITY_TYPES.HERO)) { - return true; - } - } + // Check if any selected entity is only mentioned in general notes + for (const name of selectedHeroNames) { + if (isMentionedOnlyInGeneralNotes(changelog, name, 'heroes')) return true; } - - if (hasItemFilter) { - for (const itemName of selectedItemNames) { - if (isEntityInGeneralNotesOnly(changelog, itemName, ENTITY_TYPES.ITEM)) { - return true; - } - } + for (const name of selectedItemNames) { + if (isMentionedOnlyInGeneralNotes(changelog, name, 'items')) return true; } return false; From fd144c53189a083b818a8352154135de1be9c37a Mon Sep 17 00:00:00 2001 From: Drake Bott Date: Thu, 8 Jan 2026 00:21:09 -0600 Subject: [PATCH 7/7] Update, drop nx use pnpm workspaces --- .github/actions/setup-pipeline/action.yml | 12 - .github/workflows/deploy.yml | 6 +- .github/workflows/pr.yml | 2 +- .mcp.json | 8 - apps/web/package.json | 12 + apps/web/project.json | 73 - .../lib/components/changelog/Changelog.svelte | 97 +- .../components/changelog/ChangelogCard.svelte | 324 ++- .../changelog/PatchPreviewCard.svelte | 70 +- .../components/changelog/PatchTimeline.svelte | 82 +- apps/web/src/routes/hero/[slug]/+page.svelte | 352 ++- apps/web/src/routes/item/[slug]/+page.svelte | 323 ++- flake.lock | 34 +- libs/db/package.json | 17 + libs/meta/package.json | 17 + libs/scraper/package.json | 18 + libs/scraper/src/cache/posts/post-93983.json | 14 + libs/scraper/src/cache/posts/post-95233.json | 14 + libs/utils/package.json | 9 + nx.json | 33 - package.json | 19 +- pnpm-lock.yaml | 2440 +---------------- pnpm-workspace.yaml | 3 + 23 files changed, 1078 insertions(+), 2901 deletions(-) delete mode 100644 .mcp.json delete mode 100644 apps/web/project.json create mode 100644 libs/db/package.json create mode 100644 libs/meta/package.json create mode 100644 libs/scraper/package.json create mode 100644 libs/scraper/src/cache/posts/post-93983.json create mode 100644 libs/scraper/src/cache/posts/post-95233.json create mode 100644 libs/utils/package.json delete mode 100644 nx.json create mode 100644 pnpm-workspace.yaml diff --git a/.github/actions/setup-pipeline/action.yml b/.github/actions/setup-pipeline/action.yml index a10b2a9..fd1d736 100644 --- a/.github/actions/setup-pipeline/action.yml +++ b/.github/actions/setup-pipeline/action.yml @@ -6,11 +6,6 @@ inputs: description: GitHub token for Nix installation required: true -outputs: - dep-graph-path: - description: Path to the generated dependency graph file - value: ${{ steps.dep-graph.outputs.path }} - runs: using: composite steps: @@ -30,10 +25,3 @@ runs: - name: Install dependencies shell: bash run: pnpm install --frozen-lockfile - - - name: Generate dependency graph - id: dep-graph - shell: bash - run: | - pnpm exec nx dep-graph --file dep-graph.json - echo "path=dep-graph.json" >> $GITHUB_OUTPUT diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f07eab1..89797f4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -33,7 +33,9 @@ jobs: run: pnpm run lint - name: Build scraper and generate database - run: pnpm exec nx build scraper + run: pnpm run build:scraper + env: + DATABASE_URL: file:apps/web/static/deadlog.db - name: Export database to SQL run: | @@ -53,7 +55,7 @@ jobs: run: pnpm exec wrangler d1 execute deadlog --remote --file=deadlog-clean.sql --config=apps/web/wrangler.toml - name: Build web project - run: pnpm exec nx build web + run: pnpm run build env: CLOUDFLARE: true DATABASE_URL: file:apps/web/static/deadlog.db diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 8cb6b77..0fdbdc6 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -36,7 +36,7 @@ jobs: - name: Build web if: matrix.task == 'build' - run: pnpm exec nx build web + run: pnpm run build env: NODE_ENV: production diff --git a/.mcp.json b/.mcp.json deleted file mode 100644 index d78fd76..0000000 --- a/.mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "mcpServers": { - "svelte": { - "command": "bunx", - "args": ["@sveltejs/mcp"] - } - } -} diff --git a/apps/web/package.json b/apps/web/package.json index d65abcf..a04dea4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -3,7 +3,19 @@ "version": "1.0.0", "type": "module", "private": true, + "scripts": { + "dev": "DATABASE_URL=file:static/deadlog.db vite dev --port 5173", + "build": "DATABASE_URL=file:static/deadlog.db vite build", + "preview": "DATABASE_URL=file:static/deadlog.db vite preview --port 4173", + "prepare": "svelte-kit sync", + "check": "svelte-check --tsconfig tsconfig.json", + "test": "vitest run", + "lint": "eslint ." + }, "dependencies": { + "@deadlog/db": "workspace:*", + "@deadlog/scraper": "workspace:*", + "@deadlog/utils": "workspace:*", "@sveltejs/kit": "2.49.3", "svelte": "5.46.1" }, diff --git a/apps/web/project.json b/apps/web/project.json deleted file mode 100644 index 0e33514..0000000 --- a/apps/web/project.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "web", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/web/src", - "projectType": "application", - "targets": { - "dev": { - "executor": "nx:run-commands", - "dependsOn": ["^build", "prepare"], - "options": { - "command": "vite dev --port 5173", - "cwd": "apps/web", - "env": { - "DATABASE_URL": "file:static/deadlog.db" - } - } - }, - "build": { - "executor": "nx:run-commands", - "dependsOn": ["^build", "prepare"], - "outputs": ["{workspaceRoot}/dist/apps/web"], - "options": { - "command": "vite build", - "cwd": "apps/web", - "env": { - "DATABASE_URL": "file:static/deadlog.db" - } - } - }, - "preview": { - "executor": "nx:run-commands", - "dependsOn": ["build"], - "options": { - "command": "vite preview --port 4173", - "cwd": "apps/web", - "env": { - "DATABASE_URL": "file:static/deadlog.db" - } - } - }, - "prepare": { - "executor": "nx:run-commands", - "options": { - "command": "svelte-kit sync", - "cwd": "apps/web" - } - }, - "check": { - "executor": "nx:run-commands", - "dependsOn": ["prepare"], - "options": { - "command": "svelte-check --tsconfig apps/web/tsconfig.json" - } - }, - "test": { - "executor": "nx:run-commands", - "dependsOn": ["prepare"], - "options": { - "command": "vitest run", - "cwd": "apps/web" - } - }, - "lint": { - "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/web/**/*.{ts,js,svelte}"] - } - } - }, - "tags": [], - "implicitDependencies": ["scraper", "meta"] -} diff --git a/apps/web/src/lib/components/changelog/Changelog.svelte b/apps/web/src/lib/components/changelog/Changelog.svelte index 563b5de..74ce176 100644 --- a/apps/web/src/lib/components/changelog/Changelog.svelte +++ b/apps/web/src/lib/components/changelog/Changelog.svelte @@ -1,6 +1,6 @@ {#if isLatest} -
+ +
+ + +
+ +
+ +
+ +

+ Latest Update +

+
-
-

- Latest Update -

{formatDate(date)}

+
- + {author.slice(0, 2).toUpperCase()} - {author} + {author} +
+ + + {#if heroIcons.length > 0 || itemIcons.length > 0} +
+ {#if heroIcons.length > 0} +
+
+ {#each heroIcons as icon, i (icon.id)} + {icon.alt} + {/each} +
+ {#if heroRemaining > 0} + +{heroRemaining} + {/if} +
+ {/if} + + {#if itemIcons.length > 0} +
+
+ {#each itemIcons as icon, i (icon.id)} + {icon.alt} + {/each} +
+ {#if itemRemaining > 0} + +{itemRemaining} + {/if} +
+ {/if} +
+ {/if} + + +
+ {#if heroCount > 0} + + {heroCount} + hero{heroCount !== 1 ? 'es' : ''} + + {/if} + {#if itemCount > 0} + + {itemCount} + item{itemCount !== 1 ? 's' : ''} + + {/if} +
+
+ +
+ + View full patch + + +
+
+{:else} + + +
+ + +
+ +
+
+
+
+ +

+ {formatDate(date)} +

+
+
+ + + + {author.slice(0, 2).toUpperCase()} + + + {author} +
+
{#if heroIcons.length > 0} -
+
- {#each heroIcons as icon (icon.id)} + {#each heroIcons as icon, i (icon.id)} {icon.alt} {/each}
{#if heroRemaining > 0} - +{heroRemaining} + +{heroRemaining} {/if}
{/if} {#if itemIcons.length > 0} -
+
0}>
- {#each itemIcons as icon (icon.id)} + {#each itemIcons as icon, i (icon.id)} {icon.alt} {/each}
{#if itemRemaining > 0} - +{itemRemaining} + +{itemRemaining} {/if}
{/if} -
+
{#if heroCount > 0} - {heroCount} hero{heroCount !== 1 ? 'es' : ''} + + {heroCount} + hero{heroCount !== 1 ? 'es' : ''} + {/if} {#if itemCount > 0} - {itemCount} item{itemCount !== 1 ? 's' : ''} + + {itemCount} + item{itemCount !== 1 ? 's' : ''} + {/if} -
-
- -
- - View full patch - - -
-
-{:else} - -
- -
-
-

- {formatDate(date)} -

-
- - - - {author.slice(0, 2).toUpperCase()} - - - {author} -
-
-
- - {#if heroIcons.length > 0} -
-
- {#each heroIcons as icon (icon.id)} - {icon.alt} - {/each} -
- {#if heroRemaining > 0} - +{heroRemaining} - {/if} + View + +
- {/if} - - {#if itemIcons.length > 0} -
0} - class:mt-auto={heroIcons.length === 0} - > -
- {#each itemIcons as icon (icon.id)} - {icon.alt} - {/each} -
- {#if itemRemaining > 0} - +{itemRemaining} - {/if} -
- {/if} - -
- {#if heroCount > 0} - {heroCount} hero{heroCount !== 1 ? 'es' : ''} - {/if} - {#if itemCount > 0} - {itemCount} item{itemCount !== 1 ? 's' : ''} - {/if}
{/if} diff --git a/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte index b53aa78..d659232 100644 --- a/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte +++ b/apps/web/src/lib/components/changelog/PatchPreviewCard.svelte @@ -5,6 +5,7 @@ import { Badge } from '$lib/components/ui/badge'; import { formatDate } from '@deadlog/utils'; import ArrowRight from '@lucide/svelte/icons/arrow-right'; + import Calendar from '@lucide/svelte/icons/calendar'; interface Props { id: string; @@ -32,16 +33,30 @@ - + +
+ +
- +
+ + +
- + {author.slice(0, 2).toUpperCase()} @@ -56,21 +71,25 @@
{#each displayEntities as entity, i (entity.id)} - {entity.alt} + > + {entity.alt} +
{/each}
{#if entityOverflow > 0} +{entityOverflow} @@ -81,12 +100,18 @@
{#if heroes.length > 0} - + {heroes.length} hero{heroes.length !== 1 ? 'es' : ''} {/if} {#if items.length > 0} - + {items.length} item{items.length !== 1 ? 's' : ''} {/if} @@ -94,13 +119,18 @@
View changes
+ + +
diff --git a/apps/web/src/lib/components/changelog/PatchTimeline.svelte b/apps/web/src/lib/components/changelog/PatchTimeline.svelte index b8bf051..3fe7c5e 100644 --- a/apps/web/src/lib/components/changelog/PatchTimeline.svelte +++ b/apps/web/src/lib/components/changelog/PatchTimeline.svelte @@ -1,6 +1,8 @@ {#if sortedPatches.length > 1} -
-
+
+
{#each sortedPatches as patch, i (patch.id)} - {#snippet child({ props })} - - {/snippet} + +
+
- -

{formatDate(patch.date)}

+ +

{formatDate(patch.date)}

{#if i < sortedPatches.length - 1} -
+
{/if} {/each}
-
+
{#if firstDate && lastDate} - {formatMonth(firstDate)} - {formatMonth(lastDate)} + + + {formatMonth(firstDate)} + + + {formatMonth(lastDate)} + + {/if}
diff --git a/apps/web/src/routes/hero/[slug]/+page.svelte b/apps/web/src/routes/hero/[slug]/+page.svelte index ec761a0..5e202a2 100644 --- a/apps/web/src/routes/hero/[slug]/+page.svelte +++ b/apps/web/src/routes/hero/[slug]/+page.svelte @@ -4,8 +4,10 @@ import { PatchPreviewCard, PatchTimeline } from '$lib/components/changelog'; import { Badge } from '$lib/components/ui/badge'; import ArrowLeft from '@lucide/svelte/icons/arrow-left'; + import Activity from '@lucide/svelte/icons/activity'; import { MetaTags } from 'svelte-meta-tags'; - import { fly } from 'svelte/transition'; + import { fly, scale, blur } from 'svelte/transition'; + import { elasticOut, quintOut, expoOut } from 'svelte/easing'; import { createQuery } from '@tanstack/svelte-query'; import { queryKeys } from '$lib/queries/keys'; import { toast } from 'svelte-sonner'; @@ -20,7 +22,6 @@ } // Use TanStack Query with SSR data as initialData - // This enables: background refetch, prefetch cache hits, stale-while-revalidate const query = createQuery(() => ({ queryKey: queryKeys.hero(hero.slug), queryFn: async () => { @@ -29,10 +30,10 @@ return res.json(); }, initialData: { hero, changelogs: initialChangelogs }, - staleTime: 60 * 60 * 1000 // 1 hour - matches QueryClient default + staleTime: 60 * 60 * 1000 })); - // Show toast if background refetch fails (user still sees SSR data) + // Show toast if background refetch fails $effect(() => { if (query.isError && browser) { toast.error('Failed to refresh data', { @@ -64,6 +65,86 @@ return () => mediaQuery.removeEventListener('change', handler); } }); + + // Transition config based on reduced motion + const transitionConfig = $derived( + reducedMotion + ? { duration: 0 } + : { + duration: 400, + easing: quintOut + } + ); + + const cardTransitionConfig = $derived((i: number) => + reducedMotion + ? { duration: 0 } + : { + delay: Math.min(i, 12) * 40, + duration: 400, + easing: quintOut + } + ); + + // Type-specific styles using Svelte $derived + const typeGradient = $derived(() => { + if (!hero.heroType) return ''; + const colors: Record = { + marksman: 'from-amber-500/20 via-yellow-500/10 to-amber-500/5', + mystic: 'from-purple-500/20 via-fuchsia-500/10 to-purple-500/5', + brawler: 'from-red-500/20 via-orange-500/10 to-red-500/5' + }; + return colors[hero.heroType] || ''; + }); + + const typePatternColor = $derived(() => { + if (!hero.heroType) return ''; + const colors: Record = { + marksman: 'oklch(0.75 0.15 55)', + mystic: 'oklch(0.65 0.2 300)', + brawler: 'oklch(0.6 0.2 25)' + }; + return colors[hero.heroType] || ''; + }); + + const typeBorderColor = $derived(() => { + if (!hero.heroType) return 'border-border'; + const borderColors: Record = { + marksman: 'border-amber-500/30', + mystic: 'border-purple-500/30', + brawler: 'border-red-500/30' + }; + return borderColors[hero.heroType] || 'border-border'; + }); + + const typeAccentColor = $derived(() => { + if (!hero.heroType) return ''; + const colors: Record = { + marksman: '#f59e0b', + mystic: '#a855f7', + brawler: '#ef4444' + }; + return colors[hero.heroType] || ''; + }); + + const typeBorderVar = $derived(() => { + if (!hero.heroType) return ''; + return `var(--type-${hero.heroType})`; + }); + + // Svelte motion for rotating ring + let rotation = $state(0); + let rotationFrame: number; + + $effect(() => { + if (reducedMotion) return; + const animateRotation = () => { + rotation = (rotation + 0.05) % 360; + rotationFrame = requestAnimationFrame(animateRotation); + }; + rotationFrame = requestAnimationFrame(animateRotation); + return () => cancelAnimationFrame(rotationFrame); + }); -
- - - Back to all changes - - -
-
- {#if hero.image} -
- - {#if hero.heroType} -
- {/if} - - {hero.name} +
+ + {#if hero.heroType} +
+
+ +
+
+ {/if} + +
+ + + Back to all changes + + + +
+ + {#if hero.heroType} +
+
+
{/if} -
-

- {hero.name} -

+ +
+ + {#if hero.image} +
+ + {#if hero.heroType} +
+ +
+
+
+ {/if} + + {hero.name} +
+ {/if} + +
- {#if hero.heroType} - - {hero.heroType} - +
+ + Hero Profile +
+ +

+ {hero.name} +

+ +
+ {#if hero.heroType} + + {hero.heroType} + + {/if} +
+ {changelogs.length} + change{changelogs.length !== 1 ? 's' : ''} +
+
+ + {#if changelogs.length > 1} +
+ ({ + id: c.id, + date: c.date + }))} + class="max-w-md" + timelineColor={hero.heroType} + /> +
{/if} - - {changelogs.length} change{changelogs.length !== 1 ? 's' : ''} -
- {#if changelogs.length > 1} - ({ - id: c.id, - date: c.date - }))} - class="mt-4 max-w-md" - /> - {/if}
-
-
+
-
-

- Change History -

+ +
+
+
+

+ Change History +

+
+
- {#if changelogs.length > 0} -
- {#each changelogs as changelog, i (changelog.id)} + {#if changelogs.length > 0} +
+ {#each changelogs as changelog, i (changelog.id)} +
+ +
+ {/each} +
+ {:else} +
- +
- {/each} -
- {:else} -
-

- No recorded changes for {hero.name} yet. -

-
- {/if} -
+

+ No changes recorded for {hero.name} + yet. +

+

Check back soon for updates.

+
+ {/if} + +
diff --git a/apps/web/src/routes/item/[slug]/+page.svelte b/apps/web/src/routes/item/[slug]/+page.svelte index fe0bc06..8de7876 100644 --- a/apps/web/src/routes/item/[slug]/+page.svelte +++ b/apps/web/src/routes/item/[slug]/+page.svelte @@ -4,8 +4,10 @@ import { PatchPreviewCard, PatchTimeline } from '$lib/components/changelog'; import { Badge } from '$lib/components/ui/badge'; import ArrowLeft from '@lucide/svelte/icons/arrow-left'; + import Package from '@lucide/svelte/icons/package'; import { MetaTags } from 'svelte-meta-tags'; - import { fly } from 'svelte/transition'; + import { fly, scale, blur } from 'svelte/transition'; + import { elasticOut, quintOut, expoOut } from 'svelte/easing'; import { createQuery } from '@tanstack/svelte-query'; import { queryKeys } from '$lib/queries/keys'; import { toast } from 'svelte-sonner'; @@ -20,7 +22,6 @@ } // Use TanStack Query with SSR data as initialData - // This enables: background refetch, prefetch cache hits, stale-while-revalidate const query = createQuery(() => ({ queryKey: queryKeys.item(item.slug), queryFn: async () => { @@ -29,10 +30,10 @@ return res.json(); }, initialData: { item, changelogs: initialChangelogs }, - staleTime: 60 * 60 * 1000 // 1 hour - matches QueryClient default + staleTime: 60 * 60 * 1000 })); - // Show toast if background refetch fails (user still sees SSR data) + // Show toast if background refetch fails $effect(() => { if (query.isError && browser) { toast.error('Failed to refresh data', { @@ -65,6 +66,7 @@ } }); + // Type labels and variants const typeLabels: Record = { weapon: 'Weapon Item', ability: 'Vitality Item', @@ -77,11 +79,70 @@ upgrade: 'spirit' }; - const typeColors: Record = { - weapon: 'var(--item-weapon)', - ability: 'var(--item-vitality)', - upgrade: 'var(--item-spirit)' - }; + // Type-specific styles using Svelte $derived (non-function versions) + const typeColors = $derived( + (() => { + const colors: Record = { + weapon: 'var(--item-weapon)', + ability: 'var(--item-vitality)', + upgrade: 'var(--item-spirit)' + }; + return colors[item.type] || ''; + })() + ); + + const typeGradients = $derived( + (() => { + const gradients: Record = { + weapon: 'from-orange-500/10 via-amber-500/5 to-transparent', + ability: 'from-emerald-500/10 via-green-500/5 to-transparent', + upgrade: 'from-blue-500/10 via-indigo-500/5 to-transparent' + }; + return gradients[item.type] || ''; + })() + ); + + const typeBorderGlow = $derived( + (() => { + const glows: Record = { + weapon: 'shadow-orange-500/20', + ability: 'shadow-emerald-500/20', + upgrade: 'shadow-blue-500/20' + }; + return glows[item.type] || ''; + })() + ); + + const typeSolidColor = $derived( + (() => { + const colors: Record = { + weapon: 'oklch(0.65 0.2 40)', + ability: 'oklch(0.65 0.2 140)', + upgrade: 'oklch(0.65 0.2 290)' + }; + return colors[item.type] || ''; + })() + ); + + // Transition config based on reduced motion + const transitionConfig = $derived( + reducedMotion + ? { duration: 0 } + : { + duration: 400, + easing: quintOut + } + ); + + const cardTransitionConfig = $derived((i: number) => + reducedMotion + ? { duration: 0 } + : { + delay: Math.min(i, 12) * 40, + duration: 400, + easing: quintOut + } + ); -
- - - Back to all changes - - -
+ +
-
- {#if item.image} - {item.name} - {/if} -
-

- {item.name} -

+
+ +
+
+ +
+ + + Back to all changes + + + +
+ +
+ + +
+ +
+ +
+ + {#if item.image} +
+ +
+ +
+ +
+ {item.name} +
+
+ {/if} + +
- - {typeLabels[item.type] || item.type} - - - {changelogs.length} change{changelogs.length !== 1 ? 's' : ''} - -
- {#if changelogs.length > 1} - ({ - id: c.id, - date: c.date - }))} - class="mt-4 max-w-md" - /> - {/if} -
-
-
+
+ + Item +
-
-

- Change History -

+

+ {item.name} +

- {#if changelogs.length > 0} -
- {#each changelogs as changelog, i (changelog.id)}
- + + {typeLabels[item.type] || item.type} + +
+ {changelogs.length} + change{changelogs.length !== 1 ? 's' : ''} +
- {/each} + + {#if changelogs.length > 1} +
+ ({ + id: c.id, + date: c.date + }))} + class="max-w-md" + /> +
+ {/if} +
- {:else} -
-

- No recorded changes for {item.name} yet. -

+ + + +
+
+
+

+ Change History +

+
- {/if} -
+ + {#if changelogs.length > 0} +
+ {#each changelogs as changelog, i (changelog.id)} +
+ +
+ {/each} +
+ {:else} +
+
+ +
+

+ No changes recorded for {item.name} + yet. +

+

Check back soon for updates.

+
+ {/if} + +
diff --git a/flake.lock b/flake.lock index 2faf313..262e3f5 100644 --- a/flake.lock +++ b/flake.lock @@ -3,15 +3,15 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1761588595, - "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=", - "owner": "edolstra", + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "NixOS", "repo": "flake-compat", - "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", "type": "github" }, "original": { - "owner": "edolstra", + "owner": "NixOS", "repo": "flake-compat", "type": "github" } @@ -75,11 +75,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1765363881, - "narHash": "sha256-3C3xWn8/2Zzr7sxVBmpc1H1QfxjNfta5IMFe3O9ZEPw=", + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d2b1213bf5ec5e62d96b003ab4b5cbc42abfc0d0", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", "type": "github" }, "original": { @@ -119,11 +119,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1761236834, - "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", + "lastModified": 1767364772, + "narHash": "sha256-fFUnEYMla8b7UKjijLnMe+oVFOz6HjijGGNS1l7dYaQ=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", + "rev": "16c7794d0a28b5a37904d55bcca36003b9109aaa", "type": "github" }, "original": { @@ -159,11 +159,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1765464257, - "narHash": "sha256-dixPWKiHzh80PtD0aLuxYNQ0xP+843dfXG/yM3OzaYQ=", + "lastModified": 1767281941, + "narHash": "sha256-6MkqajPICgugsuZ92OMoQcgSHnD6sJHwk8AxvMcIgTE=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "09e45f2598e1a8499c3594fe11ec2943f34fe509", + "rev": "f0927703b7b1c8d97511c4116eb9b4ec6645a0fa", "type": "github" }, "original": { @@ -216,11 +216,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1762938485, - "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", + "lastModified": 1767801790, + "narHash": "sha256-QfX6g3Wj2vQe7oBJEbTf0npvC6sJoDbF9hb2+gM5tf8=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", + "rev": "778a1d691f1ef45dd68c661715c5bf8cbf131c80", "type": "github" }, "original": { diff --git a/libs/db/package.json b/libs/db/package.json new file mode 100644 index 0000000..eaf36ee --- /dev/null +++ b/libs/db/package.json @@ -0,0 +1,17 @@ +{ + "name": "@deadlog/db", + "version": "1.0.0", + "type": "module", + "private": true, + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@libsql/client": "0.17.0", + "drizzle-orm": "0.45.1" + }, + "devDependencies": { + "@types/node": "24.10.4", + "drizzle-kit": "0.31.8" + } +} diff --git a/libs/meta/package.json b/libs/meta/package.json new file mode 100644 index 0000000..04edc31 --- /dev/null +++ b/libs/meta/package.json @@ -0,0 +1,17 @@ +{ + "name": "@deadlog/meta", + "version": "1.0.0", + "type": "module", + "private": true, + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@deadlog/db": "workspace:*", + "@deadlog/scraper": "workspace:*", + "@deadlog/utils": "workspace:*" + }, + "devDependencies": { + "@types/node": "24.10.4" + } +} diff --git a/libs/scraper/package.json b/libs/scraper/package.json new file mode 100644 index 0000000..d1792d2 --- /dev/null +++ b/libs/scraper/package.json @@ -0,0 +1,18 @@ +{ + "name": "@deadlog/scraper", + "version": "1.0.0", + "type": "module", + "private": true, + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "@deadlog/db": "workspace:*", + "@deadlog/utils": "workspace:*", + "deadlock-api-client": "github:deadlock-api/openapi-clients#path:typescript/api" + }, + "devDependencies": { + "@types/node": "24.10.4", + "happy-dom": "20.1.0" + } +} diff --git a/libs/scraper/src/cache/posts/post-93983.json b/libs/scraper/src/cache/posts/post-93983.json new file mode 100644 index 0000000..581fc0a --- /dev/null +++ b/libs/scraper/src/cache/posts/post-93983.json @@ -0,0 +1,14 @@ +{ + "postId": "177936", + "title": "12-16-2025 Update", + "author": "Yoshi", + "authorImage": "https://project8-data.community.forum/avatars/m/0/1.jpg?1713628630", + "pubDate": "2025-12-16T10:33:38-0800", + "content": "\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t
\n\n\t\t\n\t\t\t\n\n\t\n\t\t\n\t\n\n\t\t\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t
- The 10% move speed slow from taking damage is now a 20% slow only for the portion over the hero's base move speed
\n- Move Speed bonuses now stack diminishingly
\n- Base move speed reduced by 0.1 (except for heroes lower than 6.5)
\n- Heroes with move speed spirit scaling have the values reduced by 40%
\n- Updated move speed values on items:
\n
- Active Reload: Move speed reduced from 1 to 0.75​
- Backstabber: Move speed reduced from 1.75 to 1.5​
- Fleetfoot: Move speed reduced from 3.5 to 3.25​
- Enduring Speed: Move speed reduced from 2.25 to 2.0​
- Guardian Ward: Move speed reduced from 3 to 2.75​
- Spirit Shielding: Move speed reduced from 1.75 to 1.5​
- Weapon Shielding: Move speed reduced from 1.75 to 1.5​
- Blood Tribute: Move speed reduced from 2.25 to 2​
- Burst Fire: Move speed reduced from 1.5 to 1.25​
- Headhunter: Move speed reduced from 2 to 1.75​
- Heroic Aura: Move speed reduced from 2.5 to 2.25​
- Counterspell: Move speed reduced from 2 to 1.75​
- Debuff Remover: Move speed reduced from 2.5 to 2.25​
- Fortitude: Move speed reduced from 1.5 to 1.25​
- Veil Walker: Invis move speed reduced from 4 to 3.5​
- Radiant Regeneration: Move speed reduced from 2 to 1.75​
- Surge of Power: Move speed reduced from 2 to 1.75​
- Frenzy: Move speed reduced from 1 to 0.75​
- Frenzy: Active move speed reduced from 3 to 2.5​
- Divine Barrier: Move speed reduced from 3 to 2.75​
- Healing Tempo: Move speed reduced from 1.5 to 1.25​
- Juggernaut: Move speed reduced from 2.25 to 2​
- Ethereal Shift: Move speed reduced from 3 to 2.5​
- Sprint ramp rate reduced from 0.75/sec to 0.6/sec
\n- Sprint now starts accelerating for sprint speeds over +2.5 rather than only after +3
\n- Base sprint speed reduced by 0.4
\n- Wraith: Sprint speed spirit power scaling reduced from 0.6 to 0.5
\n- Updated sprint values on items:
\n
- Sprint Boots: Sprint reduced from 2.2 to 2.0​
- Long Range: Sprint reduced from 1 to 0.75​
- Swift Striker: Sprint reduced from 1 to 0.75​
- Mystic Slow: Sprint reduced from 1 to 0.75​
- Heroic Aura: Sprint reduced from 2 to 1.5​
- Hunter's Aura: Sprint reduced from 1 to 0.75​
- Sharpshooter: Sprint reduced from 1.5 to 1​
- Rescue Beam: Sprint reduced from 1 to 0.75​
- Trophy Collector: Sprint reduced from 2.2 to 2.0​
- Disarming Hex: Sprint reduced from 1 to 0.75​
- Shadow Weave: Sprint reduced from 2 to 1.5​
- Lightning Scroll: Sprint reduced from 1 to 0.75​
- Vortex Web: Sprint reduced from 1 to 0.75​
- Enduring Speed: Slow resist reduced from 30% to 25%
\n- Fleetfoot: Active slow resist reduced from 40% to 35%
\n- Majestic Leap: Cooldown increased from 34s to 45s
\n- Majestic Leap: Barrier scaling per boon reduced from 10 to 8
\n
\n
\n- Bonus Health on all Weapon and Spirit items is reduced by ~25
\n- Vitality investment tree bonuses changed from a % of base health to a fixed amount (from +8/10/13/17/34/39/44/48/52/56% to +75/125/200/275/525/625/750/1000/1200/1400)
\n- Colossus: Bonus Health reduced from +600 to +300
\n- Colossus: Now grants +15% Base Health
\n- Siphon Bullets: Cooldown increased from 0.8s to 1.2s
\n
\n
\n- Spirit investment tree 4.8k bonus reduced from 45 to 38
\n- Surge of Power Imbued Ability Spirit reduced from 28 to 24
\n- Rapid Recharge Charged Ability Spirit reduced from 20 to 16
\n- Crippling Headshot: Bullet and Spirit Resist reduction from -18% to -16%
\n- Focus Lens: Spirit Resist reduction reduced from -12% to -9% (affects Spirit Sap)
\n- Spirit Snatch: Spirit Resist steal reduced from 15% to 12%
\n- Tankbuster: Changed from doing % of Max Health to a % of Current Health
\n- Tankbuster: Damage dealt increased from 5% to 7.5%
\n
\n
\n- Trooper bounty reduced by 12%
\n
\n
\n- Shrines health increased from 3000 to 7000
\n- Killing both enemy shrines will now make all of your troopers stronger (30% hp and 30% damage)
\n- Walker Rocket Barrage radius reduced from 6m to 5m
\n
\n
\n- Medic orbs now heals allied troopers 30% more
\n- Medic orbs regen on allied troopers is now applied over 8s instead of 2s
\n- Medic Trooper HP increased from 260 to 350 (default trooper is 300)
\n- Medic Trooper DPS vs other troopers increased from 35 to 45 (default trooper is 35)
\n- Medic Troopers attack range vs troopers and players increased by +5m over the default
\n- Medic Pack pickup range scales from 18m->26m to 18m->30m (over the same time period, 10min to 18min)
\n
\n
\n- Urn: Bounty increased from 700 + 230/min to 1300 + 230/min
\n- Urn: Comeback bounty now gives more souls
\n- Urn: Bullet and Spirit resist for carrier increased from 30% to 50%
\n- Urn: Bonus bounty for carrier increased from 25% to 35%
\n
\n
\n- Increased kill bounty for solo kills (1 attacker in the kill) by 25%, and by 15% for duo kills
\n- Increased portion of the bounty the killer gets relative to the assist portion
\n- Increased comeback bounties for losing team a bit
\n
\n
\n- Getting hit while on Jump Pad during the window now deals 15% max hp damage
\n
\n
\n- Neutral HP reduced by 20%
\n- Neutral HP growth increased from 0.5%/min to 2.1% (less HP before ~15 minutes, more afterwards)
\n- Neutrals spirit resistance increased by 5%
\n- Sinner's Sacrifice bounty reduced by 10%
\n- Cultist Sacrifice: Cooldown increased from 260s to 270s
\n- Unsecured souls claim period reworked. Previously the way it worked was any unsecured souls you gained were added to a rolling 165s window, where it was divided over that time and given out, with a minimum amount given per second of 1 soul. The new system drains 0.5% (of the remaining souls) + 1.6 (scales with the 8% bounty growth per minute).
\n
\nThere are a few examples below to show how they compare. Old was 165s (assuming bounty was at least 165s). New is:
\n
\n
1x Small Camp: 77s​
2x Medium Camps: 163s​
1x Hard Camp: 193s​
4x Medium Camps: 230s​
2x Hard Camps: 263s​
1x Hard Camp + 3x Medium Camps: 270s​
2x Hard Camp + 6x Medium Camps: 354s​

\n
\n
\n
\n- Fixed a bug causing AP Rounds to reduce damage on targets with negative resist
\n- When Armor Piercing Rounds Proc's, Plated Armor can no longer stop the Proc'd Bullet.
\n- Fixed Curse dispelling targets with Unstoppable state
\n
\n
\n
\n- Billy: Health regen reduced from 3 to 2.5
\n- Billy: Blasted non-player effectiveness reduced from 35% to 25%
\n- Billy: Blasted light melee effectiveness reduced from 50% to 40%
\n- Billy: Chain Gang will now break slightly faster when target is out of LOS
\n
\n- Dynamo: Kinetic Pulse spirit scaling range reduced from 0.2 to 0.1
\n- Dynamo: Health regen reduced from 2.5 to 1.75
\n
\n- Lady Geist: Stamina dash distance moved to bucket 3 (slower)
\n- Lady Geist: Essence Bomb self damage spirit scaling reduced from 1.6 to 1.8
\n- Lady Geist: Malice self damage increased from 7% to 9%
\n
\n- Mirage: Move speed reduced by 0.2
\n- Mirage: Bullet damage per boon reduced from 0.616 to 0.5
\n- Mirage: Djinn's Mark cooldown increased from 2.5s to 2.6s
\n- Mirage: Djinn's Mark max range from 45m to 40m
\n- Mirage: Traveler cooldown increased from 145s to 155s
\n- Mirage: Traveler T1 cooldown from -25s to -35s
\n
\n- Shiv: Bloodletting deferred damage reduced from 30% to 25%
\n- Shiv: Bloodletting T2 deferred damage increased from 10% to 15%
\n- Shiv: Rage buildup rate reduced by 6%
\n- Shiv: Killing Blow cast range reduced from 15m to 13m
\n
\n- Vindicta: Assassinate T2 reduced from +90 Max Bonus Damage to 80
\n
\n- Wraith: Bullet damage per boon reduced from 0.17 to 0.14
\n- Wraith: Project Mind T2 spirit scaling reduced from 2.44 to 1.7
\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
 
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\n\t\t\n\t\t\t\n\n\t\n\t\t\n\t\n\n\t\t\n\n\t\t\n\t
\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t", + "posterReplies": [ + { + "content": "\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t
\n\n\t\t\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t
- Initial wall jump no longer costs stamina
\n- Stamina now regenerates faster (from 5s to 4.5s for 1 stamina)
\n- Removed on bullet hit move slow
\n- Time delay before sprint starts working after hero/neutral interaction reduced from 4s to 3s
\n- Weakened Patron now gains 50% damage reduction if one defender is in the pit and 100% if two or more are (defenders must be in pit for at least 2s for reduction to kick in)
\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
 
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\n\t\t\n\n\t\t\n\t
\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t", + "timestamp": "2025-12-17T12:33:46-0800" + } + ] +} diff --git a/libs/scraper/src/cache/posts/post-95233.json b/libs/scraper/src/cache/posts/post-95233.json new file mode 100644 index 0000000..b14d8fb --- /dev/null +++ b/libs/scraper/src/cache/posts/post-95233.json @@ -0,0 +1,14 @@ +{ + "postId": "180519", + "title": "12-29-2025 Update", + "author": "Yoshi", + "authorImage": "https://project8-data.community.forum/avatars/m/0/1.jpg?1713628630", + "pubDate": "2025-12-29T22:33:52-0800", + "content": "\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t
\n\n\t\t\n\t\t\t\n\n\t\n\t\t\n\t\n\n\t\t\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t
- Bebop: Stamina increased from 2 to 3
\n- Bebop: Stamina regeneration cooldown increased from 4.55s to 6s
\n- Bebop: Bebop Health per boon increased from +46 to +52
\n- Bebop: Sticky Bomb base damage reduced from 100 to 75
\n- Bebop: Sticky Bomb T2 damage reduced from 63 to 60
\n- Bebop: Sticky Bomb Spirit Scaling increased from 1.1 to 1.5
\n- Bebop: Sticky Bomb per hero hit from 1.5% to 1% + 0.0025% Spirit Scaling
\n- Bebop: Sticky Bomb per hero kill from 4% to 2.5% + 0.015% Spirit Scaling
\n- Grey Talon: Rain of Arrows cooldown reduced from 35s to 30s
\n- Grey Talon: Rain of Arrows T3 now also grants +30% Bullet Evasion
\n- Grey Talon: Guided Owl duration increased from 16s to 18s
\n- Grey Talon: Guided Owl T1 damage increased from +81 to +85
\n- Grey Talon: Guided Owl Spirit Power per kill increased from 5 to 8
\n- Holliday: Powder Keg cooldown reduced from 32s to 28s
\n- Holliday: Fixed Lasso being removed by Divine Barrier
\n- Ivy: Watcher's Covenant Replicated Healing increased from 25% to 35%
\n- Ivy: Watcher's Covenant Replicated Healing now scales with boons (0.5)
\n- Ivy: Air Drop ally damage penalty reduced from -30% to -20%
\n- Kelvin: Frost Grenade T3 now also reduces stamina regen by -30%
\n- Kelvin: Ice Path T3 Max Spirit Power increased from 55 to 75
\n- Kelvin: Ice Path T3 Spirit Power linger duration increased from 6s to 8s
\n- Mo & Krill: Burrow initial knockup vertical area detection improved
\n- Mo & Krill: Sand Blast now deals a fixed 40 damage
\n- Mo & Krill: Sand Blast can now be casted while Burrowed
\n- Mo & Krill: Sand Blast T2 increased from -19s Cooldown to -23s
\n- Mo & Krill: Sand Blast T3 now also slows dash distance by 40%
\n- Paradox: Kinetic Carbine cooldown reduced from 30s to 27s
\n- Paradox: Time Wall Width increased from 7m to 7.5m
\n- Seven: Lightning Ball T3 increased from +1m to +1.5m
\n- Seven: Power Surge T2 reduced from -15% Spirit Resist for 8s to -10% for 6s
\n- Seven: Storm Cloud DPS increased from 90 to 95
\n- Seven: Storm Cloud T3 increased from +54 DPS to 65
\n- Seven: Storm Cloud T3 move speed increased from 2.5 to 3.8
\n- Sinclair: Spirit power growth increased from 1.1 to 1.3
\n- Sinclair: Vexing Bolt initial velocity reduced from 1000 to 800
\n- Sinclair: Vexing Bolt now only snaps to heroes
\n- Sinclair: Vexing Bolt max duration increased from 3s to 4s (max damage is still at 2s)
\n- Sinclair: Rabbit Hex cooldown reduced from 30s to 26s
\n- Sinclair: Rabbit Hex radius increased from 6m to 6.5m
\n- Yamato: Power Slash T3 bonus damage reduced from +166 to +150
\n- Yamato: Power Slash T3 now also increases spirit power scaling by 0.5
\n- Yamato: Shadow Transformation heal on kill increased from 12% to 15%
\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
 
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\n\t\t\n\t\t\t\n\n\t\n\t\t\n\t\n\n\t\t\n\n\t\t\n\t
\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t", + "posterReplies": [ + { + "content": "\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t
\n\n\t\t\n\n\t\t
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\n\t\t\t
\n\t\t\t\t\n\t\t\t\t\t
- Billy: Base bullet damage reduced from 6.79 to 6.3
\n- Lady Geist: Ammo reduced from 10 to 9
\n- Lady Geist: Bullet Falloff from 58m to 52m
\n- McGinnis: Medicinal Specter radius spirit scaling reduced from 0.0456 to 0.03
\n- McGinnis: Medicinal Specter duration spirit scaling reduced from 0.11 to 0.05
\n- McGinnis: Medicinal Specter T3 reduced from 3% Max Health to 2.5%
\n- McGinnis: Heavy Barrage T1 slow increased from 30% to 40% (and 20% dash slow)
\n- McGinnis: Heavy Barrage T3 spirit scaling increased from +0.1 to +0.2
\n- Toxic Bullets: Bleed damage reduced from 2.2% to 2%
\n- Toxic Bullets: Buildup is 10% harder
\n- Bebop: Stamina regeneration cooldown improved from 6s to 5.5s
\n- Bebop: Sticky Bomb stacks now count for half for each stack after a certain threshold (100 on hit and 10 on kill)
\n- Bebop: Sticky Bomb base damage increased from 70 to 80
\n- Bebop: Sticky Bomb T2 increased from +60 to +70
\n\t\t\t\t\n\t\t\t
\n\n\t\t\t
 
\n\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t
\n\n\t\t\n\n\t\t\n\t
\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\n\t\n\n\t\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t", + "timestamp": "2025-12-30T22:38:21-0800" + } + ] +} diff --git a/libs/utils/package.json b/libs/utils/package.json new file mode 100644 index 0000000..c436ee0 --- /dev/null +++ b/libs/utils/package.json @@ -0,0 +1,9 @@ +{ + "name": "@deadlog/utils", + "version": "1.0.0", + "type": "module", + "private": true, + "exports": { + ".": "./src/index.ts" + } +} diff --git a/nx.json b/nx.json deleted file mode 100644 index 17e5831..0000000 --- a/nx.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "$schema": "./node_modules/nx/schemas/nx-schema.json", - "targetDefaults": { - "build": { - "dependsOn": ["^build"], - "cache": true - }, - "generate": { - "cache": false - }, - "test": { - "cache": false - }, - "lint": { - "cache": true, - "inputs": [ - "default", - "{workspaceRoot}/eslint.config.js", - "{workspaceRoot}/.prettierrc", - "{workspaceRoot}/.prettierignore" - ] - } - }, - "namedInputs": { - "default": ["{projectRoot}/**/*", "sharedGlobals"], - "production": [ - "default", - "!{projectRoot}/**/?(*.)+(spec|test).[jt]s?(x)?(.snap)", - "!{projectRoot}/tsconfig.spec.json" - ], - "sharedGlobals": [] - } -} diff --git a/package.json b/package.json index dc66633..f09a05e 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,17 @@ "type": "module", "scripts": { "postinstall": "cd node_modules/deadlock-api-client && npm run build", - "test": "pnpm exec nx run-many -t test --projects=* --exclude=deadlog.io", - "check": "pnpm exec nx run-many -t check --projects=* --exclude=deadlog.io", - "lint": "pnpm exec nx run-many -t lint --projects=* --exclude=deadlog.io" + "dev": "pnpm --filter 'deadlog-web' dev", + "build": "pnpm --filter 'deadlog-web' build", + "preview": "pnpm --filter 'deadlog-web' preview", + "test": "pnpm --filter 'deadlog-web' test", + "test:all": "pnpm -r --filter './apps/**' --filter './libs/**' run test", + "check": "pnpm --filter 'deadlog-web' check", + "lint": "pnpm --filter 'deadlog-web' lint", + "format": "prettier --write .", + "fmt:check": "prettier --check .", + "build:scraper": "OUTPUT_DIR=apps/web/static tsx --tsconfig=tsconfig.base.json libs/scraper/src/compile.ts", + "build:meta": "DATABASE_URL=file:apps/web/static/deadlog.db tsx --tsconfig=tsconfig.base.json libs/meta/src/generate-previews.ts" }, "devDependencies": { "@cloudflare/workers-types": "4.20260108.0", @@ -15,7 +23,6 @@ "@fontsource/inter": "5.2.8", "@libsql/client": "0.17.0", "@lucide/svelte": "0.562.0", - "@nx/eslint": "22.3.3", "@internationalized/date": "3.10.1", "@sveltejs/adapter-cloudflare": "7.2.4", "@sveltejs/adapter-node": "5.4.0", @@ -42,7 +49,6 @@ "happy-dom": "20.1.0", "mode-watcher": "1.1.0", "msw": "2.12.7", - "nx": "22.3.3", "playwright": "1.57.0", "prettier": "3.7.4", "prettier-plugin-sql": "0.19.2", @@ -68,6 +74,5 @@ "vitest": "4.0.16", "wrangler": "4.57.0", "zod": "4.3.5" - }, - "nx": {} + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7690927..bd66dea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,9 +26,6 @@ importers: '@lucide/svelte': specifier: 0.562.0 version: 0.562.0(svelte@5.46.1) - '@nx/eslint': - specifier: 22.3.3 - version: 22.3.3(@babel/traverse@7.28.5)(@zkochan/js-yaml@0.0.7)(eslint@9.39.2(jiti@2.6.1))(nx@22.3.3) '@sveltejs/adapter-cloudflare': specifier: 7.2.4 version: 7.2.4(@sveltejs/kit@2.49.3(@sveltejs/vite-plugin-svelte@6.2.3(svelte@5.46.1)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(wrangler@4.57.0(@cloudflare/workers-types@4.20260108.0)) @@ -110,9 +107,6 @@ importers: msw: specifier: 2.12.7 version: 2.12.7(@types/node@24.10.4)(typescript@5.9.3) - nx: - specifier: 22.3.3 - version: 22.3.3 playwright: specifier: 1.57.0 version: 1.57.0 @@ -263,543 +257,6 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-decorators@7.28.0': - resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-decorators@7.27.1': - resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.28.5': - resolution: {integrity: sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.28.5': - resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.28.5': - resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} - '@cloudflare/kv-asset-handler@0.4.1': resolution: {integrity: sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==} engines: {node: '>=18.0.0'} @@ -860,15 +317,9 @@ packages: '@drizzle-team/brocli@0.10.2': resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -1536,18 +987,6 @@ packages: '@internationalized/date@3.10.1': resolution: {integrity: sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==} - '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1645,87 +1084,9 @@ packages: resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} - '@neon-rs/load@0.0.4': resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} - '@nx/devkit@22.3.3': - resolution: {integrity: sha512-/hxcdhE+QDalsWEbJurHtZh9aY27taHeImbCVJnogwv85H3RbAE+0YuKXGInutfLszAs7phwzli71yq+d2P45Q==} - peerDependencies: - nx: '>= 21 <= 23 || ^22.0.0-0' - - '@nx/eslint@22.3.3': - resolution: {integrity: sha512-iG/LvrYf2CFAm2A0kfmRU4VeCTAN5PjUw8xc6oD1zfQ/KTmE/gFG2P1aJBo2mTIyzk9k8ZI0dqIhPLdl/AAtxg==} - peerDependencies: - '@zkochan/js-yaml': 0.0.7 - eslint: ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - '@zkochan/js-yaml': - optional: true - - '@nx/js@22.3.3': - resolution: {integrity: sha512-L3MOb8cLc2TIg2R3hGC9FLlcuVqlqST/fztmOihw9wS3lo52E4v2gP/BpYGfRh/u9r6Ekm6LF03Or+VwYzPuzA==} - peerDependencies: - verdaccio: ^6.0.5 - peerDependenciesMeta: - verdaccio: - optional: true - - '@nx/nx-darwin-arm64@22.3.3': - resolution: {integrity: sha512-zBAGFGLal09CxhQkdMpOVwcwa9Y01aFm88jTTn35s/DdIWsfngmPzz0t4mG7u2D05q7TJfGQ31pIf5GkNUjo6g==} - cpu: [arm64] - os: [darwin] - - '@nx/nx-darwin-x64@22.3.3': - resolution: {integrity: sha512-6ZQ6rMqH8NY4Jz+Gc89D5bIH2NxZb5S/vaA4yJ9RrqAfl4QWchNFD5na+aRivSd+UdsYLPKKl6qohet5SE6vOg==} - cpu: [x64] - os: [darwin] - - '@nx/nx-freebsd-x64@22.3.3': - resolution: {integrity: sha512-J/PP5pIOQtR7ZzrFwP6d6h0yfY7r9EravG2m940GsgzGbtZGYIDqnh5Wdt+4uBWPH8VpdNOwFqH0afELtJA3MA==} - cpu: [x64] - os: [freebsd] - - '@nx/nx-linux-arm-gnueabihf@22.3.3': - resolution: {integrity: sha512-/zn0altzM15S7qAgXMaB41vHkEn18HyTVUvRrjmmwaVqk9WfmDmqOQlGWoJ6XCbpvKQ8bh14RyhR9LGw1JJkNA==} - cpu: [arm] - os: [linux] - - '@nx/nx-linux-arm64-gnu@22.3.3': - resolution: {integrity: sha512-NmPeCexWIZHW9RM3lDdFENN9C3WtlQ5L4RSNFESIjreS921rgePhulsszYdGnHdcnKPYlBBJnX/NxVsfioBbnQ==} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-arm64-musl@22.3.3': - resolution: {integrity: sha512-K02U88Q0dpvCfmSXXvY7KbYQSa1m+mkYeqDBRHp11yHk1GoIqaHp8oEWda7FV4gsriNExPSS5tX1/QGVoLZrCw==} - cpu: [arm64] - os: [linux] - - '@nx/nx-linux-x64-gnu@22.3.3': - resolution: {integrity: sha512-04TEbvgwRaB9ifr39YwJmWh3RuXb4Ry4m84SOJyjNXAfPrepcWgfIQn1VL2ul1Ybq+P023dLO9ME8uqFh6j1YQ==} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@22.3.3': - resolution: {integrity: sha512-uxBXx5q+S5OGatbYDxnamsKXRKlYn+Eq1nrCAHaf8rIfRoHlDiRV2PqtWuF+O2pxR5FWKpvr+/sZtt9rAf7KMw==} - cpu: [x64] - os: [linux] - - '@nx/nx-win32-arm64-msvc@22.3.3': - resolution: {integrity: sha512-aOwlfD6ZA1K6hjZtbhBSp7s1yi3sHbMpLCa4stXzfhCCpKUv46HU/EdiWdE1N8AsyNFemPZFq81k1VTowcACdg==} - cpu: [arm64] - os: [win32] - - '@nx/nx-win32-x64-msvc@22.3.3': - resolution: {integrity: sha512-EDR8BtqeDvVNQ+kPwnfeSfmerYetitU3tDkxOMIybjKJDh69U2JwTB8n9ARwNaZQbNk7sCGNRUSZFTbAAUKvuQ==} - cpu: [x64] - os: [win32] - - '@nx/workspace@22.3.3': - resolution: {integrity: sha512-A7Qd1Yi/hp/VPvig6tV+JmlYVSA4WhckNkP1giYZoESpGLxRlpwINpd5ii3oafOlglUdEZ8AiS3X+RUg9QmCAQ==} - '@open-draft/deferred-promise@2.2.0': resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} @@ -1893,9 +1254,6 @@ packages: cpu: [x64] os: [win32] - '@sinclair/typebox@0.34.47': - resolution: {integrity: sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==} - '@sindresorhus/is@7.1.1': resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} engines: {node: '>=18'} @@ -2118,9 +1476,6 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -2142,9 +1497,6 @@ packages: '@types/node@24.10.4': resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/pegjs@0.10.6': resolution: {integrity: sha512-eLYXDbZWXh2uxf+w8sXS8d6KSoXTswfps6fvCUuVAGN8eRpfe7h9eSRydxiSJvo9Bf+GzifsDOr9TMQlmJdmkw==} @@ -2262,17 +1614,6 @@ packages: '@vitest/utils@4.0.16': resolution: {integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA==} - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - - '@yarnpkg/parsers@3.0.2': - resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} - engines: {node: '>=18.12.0'} - - '@zkochan/js-yaml@0.0.7': - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} - hasBin: true - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -2292,17 +1633,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2311,13 +1644,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -2329,9 +1655,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2342,49 +1665,9 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} - babel-plugin-const-enum@1.2.0: - resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-transform-typescript-metadata@0.3.2: - resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} - peerDependencies: - '@babel/core': ^7 - '@babel/traverse': ^7 - peerDependenciesMeta: - '@babel/traverse': - optional: true - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - baseline-browser-mapping@2.9.12: - resolution: {integrity: sha512-Mij6Lij93pTAIsSYy5cyBQ975Qh9uLEc5rwGTpomiZeXZL9yIS6uORJakb3ScHgfs0serMMfIbXzokPMuEiRyw==} - hasBin: true - big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -2396,9 +1679,6 @@ packages: '@internationalized/date': ^3.8.1 svelte: ^5.33.0 - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - blake3-wasm@2.1.5: resolution: {integrity: sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==} @@ -2408,17 +1688,9 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2427,9 +1699,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001763: - resolution: {integrity: sha512-mh/dGtq56uN98LlNX9qdbKnzINhX0QzhiWBFEkFfsFO4QyCvL8YegrJAazCwXIeqkIob8BlZPGM3xdnY+sgmvQ==} - chai@6.2.1: resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} @@ -2442,14 +1711,6 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -2458,10 +1719,6 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -2480,10 +1737,6 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -2501,9 +1754,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} @@ -2512,13 +1762,6 @@ packages: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - cross-fetch@4.1.0: resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} @@ -2668,13 +1911,6 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} @@ -2694,11 +1930,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - devalue@5.5.0: resolution: {integrity: sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==} @@ -2708,14 +1939,6 @@ packages: dom-accessibility-api@0.6.3: resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - dotenv-expand@11.0.7: - resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} - engines: {node: '>=12'} - - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} - engines: {node: '>=12'} - drizzle-kit@0.31.8: resolution: {integrity: sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg==} hasBin: true @@ -2822,31 +2045,13 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - error-stack-parser-es@1.0.5: resolution: {integrity: sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==} @@ -2893,10 +2098,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2946,11 +2147,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -3006,17 +2202,10 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -3025,10 +2214,6 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -3049,12 +2234,6 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} - front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3068,10 +2247,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3147,9 +2322,6 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -3170,9 +2342,6 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} @@ -3183,9 +2352,6 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} @@ -3193,11 +2359,6 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3210,10 +2371,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -3226,26 +2383,9 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -3253,42 +2393,19 @@ packages: js-base64@3.7.8: resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - jsox@1.2.124: resolution: {integrity: sha512-KwptI8xUfOt7qJ+P+2utrJIEHTgDjXpBsDhPSM4GDq++4by+LX9nUFee97QfRloGcMh5iA9Ha/4UCVZl7zWzuA==} deprecated: Discovered error in stringification with certain references @@ -3392,13 +2509,6 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} @@ -3409,19 +2519,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -3450,10 +2550,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -3470,21 +2566,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mode-watcher@1.1.0: resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} peerDependencies: @@ -3548,54 +2633,17 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - node-sql-parser@5.3.13: resolution: {integrity: sha512-heyWv3lLjKHpcBDMUSR+R0DohRYZTYq+Ro3hJ4m9Ia8ccdKbL5UijIaWr2L4co+bmmFuvBVZ4v23QW2PqvBFAA==} engines: {node: '>=8'} - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - nx@22.3.3: - resolution: {integrity: sha512-pOxtKWUfvf0oD8Geqs8D89Q2xpstRTaSY+F6Ut/Wd0GnEjUjO32SS1ymAM6WggGPHDZN4qpNrd5cfIxQmAbRLg==} - hasBin: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': - optional: true - obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} - outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -3611,10 +2659,6 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3629,20 +2673,12 @@ packages: path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -3777,10 +2813,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@30.2.0: - resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - promise-limit@2.7.0: resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} @@ -3798,17 +2830,10 @@ packages: resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} engines: {node: '>=0.12'} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -3817,28 +2842,10 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - regexparam@3.0.0: resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} engines: {node: '>=8'} - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} - hasBin: true - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3850,19 +2857,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - resolve@1.22.11: resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -3921,19 +2920,12 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -3957,9 +2949,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3975,9 +2964,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.19: - resolution: {integrity: sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==} - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -3985,9 +2971,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sql-formatter@15.6.10: resolution: {integrity: sha512-0bJOPQrRO/JkjQhiThVayq0hOKnI1tHI+2OTkmT7TGtc6kqS+V7kveeMzRW+RNQGxofmTmet9ILvztyuxv0cJQ==} hasBin: true @@ -4013,17 +2996,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -4117,10 +3093,6 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4143,10 +3115,6 @@ packages: resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} hasBin: true - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -4158,10 +3126,6 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} @@ -4178,10 +3142,6 @@ packages: typescript: optional: true - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4226,31 +3186,9 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} - until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4347,9 +3285,6 @@ packages: jsdom: optional: true - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -4405,9 +3340,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -4436,9 +3368,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -4483,718 +3412,6 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.5': {} - - '@babel/core@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - - '@babel/parser@7.28.5': - dependencies: - '@babel/types': 7.28.5 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - - '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 - esutils: 2.0.3 - - '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/runtime@7.28.4': {} - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - - '@babel/traverse@7.28.5': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.28.5': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@cloudflare/kv-asset-handler@0.4.1': dependencies: mime: 3.0.0 @@ -5234,18 +3451,10 @@ snapshots: '@drizzle-team/brocli@0.10.2': {} - '@emnapi/core@1.8.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 - - '@emnapi/wasi-threads@1.1.0': - dependencies: - tslib: 2.8.1 + optional: true '@esbuild-kit/core-utils@3.3.2': dependencies: @@ -5661,14 +3870,6 @@ snapshots: dependencies: '@swc/helpers': 0.5.17 - '@jest/diff-sequences@30.0.1': {} - - '@jest/get-type@30.1.0': {} - - '@jest/schemas@30.0.5': - dependencies: - '@sinclair/typebox': 0.34.47 - '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -5745,173 +3946,55 @@ snapshots: '@libsql/isomorphic-ws': 0.1.5 cross-fetch: 4.1.0 js-base64: 3.7.8 - node-fetch: 3.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - - '@libsql/isomorphic-ws@0.1.5': - dependencies: - '@types/ws': 8.18.1 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@libsql/linux-arm-gnueabihf@0.5.22': - optional: true - - '@libsql/linux-arm-musleabihf@0.5.22': - optional: true - - '@libsql/linux-arm64-gnu@0.5.22': - optional: true - - '@libsql/linux-arm64-musl@0.5.22': - optional: true - - '@libsql/linux-x64-gnu@0.5.22': - optional: true - - '@libsql/linux-x64-musl@0.5.22': - optional: true - - '@libsql/win32-x64-msvc@0.5.22': - optional: true - - '@lucide/svelte@0.562.0(svelte@5.46.1)': - dependencies: - svelte: 5.46.1 - - '@mswjs/interceptors@0.40.0': - dependencies: - '@open-draft/deferred-promise': 2.2.0 - '@open-draft/logger': 0.3.0 - '@open-draft/until': 2.1.0 - is-node-process: 1.2.0 - outvariant: 1.4.3 - strict-event-emitter: 0.5.1 - - '@napi-rs/wasm-runtime@0.2.4': - dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.7.1 - '@tybys/wasm-util': 0.9.0 - - '@neon-rs/load@0.0.4': {} - - '@nx/devkit@22.3.3(nx@22.3.3)': - dependencies: - '@zkochan/js-yaml': 0.0.7 - ejs: 3.1.10 - enquirer: 2.3.6 - minimatch: 9.0.3 - nx: 22.3.3 - semver: 7.7.3 - tslib: 2.8.1 - yargs-parser: 21.1.1 - - '@nx/eslint@22.3.3(@babel/traverse@7.28.5)(@zkochan/js-yaml@0.0.7)(eslint@9.39.2(jiti@2.6.1))(nx@22.3.3)': - dependencies: - '@nx/devkit': 22.3.3(nx@22.3.3) - '@nx/js': 22.3.3(@babel/traverse@7.28.5)(nx@22.3.3) - eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.3 - tslib: 2.8.1 - typescript: 5.9.3 - optionalDependencies: - '@zkochan/js-yaml': 0.0.7 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - verdaccio - - '@nx/js@22.3.3(@babel/traverse@7.28.5)(nx@22.3.3)': - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) - '@babel/preset-env': 7.28.5(@babel/core@7.28.5) - '@babel/preset-typescript': 7.28.5(@babel/core@7.28.5) - '@babel/runtime': 7.28.4 - '@nx/devkit': 22.3.3(nx@22.3.3) - '@nx/workspace': 22.3.3 - '@zkochan/js-yaml': 0.0.7 - babel-plugin-const-enum: 1.2.0(@babel/core@7.28.5) - babel-plugin-macros: 3.1.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.28.5)(@babel/traverse@7.28.5) - chalk: 4.1.2 - columnify: 1.6.0 - detect-port: 1.6.1 - ignore: 5.3.2 - js-tokens: 4.0.0 - jsonc-parser: 3.2.0 - npm-run-path: 4.0.1 - picocolors: 1.1.1 - picomatch: 4.0.2 - semver: 7.7.3 - source-map-support: 0.5.19 - tinyglobby: 0.2.15 - tslib: 2.8.1 + node-fetch: 3.3.2 transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - supports-color - - '@nx/nx-darwin-arm64@22.3.3': - optional: true + - bufferutil + - encoding + - utf-8-validate - '@nx/nx-darwin-x64@22.3.3': - optional: true + '@libsql/isomorphic-ws@0.1.5': + dependencies: + '@types/ws': 8.18.1 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@nx/nx-freebsd-x64@22.3.3': + '@libsql/linux-arm-gnueabihf@0.5.22': optional: true - '@nx/nx-linux-arm-gnueabihf@22.3.3': + '@libsql/linux-arm-musleabihf@0.5.22': optional: true - '@nx/nx-linux-arm64-gnu@22.3.3': + '@libsql/linux-arm64-gnu@0.5.22': optional: true - '@nx/nx-linux-arm64-musl@22.3.3': + '@libsql/linux-arm64-musl@0.5.22': optional: true - '@nx/nx-linux-x64-gnu@22.3.3': + '@libsql/linux-x64-gnu@0.5.22': optional: true - '@nx/nx-linux-x64-musl@22.3.3': + '@libsql/linux-x64-musl@0.5.22': optional: true - '@nx/nx-win32-arm64-msvc@22.3.3': + '@libsql/win32-x64-msvc@0.5.22': optional: true - '@nx/nx-win32-x64-msvc@22.3.3': - optional: true + '@lucide/svelte@0.562.0(svelte@5.46.1)': + dependencies: + svelte: 5.46.1 - '@nx/workspace@22.3.3': + '@mswjs/interceptors@0.40.0': dependencies: - '@nx/devkit': 22.3.3(nx@22.3.3) - '@zkochan/js-yaml': 0.0.7 - chalk: 4.1.2 - enquirer: 2.3.6 - nx: 22.3.3 - picomatch: 4.0.2 - semver: 7.7.3 - tslib: 2.8.1 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@neon-rs/load@0.0.4': {} '@open-draft/deferred-promise@2.2.0': {} @@ -6038,8 +4121,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.53.3': optional: true - '@sinclair/typebox@0.34.47': {} - '@sindresorhus/is@7.1.1': {} '@speed-highlight/core@1.2.12': {} @@ -6237,10 +4318,6 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@tybys/wasm-util@0.9.0': - dependencies: - tslib: 2.8.1 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -6262,8 +4339,6 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/parse-json@4.0.2': {} - '@types/pegjs@0.10.6': {} '@types/react@19.2.7': @@ -6441,17 +4516,6 @@ snapshots: '@vitest/pretty-format': 4.0.16 tinyrainbow: 3.0.3 - '@yarnpkg/lockfile@1.1.0': {} - - '@yarnpkg/parsers@3.0.2': - dependencies: - js-yaml: 3.14.2 - tslib: 2.8.1 - - '@zkochan/js-yaml@0.0.7': - dependencies: - argparse: 2.0.1 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -6462,8 +4526,6 @@ snapshots: acorn@8.15.0: {} - address@1.2.2: {} - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6471,28 +4533,18 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} - ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - argparse@2.0.1: {} aria-query@5.3.2: {} assertion-error@2.0.1: {} - async@3.2.6: {} - asynckit@0.4.0: {} axios@1.13.2: @@ -6505,58 +4557,8 @@ snapshots: axobject-query@4.1.0: {} - babel-plugin-const-enum@1.2.0(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.28.4 - cosmiconfig: 7.1.0 - resolve: 1.22.11 - - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.28.5)(@babel/traverse@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - optionalDependencies: - '@babel/traverse': 7.28.5 - balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - baseline-browser-mapping@2.9.12: {} - big-integer@1.6.52: {} bits-ui@2.15.4(@internationalized/date@3.10.1)(@sveltejs/kit@2.49.3(@sveltejs/vite-plugin-svelte@6.2.3(svelte@5.46.1)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)))(svelte@5.46.1): @@ -6572,12 +4574,6 @@ snapshots: transitivePeerDependencies: - '@sveltejs/kit' - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - blake3-wasm@2.1.5: {} brace-expansion@1.1.12: @@ -6589,21 +4585,8 @@ snapshots: dependencies: balanced-match: 1.0.2 - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.9.12 - caniuse-lite: 1.0.30001763 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - buffer-from@1.1.2: {} - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -6611,8 +4594,6 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001763: {} - chai@6.2.1: {} chalk@4.1.2: @@ -6624,12 +4605,6 @@ snapshots: dependencies: readdirp: 4.1.2 - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.6.1: {} - cli-width@4.1.0: {} cliui@8.0.1: @@ -6638,8 +4613,6 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone@1.0.4: {} - clsx@2.1.1: {} color-convert@2.0.1: @@ -6658,11 +4631,6 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 - columnify@1.6.0: - dependencies: - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -6675,24 +4643,10 @@ snapshots: concat-map@0.0.1: {} - convert-source-map@2.0.0: {} - cookie@0.6.0: {} cookie@1.1.1: {} - core-js-compat@3.47.0: - dependencies: - browserslist: 4.28.1 - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - cross-fetch@4.1.0: dependencies: node-fetch: 2.7.0 @@ -6833,12 +4787,6 @@ snapshots: deepmerge@4.3.1: {} - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - define-lazy-prop@2.0.0: {} - delaunator@5.0.1: dependencies: robust-predicates: 3.0.2 @@ -6851,25 +4799,12 @@ snapshots: detect-libc@2.1.2: {} - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - devalue@5.5.0: {} discontinuous-range@1.0.0: {} dom-accessibility-api@0.6.3: {} - dotenv-expand@11.0.7: - dependencies: - dotenv: 16.4.7 - - dotenv@16.4.7: {} - drizzle-kit@0.31.8: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -6895,31 +4830,13 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - ejs@3.1.10: - dependencies: - jake: 10.9.4 - - electron-to-chromium@1.5.267: {} - emoji-regex@8.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 - enquirer@2.3.6: - dependencies: - ansi-colors: 4.1.3 - - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - error-stack-parser-es@1.0.5: {} es-define-property@1.0.1: {} @@ -7031,8 +4948,6 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.6.1)): @@ -7115,8 +5030,6 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - esprima@4.0.1: {} - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -7158,18 +5071,10 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -7180,8 +5085,6 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat@5.0.2: {} - flatted@3.3.3: {} follow-redirects@1.15.11: {} @@ -7198,12 +5101,6 @@ snapshots: dependencies: fetch-blob: 3.2.0 - front-matter@4.0.2: - dependencies: - js-yaml: 3.14.2 - - fs-constants@1.0.0: {} - fsevents@2.3.2: optional: true @@ -7212,8 +5109,6 @@ snapshots: function-bind@1.1.2: {} - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -7287,8 +5182,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - ignore@5.3.2: {} ignore@7.0.5: {} @@ -7302,24 +5195,18 @@ snapshots: indent-string@4.0.0: {} - inherits@2.0.4: {} - inline-style-parser@0.2.7: {} internmap@1.0.1: {} internmap@2.0.3: {} - is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-docker@2.2.1: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -7328,8 +5215,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-interactive@1.0.0: {} - is-module@1.0.0: {} is-node-process@1.2.0: {} @@ -7342,56 +5227,22 @@ snapshots: dependencies: '@types/estree': 1.0.8 - is-unicode-supported@0.1.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - isexe@2.0.0: {} - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.4 - picocolors: 1.1.1 - - jest-diff@30.2.0: - dependencies: - '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.2.0 - jiti@2.6.1: {} js-base64@3.7.8: {} - js-tokens@4.0.0: {} - - js-yaml@3.14.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsesc@3.1.0: {} - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - json5@2.2.3: {} - - jsonc-parser@3.2.0: {} - jsox@1.2.124: {} keyv@4.5.4: @@ -7504,10 +5355,6 @@ snapshots: lilconfig@2.1.0: {} - lines-and-columns@1.2.4: {} - - lines-and-columns@2.0.3: {} - locate-character@3.0.0: {} locate-path@6.0.0: @@ -7516,19 +5363,8 @@ snapshots: lodash-es@4.17.21: {} - lodash.debounce@4.0.8: {} - lodash.merge@4.6.2: {} - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lz-string@1.5.0: {} magic-string@0.30.21: @@ -7549,8 +5385,6 @@ snapshots: mime@3.0.0: {} - mimic-fn@2.1.0: {} - mimic-function@5.0.1: {} min-indent@1.0.1: {} @@ -7577,20 +5411,10 @@ snapshots: dependencies: brace-expansion: 1.1.12 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 - minimist@1.2.8: {} - mode-watcher@1.1.0(svelte@5.46.1): dependencies: runed: 0.25.0(svelte@5.46.1) @@ -7655,86 +5479,13 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-machine-id@1.1.12: {} - - node-releases@2.0.27: {} - node-sql-parser@5.3.13: dependencies: '@types/pegjs': 0.10.6 big-integer: 1.6.52 - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - nx@22.3.3: - dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.2 - '@zkochan/js-yaml': 0.0.7 - axios: 1.13.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.4.7 - dotenv-expand: 11.0.7 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - front-matter: 4.0.2 - ignore: 7.0.5 - jest-diff: 30.2.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - resolve.exports: 2.0.3 - semver: 7.7.3 - string-width: 4.2.3 - tar-stream: 2.2.0 - tmp: 0.2.5 - tree-kill: 1.2.2 - tsconfig-paths: 4.2.0 - tslib: 2.8.1 - yaml: 2.8.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 22.3.3 - '@nx/nx-darwin-x64': 22.3.3 - '@nx/nx-freebsd-x64': 22.3.3 - '@nx/nx-linux-arm-gnueabihf': 22.3.3 - '@nx/nx-linux-arm64-gnu': 22.3.3 - '@nx/nx-linux-arm64-musl': 22.3.3 - '@nx/nx-linux-x64-gnu': 22.3.3 - '@nx/nx-linux-x64-musl': 22.3.3 - '@nx/nx-win32-arm64-msvc': 22.3.3 - '@nx/nx-win32-x64-msvc': 22.3.3 - transitivePeerDependencies: - - debug - obug@2.1.1: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7744,17 +5495,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@5.3.0: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - is-interactive: 1.0.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - outvariant@1.4.3: {} p-limit@3.1.0: @@ -7769,13 +5509,6 @@ snapshots: dependencies: callsites: 3.1.0 - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - path-exists@4.0.0: {} path-key@3.1.1: {} @@ -7784,14 +5517,10 @@ snapshots: path-to-regexp@6.3.0: {} - path-type@4.0.0: {} - pathe@2.0.3: {} picocolors@1.1.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pixelmatch@7.1.0: @@ -7862,12 +5591,6 @@ snapshots: prettier@3.7.4: {} - pretty-format@30.2.0: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 - promise-limit@2.7.0: {} proxy-from-env@1.1.0: {} @@ -7881,16 +5604,8 @@ snapshots: discontinuous-range: 1.0.0 ret: 0.1.15 - react-is@18.3.1: {} - react@19.2.3: {} - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readdirp@4.1.2: {} redent@3.0.0: @@ -7898,48 +5613,20 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - regenerate-unicode-properties@10.2.2: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - regexparam@3.0.0: {} - regexpu-core@6.4.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 - regjsgen: 0.8.0 - regjsparser: 0.13.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 - - regjsgen@0.8.0: {} - - regjsparser@0.13.0: - dependencies: - jsesc: 3.1.0 - require-directory@2.1.1: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.3: {} - resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - ret@0.1.15: {} rettime@0.7.0: {} @@ -8014,14 +5701,10 @@ snapshots: dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} schema-dts@1.1.5: {} - semver@6.3.1: {} - semver@7.7.3: {} set-cookie-parser@2.7.2: {} @@ -8060,8 +5743,6 @@ snapshots: siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-swizzle@0.2.4: @@ -8076,11 +5757,6 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.19: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8088,8 +5764,6 @@ snapshots: source-map@0.6.1: {} - sprintf-js@1.0.3: {} - sql-formatter@15.6.10: dependencies: argparse: 2.0.1 @@ -8111,16 +5785,10 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-bom@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -8222,14 +5890,6 @@ snapshots: tapable@2.3.0: {} - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - tinybench@2.9.0: {} tinyexec@1.0.2: {} @@ -8247,8 +5907,6 @@ snapshots: dependencies: tldts-core: 7.0.19 - tmp@0.2.5: {} - totalist@3.0.1: {} tough-cookie@6.0.0: @@ -8257,8 +5915,6 @@ snapshots: tr46@0.0.3: {} - tree-kill@1.2.2: {} - ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -8267,12 +5923,6 @@ snapshots: optionalDependencies: typescript: 5.9.3 - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} tsx@4.21.0: @@ -8315,25 +5965,8 @@ snapshots: dependencies: pathe: 2.0.3 - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 - - unicode-match-property-value-ecmascript@2.2.1: {} - - unicode-property-aliases-ecmascript@2.2.0: {} - until-async@3.0.2: {} - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -8410,10 +6043,6 @@ snapshots: - tsx - yaml - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - web-streams-polyfill@3.3.3: {} webidl-conversions@3.0.1: {} @@ -8478,19 +6107,16 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} - ws@8.18.0: {} ws@8.18.3: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yaml@1.10.2: {} - yaml@2.8.2: {} + yaml@2.8.2: + optional: true yargs-parser@21.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..8f80f0c --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +packages: + - 'apps/*' + - 'libs/*'