From ef9177ec09c97ec110e46040c0fbefab1e4ac23e Mon Sep 17 00:00:00 2001 From: Oliver Rose Date: Sun, 18 Oct 2026 15:20:08 -0400 Subject: [PATCH 1/3] cache improvements --- package.json | 1 - pnpm-lock.yaml | 1156 ++++++++--------- pnpm-workspace.yaml | 2 +- src-tauri/Cargo.lock | 174 ++- src-tauri/Cargo.toml | 3 +- src-tauri/capabilities/default.json | 4 +- src-tauri/src/cache.rs | 148 +++ src-tauri/src/commands.rs | 19 - src-tauri/src/error.rs | 3 + src-tauri/src/lib.rs | 19 +- src/lib/cache.ts | 83 ++ .../components/settings/custom/Cache.svelte | 56 + .../settings/custom/ClearCache.svelte | 39 - src/lib/graphql/7tv.ts | 11 + src/lib/handlers/seventv/emote-set-update.ts | 7 +- src/lib/handlers/seventv/user-update.ts | 2 +- src/lib/managers/badge-manager.ts | 4 +- src/lib/managers/base-emote-manager.ts | 99 +- src/lib/managers/channel-badge-manager.ts | 3 +- src/lib/managers/channel-emote-manager.ts | 56 +- src/lib/managers/cheermote-manager.ts | 3 +- src/lib/managers/emote-manager.ts | 42 +- src/lib/settings/categories/advanced.ts | 4 +- 23 files changed, 1092 insertions(+), 846 deletions(-) create mode 100644 src-tauri/src/cache.rs create mode 100644 src/lib/cache.ts create mode 100644 src/lib/components/settings/custom/Cache.svelte delete mode 100644 src/lib/components/settings/custom/ClearCache.svelte diff --git a/package.json b/package.json index e03d4853..f7e96a3c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "paneforge": "^1.0.2", "shadow-plugin": "^2.1.1", "tailwindcss": "^4.3.3", - "tauri-plugin-cache-api": "^0.1.6", "tldts": "^7.4.15", "valibot": "^1.5.0", "virtua": "^0.52.7" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e8100d0..b44395d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -166,10 +166,10 @@ catalogs: default: vite-plus: specifier: latest - version: 1.0.0 + version: 1.3.0 overrides: - vite: npm:@voidzero-dev/vite-plus-core@^1.0.0 + vite: npm:@voidzero-dev/vite-plus-core@latest importers: @@ -192,7 +192,7 @@ importers: version: 0.4.2(svelte@5.57.1) '@tailwindcss/vite': specifier: ^4.3.3 - version: 4.3.3(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + version: 4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) '@tanstack/svelte-hotkeys': specifier: ^0.12.0 version: 0.12.0(svelte@5.57.1) @@ -231,7 +231,7 @@ importers: version: 3.2.1 bits-ui: specifier: ^2.19.3 - version: 2.19.3(@internationalized/date@3.12.4)(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) + version: 2.19.3(@internationalized/date@3.12.4)(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) chroma-js: specifier: ^3.2.0 version: 3.2.0 @@ -259,9 +259,6 @@ importers: tailwindcss: specifier: ^4.3.3 version: 4.3.3 - tauri-plugin-cache-api: - specifier: ^0.1.6 - version: 0.1.6 tldts: specifier: ^7.4.15 version: 7.4.15 @@ -283,10 +280,10 @@ importers: version: 3.12.4 '@sveltejs/adapter-static': specifier: ^4.0.0 - version: 4.0.0(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3)) + version: 4.0.0(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3)) '@sveltejs/kit': specifier: ^3.0.0 - version: 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) + version: 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) '@tauri-apps/cli': specifier: ^2.12.0 version: 2.12.0 @@ -313,16 +310,16 @@ importers: version: 6.0.3 unplugin-icons: specifier: ^24.0.0 - version: 24.0.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1) + version: 24.0.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1) vite: - specifier: npm:@voidzero-dev/vite-plus-core@^1.0.0 - version: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + specifier: npm:@voidzero-dev/vite-plus-core@latest + version: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' vite-plugin-devtools-json: specifier: ^1.1.0 - version: 1.1.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + version: 1.1.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) vite-plus: specifier: 'catalog:' - version: 1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) + version: 1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) packages: @@ -451,289 +448,289 @@ packages: peerDependencies: svelte: ^4 || ^5 - '@oxc-project/runtime@0.151.0': - resolution: {integrity: sha512-fNuliiqGTseerW2FTbxq6UOQavKL/NvNh9K3peJZZVNi1NbM4Ehscwp3MX9nu+9bfbSfmPUEivF779XQU5exiw==} + '@oxc-project/runtime@0.154.0': + resolution: {integrity: sha512-cBQNGoh659BNgvA8OC/e4BNDtFkv03dJaYdkp2adgOQNtISNAPQ+nB4S8XvWtNk7Xl+0g+7aa+iRGR25Xycd1Q==} engines: {node: ^20.19.0 || >=22.12.0} - '@oxc-project/types@0.151.0': - resolution: {integrity: sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==} + '@oxc-project/types@0.154.0': + resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} - '@oxfmt/binding-android-arm-eabi@0.70.0': - resolution: {integrity: sha512-Xd7YO4/T2axEj6FTLcj4Why3mTBqFMg+x24xtorT4Lb2+1g82090GH0a/4U1m0pABGYiix2bq1pqkYrmV3f0Sw==} + '@oxfmt/binding-android-arm-eabi@0.73.0': + resolution: {integrity: sha512-dhunAdMbi/4o0Y66/+Wl6rpsNqpvE4i26Qw6bB77A97L2lJoktWg6m+X9QOon8iOEEqzD9rEZqFi5uZ4oIzhCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.70.0': - resolution: {integrity: sha512-x9rlMYyKXdgKdYyUJzGsK1ZV8P4di/J32ipzcS6Jet6p9r9UAh28neXIMtdlSaJJycdi61Z4YkcLKLpk8ueFjg==} + '@oxfmt/binding-android-arm64@0.73.0': + resolution: {integrity: sha512-dBoypjC2/xeyKyIhN2waX0/XeoccH9k0lVVe+sGRc4X8HSJVRtqyZDoXdr7bGY9A75c51dX0z0dLDpGQKwCdCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.70.0': - resolution: {integrity: sha512-IUTUPvrBVYy7POh4stXzRdz4IVC/1QSaviCWoyenSlOhGu0X9j5K07vCTM9biLjAA2Zs31l0Rj5vvRpj9n95wA==} + '@oxfmt/binding-darwin-arm64@0.73.0': + resolution: {integrity: sha512-Tn7Y+qWIpCQK+qdYwBcn6YvqeBuPiuG3tcNlYg16a5QL2o3rSmrgBB1nCyYqo0uvc1LNrfQW9/CK2tzFuID/Fg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.70.0': - resolution: {integrity: sha512-vw745q870oTd6J517O24asoX4/E+eK0nxYIFoedSLqgJ+nI5En7+ZS82iZSHZ69zevQrnOXiyHP01dA+t8xD8w==} + '@oxfmt/binding-darwin-x64@0.73.0': + resolution: {integrity: sha512-yVb0E0tg/+9Xc9YJCBq66qF1DC/aN5mhb5nnHz0k4ikwkMANtSul2VPDSwjYdXR6/DFimc+pPUgLBqkIa5Ctuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.70.0': - resolution: {integrity: sha512-NO14EgSM9dFkcg+MfGPxvsKqXYs9LKaxPrOKXpv1R0rLokGGFDcCq6dBMq18dE4wlpFOovX0UZY2uh1P30O7QA==} + '@oxfmt/binding-freebsd-x64@0.73.0': + resolution: {integrity: sha512-IKR4lFnBkYNL9Uqdxa5GMTQLvnLj+3sDwTvh2atHCzah0xeo+1xR5bigRU8uyXlOsA4VpXUn0UAimq4E4RBGmQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.70.0': - resolution: {integrity: sha512-139OEhHarj9CYoJ/i9gXlPv4KLBGtLj2toseOWYFf09QwlhklaZk+wW3aOvlqoeZtuayvkoSNVWra7WJ21s3VQ==} + '@oxfmt/binding-linux-arm-gnueabihf@0.73.0': + resolution: {integrity: sha512-7qnZ4g0ZCO3aZevOOQpZIABYwwXJW1lLDo2elviGdPQ0i11255xKEMFsi97fC1/nauQFseCJfELUy/k2JoOP+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.70.0': - resolution: {integrity: sha512-GEh2PY3IWTE0M24eNhTduountANSbWyDmMnzFSQE/nGg/bjPugbUgiGuFu+xdqcQSd/HKSwH80/F2yVVD48yhA==} + '@oxfmt/binding-linux-arm-musleabihf@0.73.0': + resolution: {integrity: sha512-36eBico2j/WPB84gb4FYd/jjqGCKOwU4M+TWLBUIqlnzTozQueLy0joA5BwsSp2OZFVkOlpCwvA3ndPamdiyLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.70.0': - resolution: {integrity: sha512-En5i+UJmZSPxuSf47F2Hl5YOzKB0bicQLnGQkeTCMQ35cWLtbrSwACJKfiLqRZrk05DwSnsJkhBRaM3OURtIaA==} + '@oxfmt/binding-linux-arm64-gnu@0.73.0': + resolution: {integrity: sha512-VZ3cSgCAT18knKo52DcACmAuIoqG6qVEyeZRFbJd0xmYQ8GyYjuBc6IAh6MZHijT6q7p4/HPI+6ZWsCuhdV6iw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.70.0': - resolution: {integrity: sha512-WWOoV5W9Im3flVwOVrWn/2DUlOF8v5vcCip+kcNuaMpulRCh6nzzt1Su2vcL2F908YJIXNV3HvegbBHuyLwKHg==} + '@oxfmt/binding-linux-arm64-musl@0.73.0': + resolution: {integrity: sha512-8YVzH59XSHcqwXNgc5qK851zCqwpmBgOifARXEPPe5/xTsIbHceYoPZAyqfpYV0CfKmzSaEDBgYHFza4rhx+Zw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.70.0': - resolution: {integrity: sha512-YUouneIqW+5n7aE8xx/zeZ6/utr/KH7oykcGoFyd8Uz8uh591T1oKlnoWA3BsRq/ZR42oY1w4MUYvS/0e/MQOA==} + '@oxfmt/binding-linux-ppc64-gnu@0.73.0': + resolution: {integrity: sha512-MqRJnmCys0rwOgpWyEidSA7v/bvOqfNDJhPkQoR9mPVYrvSmMaW2Xhdpl28cbTA+brOM1is62GjIvJplVlUVpw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.70.0': - resolution: {integrity: sha512-iEnMf21S5aGVa4hViDGY8sAQ/AHyCu2JPyrQF8P06wtHhSkD1YJBeT4m/KiGewgf7+a5XCYSCRIPcRQa1xwEoQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.73.0': + resolution: {integrity: sha512-4t2F3SWJSK/O/kRRFnL0elJzn75fJGGu71gs1HtiWcS80SmJOpkHiwwLnTp9suGdns8VHEPxYS0GTcyVwHKWBA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.70.0': - resolution: {integrity: sha512-91Sdniaj20fQzyMeCxMDzTP4c9s4RB8dGQ308xHhDR0n6U7+1Xq7N9klE7mfXq8iV3lRmIGSXi5X23Hn/0XX/g==} + '@oxfmt/binding-linux-riscv64-musl@0.73.0': + resolution: {integrity: sha512-D8b4I8I1kLdJQFwdFXNV+cwh3xWSiNKofjdGUk0nDpc0AHOds8T+poGbP9RWQMvgsvMb9OMgp/aV7ahBR37TbQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.70.0': - resolution: {integrity: sha512-uUV30M6E+2TKKGMaKiwfeL4RZrviHXlUxsrYJ/jFBb+1EZy+pnFT+hF73eeWdzh5NqPOAnw0iiMAIqjqiLZPFg==} + '@oxfmt/binding-linux-s390x-gnu@0.73.0': + resolution: {integrity: sha512-QrC1S5VL1+N5rvorB15jH7CPvjVHA7GyUI5oVEd8Bd9m5605RDBQYTxDQ920DuylRoZOh2V7/xXpfCtFUrojUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.70.0': - resolution: {integrity: sha512-ivMcX6kNDPhqtbOaBt/ItFlLlTlXNHLgRuNmxP6Na6UuYXRT10llpJcAPbGeRgjjb3Qzv4jwPp3fB0hui50WNQ==} + '@oxfmt/binding-linux-x64-gnu@0.73.0': + resolution: {integrity: sha512-dFcUKQPltCEPa+YlkF3zqufn6nJPZdG73LpnjBvZFFsU3laCMssDXSYB99mVaj43FqdEgjpz5TO6gbYXcczd9g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.70.0': - resolution: {integrity: sha512-w+S+fERxYmlZSyZlJK/U292FjyBoH8cCEj21/tYJX6atX5kNSn+HDkhlFQKT2zcMwUW0uAtUL/bOrlwJZwqRdA==} + '@oxfmt/binding-linux-x64-musl@0.73.0': + resolution: {integrity: sha512-LmQe+nV8e+eUwfPNCxDF+owbsg88toBiR/8rZRgVOeKQP3MaGefXZRvBoc1UG37iWEQ/9JlCXG9Mc4nf4N3agw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.70.0': - resolution: {integrity: sha512-Zlom1Xkx257R8bk4ZI4zJsrGno2opknz1+5v5baka3nn4FPyvNSdh8JUL4CdN1S1OWRMvJ9UJQ+RfIqGGCUEfA==} + '@oxfmt/binding-openharmony-arm64@0.73.0': + resolution: {integrity: sha512-8weOr1OKknE0G2DbR6ejJUT9AOsoBU6cXlsetmbihHv1K+bK7qP61T6lJxY0k/aAO7GyOJiRGNlL+04r4eH8Xg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.70.0': - resolution: {integrity: sha512-FQgPW5R17vzt7cgrJ8eG/dqX00o2xHsqFeLfw4xzA9FRHpN/DjFo9YDonvIIXGxiEuS9F/jZPnGO+KHNKuCo4Q==} + '@oxfmt/binding-win32-arm64-msvc@0.73.0': + resolution: {integrity: sha512-mZV+QxXYgb8E18gzAFItb937VIsE4dqWdStrD3tRRC52UubOYEuU+e7NaIqUsGdB5YsJqNeuck3Ue/af2r9wyA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.70.0': - resolution: {integrity: sha512-ZfZublNhZ+XBndMiXhkiLlPE+XyGRDa0CweeTL6t1fZypfCh1LTg7e5CvnOeTBunq15MskOcRempumSPGAaCQA==} + '@oxfmt/binding-win32-ia32-msvc@0.73.0': + resolution: {integrity: sha512-QJPUsbgUb97ZPPMkFUq6VQq0fLhC4Np19KL9aB/qKVwXnpKE6MIiILXqzhKnQ/UbnEDjKJ7Xv1d6zH4bYPCUdQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.70.0': - resolution: {integrity: sha512-HlIZEn+WzLQL0DszNzldiRl/DPRCX5R0Vkt6qeUPR1YHwy52hZZo4x6HoTOVmKRP2wUiwPGtKsihNY/f8KRaBg==} + '@oxfmt/binding-win32-x64-msvc@0.73.0': + resolution: {integrity: sha512-cGcze2fu+ykIaFtkEvZlkZ3HvnCLk+WISthtq99zWTWn0x13t5L9TxvGdLZMUMvtfYR+ICkiCwKnguVubdcw0w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@7.0.2003': - resolution: {integrity: sha512-TgV33rXr6ueXBwvc+0nssUkTBSXHJxv77I8p4RCjDjCnvexHtmoPiudVRDfj3S3puMDdeQdHW6jdUgUPy3nr/w==} + '@oxlint-tsgolint/darwin-arm64@7.0.2004': + resolution: {integrity: sha512-uJk3ttju7Lz+Nv8WG4CsLyewoL1qf/Ny8S8OksJ7Bm/F14Tc9gMfW6arM1PCc57IzH/X/I79YsCWTgxX1FKibQ==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@7.0.2003': - resolution: {integrity: sha512-hY3FMAjIaPDdK3FNxyRXRfHPOFeoBn6dmnLyKZgQ2IbTTD1adXhl6PfCIqHhCPvurigv7nf7mYuWZZ19MmJzmg==} + '@oxlint-tsgolint/darwin-x64@7.0.2004': + resolution: {integrity: sha512-0BFfHTzDxNDFPcu0UZAXT6CyCJHAXM0dZveyDb4KEHa2qF/DSnOKOrmvK/wFuFol9kvijbGM9JfuOsor+zWXRw==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@7.0.2003': - resolution: {integrity: sha512-eAET4JpyfBbg8SO0K74o4R55tEjVC292pIyxGOw2XGf8x/HrPNyxwQ478jMYOM54FIVOHc8sJ6VRHxluy6lucw==} + '@oxlint-tsgolint/linux-arm64@7.0.2004': + resolution: {integrity: sha512-TAehQc+qdRXyDN3nl/r/3/oPrBVrbtrDeGMkFyG6mf+XphpoJ2lAMVFLclyvrVZCw02RbKROjyw8h72XwQQHcw==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@7.0.2003': - resolution: {integrity: sha512-GXdyO/XyqDJ3s/llR/oOktLsYNjZtWSQBy0JMc+/0gsNPvTcseKPhn9c6KcFyWmnr6H4vljYALbujonqSzzEGw==} + '@oxlint-tsgolint/linux-x64@7.0.2004': + resolution: {integrity: sha512-LPunZvm6ZbWPfHMAyfZf9ci3HHvNEzLejO8zdqO3GoVGoSEHqqufHUD7+OgeatVSaJP7uXDJ2HaNOHIoH7go4Q==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@7.0.2003': - resolution: {integrity: sha512-TWauXnPfet0VgpmrstoAK58eJ4gbuwPUuUTQmYQAzE/RG1CpnxXtrKUJULf6lyerPE4KN3gM+DflIA1hOH+38Q==} + '@oxlint-tsgolint/win32-arm64@7.0.2004': + resolution: {integrity: sha512-FVWplzDImWhiuawnIZVETaQecv4GWom6Jv4Fx2xj7hhXXDZ5okEgiw1gTCImHTIQsi2ycC5oSxVwrn69bMh7iw==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@7.0.2003': - resolution: {integrity: sha512-DoRmfe7j8VqNlukp8liRVW45GQDhzRccNenjD/pdzelgtffW47pCMd1xbJLkPaPbKnTwID3onn3VZlL7JbebEA==} + '@oxlint-tsgolint/win32-x64@7.0.2004': + resolution: {integrity: sha512-7PsxuUx11Ry9DYTWcljTzRbmZY9B6O9fFFfZV+aodQEMy6pfRT3fhoQRv9PtGN/89z1pPz3nFKrsFm6WqNtX7w==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.85.0': - resolution: {integrity: sha512-q2KO/Zso9UT+OMn0NF9ywn4E4t0MI3yxiDhNyhsQ7DyQJrC4FhFE4TXOi4bktFnOWXTMds8qZSbpv2XwRaNOBg==} + '@oxlint/binding-android-arm-eabi@1.88.0': + resolution: {integrity: sha512-k6Fgkf86ubfeH4GvqYsRolfuVAp0pfYVZvifSlXNHPdMaWUOfxUrmLEeDD7hF6U2oJuhsVxhSWq86/xCJ+9MmA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.85.0': - resolution: {integrity: sha512-SxLN3ALjoT9NNdvpjEevGeHvfzTAFrF0NBYB5tzK7/GtCKMze3j1e/m/X2ozqGj2U9hfGG/dg/OG8vpVK4PiDA==} + '@oxlint/binding-android-arm64@1.88.0': + resolution: {integrity: sha512-AsIyhl9o1ejwtac7NMbhKpMdSml6NWR0ljKjZERxC8OHYDAW8o/Om9n1QHVLi4VCEUo42Zte2/Op9kyoGpJZMg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.85.0': - resolution: {integrity: sha512-Y/Sup/J4f0f9UGsSd/xyCNTeWL+gepO63GBdEDAfue9nBsnk9zMmnIXx1O6b1V8C90vB5nucYNZ0pbMXAp8zJA==} + '@oxlint/binding-darwin-arm64@1.88.0': + resolution: {integrity: sha512-qgBjB7eEKcCB4RqjXGuoSZq74g0wD09fWFJ+HWcCJcKaga8TeUHtb+BY0SsxdleSLBgx4RZ7qmgo0EzqEq7JoQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.85.0': - resolution: {integrity: sha512-ApOSNC04ynpDTwvBD+//0wyfODRSbEzvRoKpX8teffmc27z8AockwSNeMXGJXn5KP85eahDgR/2llICWLkzcnw==} + '@oxlint/binding-darwin-x64@1.88.0': + resolution: {integrity: sha512-sCz3X5Mw/xdzEzn4fsCt1Iq8NKJnGNfhR+b9B5k+4DysYAHsmIhYoocnBPiQ9kvY3+pUun2A0Z8Vtun/Nv6YoQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.85.0': - resolution: {integrity: sha512-bNrVrCOA/kHky3Tu79IXWXe5bhIgLXfUuUEDHlAGOHUk96MkvDZ1ecaQF19rwstrnaqfP1o9nBTqzIr9+ZHkUg==} + '@oxlint/binding-freebsd-x64@1.88.0': + resolution: {integrity: sha512-xTOdYOIqCufgIj0knvxu86FBfovP6QBiD7ngNva01gb8xPQCD5gXkE5APGczH35zStim1O3zqvFbLQmY85xXRg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.85.0': - resolution: {integrity: sha512-NUrzOJ1s/EqsVvfn2L/1D8Wro2LPIZUbihL8kOJLh5fEdGEN3rdOGUYq3HwnUIL8sjpoP+4N6RaGrgmMJnaMPw==} + '@oxlint/binding-linux-arm-gnueabihf@1.88.0': + resolution: {integrity: sha512-BLadtw88NdYJBrAtC1dYzrPfSP2d5zgx6iuZycdD0YmZBJ2Nqbit9Z4PSaIb6gxK25dweArGMPbOmq/0ugwUPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.85.0': - resolution: {integrity: sha512-UJXrAT3E/RWkEqXLIs2ehETja1qfgkPb+5gwLIIS+o/6cf+grHvoOXTa5997a/YNQfcJS0DRBTOfZt95cvOI1g==} + '@oxlint/binding-linux-arm-musleabihf@1.88.0': + resolution: {integrity: sha512-wILSczl/DaZsCcf7j7tvNbssp8hxEHIJxrv4j7+JjI3TAL1U/JTWbeUtoJJC/vo8+2hkTmHLYoKJjmiNbijdXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.85.0': - resolution: {integrity: sha512-lK40QLjI0HxigO7CjDDshEtfYIeiYS0020v5BHFPqN4uuQBQxd2K9LNom2dW15o9F1937quSCRVp4ZsVhdbYdg==} + '@oxlint/binding-linux-arm64-gnu@1.88.0': + resolution: {integrity: sha512-jutT2Hy8JCuZuMwIFHo2HtyxfOfBJHyQxlBHBK1SL9W2f8n/WhjAP0FnDMz9d/mjhv9+QA0mx5AdQ9fDjsrFFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.85.0': - resolution: {integrity: sha512-c2zbdBwGKreHXwRx3gWBuFGJxLhxgsg6YlZ+3H+RgRusU/UEV9jNwJ3HGYK+nRo0LvBa7mt6Kj86xoVotUo8cw==} + '@oxlint/binding-linux-arm64-musl@1.88.0': + resolution: {integrity: sha512-8N8iGV9hh4Lkeuq7QsEkjoXNRRflqR1G2qyoGYXcA0k5qllrdqmfylKEXyHIVERxqNDyMO4StqDQ0uLxXcBQAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.85.0': - resolution: {integrity: sha512-tlt/Hy8lZ97/lCPmCgw/B3k/mwh+BzaIPbPkldZEly7TwLmx0xe2CQcaW2g/rR0dOgS9JNGCZsMEqLhUNMGvaw==} + '@oxlint/binding-linux-ppc64-gnu@1.88.0': + resolution: {integrity: sha512-5ydcQt3znNQ/rGEWYRvpS2cK9+T18P2VYgnyJ+eloEAwi9YUmsXy5VGrRqNWIK6qzWwHGnEE3ojVqqQNo+f0hA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.85.0': - resolution: {integrity: sha512-3tNR9Xey82X0zKuY1d8hJ6Rc9gwRDurmqGLnQZa5xqOXy8/YyiqFXjAtugkKLY82obOlpK1eSiDRlgcNPuxtIg==} + '@oxlint/binding-linux-riscv64-gnu@1.88.0': + resolution: {integrity: sha512-iGx0uvFT54b/5DPJdEBCxYIrVB3v0uTy+JhRh3CyEp8/22BXDkG8rffkFwREdLsdj9mOrPbJYVOZw8ipcBuzjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.85.0': - resolution: {integrity: sha512-wbGRd5PqCcjkJFHhZuZ2OBSUQY9czlQsoA/cQQB9JK/L9mC5MQgGoKAh+xd8QjA5V+0D3j+Qd1lAWn1I8zlelA==} + '@oxlint/binding-linux-riscv64-musl@1.88.0': + resolution: {integrity: sha512-Wt47mKMWelVjRjuR7BCFxXkB0m79K1sTEbqMHRWciKUgo5iv7sWsF4RXSOyFYHD9zerNrkRZblnN273rhwOA1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.85.0': - resolution: {integrity: sha512-3Sn0kSrE4DPZCWV/8o+n4x3aFZxI9ulMnkYlwCbJ8eUVkwRK2IerohE/A/z3SNbCwoPFOCJmGE5Avrq0rrvdvQ==} + '@oxlint/binding-linux-s390x-gnu@1.88.0': + resolution: {integrity: sha512-g3L12KCS4+1gtUt3RbJ4F+Yxx4LNmmZLEPfhd8rAHEJjJk2lAgNfnjGoP/phJyhG5WS6VbNYbJtadJelNfvTMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.85.0': - resolution: {integrity: sha512-JY2pxxYfB62bAGfejljVCqc44etItehPuAyaeSAdMuEMtwNA00ggMnS66lC1oIhos6oOXUkuU6mZ9bpFh3BqWg==} + '@oxlint/binding-linux-x64-gnu@1.88.0': + resolution: {integrity: sha512-og/XHVDOD9ZJgRiZkT9DgzQd4sr+JZW7e4l17Q/jVMZiIbeEd4uIu9iAoUbTF1gIvVZoRc4QDOxyVUvQGp4WHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.85.0': - resolution: {integrity: sha512-5k74vZ6qJBjBHEOlBk9B/iv68Yu0F1Afw/vvT2ar6OGCqEeXLaSjXz2n/IPCbhLG22UoKoYEJTzpYraRdcp6PA==} + '@oxlint/binding-linux-x64-musl@1.88.0': + resolution: {integrity: sha512-EmhBsp+xuKb6YbZNEMLBo80Xw71AZOIm18do8ni/GLX/Lw1XzNhVYpbxO1KasYtoAvrGtCOdCPULRlIE0bPbTQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.85.0': - resolution: {integrity: sha512-GbAl5qt5TCkPLXTaIISZJnugrcBhra6rodcXc9jYt620UtdsTt71NlNmJmm0frxzFpd54x/G+MkitEJA8I/BoA==} + '@oxlint/binding-openharmony-arm64@1.88.0': + resolution: {integrity: sha512-DBUcx/KwYdg1DAz+G01P/GFv512J04EsZadbHptx2FTpWT/MWRg21ZToNHt9pnsfQRBQ3et/g+vqzbvrdAVbuA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.85.0': - resolution: {integrity: sha512-kjmws5MK0et2swk4ND85D7NVQyDHw162i6whtZDLUA/lo6FQyBZDcmMRCMcVZcNrAhIaftVb00x9ChGDOjjNJA==} + '@oxlint/binding-win32-arm64-msvc@1.88.0': + resolution: {integrity: sha512-xeVd0n4XG5HvynxfYvXi6uB+JvZbVZataowPS8cYpMbYg9mwE4sSyElFQd4LVJFifq8bRLDSR18XgEildmcXAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.85.0': - resolution: {integrity: sha512-eSsIJx9n4yxvOqYTZyPEMyEXRmE60XH7xGAU7i0Qbsn1lf6Za3CWJ9aRd82oSFKXaxhp+sA6/yMJVRIpLpna6A==} + '@oxlint/binding-win32-ia32-msvc@1.88.0': + resolution: {integrity: sha512-MA6iOw//amleaz2mVMsZrA7NHlEexjTrhIxSMFCXQi6IUuQO+3Od00GZhr2iCYw6RFzMW36jkKK/WHBXMsoQAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.85.0': - resolution: {integrity: sha512-pBebIPUpKKhWrhSMWhy8TdAZBewiXnfxmaAGxhzxM1068GagqFaTwgKlU6e+UyJ2sPR+VoHouhXuGJkQjsrDvA==} + '@oxlint/binding-win32-x64-msvc@1.88.0': + resolution: {integrity: sha512-3Sz6rVWe8Dy+ufsXurFN1GX2dX43F/lQMSLelK9gFjiba7nHvLlqlhR5cHlWVnCpSqUY1hN9pyCX9XToe6ve6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint/plugins@1.79.0': - resolution: {integrity: sha512-S0uyoxakDINJ4DPgqxGlEEvrdSMeQb7Z2lKVjxoY2gwsbZbfg2Xr8Klfeo5ZeraHmmdBCELFUHkSe6KEmBpMvg==} + '@oxlint/plugins@1.88.0': + resolution: {integrity: sha512-G2xbfWTrbqYRhR/vfeKNMQf/sS3/ti0iKJAAkRxHuXWZH/hne/dyIb9QKk5LuR6cJLARxsL6FMoAYmfspd74MQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@polka/url@1.0.0-next.29': @@ -1007,12 +1004,12 @@ packages: '@tauri-store/svelte@3.2.1': resolution: {integrity: sha512-uuBn7/XAtyEoDY4R8ZsQJ02eJpX0id69xRAbkxXlx6nmds9vUSJkq65e4UHe+Pq2KC3QlJW6FumYKWhZv4xiUA==} - '@testing-library/dom@10.4.1': - resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + '@testing-library/dom@10.4.2': + resolution: {integrity: sha512-yzr2S9HyAIdhz2/6qHgbs665Q7PKVcDF05vsOlHPxG1mo36gKVesdYVeDLnXgfjJ03CrKRk08knc6+E/9m8v2Q==} engines: {node: '>=18'} - '@testing-library/user-event@14.6.6': - resolution: {integrity: sha512-Jbs9FpkkIDw8FgSc6kOVsOv8JuuqGAL7J4X1oot77JxAoDlkNn2GRkd0aYRVuQ+pVQAiHWVkE4rX/dkF5fBiCw==} + '@testing-library/user-event@14.6.8': + resolution: {integrity: sha512-vgSSqnANMnkcYR/vUNDbwS7aM3OErRLNUG8vCVVlj4oc6cKffUrccX7UAS5AmJQQNZTSibi9z5GvvRZ0aYgUCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' @@ -1035,20 +1032,20 @@ packages: '@types/node@26.6.3': resolution: {integrity: sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==} - '@vitest/browser-preview@5.0.1': - resolution: {integrity: sha512-NagNnZD6A8ccl+pycLWX2b/e9YJtH5NuDUyiiadQjptMRuZVBAB9r9I3itdKm6exxtcl+rOTv2rWt6vu5uOm1A==} + '@vitest/browser-preview@5.0.5': + resolution: {integrity: sha512-ViNg4UlomGSJHtnnr7Txm+55P7/aAMMoS+1WYnWjp5w5tzf7YEUAICcs2sb1uMovEnC8el/8zUfkWZ8+7fPCKA==} peerDependencies: - vitest: 5.0.1 + vitest: 5.0.5 - '@vitest/browser@5.0.1': - resolution: {integrity: sha512-s2UroEhP2BZPoen1qrXXTtVqnUcs6y2sxMLGCZ8tZDkH2iM/6tTC2GVTPCgF+oVF3X5M6wC/X2O0MvvoHNmH0Q==} + '@vitest/browser@5.0.5': + resolution: {integrity: sha512-IDMoZX/iZ8rkilw7weaSgN8tJ7iZ9hUv0wYoKXyiyjWjWFwLSWAY707DcVTgxTYOudWC1E3HA9LYn7kVa9a7uQ==} peerDependencies: - vitest: 5.0.1 + vitest: 5.0.5 - '@vitest/mocker@5.0.1': - resolution: {integrity: sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==} + '@vitest/mocker@5.0.5': + resolution: {integrity: sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==} peerDependencies: - msw: ^2.4.9 + msw: ^2.4.9 || ^3.0.0 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: @@ -1056,30 +1053,33 @@ packages: vite: optional: true - '@vitest/pretty-format@5.0.1': - resolution: {integrity: sha512-6guWwj5d9bguuefTOvJoq387tfpkzSv554YdUEGzjJH2PnnmvzTLQ1UQSuAk5wBFVhf2CUmy/S/palOcb6dmpA==} + '@vitest/pretty-format@5.0.5': + resolution: {integrity: sha512-24sSdIlMA9DVPXnYiB9siwU0bTd887Y9jX3+vabztCSsvHwo7ipvJ/a2L3Rljw8+2rK1f5fCj3h5U9I/Jsqgbw==} - '@vitest/snapshot@5.0.1': - resolution: {integrity: sha512-aEW4fuQVg1i3fnC781qvwxC5QNptUvb+JjIUfX1WuWJqkjCgpiU8+I89mMcJmxOPLdaGAwEPFFVk02rGKYexvw==} + '@vitest/snapshot@5.0.5': + resolution: {integrity: sha512-dHyFElWMQy0wFBGrIaPPeUWfJFh+jAUrv46ImIJGd8CADdKV3mlrAu3FyD0wesdxELFCs9M807e040Kba/XKtA==} - '@vitest/spy@5.0.1': - resolution: {integrity: sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==} + '@vitest/spy@5.0.5': + resolution: {integrity: sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==} - '@vitest/ui@5.0.1': - resolution: {integrity: sha512-7PvQu/X9/pQoHYfNLAYL22qsD4/+sx2k7zpUA7XvjW0sc40r3/r0lGZ2fsEyOHMuO8Q1KjiO1QQVjJdnWUy/WQ==} + '@vitest/ui@5.0.5': + resolution: {integrity: sha512-dCoGUOdgmCaSB2g+WQ/spPCBkytAWdNUkFSXY4z+eYp2d8JEOY8v0uDRaJTG9qf/kTlTVZ4CuYMYMz/f1HS/qQ==} peerDependencies: - vitest: 5.0.1 + vitest: 5.0.5 - '@vitest/utils@5.0.1': - resolution: {integrity: sha512-E9+yEA+jsfaoxZcUHFzEqUrQcoNh2EwrPT5efIqkUPUwD5Ua2Li9BRWaYeRwvzvdLgTSVrre8oKNeyrfg7KkdQ==} + '@vitest/utils@5.0.5': + resolution: {integrity: sha512-/rBu7gzLDQI/SC79Tn98b5DwOgaHU/Gt4I9OVeP3YofzNaYtbImRCOJQmT1S6vOJg9gEIlWC+r3QxKkjuSa1nQ==} - '@voidzero-dev/vite-plus-core@1.0.0': - resolution: {integrity: sha512-GHCd6d7h3JVojI/yxe/EAHwX5gn+OI7G932VBnYoTiwATLJrvHOs+okx7Ek2LGEJ57NJRENwCFgVYefjwPLfFA==} + '@voidzero-dev/vite-plus-core@1.3.0': + resolution: {integrity: sha512-Bk/LBwNrxoB8XbGUtGJE3r+U9P4puvdZ6UH36ekygE1J+on/ytwM/yBgQwBnvmX6/MVax+2xxj8wk0N/KkyNeA==} engines: {node: ^20.19.0 || ^22.18.0 || >=24.11.0} peerDependencies: '@arethetypeswrong/core': ^0.18.1 '@types/node': ^20.19.0 || >=22.12.0 + '@typescript/native-preview': '*' '@vitejs/devtools': ^0.7.1 + '@volar/typescript': ~2.4.0 + '@vue/language-core': ~3.2.0 || ~3.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -1093,14 +1093,21 @@ packages: typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 unplugin-unused: '>=0.5.0' unrun: '*' + vue-tsc: ~3.2.0 || ~3.3.0 yaml: ^2.4.2 peerDependenciesMeta: '@arethetypeswrong/core': optional: true '@types/node': optional: true + '@typescript/native-preview': + optional: true '@vitejs/devtools': optional: true + '@volar/typescript': + optional: true + '@vue/language-core': + optional: true esbuild: optional: true jiti: @@ -1127,219 +1134,131 @@ packages: optional: true unrun: optional: true + vue-tsc: + optional: true yaml: optional: true - '@voidzero-dev/vite-plus-darwin-arm64@1.0.0': - resolution: {integrity: sha512-lR+0rHOCYQTUo4Un0Sy14Xi1NBqoPXRnhsRyc0Joe53fomZ+wPtgErk15tkvWQdSLGNOr8hDDWJKo/kzI0Y37w==} + '@voidzero-dev/vite-plus-darwin-arm64@1.3.0': + resolution: {integrity: sha512-BF4W+UwGxUkHPrH2pZLhafJfkJT20WZIbMzZgZLGQ44LPpZPX8Sb+qtblUnXUkkCzTqad4XtSPgiLKglvZkNQQ==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [darwin] - '@voidzero-dev/vite-plus-darwin-x64@1.0.0': - resolution: {integrity: sha512-MW3YnWpYP6wxvpd5KLFYTdtHTcAVnN0mVoLrmA9KCKWfOzO8nanr8hpuyEIdLMQT3r/7VNKRvgROI0CZZDP9/A==} + '@voidzero-dev/vite-plus-darwin-x64@1.3.0': + resolution: {integrity: sha512-vLZTk0r+s3e7mycj4SGBbcpK+xyM8a86hXQZtQbJyW7xrGJzsavISy7/m4gGZpWN32Hl4Tmx9V/ffeaoXLkRdg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [darwin] - '@voidzero-dev/vite-plus-linux-arm64-gnu@1.0.0': - resolution: {integrity: sha512-n4onkD4oT+g4jLj9rR37TM4i2IbaYvIiU68p1A/5KrwnIHzbv2maO0BqBYdIRnBy1Mil8pIx9HsT8riWCjZeTw==} + '@voidzero-dev/vite-plus-linux-arm64-gnu@1.3.0': + resolution: {integrity: sha512-H43Dj9RkEyjOFXxTk3DLTa6hqmHhxUN9vbbqNdwQoc3/TPNhC1zsLZy3qgUFbYGLdS7M9jICCqFzj5GDSYrhIw==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-arm64-musl@1.0.0': - resolution: {integrity: sha512-EZfgINa0FL/eIsLkL3MfQz7+Dc4VDAeIrf1UZDlitt//8NIOqI6nVMPnIFzMZThaIncIose+cVWsEkKLAKMM/A==} + '@voidzero-dev/vite-plus-linux-arm64-musl@1.3.0': + resolution: {integrity: sha512-Se2GlvzUZOvFy+5hoQHoG7LFeiplKs+EJwaskayCSLwZAP+e6/LTK7EK+8OcdMpmdsLPtZoTJHkIjSzrQowJwQ==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-linux-x64-gnu@1.0.0': - resolution: {integrity: sha512-R6+/oVLCSEvatOG1utYo0d0I++QPjWuRt2moD21+UUu2mQ8VyZHaaQLgoxrQG9shA9o0RBDmwxhGUXL20Rk1FA==} + '@voidzero-dev/vite-plus-linux-x64-gnu@1.3.0': + resolution: {integrity: sha512-moxojk6zmog2SaLE4/cG75acE6X3cjR0/52Ba8OG2ct0r+dv55VSE0kellAuxS6o9VHy7TBhkIpwpFpQ34rnAA==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [glibc] - '@voidzero-dev/vite-plus-linux-x64-musl@1.0.0': - resolution: {integrity: sha512-B1Ottn22hn9RZ6XIVrWCXAAMfCOQRJ4KWoKbPL4JxC+UgvEiY9kC1ZFPqEAI89zIbW8eLdP3BeT14NQ0h1rtxw==} + '@voidzero-dev/vite-plus-linux-x64-musl@1.3.0': + resolution: {integrity: sha512-CykxH008Dy9u20Myki9/UIqq3Dbo1ZMqa098aS6AtWp3QKyEKzSLPB3jKDUklgmu83xiFe5BpPA+33oF0yNY7A==} engines: {node: '>=20.0.0'} cpu: [x64] os: [linux] libc: [musl] - '@voidzero-dev/vite-plus-win32-arm64-msvc@1.0.0': - resolution: {integrity: sha512-XXK6N5xMkGVIcqMaVDjqDh44z0Z00DA8dYn2BWUkFOQflUU1Z3IWt+bPm/1Y7LjkwBWj5qD2zsQY1ANDCeX9QA==} + '@voidzero-dev/vite-plus-win32-arm64-msvc@1.3.0': + resolution: {integrity: sha512-l61S9b8aeiDpi8wPRfz4HonqRkLpt/OVYs0sCskvlXYSW/L8qfLOtuWH/xpF8xDjMIfBefKejBVfU1UlRax5Tw==} engines: {node: '>=20.0.0'} cpu: [arm64] os: [win32] - '@voidzero-dev/vite-plus-win32-x64-msvc@1.0.0': - resolution: {integrity: sha512-XabdwdAsJ9QqEVSpSOuiiyJjiEwbwOspGahei9svQUGjs7e8MPuj4y/ltBHJZpyCBdZI6fhlc7Xaps9bUtl7Og==} + '@voidzero-dev/vite-plus-win32-x64-msvc@1.3.0': + resolution: {integrity: sha512-b6Ng8YezA6JA3adQBNA+8Mn26+OX4fw/tsPfnk//5Cx+1XFDZoAxWYXtGzc0yUQPEKnoGtfw/0OUvcibg61yYg==} engines: {node: '>=20.0.0'} cpu: [x64] os: [win32] - '@yuku-codegen/binding-android-arm64@0.9.5': - resolution: {integrity: sha512-jrOY5WM+AaAqkv51fHP1x28ifto4WgcZVzodLUyMU1jMWn5Sq+VciRdk/n8E0Ey5w4p4cWWE+m5GfXWOYh7Kzw==} + '@yuku-core/binding-android-arm64@0.19.0': + resolution: {integrity: sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==} cpu: [arm64] os: [android] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-darwin-arm64@0.9.5': - resolution: {integrity: sha512-4O4lkCQIzPZGjiNB1GORSI6hBECbiiSBS/APZXPvNKYH+nhY4uuqv03LNXA+SET3hoBjvr95P5rIhY8KQaQUBA==} + '@yuku-core/binding-darwin-arm64@0.19.0': + resolution: {integrity: sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==} cpu: [arm64] os: [darwin] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-darwin-x64@0.9.5': - resolution: {integrity: sha512-9EvoUO0SEhD6/d8VHdWuPerepPMSR1y84+UEgz8Un1Ope14Oe7xMvePpEQLTLovoIFZ8Zg3iZ8z8E11pZMqC3g==} + '@yuku-core/binding-darwin-x64@0.19.0': + resolution: {integrity: sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==} cpu: [x64] os: [darwin] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-freebsd-x64@0.9.5': - resolution: {integrity: sha512-HqT78WwgHTmp8lwujoUa9CrIortX4DdpuiVC18ZPSGvuuJf4ylpIEI6QrQEM78Zwz3muhAWAOXZ5irdiYY+AyA==} + '@yuku-core/binding-freebsd-x64@0.19.0': + resolution: {integrity: sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==} cpu: [x64] os: [freebsd] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-arm-gnu@0.9.5': - resolution: {integrity: sha512-QJXwIW6Ms3QIawbcBIedmrmXnfdpuAOjZJ/eAABq5XTzWvSxZ7lutu9W5yIHahlaTaFnBo7ikrVMD1szLTpPUw==} + '@yuku-core/binding-linux-arm-gnu@0.19.0': + resolution: {integrity: sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==} cpu: [arm] os: [linux] libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-arm-musl@0.9.5': - resolution: {integrity: sha512-eHbFy3IHGb+IYarrYwAo0yWSEQV3eAmEn6VrsKA6I1Wy1YPJxWqSJlV69JhqsHtJuJlljUIF3ex0y46yaKIu9w==} + '@yuku-core/binding-linux-arm-musl@0.19.0': + resolution: {integrity: sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==} cpu: [arm] os: [linux] libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-arm64-gnu@0.9.5': - resolution: {integrity: sha512-ByoJMbySTaDhjAXSu8q6Lh7HKg3YoesXpcT72aYk0Aiw4PCznmY4ybpLTq0RCvp0RIPhFm/6yECFiGBwyCC1nw==} + '@yuku-core/binding-linux-arm64-gnu@0.19.0': + resolution: {integrity: sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==} cpu: [arm64] os: [linux] libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-arm64-musl@0.9.5': - resolution: {integrity: sha512-gD9vfXIoBw1toSxhO9rgmSu/FEfy3PMznJAxVjIuH8DrWEiDKXmJO0pJKfj1Ltbe/TmtWVZR+TjISqeSIGQzMg==} + '@yuku-core/binding-linux-arm64-musl@0.19.0': + resolution: {integrity: sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==} cpu: [arm64] os: [linux] libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-x64-gnu@0.9.5': - resolution: {integrity: sha512-BARvdnvqMGjOr5Iel2JH+9H5vAIE0R6H0Z2fsT02xrvmI/1ZXNB8lkuX+ZGevPhZb3zJ9WeC/R8JZstrsUOK5g==} + '@yuku-core/binding-linux-x64-gnu@0.19.0': + resolution: {integrity: sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==} cpu: [x64] os: [linux] libc: [glibc] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-linux-x64-musl@0.9.5': - resolution: {integrity: sha512-x8flcevS1fbb7ESrmpOY/pON4eInSaE/7Ktjqx2udOE2W33BNSZmJuwpyUgo54AoHNqrcaM7szqydyJn5fNvew==} + '@yuku-core/binding-linux-x64-musl@0.19.0': + resolution: {integrity: sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==} cpu: [x64] os: [linux] libc: [musl] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-win32-arm64@0.9.5': - resolution: {integrity: sha512-KOL/rBatWqH4ZpCNoF8ZtSNdOJbAxBJLmk/VeRciepGROPTbPum1A9t67GpFgOU7qrkUWlPJdJ+KHKbvbmOt+w==} + '@yuku-core/binding-win32-arm64@0.19.0': + resolution: {integrity: sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==} cpu: [arm64] os: [win32] - deprecated: yuku-codegen is pure JavaScript since 0.14 - '@yuku-codegen/binding-win32-x64@0.9.5': - resolution: {integrity: sha512-FxENahEjWSan59Syh/us/Kf4wNq8qrJLFJ3R2N4Oiwtb6yNdz/rWLNTIoNSssnsp7IoWJdUP6o/Z8ppg7lXMcg==} + '@yuku-core/binding-win32-x64@0.19.0': + resolution: {integrity: sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==} cpu: [x64] os: [win32] - deprecated: yuku-codegen is pure JavaScript since 0.14 - - '@yuku-parser/binding-android-arm64@0.9.5': - resolution: {integrity: sha512-A2JCFCSHfnficqYEw4Iujpx7XrkMM3UfFcgJFmYpZSo9zM4nyhmdIIE0FogSduuU60lhM0/UcfuUBXIVNBMlGQ==} - cpu: [arm64] - os: [android] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-darwin-arm64@0.9.5': - resolution: {integrity: sha512-3PiyU+Eare4YuKaQ22N98/yAiROPY5o/NQJHraICzDvk4pgS+m+bgLKOvkGBRn33OnV95Vdv1Mn38b+MQHpULQ==} - cpu: [arm64] - os: [darwin] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-darwin-x64@0.9.5': - resolution: {integrity: sha512-blFMAFI7AInI83XaiOF8cIeiRM46Nz9EfpZtZPRLbKxSA9aAr5v8aHYpmfN6NoyXxAv/10pwS4gsAuc1W6fy5Q==} - cpu: [x64] - os: [darwin] - deprecated: yuku-parser runs on yuku-core since 0.14 - '@yuku-parser/binding-freebsd-x64@0.9.5': - resolution: {integrity: sha512-TsNuL4qsZdO0tHp5GW43Y5fHeLPpPHA675wdcPNTcdq2ZO5AvsQWFFoiDg8CH4oBktfsQ9tdvKhjLnLYwKvp4g==} - cpu: [x64] - os: [freebsd] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-arm-gnu@0.9.5': - resolution: {integrity: sha512-b0afYK5gHeV8RdmOcqAlgM8ONsye4cax4DMnIBaoJyPMd1UTGvTbpkqQcPVdhmHlcfcGVGMV1laeVovlr/dscw==} - cpu: [arm] - os: [linux] - libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-arm-musl@0.9.5': - resolution: {integrity: sha512-fD3lKzl+r6j6n8DwiMY53qnh5DLqD8KJjCp+NbVud54Nnh3Q9Wprqss3YzyMHP3NSJk663Wlg1E1X5qOuFVFig==} - cpu: [arm] - os: [linux] - libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-arm64-gnu@0.9.5': - resolution: {integrity: sha512-aRU/aCphV1MWCl/lvI6NX8LgucHQ68Fx+vz7NBb/5MEr2EuzCxiPOQqeFcMdWh+2AED/p0AvAREch0c+cSnlhA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-arm64-musl@0.9.5': - resolution: {integrity: sha512-5+Guro0l8H473YXlEjVNBRLN/IbPbJdnQh1zo0OLt49xxnON+XMJRRaEyTOTfkn9QSRg0+BhEKGR4W9Gu2uZJQ==} - cpu: [arm64] - os: [linux] - libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-x64-gnu@0.9.5': - resolution: {integrity: sha512-pwwSyV9q+GlvzSXlsMZBMlgk22L5bud714/vqZCdeUTivzeUVltQzUaf3IQXOGXdpc59JYTeuMCtbGquaAUoCA==} - cpu: [x64] - os: [linux] - libc: [glibc] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-linux-x64-musl@0.9.5': - resolution: {integrity: sha512-z18j6JN3lBHH8vzN7gG1M8fI0nlgItSfnC9PfbmUbt97iHViKfw2iA2G9fGwRMe5LyPRZBrejIlapbygPbpdaw==} - cpu: [x64] - os: [linux] - libc: [musl] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-win32-arm64@0.9.5': - resolution: {integrity: sha512-s6Gwttb1dQvtPX6Bgkw+UPC9IO3UBDXc6Zezog8MMgvu3UfJBBB9TQqKBX/2quu0Eyh+lLSAyNlIyyecaagUPg==} - cpu: [arm64] - os: [win32] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-parser/binding-win32-x64@0.9.5': - resolution: {integrity: sha512-FrERt9YWatY3bJfSUdi4YWY+6iQcyo3MzCC821BxlWM5TFZEHijnpz/bknR79VHlXY/9CvXz8ZlaAGPsTtN3nw==} - cpu: [x64] - os: [win32] - deprecated: yuku-parser runs on yuku-core since 0.14 - - '@yuku-toolchain/types@0.9.5': - resolution: {integrity: sha512-KiuLNNgX9uNealaWAR+G3/cMXnRk9x4TY2EkYe/KIag+UPdwiA0RRf1hr1WAxzTP8KGzCTkqUdLPvqh32sEO3w==} + '@yuku-toolchain/types@0.19.0': + resolution: {integrity: sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==} acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} @@ -1376,8 +1295,8 @@ packages: '@internationalized/date': ^3.8.1 svelte: ^5.33.0 - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + chai@6.3.0: + resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==} engines: {node: '>=18'} chokidar@4.0.3: @@ -1683,6 +1602,9 @@ packages: magic-string@1.2.3: resolution: {integrity: sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==} + magic-string@1.4.3: + resolution: {integrity: sha512-z12OxmaPGE0F4xlpGdjuAUckipLpQlTAuAmyGhNoD7ODpYUzvDfvtxUbjM/jwznyP178oju/KDdyi220wNJ0RQ==} + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -1699,8 +1621,8 @@ packages: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - nanoid@3.3.18: - resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + nanoid@3.3.20: + resolution: {integrity: sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1714,32 +1636,39 @@ packages: resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} engines: {node: '>=12.20.0'} + obug@3.0.0: + resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==} + engines: {node: '>=12.20.0'} + ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} - oxfmt@0.70.0: - resolution: {integrity: sha512-IsHxZ4y0wQLLMhnrJblBJgZsLDzfULrJnAw5j/QqsTlMa/m3AqsbToi+W71uhBGaqlqq/PbbjvHc09TJwdv3Tw==} + oxfmt@0.73.0: + resolution: {integrity: sha512-Ke4xbpuzqIBP4bkd48q815RhqWNJqOBzxVA9199M4qcF0y0LtpUv7UTg1dJ5ea6jw0RBUDZvX3qOUMNmmxfxbw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: + '@astrojs/compiler-rs': ^0.4.0 || ^0.5.0 svelte: ^5.0.0 vite-plus: '*' peerDependenciesMeta: + '@astrojs/compiler-rs': + optional: true svelte: optional: true vite-plus: optional: true - oxlint-tsgolint@7.0.2003: - resolution: {integrity: sha512-VnK4zlqgmgq/7ZcjzCk/WpN8kKFsYGcB85Io9qT3wL4K8Un3RKmJkp793crNETieMusPMKOA4a+Mw2wbteI6TQ==} + oxlint-tsgolint@7.0.2004: + resolution: {integrity: sha512-vQ9WDF3fiZJvRdSDosNOflerOCOpwol6vWzVDxW76RcU19cjTh7engvkHLvmv+tzedR8fAiJUVUGr6IVZdkzXQ==} hasBin: true - oxlint@1.85.0: - resolution: {integrity: sha512-bc26s97nuvPj1ViyPsqmKecVkUWFMEdtayO8MaQ6oiLfs1pj94cQlZZhrh4BPNlr9HQosjhIlwgZKsfcwmcNgg==} + oxlint@1.88.0: + resolution: {integrity: sha512-uIcFgw8BmqvFRGzH5+r7d2zJMEexwNSrEmM6WQNnGh3VkO0XYTEFoyxyNE6tjKMUib9Cue4XJA2DoWruO5D6aw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=7.0.2001' + oxlint-tsgolint: '>=7.0.2003' vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: @@ -1775,8 +1704,8 @@ packages: resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} engines: {node: '>=14.19.0'} - postcss@8.5.26: - resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + postcss@8.5.30: + resolution: {integrity: sha512-zkd+e9S1AQHhmaBKye9zlFHWjOwVgqXl1q3ECYy8561K7qxR2cREf/STLskulBFd78k6AOFeA+ff1TtEzk9bAA==} engines: {node: ^10 || ^12 || >=14} pretty-format@27.5.1: @@ -1827,9 +1756,6 @@ packages: shadow-plugin@2.1.1: resolution: {integrity: sha512-V4MwWPNzna/Zq6lIjT7vWAHf5uSCVDPkFG5m1cXs9WTtLGeLA3/NAtjJxxY3lYwBiA9O8+g/yLfC+c+P4qk4yw==} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -1838,11 +1764,12 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + source-map-js@1.2.2: + resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==} + engines: {node: '>=0.10.0'} - std-env@4.2.0: - resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + std-env@4.3.0: + resolution: {integrity: sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==} style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} @@ -1905,11 +1832,8 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tauri-plugin-cache-api@0.1.6: - resolution: {integrity: sha512-JjkyoISdJLh1M8+wtz/qUglXMVQiim/VR3bQZxijq7GMiPu1DZScMCmIOxEZEPipkF0Y9cRh+svxR2n6oOZl9w==} - - tinybench@6.1.4: - resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + tinybench@6.2.2: + resolution: {integrity: sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==} engines: {node: '>=20.0.0'} tinyexec@1.3.0: @@ -1924,12 +1848,12 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinypool@2.1.2: - resolution: {integrity: sha512-9YodfrxS9g9IbFr/KOjE5bAeJ0p61n3bW6mqvy0jtoeKd1kTW1Cxm0oulm6KX2lyM9Gl6WIe8nEbY7LWv5ZJww==} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} engines: {node: ^20.0.0 || >=22.0.0} - tinyrainbow@3.1.1: - resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + tinyrainbow@3.2.0: + resolution: {integrity: sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==} engines: {node: '>=14.0.0'} tldts-core@7.4.15: @@ -2059,18 +1983,21 @@ packages: peerDependencies: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - vite-plus@1.0.0: - resolution: {integrity: sha512-2ezzBWt+AVO+I2F9Cpb2Of0J12Lat35kWZ/FRL2monMnKZuACKfkYAA/nMqdDo1KwB8sWjTKzmD9mRCh1Q1n+g==} + vite-plus@1.3.0: + resolution: {integrity: sha512-wZGsDeYfPcrCegqgY68pJJHGTpEZdsZvIMH2/mWXkGkBD72UY3M7z24Sv3ZeOL/FrqbbtyqBOfkKO6BvoQ8wMw==} engines: {node: ^22.18.0 || ^24.11.0 || >=26.0.0} hasBin: true peerDependencies: - '@vitest/browser-playwright': 5.0.1 + '@vitest/browser-playwright': 5.0.5 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + playwright: '*' peerDependenciesMeta: '@vitest/browser-playwright': optional: true '@vitest/browser-webdriverio': optional: true + playwright: + optional: true vitefu@1.1.3: resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} @@ -2080,20 +2007,20 @@ packages: vite: optional: true - vitest@5.0.1: - resolution: {integrity: sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==} + vitest@5.0.5: + resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 5.0.1 - '@vitest/browser-preview': 5.0.1 + '@vitest/browser-playwright': 5.0.5 + '@vitest/browser-preview': 5.0.5 '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 - '@vitest/coverage-istanbul': 5.0.1 - '@vitest/coverage-v8': 5.0.1 - '@vitest/ui': 5.0.1 + '@vitest/coverage-istanbul': 5.0.5 + '@vitest/coverage-v8': 5.0.5 + '@vitest/ui': 5.0.5 happy-dom: '*' jsdom: '*' vite: ^6.4.0 || ^7.0.0 || ^8.0.0 @@ -2127,13 +2054,13 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + why-is-node-running@3.2.1: + resolution: {integrity: sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==} + engines: {node: '>=20.11'} hasBin: true - ws@8.21.3: - resolution: {integrity: sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==} + ws@8.22.0: + resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2144,14 +2071,13 @@ packages: utf-8-validate: optional: true - yuku-ast@0.9.5: - resolution: {integrity: sha512-Q8qW8WwQnN5Cm0ZZivdRIfv0sRLTjUq0YumXJkw8CYN1aCdICH9rk4C47/4n6kA5EqDtlj+F608twoTSV2MwdQ==} + yuku-core@0.19.0: + resolution: {integrity: sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==} + engines: {node: '>=14.18.0'} - yuku-codegen@0.9.5: - resolution: {integrity: sha512-zGUVyDpSK4b6c9B0yyxi2P0wujn1XZTbG9dCb7d6gyAoP63EMgyLzUwPUvwxPG5jgYqhlI7w+S3oCyapqGr4PA==} - - yuku-parser@0.9.5: - resolution: {integrity: sha512-IBnAdNVMswWbJcM7woPluOudectJzFjJ1N8jVRxP9Uq4CIv5hZdBIcdmtRbFDYF/Ph2j2gVup4YJ4N9mh0jYFA==} + yuku-parser@0.19.0: + resolution: {integrity: sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==} + engines: {node: '>=14.18.0'} zimmerframe@1.1.4: resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} @@ -2309,143 +2235,143 @@ snapshots: number-flow: 0.6.2 svelte: 5.57.1 - '@oxc-project/runtime@0.151.0': {} + '@oxc-project/runtime@0.154.0': {} - '@oxc-project/types@0.151.0': {} + '@oxc-project/types@0.154.0': {} - '@oxfmt/binding-android-arm-eabi@0.70.0': + '@oxfmt/binding-android-arm-eabi@0.73.0': optional: true - '@oxfmt/binding-android-arm64@0.70.0': + '@oxfmt/binding-android-arm64@0.73.0': optional: true - '@oxfmt/binding-darwin-arm64@0.70.0': + '@oxfmt/binding-darwin-arm64@0.73.0': optional: true - '@oxfmt/binding-darwin-x64@0.70.0': + '@oxfmt/binding-darwin-x64@0.73.0': optional: true - '@oxfmt/binding-freebsd-x64@0.70.0': + '@oxfmt/binding-freebsd-x64@0.73.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.70.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.73.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.70.0': + '@oxfmt/binding-linux-arm-musleabihf@0.73.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.70.0': + '@oxfmt/binding-linux-arm64-gnu@0.73.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.70.0': + '@oxfmt/binding-linux-arm64-musl@0.73.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.70.0': + '@oxfmt/binding-linux-ppc64-gnu@0.73.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.70.0': + '@oxfmt/binding-linux-riscv64-gnu@0.73.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.70.0': + '@oxfmt/binding-linux-riscv64-musl@0.73.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.70.0': + '@oxfmt/binding-linux-s390x-gnu@0.73.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.70.0': + '@oxfmt/binding-linux-x64-gnu@0.73.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.70.0': + '@oxfmt/binding-linux-x64-musl@0.73.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.70.0': + '@oxfmt/binding-openharmony-arm64@0.73.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.70.0': + '@oxfmt/binding-win32-arm64-msvc@0.73.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.70.0': + '@oxfmt/binding-win32-ia32-msvc@0.73.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.70.0': + '@oxfmt/binding-win32-x64-msvc@0.73.0': optional: true - '@oxlint-tsgolint/darwin-arm64@7.0.2003': + '@oxlint-tsgolint/darwin-arm64@7.0.2004': optional: true - '@oxlint-tsgolint/darwin-x64@7.0.2003': + '@oxlint-tsgolint/darwin-x64@7.0.2004': optional: true - '@oxlint-tsgolint/linux-arm64@7.0.2003': + '@oxlint-tsgolint/linux-arm64@7.0.2004': optional: true - '@oxlint-tsgolint/linux-x64@7.0.2003': + '@oxlint-tsgolint/linux-x64@7.0.2004': optional: true - '@oxlint-tsgolint/win32-arm64@7.0.2003': + '@oxlint-tsgolint/win32-arm64@7.0.2004': optional: true - '@oxlint-tsgolint/win32-x64@7.0.2003': + '@oxlint-tsgolint/win32-x64@7.0.2004': optional: true - '@oxlint/binding-android-arm-eabi@1.85.0': + '@oxlint/binding-android-arm-eabi@1.88.0': optional: true - '@oxlint/binding-android-arm64@1.85.0': + '@oxlint/binding-android-arm64@1.88.0': optional: true - '@oxlint/binding-darwin-arm64@1.85.0': + '@oxlint/binding-darwin-arm64@1.88.0': optional: true - '@oxlint/binding-darwin-x64@1.85.0': + '@oxlint/binding-darwin-x64@1.88.0': optional: true - '@oxlint/binding-freebsd-x64@1.85.0': + '@oxlint/binding-freebsd-x64@1.88.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.85.0': + '@oxlint/binding-linux-arm-gnueabihf@1.88.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.85.0': + '@oxlint/binding-linux-arm-musleabihf@1.88.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.85.0': + '@oxlint/binding-linux-arm64-gnu@1.88.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.85.0': + '@oxlint/binding-linux-arm64-musl@1.88.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.85.0': + '@oxlint/binding-linux-ppc64-gnu@1.88.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.85.0': + '@oxlint/binding-linux-riscv64-gnu@1.88.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.85.0': + '@oxlint/binding-linux-riscv64-musl@1.88.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.85.0': + '@oxlint/binding-linux-s390x-gnu@1.88.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.85.0': + '@oxlint/binding-linux-x64-gnu@1.88.0': optional: true - '@oxlint/binding-linux-x64-musl@1.85.0': + '@oxlint/binding-linux-x64-musl@1.88.0': optional: true - '@oxlint/binding-openharmony-arm64@1.85.0': + '@oxlint/binding-openharmony-arm64@1.88.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.85.0': + '@oxlint/binding-win32-arm64-msvc@1.88.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.85.0': + '@oxlint/binding-win32-ia32-msvc@1.88.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.85.0': + '@oxlint/binding-win32-x64-msvc@1.88.0': optional: true - '@oxlint/plugins@1.79.0': {} + '@oxlint/plugins@1.88.0': {} '@polka/url@1.0.0-next.29': {} @@ -2459,15 +2385,15 @@ snapshots: dependencies: acorn: 8.18.0 - '@sveltejs/adapter-static@4.0.0(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))': + '@sveltejs/adapter-static@4.0.0(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))': dependencies: - '@sveltejs/kit': 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) + '@sveltejs/kit': 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) - '@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3)': + '@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3)': dependencies: '@rolldown/pluginutils': 1.0.1 '@standard-schema/spec': 1.1.0 - '@sveltejs/vite-plugin-svelte': 7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1) + '@sveltejs/vite-plugin-svelte': 7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1) cookie: 2.0.1 devalue: 5.9.4 esm-env: 1.2.2 @@ -2475,20 +2401,20 @@ snapshots: mrmime: 2.0.1 sirv: 3.0.2 svelte: 5.57.1 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' optionalDependencies: typescript: 6.0.3 '@sveltejs/load-config@0.2.3': {} - '@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)': + '@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)': dependencies: deepmerge: 4.3.1 - magic-string: 1.2.3 + magic-string: 1.4.3 obug: 2.2.1 svelte: 5.57.1 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - vitefu: 1.1.3(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vitefu: 1.1.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) '@swc/helpers@0.5.23': dependencies: @@ -2555,12 +2481,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))': + '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' '@tanstack/hotkeys@0.10.0': dependencies: @@ -2671,7 +2597,7 @@ snapshots: transitivePeerDependencies: - '@typescript-eslint/types' - '@testing-library/dom@10.4.1': + '@testing-library/dom@10.4.2': dependencies: '@babel/code-frame': 7.29.7 '@babel/runtime': 7.29.7 @@ -2682,9 +2608,9 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/user-event@14.6.6(@testing-library/dom@10.4.1)': + '@testing-library/user-event@14.6.8(@testing-library/dom@10.4.2)': dependencies: - '@testing-library/dom': 10.4.1 + '@testing-library/dom': 10.4.2 '@types/aria-query@5.0.4': {} @@ -2703,193 +2629,156 @@ snapshots: dependencies: undici-types: 8.9.0 - '@vitest/browser-preview@5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1)': + '@vitest/browser-preview@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5)': dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.6(@testing-library/dom@10.4.1) - '@vitest/browser': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1) - vitest: 5.0.1(@types/node@26.6.3)(@vitest/browser-preview@5.0.1)(@vitest/ui@5.0.1)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + '@testing-library/dom': 10.4.2 + '@testing-library/user-event': 14.6.8(@testing-library/dom@10.4.2) + '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5) + vitest: 5.0.5(@types/node@26.6.3)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1)': + '@vitest/browser@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) - '@vitest/ui': 5.0.1(vitest@5.0.1) - '@vitest/utils': 5.0.1 - magic-string: 1.2.3 + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + '@vitest/ui': 5.0.5(vitest@5.0.5) + '@vitest/utils': 5.0.5 + magic-string: 1.4.3 pngjs: 7.0.0 sirv: 3.0.2 - tinyrainbow: 3.1.1 - vitest: 5.0.1(@types/node@26.6.3)(@vitest/browser-preview@5.0.1)(@vitest/ui@5.0.1)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) - ws: 8.21.3 + tinyrainbow: 3.2.0 + vitest: 5.0.5(@types/node@26.6.3)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + ws: 8.22.0 transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/mocker@5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))': + '@vitest/mocker@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.1 + '@vitest/spy': 5.0.5 estree-walker: 3.0.3 - magic-string: 1.2.3 + magic-string: 1.4.3 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - '@vitest/pretty-format@5.0.1': + '@vitest/pretty-format@5.0.5': dependencies: - tinyrainbow: 3.1.1 + tinyrainbow: 3.2.0 - '@vitest/snapshot@5.0.1': + '@vitest/snapshot@5.0.5': dependencies: - '@vitest/pretty-format': 5.0.1 - '@vitest/utils': 5.0.1 - magic-string: 1.2.3 + '@vitest/pretty-format': 5.0.5 + '@vitest/utils': 5.0.5 + magic-string: 1.4.3 pathe: 2.0.3 - '@vitest/spy@5.0.1': {} + '@vitest/spy@5.0.5': {} - '@vitest/ui@5.0.1(vitest@5.0.1)': + '@vitest/ui@5.0.5(vitest@5.0.5)': dependencies: - '@vitest/utils': 5.0.1 + '@vitest/utils': 5.0.5 fflate: 0.8.3 flatted: 3.4.4 pathe: 2.0.3 sirv: 3.0.2 - tinyrainbow: 3.1.1 - vitest: 5.0.1(@types/node@26.6.3)(@vitest/browser-preview@5.0.1)(@vitest/ui@5.0.1)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + tinyrainbow: 3.2.0 + vitest: 5.0.5(@types/node@26.6.3)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) - '@vitest/utils@5.0.1': + '@vitest/utils@5.0.5': dependencies: - '@vitest/pretty-format': 5.0.1 + '@vitest/pretty-format': 5.0.5 convert-source-map: 2.0.0 - tinyrainbow: 3.1.1 + tinyrainbow: 3.2.0 - '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)': + '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)': dependencies: - '@oxc-project/runtime': 0.151.0 - '@oxc-project/types': 0.151.0 + '@oxc-project/runtime': 0.154.0 + '@oxc-project/types': 0.154.0 lightningcss: 1.33.0 - postcss: 8.5.26 - yuku-codegen: 0.9.5 - yuku-parser: 0.9.5 + postcss: 8.5.30 + yuku-parser: 0.19.0 optionalDependencies: '@types/node': 26.6.3 - '@voidzero-dev/vite-plus-darwin-arm64': 1.0.0 - '@voidzero-dev/vite-plus-darwin-x64': 1.0.0 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.0.0 - '@voidzero-dev/vite-plus-linux-arm64-musl': 1.0.0 - '@voidzero-dev/vite-plus-linux-x64-gnu': 1.0.0 - '@voidzero-dev/vite-plus-linux-x64-musl': 1.0.0 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.0.0 - '@voidzero-dev/vite-plus-win32-x64-msvc': 1.0.0 + '@voidzero-dev/vite-plus-darwin-arm64': 1.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 1.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 1.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 1.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 1.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 1.3.0 fsevents: 2.3.3 jiti: 2.7.0 typescript: 6.0.3 - '@voidzero-dev/vite-plus-darwin-arm64@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-darwin-x64@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-linux-arm64-gnu@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-linux-arm64-musl@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-linux-x64-gnu@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-linux-x64-musl@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-win32-arm64-msvc@1.0.0': - optional: true - - '@voidzero-dev/vite-plus-win32-x64-msvc@1.0.0': - optional: true - - '@yuku-codegen/binding-android-arm64@0.9.5': + '@voidzero-dev/vite-plus-darwin-arm64@1.3.0': optional: true - '@yuku-codegen/binding-darwin-arm64@0.9.5': + '@voidzero-dev/vite-plus-darwin-x64@1.3.0': optional: true - '@yuku-codegen/binding-darwin-x64@0.9.5': + '@voidzero-dev/vite-plus-linux-arm64-gnu@1.3.0': optional: true - '@yuku-codegen/binding-freebsd-x64@0.9.5': + '@voidzero-dev/vite-plus-linux-arm64-musl@1.3.0': optional: true - '@yuku-codegen/binding-linux-arm-gnu@0.9.5': + '@voidzero-dev/vite-plus-linux-x64-gnu@1.3.0': optional: true - '@yuku-codegen/binding-linux-arm-musl@0.9.5': + '@voidzero-dev/vite-plus-linux-x64-musl@1.3.0': optional: true - '@yuku-codegen/binding-linux-arm64-gnu@0.9.5': + '@voidzero-dev/vite-plus-win32-arm64-msvc@1.3.0': optional: true - '@yuku-codegen/binding-linux-arm64-musl@0.9.5': + '@voidzero-dev/vite-plus-win32-x64-msvc@1.3.0': optional: true - '@yuku-codegen/binding-linux-x64-gnu@0.9.5': + '@yuku-core/binding-android-arm64@0.19.0': optional: true - '@yuku-codegen/binding-linux-x64-musl@0.9.5': + '@yuku-core/binding-darwin-arm64@0.19.0': optional: true - '@yuku-codegen/binding-win32-arm64@0.9.5': + '@yuku-core/binding-darwin-x64@0.19.0': optional: true - '@yuku-codegen/binding-win32-x64@0.9.5': + '@yuku-core/binding-freebsd-x64@0.19.0': optional: true - '@yuku-parser/binding-android-arm64@0.9.5': + '@yuku-core/binding-linux-arm-gnu@0.19.0': optional: true - '@yuku-parser/binding-darwin-arm64@0.9.5': + '@yuku-core/binding-linux-arm-musl@0.19.0': optional: true - '@yuku-parser/binding-darwin-x64@0.9.5': + '@yuku-core/binding-linux-arm64-gnu@0.19.0': optional: true - '@yuku-parser/binding-freebsd-x64@0.9.5': + '@yuku-core/binding-linux-arm64-musl@0.19.0': optional: true - '@yuku-parser/binding-linux-arm-gnu@0.9.5': + '@yuku-core/binding-linux-x64-gnu@0.19.0': optional: true - '@yuku-parser/binding-linux-arm-musl@0.9.5': + '@yuku-core/binding-linux-x64-musl@0.19.0': optional: true - '@yuku-parser/binding-linux-arm64-gnu@0.9.5': + '@yuku-core/binding-win32-arm64@0.19.0': optional: true - '@yuku-parser/binding-linux-arm64-musl@0.9.5': + '@yuku-core/binding-win32-x64@0.19.0': optional: true - '@yuku-parser/binding-linux-x64-gnu@0.9.5': - optional: true - - '@yuku-parser/binding-linux-x64-musl@0.9.5': - optional: true - - '@yuku-parser/binding-win32-arm64@0.9.5': - optional: true - - '@yuku-parser/binding-win32-x64@0.9.5': - optional: true - - '@yuku-toolchain/types@0.9.5': {} + '@yuku-toolchain/types@0.19.0': {} acorn@8.18.0: {} @@ -2907,20 +2796,20 @@ snapshots: axobject-query@4.1.0: {} - bits-ui@2.19.3(@internationalized/date@3.12.4)(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): + bits-ui@2.19.3(@internationalized/date@3.12.4)(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): dependencies: '@floating-ui/core': 1.8.0 '@floating-ui/dom': 1.8.0 '@internationalized/date': 3.12.4 esm-env: 1.2.2 - runed: 0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) + runed: 0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) svelte: 5.57.1 - svelte-toolbelt: 0.10.6(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) + svelte-toolbelt: 0.10.6(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) tabbable: 6.5.0 transitivePeerDependencies: - '@sveltejs/kit' - chai@6.2.2: {} + chai@6.3.0: {} chokidar@4.0.3: dependencies: @@ -3140,6 +3029,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.6.0 + magic-string@1.4.3: + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + mlly@1.8.2: dependencies: acorn: 8.18.0 @@ -3157,7 +3050,7 @@ snapshots: mrmime@2.0.1: {} - nanoid@3.3.18: {} + nanoid@3.3.20: {} node-fetch-native@1.6.7: {} @@ -3167,70 +3060,72 @@ snapshots: obug@2.2.1: {} + obug@3.0.0: {} + ofetch@1.5.1: dependencies: destr: 2.0.5 node-fetch-native: 1.6.7 ufo: 1.6.4 - oxfmt@0.70.0(svelte@5.57.1)(vite-plus@1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)): + oxfmt@0.73.0(svelte@5.57.1)(vite-plus@1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)): dependencies: - tinypool: 2.1.2 + tinypool: 2.2.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.70.0 - '@oxfmt/binding-android-arm64': 0.70.0 - '@oxfmt/binding-darwin-arm64': 0.70.0 - '@oxfmt/binding-darwin-x64': 0.70.0 - '@oxfmt/binding-freebsd-x64': 0.70.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.70.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.70.0 - '@oxfmt/binding-linux-arm64-gnu': 0.70.0 - '@oxfmt/binding-linux-arm64-musl': 0.70.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.70.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.70.0 - '@oxfmt/binding-linux-riscv64-musl': 0.70.0 - '@oxfmt/binding-linux-s390x-gnu': 0.70.0 - '@oxfmt/binding-linux-x64-gnu': 0.70.0 - '@oxfmt/binding-linux-x64-musl': 0.70.0 - '@oxfmt/binding-openharmony-arm64': 0.70.0 - '@oxfmt/binding-win32-arm64-msvc': 0.70.0 - '@oxfmt/binding-win32-ia32-msvc': 0.70.0 - '@oxfmt/binding-win32-x64-msvc': 0.70.0 + '@oxfmt/binding-android-arm-eabi': 0.73.0 + '@oxfmt/binding-android-arm64': 0.73.0 + '@oxfmt/binding-darwin-arm64': 0.73.0 + '@oxfmt/binding-darwin-x64': 0.73.0 + '@oxfmt/binding-freebsd-x64': 0.73.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.73.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.73.0 + '@oxfmt/binding-linux-arm64-gnu': 0.73.0 + '@oxfmt/binding-linux-arm64-musl': 0.73.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.73.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.73.0 + '@oxfmt/binding-linux-riscv64-musl': 0.73.0 + '@oxfmt/binding-linux-s390x-gnu': 0.73.0 + '@oxfmt/binding-linux-x64-gnu': 0.73.0 + '@oxfmt/binding-linux-x64-musl': 0.73.0 + '@oxfmt/binding-openharmony-arm64': 0.73.0 + '@oxfmt/binding-win32-arm64-msvc': 0.73.0 + '@oxfmt/binding-win32-ia32-msvc': 0.73.0 + '@oxfmt/binding-win32-x64-msvc': 0.73.0 svelte: 5.57.1 - vite-plus: 1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) + vite-plus: 1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) - oxlint-tsgolint@7.0.2003: + oxlint-tsgolint@7.0.2004: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 7.0.2003 - '@oxlint-tsgolint/darwin-x64': 7.0.2003 - '@oxlint-tsgolint/linux-arm64': 7.0.2003 - '@oxlint-tsgolint/linux-x64': 7.0.2003 - '@oxlint-tsgolint/win32-arm64': 7.0.2003 - '@oxlint-tsgolint/win32-x64': 7.0.2003 - - oxlint@1.85.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)): + '@oxlint-tsgolint/darwin-arm64': 7.0.2004 + '@oxlint-tsgolint/darwin-x64': 7.0.2004 + '@oxlint-tsgolint/linux-arm64': 7.0.2004 + '@oxlint-tsgolint/linux-x64': 7.0.2004 + '@oxlint-tsgolint/win32-arm64': 7.0.2004 + '@oxlint-tsgolint/win32-x64': 7.0.2004 + + oxlint@1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.85.0 - '@oxlint/binding-android-arm64': 1.85.0 - '@oxlint/binding-darwin-arm64': 1.85.0 - '@oxlint/binding-darwin-x64': 1.85.0 - '@oxlint/binding-freebsd-x64': 1.85.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.85.0 - '@oxlint/binding-linux-arm-musleabihf': 1.85.0 - '@oxlint/binding-linux-arm64-gnu': 1.85.0 - '@oxlint/binding-linux-arm64-musl': 1.85.0 - '@oxlint/binding-linux-ppc64-gnu': 1.85.0 - '@oxlint/binding-linux-riscv64-gnu': 1.85.0 - '@oxlint/binding-linux-riscv64-musl': 1.85.0 - '@oxlint/binding-linux-s390x-gnu': 1.85.0 - '@oxlint/binding-linux-x64-gnu': 1.85.0 - '@oxlint/binding-linux-x64-musl': 1.85.0 - '@oxlint/binding-openharmony-arm64': 1.85.0 - '@oxlint/binding-win32-arm64-msvc': 1.85.0 - '@oxlint/binding-win32-ia32-msvc': 1.85.0 - '@oxlint/binding-win32-x64-msvc': 1.85.0 - oxlint-tsgolint: 7.0.2003 - vite-plus: 1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) + '@oxlint/binding-android-arm-eabi': 1.88.0 + '@oxlint/binding-android-arm64': 1.88.0 + '@oxlint/binding-darwin-arm64': 1.88.0 + '@oxlint/binding-darwin-x64': 1.88.0 + '@oxlint/binding-freebsd-x64': 1.88.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.88.0 + '@oxlint/binding-linux-arm-musleabihf': 1.88.0 + '@oxlint/binding-linux-arm64-gnu': 1.88.0 + '@oxlint/binding-linux-arm64-musl': 1.88.0 + '@oxlint/binding-linux-ppc64-gnu': 1.88.0 + '@oxlint/binding-linux-riscv64-gnu': 1.88.0 + '@oxlint/binding-linux-riscv64-musl': 1.88.0 + '@oxlint/binding-linux-s390x-gnu': 1.88.0 + '@oxlint/binding-linux-x64-gnu': 1.88.0 + '@oxlint/binding-linux-x64-musl': 1.88.0 + '@oxlint/binding-openharmony-arm64': 1.88.0 + '@oxlint/binding-win32-arm64-msvc': 1.88.0 + '@oxlint/binding-win32-ia32-msvc': 1.88.0 + '@oxlint/binding-win32-x64-msvc': 1.88.0 + oxlint-tsgolint: 7.0.2004 + vite-plus: 1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3) package-manager-detector@1.8.0: {} @@ -3260,11 +3155,11 @@ snapshots: pngjs@7.0.0: {} - postcss@8.5.26: + postcss@8.5.30: dependencies: - nanoid: 3.3.18 + nanoid: 3.3.20 picocolors: 1.1.1 - source-map-js: 1.2.1 + source-map-js: 1.2.2 pretty-format@27.5.1: dependencies: @@ -3293,14 +3188,14 @@ snapshots: esm-env: 1.2.2 svelte: 5.57.1 - runed@0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): + runed@0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): dependencies: dequal: 2.0.3 esm-env: 1.2.2 lz-string: 1.5.0 svelte: 5.57.1 optionalDependencies: - '@sveltejs/kit': 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) + '@sveltejs/kit': 3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3) sade@1.8.1: dependencies: @@ -3310,8 +3205,6 @@ snapshots: shadow-plugin@2.1.1: {} - siginfo@2.0.0: {} - sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -3320,9 +3213,9 @@ snapshots: source-map-js@1.2.1: {} - stackback@0.0.2: {} + source-map-js@1.2.2: {} - std-env@4.2.0: {} + std-env@4.3.0: {} style-to-object@1.0.14: dependencies: @@ -3341,10 +3234,10 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-toolbelt@0.10.6(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): + svelte-toolbelt@0.10.6(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1): dependencies: clsx: 2.1.1 - runed: 0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) + runed: 0.35.1(@sveltejs/kit@3.0.0(@sveltejs/vite-plugin-svelte@7.3.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1)(typescript@6.0.3))(svelte@5.57.1) style-to-object: 1.0.14 svelte: 5.57.1 transitivePeerDependencies: @@ -3401,11 +3294,7 @@ snapshots: tapable@2.3.3: {} - tauri-plugin-cache-api@0.1.6: - dependencies: - '@tauri-apps/api': 2.12.0 - - tinybench@6.1.4: {} + tinybench@6.2.2: {} tinyexec@1.3.0: {} @@ -3416,9 +3305,9 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinypool@2.1.2: {} + tinypool@2.2.0: {} - tinyrainbow@3.1.1: {} + tinyrainbow@3.2.0: {} tldts-core@7.4.15: {} @@ -3438,13 +3327,13 @@ snapshots: undici-types@8.9.0: {} - unplugin-icons@24.0.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1): + unplugin-icons@24.0.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(svelte@5.57.1): dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/utils': 3.1.7 local-pkg: 1.2.1 obug: 2.2.1 - unplugin: 3.4.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + unplugin: 3.4.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) optionalDependencies: svelte: 5.57.1 transitivePeerDependencies: @@ -3459,13 +3348,13 @@ snapshots: - vite - webpack - unplugin@3.4.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): + unplugin@3.4.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): dependencies: '@jridgewell/remapping': 2.3.5 picomatch: 4.0.7 webpack-virtual-modules: 0.6.2 optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' uuid@14.0.2: {} @@ -3477,45 +3366,49 @@ snapshots: optionalDependencies: svelte: 5.57.1 - vite-plugin-devtools-json@1.1.0(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): + vite-plugin-devtools-json@1.1.0(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): dependencies: uuid: 14.0.2 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - - vite-plus@1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3): - dependencies: - '@oxc-project/types': 0.151.0 - '@oxlint/plugins': 1.79.0 - '@vitest/browser': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1) - '@vitest/browser-preview': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1) - '@vitest/mocker': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) - '@vitest/pretty-format': 5.0.1 - '@vitest/snapshot': 5.0.1 - '@vitest/spy': 5.0.1 - '@vitest/utils': 5.0.1 - oxfmt: 0.70.0(svelte@5.57.1)(vite-plus@1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)) - oxlint: 1.85.0(oxlint-tsgolint@7.0.2003)(vite-plus@1.0.0(@types/node@26.6.3)(@vitest/ui@5.0.1)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)) - oxlint-tsgolint: 7.0.2003 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - vitest: 5.0.1(@types/node@26.6.3)(@vitest/browser-preview@5.0.1)(@vitest/ui@5.0.1)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + + vite-plus@1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3): + dependencies: + '@oxc-project/types': 0.154.0 + '@oxlint/plugins': 1.88.0 + '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5) + '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5) + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + '@vitest/pretty-format': 5.0.5 + '@vitest/snapshot': 5.0.5 + '@vitest/spy': 5.0.5 + '@vitest/utils': 5.0.5 + oxfmt: 0.73.0(svelte@5.57.1)(vite-plus@1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)) + oxlint: 1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@types/node@26.6.3)(@vitest/ui@5.0.5)(jiti@2.7.0)(svelte@5.57.1)(typescript@6.0.3)) + oxlint-tsgolint: 7.0.2004 + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vitest: 5.0.5(@types/node@26.6.3)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) optionalDependencies: - '@voidzero-dev/vite-plus-darwin-arm64': 1.0.0 - '@voidzero-dev/vite-plus-darwin-x64': 1.0.0 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.0.0 - '@voidzero-dev/vite-plus-linux-arm64-musl': 1.0.0 - '@voidzero-dev/vite-plus-linux-x64-gnu': 1.0.0 - '@voidzero-dev/vite-plus-linux-x64-musl': 1.0.0 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.0.0 - '@voidzero-dev/vite-plus-win32-x64-msvc': 1.0.0 + '@voidzero-dev/vite-plus-darwin-arm64': 1.3.0 + '@voidzero-dev/vite-plus-darwin-x64': 1.3.0 + '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.3.0 + '@voidzero-dev/vite-plus-linux-arm64-musl': 1.3.0 + '@voidzero-dev/vite-plus-linux-x64-gnu': 1.3.0 + '@voidzero-dev/vite-plus-linux-x64-musl': 1.3.0 + '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.3.0 + '@voidzero-dev/vite-plus-win32-x64-msvc': 1.3.0 transitivePeerDependencies: - '@arethetypeswrong/core' + - '@astrojs/compiler-rs' - '@edge-runtime/vm' - '@opentelemetry/api' - '@types/node' + - '@typescript/native-preview' - '@vitejs/devtools' - '@vitest/coverage-istanbul' - '@vitest/coverage-v8' - '@vitest/ui' + - '@volar/typescript' + - '@vue/language-core' - bufferutil - esbuild - happy-dom @@ -3535,32 +3428,33 @@ snapshots: - unplugin-unused - unrun - utf-8-validate + - vue-tsc - yaml - vitefu@1.1.3(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): + vitefu@1.1.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - vitest@5.0.1(@types/node@26.6.3)(@vitest/browser-preview@5.0.1)(@vitest/ui@5.0.1)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): + vitest@5.0.5(@types/node@26.6.3)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) - chai: 6.2.2 + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)) + chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 - magic-string: 1.2.3 - obug: 2.2.1 + magic-string: 1.4.3 + obug: 3.0.0 picomatch: 4.0.7 - std-env: 4.2.0 - tinybench: 6.1.4 - tinyexec: 1.3.0 + std-env: 4.3.0 + tinybench: 6.2.2 + tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: '@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' - why-is-node-running: 2.3.0 + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3)' + why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 26.6.3 - '@vitest/browser-preview': 5.0.1(@voidzero-dev/vite-plus-core@1.0.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.1) - '@vitest/ui': 5.0.1(vitest@5.0.1) + '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@26.6.3)(jiti@2.7.0)(typescript@6.0.3))(vitest@5.0.5) + '@vitest/ui': 5.0.5(vitest@5.0.5) transitivePeerDependencies: - msw @@ -3568,50 +3462,30 @@ snapshots: webpack-virtual-modules@0.6.2: {} - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - - ws@8.21.3: {} + why-is-node-running@3.2.1: {} - yuku-ast@0.9.5: - dependencies: - '@yuku-toolchain/types': 0.9.5 + ws@8.22.0: {} - yuku-codegen@0.9.5: + yuku-core@0.19.0: dependencies: - '@yuku-toolchain/types': 0.9.5 - optionalDependencies: - '@yuku-codegen/binding-android-arm64': 0.9.5 - '@yuku-codegen/binding-darwin-arm64': 0.9.5 - '@yuku-codegen/binding-darwin-x64': 0.9.5 - '@yuku-codegen/binding-freebsd-x64': 0.9.5 - '@yuku-codegen/binding-linux-arm-gnu': 0.9.5 - '@yuku-codegen/binding-linux-arm-musl': 0.9.5 - '@yuku-codegen/binding-linux-arm64-gnu': 0.9.5 - '@yuku-codegen/binding-linux-arm64-musl': 0.9.5 - '@yuku-codegen/binding-linux-x64-gnu': 0.9.5 - '@yuku-codegen/binding-linux-x64-musl': 0.9.5 - '@yuku-codegen/binding-win32-arm64': 0.9.5 - '@yuku-codegen/binding-win32-x64': 0.9.5 - - yuku-parser@0.9.5: - dependencies: - '@yuku-toolchain/types': 0.9.5 - yuku-ast: 0.9.5 + '@yuku-toolchain/types': 0.19.0 optionalDependencies: - '@yuku-parser/binding-android-arm64': 0.9.5 - '@yuku-parser/binding-darwin-arm64': 0.9.5 - '@yuku-parser/binding-darwin-x64': 0.9.5 - '@yuku-parser/binding-freebsd-x64': 0.9.5 - '@yuku-parser/binding-linux-arm-gnu': 0.9.5 - '@yuku-parser/binding-linux-arm-musl': 0.9.5 - '@yuku-parser/binding-linux-arm64-gnu': 0.9.5 - '@yuku-parser/binding-linux-arm64-musl': 0.9.5 - '@yuku-parser/binding-linux-x64-gnu': 0.9.5 - '@yuku-parser/binding-linux-x64-musl': 0.9.5 - '@yuku-parser/binding-win32-arm64': 0.9.5 - '@yuku-parser/binding-win32-x64': 0.9.5 + '@yuku-core/binding-android-arm64': 0.19.0 + '@yuku-core/binding-darwin-arm64': 0.19.0 + '@yuku-core/binding-darwin-x64': 0.19.0 + '@yuku-core/binding-freebsd-x64': 0.19.0 + '@yuku-core/binding-linux-arm-gnu': 0.19.0 + '@yuku-core/binding-linux-arm-musl': 0.19.0 + '@yuku-core/binding-linux-arm64-gnu': 0.19.0 + '@yuku-core/binding-linux-arm64-musl': 0.19.0 + '@yuku-core/binding-linux-x64-gnu': 0.19.0 + '@yuku-core/binding-linux-x64-musl': 0.19.0 + '@yuku-core/binding-win32-arm64': 0.19.0 + '@yuku-core/binding-win32-x64': 0.19.0 + + yuku-parser@0.19.0: + dependencies: + '@yuku-toolchain/types': 0.19.0 + yuku-core: 0.19.0 zimmerframe@1.1.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d6d17449..62aa7d12 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,7 +1,7 @@ allowBuilds: esbuild: false catalog: - vite: npm:@voidzero-dev/vite-plus-core@^1.0.0 + vite: npm:@voidzero-dev/vite-plus-core@latest vite-plus: latest minimumReleaseAgeExclude: - "@sveltejs/kit" diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index b931bdf1..6c446916 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -1025,7 +1025,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1225,7 +1225,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1248,6 +1248,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.5.0" @@ -1802,11 +1814,32 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash", +] + [[package]] name = "hashbrown" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashlink" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a596f1b20ed2cc5ecac41a164aaebc7258057060f06c0cf7a2ba3991ee7990fb" +dependencies = [ + "hashbrown 0.17.1", +] [[package]] name = "heck" @@ -2002,13 +2035,13 @@ dependencies = [ "keyring", "mimalloc", "reqwest 0.12.28", + "rusqlite", "rustc-hash", "rustls", "serde", "serde_json", "tauri", "tauri-build", - "tauri-plugin-cache", "tauri-plugin-deep-link", "tauri-plugin-dialog", "tauri-plugin-fs", @@ -2029,6 +2062,7 @@ dependencies = [ "tracing-appender", "tracing-subscriber", "twitch_api", + "zstd", ] [[package]] @@ -2043,7 +2077,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.2", ] [[package]] @@ -2564,6 +2598,17 @@ dependencies = [ "libc", ] +[[package]] +name = "libsqlite3-sys" +version = "0.38.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1d20bef17f513b9b3004532233187769cd072d790971f4e4da0e346eb6401e8" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -2591,17 +2636,6 @@ version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" -[[package]] -name = "lzma-sys" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - [[package]] name = "mac-notification-sys" version = "0.6.15" @@ -2721,7 +2755,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.21", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -2815,7 +2849,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3843,6 +3877,31 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "rsqlite-vfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c" +dependencies = [ + "hashbrown 0.16.1", + "thiserror 2.0.21", +] + +[[package]] +name = "rusqlite" +version = "0.40.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f2a97da3e3873c73cb2a2e71b35c40ff95e0b1eefa8d72d8499a6928c3b5b3" +dependencies = [ + "bitflags 2.13.2", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", + "sqlite-wasm-rs", +] + [[package]] name = "rust-ini" version = "0.21.3" @@ -3878,7 +3937,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -3936,7 +3995,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4403,7 +4462,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4454,6 +4513,18 @@ dependencies = [ "system-deps", ] +[[package]] +name = "sqlite-wasm-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3efc0da82635d7e1ced0053bbbfa8c7ab9645d0bf36ceb4f7127bb85315d75" +dependencies = [ + "cc", + "js-sys", + "rsqlite-vfs", + "wasm-bindgen", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -4806,22 +4877,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "tauri-plugin-cache" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cf5542f3c0cfe774497b295efe49b7924f4f33fc30d182c47047bc6c141d66d" -dependencies = [ - "base64 0.22.1", - "flate2", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.21", - "xz2", -] - [[package]] name = "tauri-plugin-deep-link" version = "2.5.0" @@ -5198,7 +5253,7 @@ dependencies = [ "getrandom 0.4.3", "once_cell", "rustix", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5651,7 +5706,7 @@ dependencies = [ "png 0.18.1", "serde", "thiserror 2.0.21", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -5757,7 +5812,7 @@ checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6115,7 +6170,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -6136,7 +6191,7 @@ dependencies = [ "objc2-foundation", "objc2-quartz-core", "raw-window-handle", - "windows-sys 0.60.2", + "windows-sys 0.61.2", "windows-version", ] @@ -6718,15 +6773,6 @@ dependencies = [ "rustix", ] -[[package]] -name = "xz2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" -dependencies = [ - "lzma-sys", -] - [[package]] name = "yoke" version = "0.8.3" @@ -6935,6 +6981,34 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" +[[package]] +name = "zstd" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3ae9bf90af6e40197bef767eeefc46ad6397420fe873830bd85e5fbbfb3c70" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "8.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded520f16b29e1a9b771c722221b2b0a0398c2316d9bb3c42b458a5414d7434b" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.1.2+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "481ada9c543b2323cbb7bbdbb5249177fbf0188ed959ed2c15e4b22421c84ed3" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "zvariant" version = "5.15.0" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 4636dde4..d6bb0f13 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -30,6 +30,7 @@ either = "1.15.0" futures = "0.3.31" mimalloc = "0.1" reqwest = { version = "0.12.15", features = ["json"] } +rusqlite = { version = "0.40.2", features = ["bundled"] } rustc-hash = "2.1.3" rustls = { version = "0.23.25", features = ["ring"] } serde = { version = "1.0.219", features = ["derive"] } @@ -37,7 +38,6 @@ serde_json = "1.0.140" thiserror = "2.0.12" time = { version = "0.3", features = ["formatting", "local-offset"] } tauri = { version = "2", features = ["protocol-asset"] } -tauri-plugin-cache = "0.1.5" tauri-plugin-deep-link = "2" tauri-plugin-dialog = "2" tauri-plugin-fs = "2" @@ -54,6 +54,7 @@ tracing-appender = "0.2" tracing-subscriber = { version = "0.3", features = ["env-filter", "time"] } twitch_api = { version = "0.7.2", features = ["beta", "client", "helix", "reqwest"] } keyring = "4.1.1" +zstd = "0.14.3" [target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] tauri-plugin-single-instance = { version = "2", features = ["deep-link"] } diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index c3a20d73..457f73ec 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -12,7 +12,6 @@ "core:window:allow-start-dragging", "core:window:allow-set-focus", "core:webview:allow-create-webview-window", - "cache:default", "deep-link:default", "dialog:default", "fs:allow-exists", @@ -37,6 +36,9 @@ { "path": "$APPLOG" }, + { + "path": "$APPCACHE" + }, { "path": "$APPCONFIG/**" } diff --git a/src-tauri/src/cache.rs b/src-tauri/src/cache.rs new file mode 100644 index 00000000..ece3426b --- /dev/null +++ b/src-tauri/src/cache.rs @@ -0,0 +1,148 @@ +use std::path::Path; +use std::sync::{Arc, Mutex}; +use std::time::{SystemTime, UNIX_EPOCH}; + +use rusqlite::{Connection, OptionalExtension, params}; +use serde_json::Value; +use tauri::{State, async_runtime}; + +use crate::error::Error; + +const ZSTD_LEVEL: i32 = 3; + +#[derive(Clone)] +pub struct Cache(Arc>); + +impl Cache { + pub fn open(path: &Path) -> rusqlite::Result { + let conn = Connection::open(path)?; + + conn.execute_batch( + "PRAGMA journal_mode = WAL; + PRAGMA synchronous = NORMAL; + + CREATE TABLE IF NOT EXISTS cache ( + key TEXT PRIMARY KEY, + value BLOB NOT NULL, + expires_at INTEGER + );", + )?; + + // Expired rows are filtered out on read, so purging once per launch is + // enough to keep the file from growing. + conn.execute("DELETE FROM cache WHERE expires_at <= ?1", [now()])?; + + Ok(Self(Arc::new(Mutex::new(conn)))) + } + + fn get(&self, key: &str) -> Result, Error> { + let blob: Option> = self + .0 + .lock() + .unwrap() + .query_row( + "SELECT value FROM cache WHERE key = ?1 AND (expires_at IS NULL OR expires_at > ?2)", + params![key, now()], + |row| row.get(0), + ) + .optional()?; + + let Some(blob) = blob else { + return Ok(None); + }; + + let json = zstd::decode_all(blob.as_slice())?; + + Ok(Some(serde_json::from_slice(&json)?)) + } + + fn set(&self, key: &str, value: &Value, ttl: Option) -> Result<(), Error> { + let json = serde_json::to_vec(value)?; + let blob = zstd::encode_all(json.as_slice(), ZSTD_LEVEL)?; + let expires_at = ttl.map(|ttl| now() + ttl as i64); + + self.0.lock().unwrap().execute( + "INSERT OR REPLACE INTO cache (key, value, expires_at) VALUES (?1, ?2, ?3)", + params![key, blob, expires_at], + )?; + + Ok(()) + } + + fn remove(&self, key: &str) -> Result<(), Error> { + self.0 + .lock() + .unwrap() + .execute("DELETE FROM cache WHERE key = ?1", [key])?; + + Ok(()) + } + + fn clear(&self) -> Result<(), Error> { + self.0 + .lock() + .unwrap() + .execute_batch("DELETE FROM cache; VACUUM; PRAGMA wal_checkpoint(TRUNCATE);")?; + + Ok(()) + } + + fn size(&self) -> Result { + let size = self.0.lock().unwrap().query_row( + "SELECT COALESCE(SUM(LENGTH(key) + LENGTH(value)), 0) FROM cache", + [], + |row| row.get(0), + )?; + + Ok(size) + } +} + +fn now() -> i64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() as i64 +} + +async fn blocking(cache: &Cache, f: F) -> Result +where + T: Send + 'static, + F: FnOnce(&Cache) -> Result + Send + 'static, +{ + let cache = cache.clone(); + + async_runtime::spawn_blocking(move || f(&cache)) + .await + .map_err(anyhow::Error::from)? +} + +#[tauri::command] +pub async fn cache_get(cache: State<'_, Cache>, key: String) -> Result, Error> { + blocking(&cache, move |cache| cache.get(&key)).await +} + +#[tauri::command] +pub async fn cache_set( + cache: State<'_, Cache>, + key: String, + value: Value, + ttl: Option, +) -> Result<(), Error> { + blocking(&cache, move |cache| cache.set(&key, &value, ttl)).await +} + +#[tauri::command] +pub async fn cache_remove(cache: State<'_, Cache>, key: String) -> Result<(), Error> { + blocking(&cache, move |cache| cache.remove(&key)).await +} + +#[tauri::command] +pub async fn cache_clear(cache: State<'_, Cache>) -> Result<(), Error> { + blocking(&cache, Cache::clear).await +} + +#[tauri::command] +pub async fn cache_size(cache: State<'_, Cache>) -> Result { + blocking(&cache, Cache::size).await +} diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index d612b887..6f6e4e94 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -1,6 +1,5 @@ use serde::{Deserialize, Serialize}; use tauri::AppHandle; -use tauri_plugin_cache::CacheExt; use crate::HTTP; use crate::error::Error; @@ -59,24 +58,6 @@ pub async fn fetch_recent_messages( Ok(server_messages) } -#[tauri::command] -pub fn get_cache_size(app_handle: AppHandle) -> i64 { - let cache_path = app_handle.cache().get_cache_file_path(); - - match std::fs::metadata(cache_path) { - Ok(metadata) => { - let size = metadata.len() as i64; - - // Empty cache files contain an empty object i.e. "{}" - if size == 2 { 0 } else { size } - } - Err(error) => { - tracing::error!(%error, "Failed to get cache size"); - 0 - } - } -} - #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] pub struct AboutInfo { diff --git a/src-tauri/src/error.rs b/src-tauri/src/error.rs index 6a43b0ef..46c5d11d 100644 --- a/src-tauri/src/error.rs +++ b/src-tauri/src/error.rs @@ -22,6 +22,9 @@ pub enum Error { #[error(transparent)] Keyring(#[from] keyring::Error), + #[error(transparent)] + Sqlite(#[from] rusqlite::Error), + #[error(transparent)] WebSocket(#[from] tungstenite::Error), } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 36c68617..11da9c33 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -3,6 +3,7 @@ use std::sync::{Arc, LazyLock}; use auth::Integrity; +use cache::Cache; use irc::IrcClient; use irc::message::ServerMessage; use pubsub::PubSubClient; @@ -12,7 +13,6 @@ use seventv::SeventTvClient; use tauri::Manager; use tauri::async_runtime::{self, Mutex}; use tauri::ipc::Invoke; -use tauri_plugin_cache::{CacheConfig, CompressionMethod}; use tauri_plugin_svelte::PrettyJsonMarshaler; use twitch_api::HelixClient; use twitch_api::twitch_oauth2::UserToken; @@ -20,6 +20,7 @@ use ws::ChannelSink; mod api; mod auth; +mod cache; mod commands; mod error; mod irc; @@ -91,11 +92,6 @@ pub fn run() { } builder - .plugin(tauri_plugin_cache::init_with_config(CacheConfig { - compression_level: Some(8), - compression_method: Some(CompressionMethod::Lzma2), - ..Default::default() - })) .plugin(tauri_plugin_deep_link::init()) .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_fs::init()) @@ -121,6 +117,11 @@ pub fn run() { app_handle.plugin(svelte)?; + let cache_dir = app_handle.path().app_cache_dir()?; + std::fs::create_dir_all(&cache_dir)?; + + app.manage(Cache::open(&cache_dir.join("cache.db"))?); + async_runtime::block_on(async { let restored = auth::restore_credentials(&state.helix).await; @@ -153,8 +154,12 @@ fn get_handler() -> impl Fn(Invoke) -> bool { auth::get_integrity, auth::open_twitch_login, auth::store_token, + cache::cache_clear, + cache::cache_size, + cache::cache_get, + cache::cache_remove, + cache::cache_set, commands::fetch_recent_messages, - commands::get_cache_size, commands::get_about_info, irc::connect_irc, irc::privmsg, diff --git a/src/lib/cache.ts b/src/lib/cache.ts new file mode 100644 index 00000000..0645578a --- /dev/null +++ b/src/lib/cache.ts @@ -0,0 +1,83 @@ +import { invoke } from "@tauri-apps/api/core"; + +import { log } from "#lib/log.js"; + +interface Entry { + data: T; + fetchedAt: number; +} + +export interface RevalidateOptions { + /** + * Seconds after a fetch during which the cached data is used without + * revalidating. + */ + fresh: number; + + /** + * Seconds until the entry is evicted if it isn't refetched. + */ + ttl?: number; + + /** + * Whether to bypass the cache and fetch directly. + */ + force?: boolean; + + /** + * Called with the refetched data after stale data was returned. + */ + onRevalidate: (data: T) => void; +} + +/** + * Returns cached data immediately and refetches it in the background once it's + * older than `fresh` seconds. + */ +export async function revalidate( + key: string, + fetcher: () => Promise, + options: RevalidateOptions, +) { + const entry = options.force ? null : await get>(key); + + if (entry && Date.now() - entry.fetchedAt < options.fresh * 1000) { + return entry.data; + } + + const pending = fetcher().then(async (data) => { + await set(key, { data, fetchedAt: Date.now() } satisfies Entry, options.ttl); + return data; + }); + + if (!entry) return pending; + + pending + .then(options.onRevalidate) + .catch((error) => log.warn(`Failed to revalidate ${key}: ${error}`)); + + return entry.data; +} + +export async function get(key: string) { + return invoke("cache_get", { key }); +} + +export async function set(key: string, value: unknown, ttl?: number) { + await invoke("cache_set", { key, value, ttl }); +} + +export async function remove(key: string) { + await invoke("cache_remove", { key }); +} + +export async function clear() { + await invoke("cache_clear"); +} + +/** + * Returns the size of all cached entries in bytes. + */ +export async function size() { + return invoke("cache_size"); +} diff --git a/src/lib/components/settings/custom/Cache.svelte b/src/lib/components/settings/custom/Cache.svelte new file mode 100644 index 00000000..c1816d6a --- /dev/null +++ b/src/lib/components/settings/custom/Cache.svelte @@ -0,0 +1,56 @@ + + +
+ + + {#if import.meta.env.DEV} + + {/if} +
diff --git a/src/lib/components/settings/custom/ClearCache.svelte b/src/lib/components/settings/custom/ClearCache.svelte deleted file mode 100644 index f6a6e095..00000000 --- a/src/lib/components/settings/custom/ClearCache.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/lib/graphql/7tv.ts b/src/lib/graphql/7tv.ts index 61c65a45..e852f49e 100644 --- a/src/lib/graphql/7tv.ts +++ b/src/lib/graphql/7tv.ts @@ -98,6 +98,7 @@ export const activeEmoteSetQuery = gql( style { activeEmoteSet { id + updatedAt ...EmoteSetDetails @include(if: $details) } } @@ -137,6 +138,16 @@ export const globalEmoteSetQuery = gql( [emoteSetDetailsFragment], ); +export const globalEmoteSetVersionQuery = gql( + `query GetGlobalEmoteSetVersion { + emoteSets { + global: emoteSet(id: "01HKQT8EWR000ESSWF3625XCS4") { + updatedAt + } + } + }`, +); + export const userEmoteSetsQuery = gql( `query GetUserEmoteSets($id: String!) { users { diff --git a/src/lib/handlers/seventv/emote-set-update.ts b/src/lib/handlers/seventv/emote-set-update.ts index 99fcea74..97232296 100644 --- a/src/lib/handlers/seventv/emote-set-update.ts +++ b/src/lib/handlers/seventv/emote-set-update.ts @@ -1,5 +1,3 @@ -import * as cache from "tauri-plugin-cache-api"; - import type { Emote } from "#lib/emotes.js"; import type { EmoteChange } from "#lib/seventv.js"; @@ -84,10 +82,9 @@ export default defineHandler({ channel.emotes.set(change.value.name, emote); } + // The cache doesn't need updating since the set's updatedAt changes + // with this event, so it's refetched on next launch if (last) channel.chat.event(EmoteSetUpdate, last); - - await cache.remove(`emotes:${channel.id}`); - await cache.set(`emotes:${channel.id}`, channel.emotes.values().toArray()); } // Personal set was updated else { diff --git a/src/lib/handlers/seventv/user-update.ts b/src/lib/handlers/seventv/user-update.ts index 92a298e2..fd4727c0 100644 --- a/src/lib/handlers/seventv/user-update.ts +++ b/src/lib/handlers/seventv/user-update.ts @@ -31,8 +31,8 @@ export default defineHandler({ channel.chat.event(EmoteSetChange, { actor }); } else { channel.chat.event(EmoteSetChange, { name: child.value.name, actor }); + channel.emotes.addAll(await channel.emotes.fetch7tv()); - await channel.emotes.fetch7tv(); await invoke("resub_emote_set", { channel: channel.user.username, setId: channel.emoteSetId, diff --git a/src/lib/managers/badge-manager.ts b/src/lib/managers/badge-manager.ts index 13338487..6d3245ed 100644 --- a/src/lib/managers/badge-manager.ts +++ b/src/lib/managers/badge-manager.ts @@ -1,10 +1,10 @@ import { ofetch } from "ofetch"; import { SvelteMap } from "svelte/reactivity"; -import * as cache from "tauri-plugin-cache-api"; import type { BttvBadge, FfzBadge } from "#lib/models/badge.js"; import { app } from "#lib/app.svelte.js"; +import * as cache from "#lib/cache.js"; import { ApiError } from "#lib/errors/api-error.js"; import { globalBadgesQuery } from "#lib/graphql/twitch.js"; import { Badge } from "#lib/models/badge.js"; @@ -41,7 +41,7 @@ export class BadgeManager extends SvelteMap { // Twitch adds new badges fairly often, so ttl is lower than the // global emote cache - await cache.set("global_badges", badges, { ttl: 3 * 24 * 60 * 60 }); + await cache.set("global_badges", badges, 3 * 24 * 60 * 60); } for (const badge of badges) { diff --git a/src/lib/managers/base-emote-manager.ts b/src/lib/managers/base-emote-manager.ts index 7e0fd26e..6d23fcb4 100644 --- a/src/lib/managers/base-emote-manager.ts +++ b/src/lib/managers/base-emote-manager.ts @@ -2,34 +2,57 @@ import { SvelteMap } from "svelte/reactivity"; import type { Emote, EmoteProvider } from "#lib/emotes.js"; +import * as cache from "#lib/cache.js"; import { settings } from "#lib/settings/index.js"; +const FRESH = 5 * 60; + +// Only evicts entries for channels that haven't been joined in a while since +// entries are refreshed on every fetch +const TTL = 30 * 24 * 60 * 60; + +interface VersionedEntry { + data: Emote[]; + version: string | null; +} + export abstract class BaseEmoteManager extends SvelteMap { + /** + * Identifies this manager's entries in the cache. + */ + protected abstract get cacheId(): string; + + /** + * Retrieves a value that changes whenever the 7TV emote set is modified. + */ + protected abstract fetch7tvVersion(): Promise; + public abstract fetchFfz(): Promise; public abstract fetchBttv(): Promise; public abstract fetch7tv(): Promise; /** - * Retrieves the list of emotes from the providers enabled in the settings and - * caches them for later use. + * Loads the emotes from the providers enabled in the settings. Cached + * emotes are used immediately and refreshed in the background if stale. */ - public async fetch() { - const promises: Promise[] = []; + public async fetch(force = false) { + if (force) this.clear(); + + const promises: Promise[] = []; if (settings.state["chat.emotes.ffz"]) { - promises.push(this.fetchFfz()); + promises.push(this.#load("FrankerFaceZ", () => this.fetchFfz(), force)); } if (settings.state["chat.emotes.bttv"]) { - promises.push(this.fetchBttv()); + promises.push(this.#load("BetterTTV", () => this.fetchBttv(), force)); } if (settings.state["chat.emotes.seventv"]) { - promises.push(this.fetch7tv()); + promises.push(this.#load7tv(force)); } - const emotes = await Promise.all(promises); - return emotes.flat(); + await Promise.all(promises); } public addAll(emotes: Iterable) { @@ -40,6 +63,26 @@ export abstract class BaseEmoteManager extends SvelteMap { return this; } + /** + * Replaces the emotes from the specified provider, only touching the + * entries that changed. + */ + public replace(provider: EmoteProvider, emotes: Emote[]) { + const next = new Map(emotes.map((emote) => [emote.displayName, emote])); + + for (const [name, emote] of this) { + if (emote.provider === provider && !next.has(name)) { + this.delete(name); + } + } + + for (const [name, emote] of next) { + if (this.get(name)?.id !== emote.id) { + this.set(name, emote); + } + } + } + /** * Removes all emotes from the specified provider or all emotes if no * provider is given. @@ -53,4 +96,42 @@ export abstract class BaseEmoteManager extends SvelteMap { super.clear(); } } + + #key(provider: EmoteProvider) { + return `emotes:${provider.toLowerCase()}:${this.cacheId}`; + } + + async #load(provider: EmoteProvider, fetcher: () => Promise, force: boolean) { + const emotes = await cache.revalidate(this.#key(provider), fetcher, { + fresh: FRESH, + ttl: TTL, + force, + onRevalidate: (emotes) => this.replace(provider, emotes), + }); + + this.addAll(emotes); + } + + async #load7tv(force: boolean) { + const key = this.#key("7TV"); + + const [entry, version] = await Promise.all([ + force ? null : cache.get(key), + // undefined means the version couldn't be checked, in which case + // cached emotes are preferred over failing + this.fetch7tvVersion().catch(() => undefined), + ]); + + if (entry && (version === undefined || entry.version === version)) { + this.addAll(entry.data); + return; + } + + const emotes = await this.fetch7tv(); + this.addAll(emotes); + + if (version !== undefined) { + await cache.set(key, { data: emotes, version } satisfies VersionedEntry, TTL); + } + } } diff --git a/src/lib/managers/channel-badge-manager.ts b/src/lib/managers/channel-badge-manager.ts index 543cadbd..fc5dc149 100644 --- a/src/lib/managers/channel-badge-manager.ts +++ b/src/lib/managers/channel-badge-manager.ts @@ -1,7 +1,6 @@ -import * as cache from "tauri-plugin-cache-api"; - import type { Channel } from "#lib/models/channel.svelte.js"; +import * as cache from "#lib/cache.js"; import { channelBadgesQuery } from "#lib/graphql/twitch.js"; import { Badge } from "#lib/models/badge.js"; diff --git a/src/lib/managers/channel-emote-manager.ts b/src/lib/managers/channel-emote-manager.ts index b86f4dee..cf235c2e 100644 --- a/src/lib/managers/channel-emote-manager.ts +++ b/src/lib/managers/channel-emote-manager.ts @@ -1,7 +1,6 @@ import { ofetch } from "ofetch"; -import * as cache from "tauri-plugin-cache-api"; -import type { BttvEmote, Emote, FfzEmoteSet } from "#lib/emotes.js"; +import type { BttvEmote, FfzEmoteSet } from "#lib/emotes.js"; import type { ActiveEmoteSet } from "#lib/graphql/7tv.js"; import type { Channel } from "#lib/models/channel.svelte.js"; @@ -27,29 +26,22 @@ export class ChannelEmoteManager extends BaseEmoteManager { super(); } - public override async fetch(force = false) { - let emotes = await cache.get(`emotes:${this.channel.id}`); - - if (force || !emotes) { - if (force) this.clear(); - - const [fetched] = await Promise.all([ - super.fetch(), - // fetch7tv resolves the channel's 7TV user, so only look it up - // separately when 7TV emotes are disabled - settings.state["chat.emotes.seventv"] - ? null - : this.#fetchActiveSet(false).catch(() => null), - ]); - - emotes = fetched; - await cache.set(`emotes:${this.channel.id}`, emotes); - } else { - await this.#fetchActiveSet(false); - this.addAll(emotes); - } + protected override get cacheId() { + return this.channel.id; + } + + protected override async fetch7tvVersion() { + const set = await this.#fetchActiveSet(false); + return set ? `${set.id}:${set.updatedAt}` : null; + } - return emotes; + public override async fetch(force = false) { + await Promise.all([ + super.fetch(force), + settings.state["chat.emotes.seventv"] + ? null + : this.#fetchActiveSet(false).catch(() => null), + ]); } /** @@ -63,13 +55,11 @@ export class ChannelEmoteManager extends BaseEmoteManager { } catch (error) { const apiError = ApiError.from(error); if (apiError.status === 404) return []; + throw apiError; } - const emotes = data.sets[data.room.set].emoticons.map(transformFfzEmote); - this.addAll(emotes); - - return emotes; + return data.sets[data.room.set].emoticons.map(transformFfzEmote); } /** @@ -88,10 +78,7 @@ export class ChannelEmoteManager extends BaseEmoteManager { throw apiError; } - const emotes = data.channelEmotes.concat(data.sharedEmotes).map(transformBttvEmote); - this.addAll(emotes); - - return emotes; + return data.channelEmotes.concat(data.sharedEmotes).map(transformBttvEmote); } /** @@ -101,10 +88,7 @@ export class ChannelEmoteManager extends BaseEmoteManager { const set = await this.#fetchActiveSet(); if (!set) return []; - const emotes = set.emotes.items.map((item) => transform7tvEmote(item.emote, item.alias)); - this.addAll(emotes); - - return emotes; + return set.emotes.items.map((item) => transform7tvEmote(item.emote, item.alias)); } async #fetchActiveSet(): Promise; diff --git a/src/lib/managers/cheermote-manager.ts b/src/lib/managers/cheermote-manager.ts index 068d35c9..2f08a75e 100644 --- a/src/lib/managers/cheermote-manager.ts +++ b/src/lib/managers/cheermote-manager.ts @@ -1,8 +1,7 @@ -import * as cache from "tauri-plugin-cache-api"; - import type { Cheermote } from "#lib/graphql/twitch.js"; import type { Channel } from "#lib/models/channel.svelte.js"; +import * as cache from "#lib/cache.js"; import { cheermoteQuery } from "#lib/graphql/twitch.js"; /** diff --git a/src/lib/managers/emote-manager.ts b/src/lib/managers/emote-manager.ts index ef7a404d..8fb28f47 100644 --- a/src/lib/managers/emote-manager.ts +++ b/src/lib/managers/emote-manager.ts @@ -1,28 +1,20 @@ import { ofetch } from "ofetch"; -import * as cache from "tauri-plugin-cache-api"; -import type { BttvEmote, Emote, GlobalSet } from "#lib/emotes.js"; +import type { BttvEmote, GlobalSet } from "#lib/emotes.js"; import { transform7tvEmote, transformBttvEmote, transformFfzEmote } from "#lib/emotes.js"; import { ApiError } from "#lib/errors/api-error.js"; -import { execute7tvQuery, globalEmoteSetQuery } from "#lib/graphql/7tv.js"; +import { + execute7tvQuery, + globalEmoteSetQuery, + globalEmoteSetVersionQuery, +} from "#lib/graphql/7tv.js"; import { BaseEmoteManager } from "./base-emote-manager"; export class EmoteManager extends BaseEmoteManager { - public override async fetch(force = false) { - let emotes = await cache.get("global_emotes"); - - if (force || !emotes) { - if (force) this.clear(); - - emotes = await super.fetch(); - await cache.set("global_emotes", emotes, { ttl: 7 * 24 * 60 * 60 }); - } else { - this.addAll(emotes); - } - - return emotes; + protected override get cacheId() { + return "global"; } /** @@ -38,10 +30,7 @@ export class EmoteManager extends BaseEmoteManager { } // 3 is the global set id - const emotes = data.sets[3].emoticons.map(transformFfzEmote); - this.addAll(emotes); - - return emotes; + return data.sets[3].emoticons.map(transformFfzEmote); } /** @@ -56,10 +45,7 @@ export class EmoteManager extends BaseEmoteManager { throw ApiError.from(error); } - const emotes = data.map(transformBttvEmote); - this.addAll(emotes); - - return emotes; + return data.map(transformBttvEmote); } /** @@ -68,12 +54,14 @@ export class EmoteManager extends BaseEmoteManager { public override async fetch7tv() { const { emoteSets } = await execute7tvQuery(globalEmoteSetQuery); - const emotes = emoteSets.global!.emotes.items.map((item) => + return emoteSets.global!.emotes.items.map((item) => transform7tvEmote(item.emote, item.alias), ); + } - this.addAll(emotes); + protected override async fetch7tvVersion() { + const { emoteSets } = await execute7tvQuery(globalEmoteSetVersionQuery); - return emotes; + return emoteSets.global?.updatedAt ?? null; } } diff --git a/src/lib/settings/categories/advanced.ts b/src/lib/settings/categories/advanced.ts index fd29d194..6f71a520 100644 --- a/src/lib/settings/categories/advanced.ts +++ b/src/lib/settings/categories/advanced.ts @@ -1,6 +1,6 @@ import Toolbox from "~icons/ph/toolbox"; -import ClearCache from "#lib/components/settings/custom/ClearCache.svelte"; +import Cache from "#lib/components/settings/custom/Cache.svelte"; import type { SettingsCategory } from "../types"; @@ -39,7 +39,7 @@ export default { label: "Clear", description: "Clear the application cache to free up space or resolve issues.", renderAs: "field", - component: ClearCache, + component: Cache, }, ], }, From 614d55b80428be8fefb0eb03e863306d21de51e7 Mon Sep 17 00:00:00 2001 From: Oliver Rose Date: Thu, 22 Oct 2026 16:38:13 -0400 Subject: [PATCH 2/3] add fallbacks to cache initialization --- src-tauri/src/cache.rs | 28 ++++++++++++++++++++++++++-- src-tauri/src/lib.rs | 7 +++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/cache.rs b/src-tauri/src/cache.rs index ece3426b..1ea1479b 100644 --- a/src-tauri/src/cache.rs +++ b/src-tauri/src/cache.rs @@ -1,3 +1,4 @@ +use std::fs; use std::path::Path; use std::sync::{Arc, Mutex}; use std::time::{SystemTime, UNIX_EPOCH}; @@ -14,8 +15,31 @@ const ZSTD_LEVEL: i32 = 3; pub struct Cache(Arc>); impl Cache { - pub fn open(path: &Path) -> rusqlite::Result { - let conn = Connection::open(path)?; + pub fn open(path: &Path) -> Self { + match Self::init(Connection::open(path)) { + Ok(cache) => return cache, + Err(error) => tracing::warn!(%error, "Failed to open cache, recreating it"), + } + + for suffix in ["", "-wal", "-shm"] { + let mut file = path.as_os_str().to_owned(); + file.push(suffix); + + let _ = fs::remove_file(file); + } + + match Self::init(Connection::open(path)) { + Ok(cache) => cache, + Err(error) => { + tracing::error!(%error, "Failed to recreate cache, falling back to memory"); + + Self::init(Connection::open_in_memory()).expect("failed to open in-memory cache") + } + } + } + + fn init(conn: rusqlite::Result) -> rusqlite::Result { + let conn = conn?; conn.execute_batch( "PRAGMA journal_mode = WAL; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 11da9c33..caf497f6 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -118,9 +118,12 @@ pub fn run() { app_handle.plugin(svelte)?; let cache_dir = app_handle.path().app_cache_dir()?; - std::fs::create_dir_all(&cache_dir)?; - app.manage(Cache::open(&cache_dir.join("cache.db"))?); + if let Err(error) = std::fs::create_dir_all(&cache_dir) { + tracing::error!(%error, "Failed to create cache directory"); + } + + app.manage(Cache::open(&cache_dir.join("cache.db"))); async_runtime::block_on(async { let restored = auth::restore_credentials(&state.helix).await; From 501806a42850610abcad5a9a2d57353611f55d99 Mon Sep 17 00:00:00 2001 From: Oliver Rose Date: Thu, 22 Oct 2026 16:51:04 -0400 Subject: [PATCH 3/3] swr for badges and cheermotes --- src/lib/managers/badge-manager.ts | 67 ++++++++++++++++++--------- src/lib/managers/cheermote-manager.ts | 42 ++++++++++++----- 2 files changed, 75 insertions(+), 34 deletions(-) diff --git a/src/lib/managers/badge-manager.ts b/src/lib/managers/badge-manager.ts index 6d3245ed..1565ade7 100644 --- a/src/lib/managers/badge-manager.ts +++ b/src/lib/managers/badge-manager.ts @@ -19,6 +19,9 @@ interface FfzResponse { users: Record; } +const FRESH = 60 * 60; // 1 hour +const TTL = 30 * 24 * 60 * 60; // 30 days + export class BadgeManager extends SvelteMap { /** * A map of user ids to provider-specific badges. @@ -52,18 +55,48 @@ export class BadgeManager extends SvelteMap { } public async fetchBttv(force = false) { - let response = await cache.get("bttv_badges"); - - if (!response || force) { - try { - response = await ofetch("https://api.betterttv.net/3/cached/badges"); - } catch (error) { - throw ApiError.from(error); - } + const response = await cache.revalidate( + "bttv_badges", + async () => { + try { + return await ofetch("https://api.betterttv.net/3/cached/badges"); + } catch (error) { + throw ApiError.from(error); + } + }, + { + fresh: FRESH, + ttl: TTL, + force, + onRevalidate: (data) => this.#addBttv(data), + }, + ); + + this.#addBttv(response); + } - await cache.set("bttv_badges", response); - } + public async fetchFfz(force = false) { + const response = await cache.revalidate( + "ffz_badges", + async () => { + try { + return await ofetch("https://api.frankerfacez.com/v1/badges/ids"); + } catch (error) { + throw ApiError.from(error); + } + }, + { + fresh: FRESH, + ttl: TTL, + force, + onRevalidate: (data) => this.#addFfz(data), + }, + ); + + this.#addFfz(response); + } + #addBttv(response: BttvUser[]) { for (const user of response) { const id = `bttv:${user.badge.type}`; @@ -81,19 +114,7 @@ export class BadgeManager extends SvelteMap { } } - public async fetchFfz(force = false) { - let response = await cache.get("ffz_badges"); - - if (!response || force) { - try { - response = await ofetch("https://api.frankerfacez.com/v1/badges/ids"); - } catch (error) { - throw ApiError.from(error); - } - - await cache.set("ffz_badges", response); - } - + #addFfz(response: FfzResponse) { const badges: Record = {}; for (const data of response.badges) { diff --git a/src/lib/managers/cheermote-manager.ts b/src/lib/managers/cheermote-manager.ts index 2f08a75e..832fd871 100644 --- a/src/lib/managers/cheermote-manager.ts +++ b/src/lib/managers/cheermote-manager.ts @@ -4,6 +4,9 @@ import type { Channel } from "#lib/models/channel.svelte.js"; import * as cache from "#lib/cache.js"; import { cheermoteQuery } from "#lib/graphql/twitch.js"; +const FRESH = 60 * 60; // 1 hour +const TTL = 30 * 24 * 60 * 60; // 30 days + /** * The cheermotes in a channel keyed by their lowercased prefix. */ @@ -13,29 +16,46 @@ export class CheermoteManager extends Map { } /** - * Retrieves the list of cheermotes in the channel and caches them for later - * use. + * Retrieves the list of cheermotes in the channel. Cached cheermotes are + * used immediately and refreshed in the background if stale. */ public async fetch(force = false) { if (!force && this.size) { return this; } - let cheermotes = await cache.get(`cheermotes:${this.channel.id}`); + if (force) this.clear(); - if (force || !cheermotes) { - if (force) this.clear(); + const cheermotes = await cache.revalidate( + `cheermotes:${this.channel.id}`, + () => this.#fetch(), + { + fresh: FRESH, + ttl: TTL, + force, + onRevalidate: (cheermotes) => { + this.clear(); + this.#addAll(cheermotes); + }, + }, + ); - const { user } = await this.channel.client.gql(cheermoteQuery, { id: this.channel.id }); + this.#addAll(cheermotes); - cheermotes = user?.cheer?.emotes.filter((e) => e != null) ?? []; - await cache.set(`cheermotes:${this.channel.id}`, cheermotes); - } + return this; + } + + async #fetch() { + const { user } = await this.channel.client.gql(cheermoteQuery, { + id: this.channel.id, + }); + return user?.cheer?.emotes.filter((e) => e != null) ?? []; + } + + #addAll(cheermotes: Cheermote[]) { for (const cheermote of cheermotes) { this.set(cheermote.prefix.toLowerCase(), cheermote); } - - return this; } }