{i18n.download.title}
@@ -152,54 +132,6 @@ const platforms = [
diff --git a/packages/site/src/pages/[locale]/privacy.astro b/packages/site/src/pages/[locale]/privacy.astro
index 4062489..91b2a80 100644
--- a/packages/site/src/pages/[locale]/privacy.astro
+++ b/packages/site/src/pages/[locale]/privacy.astro
@@ -1,6 +1,7 @@
---
import Base from '../../layouts/Base.astro'
-import { t, localePath, type Locale } from '../../i18n'
+import Nav from '../../components/Nav.astro'
+import { t, type Locale } from '../../i18n'
export function getStaticPaths() {
return [{ params: { locale: 'zh' } }, { params: { locale: 'en' } }]
@@ -13,54 +14,6 @@ const GITHUB_REPO = 'https://github.com/funAgent/ai-bubu'
-
+
{
diff --git a/packages/site/src/scripts/sprite-player.ts b/packages/site/src/scripts/sprite-player.ts
new file mode 100644
index 0000000..db907e7
--- /dev/null
+++ b/packages/site/src/scripts/sprite-player.ts
@@ -0,0 +1,108 @@
+export interface SpriteAnimParams {
+ file: string
+ frameWidth: number
+ frameHeight: number
+ frameCount: number
+ columns: number
+ fps: number
+ startFrame: number
+ sheetRows: number
+}
+
+export class SpritePlayer {
+ private el: HTMLElement
+ private params: SpriteAnimParams | null = null
+ private spriteUrl = ''
+ private frameIndex = 0
+ private lastFrameTime = 0
+ private animId = 0
+ private _paused = false
+ private scale = 1
+ private maxW: number
+ private maxH: number
+
+ constructor(el: HTMLElement, maxSize = 96) {
+ this.el = el
+ this.maxW = maxSize
+ this.maxH = maxSize
+ }
+
+ play(params: SpriteAnimParams, spriteUrl: string) {
+ this.stop()
+ this.params = params
+ this.spriteUrl = spriteUrl
+ this.frameIndex = 0
+ this.lastFrameTime = 0
+ this._paused = false
+
+ const maxW = this.maxW
+ const maxH = this.maxH
+ this.scale = Math.min(maxW / params.frameWidth, maxH / params.frameHeight)
+
+ const scaledFW = Math.round(params.frameWidth * this.scale)
+ const scaledFH = Math.round(params.frameHeight * this.scale)
+ this.el.style.width = `${scaledFW}px`
+ this.el.style.height = `${scaledFH}px`
+ this.el.style.overflow = 'hidden'
+
+ const bgW = params.columns * params.frameWidth * this.scale
+ const bgH = (params.sheetRows || 1) * params.frameHeight * this.scale
+ this.el.style.backgroundImage = `url("${spriteUrl}")`
+ this.el.style.backgroundSize = `${bgW}px ${bgH}px`
+ this.el.style.imageRendering = 'pixelated'
+ this.el.style.backgroundRepeat = 'no-repeat'
+
+ this.renderFrame()
+ this.animId = requestAnimationFrame((t) => this.tick(t))
+ }
+
+ private tick(now: number) {
+ if (this._paused || !this.params) return
+
+ const interval = 1000 / this.params.fps
+ if (now - this.lastFrameTime >= interval) {
+ this.lastFrameTime = now - ((now - this.lastFrameTime) % interval)
+ this.frameIndex = (this.frameIndex + 1) % this.params.frameCount
+ this.renderFrame()
+ }
+ this.animId = requestAnimationFrame((t) => this.tick(t))
+ }
+
+ private renderFrame() {
+ if (!this.params) return
+ const globalFrame = this.params.startFrame + this.frameIndex
+ const col = globalFrame % this.params.columns
+ const row = Math.floor(globalFrame / this.params.columns)
+ const scaledFW = this.params.frameWidth * this.scale
+ const scaledFH = this.params.frameHeight * this.scale
+ const bgX = Math.round(-(col * scaledFW))
+ const bgY = Math.round(-(row * scaledFH))
+ this.el.style.backgroundPosition = `${bgX}px ${bgY}px`
+ }
+
+ pause() {
+ this._paused = true
+ cancelAnimationFrame(this.animId)
+ }
+
+ resume() {
+ if (!this._paused || !this.params) return
+ this._paused = false
+ this.lastFrameTime = 0
+ this.animId = requestAnimationFrame((t) => this.tick(t))
+ }
+
+ stop() {
+ cancelAnimationFrame(this.animId)
+ this._paused = false
+ this.params = null
+ }
+
+ get paused() {
+ return this._paused
+ }
+
+ get playing() {
+ return this.params !== null && !this._paused
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 372f765..4a00fa0 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -92,10 +92,10 @@ importers:
version: 2.10.1
'@vitejs/plugin-vue':
specifier: ^5
- version: 5.2.4(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
+ version: 5.2.4(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
'@vitest/coverage-v8':
specifier: ^4.1.2
- version: 4.1.2(vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)))
+ version: 4.1.2(vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)))
'@vue/test-utils':
specifier: ^2.4.6
version: 2.4.6
@@ -110,10 +110,10 @@ importers:
version: 5.9.3
vite:
specifier: ^6
- version: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
+ version: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
vitest:
specifier: ^4.1.2
- version: 4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))
+ version: 4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))
vue-tsc:
specifier: ^2
version: 2.2.12(typescript@5.9.3)
@@ -125,7 +125,11 @@ importers:
version: 3.7.2
astro:
specifier: ^6.1.3
- version: 6.1.3(@types/node@25.5.1)(jiti@2.6.1)(rollup@4.60.1)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3)
+ version: 6.1.3(@types/node@25.5.1)(jiti@2.6.1)(rollup@4.60.1)(terser@5.46.1)(tsx@4.22.1)(typescript@5.9.3)(yaml@2.8.3)
+ devDependencies:
+ tsx:
+ specifier: ^4.22.1
+ version: 4.22.1
packages:
@@ -283,6 +287,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.28.0':
+ resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.25.12':
resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==}
engines: {node: '>=18'}
@@ -295,6 +305,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.28.0':
+ resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.25.12':
resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==}
engines: {node: '>=18'}
@@ -307,6 +323,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.28.0':
+ resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.25.12':
resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==}
engines: {node: '>=18'}
@@ -319,6 +341,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.28.0':
+ resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.25.12':
resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==}
engines: {node: '>=18'}
@@ -331,6 +359,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.28.0':
+ resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.25.12':
resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==}
engines: {node: '>=18'}
@@ -343,6 +377,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.28.0':
+ resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.25.12':
resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==}
engines: {node: '>=18'}
@@ -355,6 +395,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.28.0':
+ resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.25.12':
resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==}
engines: {node: '>=18'}
@@ -367,6 +413,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.28.0':
+ resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.25.12':
resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==}
engines: {node: '>=18'}
@@ -379,6 +431,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.28.0':
+ resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.25.12':
resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==}
engines: {node: '>=18'}
@@ -391,6 +449,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.28.0':
+ resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.25.12':
resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==}
engines: {node: '>=18'}
@@ -403,6 +467,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.28.0':
+ resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.25.12':
resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==}
engines: {node: '>=18'}
@@ -415,6 +485,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.28.0':
+ resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.25.12':
resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==}
engines: {node: '>=18'}
@@ -427,6 +503,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.28.0':
+ resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.25.12':
resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==}
engines: {node: '>=18'}
@@ -439,6 +521,12 @@ packages:
cpu: [ppc64]
os: [linux]
+ '@esbuild/linux-ppc64@0.28.0':
+ resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
'@esbuild/linux-riscv64@0.25.12':
resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==}
engines: {node: '>=18'}
@@ -451,6 +539,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.28.0':
+ resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.25.12':
resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==}
engines: {node: '>=18'}
@@ -463,6 +557,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.28.0':
+ resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.25.12':
resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==}
engines: {node: '>=18'}
@@ -475,6 +575,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.28.0':
+ resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
'@esbuild/netbsd-arm64@0.25.12':
resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==}
engines: {node: '>=18'}
@@ -487,6 +593,12 @@ packages:
cpu: [arm64]
os: [netbsd]
+ '@esbuild/netbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.25.12':
resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==}
engines: {node: '>=18'}
@@ -499,6 +611,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.28.0':
+ resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/openbsd-arm64@0.25.12':
resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==}
engines: {node: '>=18'}
@@ -511,6 +629,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.28.0':
+ resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.25.12':
resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==}
engines: {node: '>=18'}
@@ -523,6 +647,12 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.28.0':
+ resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
'@esbuild/openharmony-arm64@0.25.12':
resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==}
engines: {node: '>=18'}
@@ -535,6 +665,12 @@ packages:
cpu: [arm64]
os: [openharmony]
+ '@esbuild/openharmony-arm64@0.28.0':
+ resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
'@esbuild/sunos-x64@0.25.12':
resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==}
engines: {node: '>=18'}
@@ -547,6 +683,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.28.0':
+ resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.25.12':
resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==}
engines: {node: '>=18'}
@@ -559,6 +701,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.28.0':
+ resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.25.12':
resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==}
engines: {node: '>=18'}
@@ -571,6 +719,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.28.0':
+ resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.25.12':
resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==}
engines: {node: '>=18'}
@@ -583,6 +737,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.28.0':
+ resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@eslint-community/eslint-utils@4.9.1':
resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -1756,6 +1916,11 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.28.0:
+ resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==}
+ engines: {node: '>=18'}
+ hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@@ -2886,6 +3051,11 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ tsx@4.22.1:
+ resolution: {integrity: sha512-TvncJykhxAzFCk0VQZKBTClall4Pm7qXDSodb6uxi8QFa8X8mT6ABjxxsQ2opDRYxG7AzcRWXaFtruz5HJKuWg==}
+ engines: {node: '>=18.0.0'}
+ hasBin: true
+
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -3495,156 +3665,234 @@ snapshots:
'@esbuild/aix-ppc64@0.27.7':
optional: true
+ '@esbuild/aix-ppc64@0.28.0':
+ optional: true
+
'@esbuild/android-arm64@0.25.12':
optional: true
'@esbuild/android-arm64@0.27.7':
optional: true
+ '@esbuild/android-arm64@0.28.0':
+ optional: true
+
'@esbuild/android-arm@0.25.12':
optional: true
'@esbuild/android-arm@0.27.7':
optional: true
+ '@esbuild/android-arm@0.28.0':
+ optional: true
+
'@esbuild/android-x64@0.25.12':
optional: true
'@esbuild/android-x64@0.27.7':
optional: true
+ '@esbuild/android-x64@0.28.0':
+ optional: true
+
'@esbuild/darwin-arm64@0.25.12':
optional: true
'@esbuild/darwin-arm64@0.27.7':
optional: true
+ '@esbuild/darwin-arm64@0.28.0':
+ optional: true
+
'@esbuild/darwin-x64@0.25.12':
optional: true
'@esbuild/darwin-x64@0.27.7':
optional: true
+ '@esbuild/darwin-x64@0.28.0':
+ optional: true
+
'@esbuild/freebsd-arm64@0.25.12':
optional: true
'@esbuild/freebsd-arm64@0.27.7':
optional: true
+ '@esbuild/freebsd-arm64@0.28.0':
+ optional: true
+
'@esbuild/freebsd-x64@0.25.12':
optional: true
'@esbuild/freebsd-x64@0.27.7':
optional: true
+ '@esbuild/freebsd-x64@0.28.0':
+ optional: true
+
'@esbuild/linux-arm64@0.25.12':
optional: true
'@esbuild/linux-arm64@0.27.7':
optional: true
+ '@esbuild/linux-arm64@0.28.0':
+ optional: true
+
'@esbuild/linux-arm@0.25.12':
optional: true
'@esbuild/linux-arm@0.27.7':
optional: true
+ '@esbuild/linux-arm@0.28.0':
+ optional: true
+
'@esbuild/linux-ia32@0.25.12':
optional: true
'@esbuild/linux-ia32@0.27.7':
optional: true
+ '@esbuild/linux-ia32@0.28.0':
+ optional: true
+
'@esbuild/linux-loong64@0.25.12':
optional: true
'@esbuild/linux-loong64@0.27.7':
optional: true
+ '@esbuild/linux-loong64@0.28.0':
+ optional: true
+
'@esbuild/linux-mips64el@0.25.12':
optional: true
'@esbuild/linux-mips64el@0.27.7':
optional: true
+ '@esbuild/linux-mips64el@0.28.0':
+ optional: true
+
'@esbuild/linux-ppc64@0.25.12':
optional: true
'@esbuild/linux-ppc64@0.27.7':
optional: true
+ '@esbuild/linux-ppc64@0.28.0':
+ optional: true
+
'@esbuild/linux-riscv64@0.25.12':
optional: true
'@esbuild/linux-riscv64@0.27.7':
optional: true
+ '@esbuild/linux-riscv64@0.28.0':
+ optional: true
+
'@esbuild/linux-s390x@0.25.12':
optional: true
'@esbuild/linux-s390x@0.27.7':
optional: true
+ '@esbuild/linux-s390x@0.28.0':
+ optional: true
+
'@esbuild/linux-x64@0.25.12':
optional: true
'@esbuild/linux-x64@0.27.7':
optional: true
+ '@esbuild/linux-x64@0.28.0':
+ optional: true
+
'@esbuild/netbsd-arm64@0.25.12':
optional: true
'@esbuild/netbsd-arm64@0.27.7':
optional: true
+ '@esbuild/netbsd-arm64@0.28.0':
+ optional: true
+
'@esbuild/netbsd-x64@0.25.12':
optional: true
'@esbuild/netbsd-x64@0.27.7':
optional: true
+ '@esbuild/netbsd-x64@0.28.0':
+ optional: true
+
'@esbuild/openbsd-arm64@0.25.12':
optional: true
'@esbuild/openbsd-arm64@0.27.7':
optional: true
+ '@esbuild/openbsd-arm64@0.28.0':
+ optional: true
+
'@esbuild/openbsd-x64@0.25.12':
optional: true
'@esbuild/openbsd-x64@0.27.7':
optional: true
+ '@esbuild/openbsd-x64@0.28.0':
+ optional: true
+
'@esbuild/openharmony-arm64@0.25.12':
optional: true
'@esbuild/openharmony-arm64@0.27.7':
optional: true
+ '@esbuild/openharmony-arm64@0.28.0':
+ optional: true
+
'@esbuild/sunos-x64@0.25.12':
optional: true
'@esbuild/sunos-x64@0.27.7':
optional: true
+ '@esbuild/sunos-x64@0.28.0':
+ optional: true
+
'@esbuild/win32-arm64@0.25.12':
optional: true
'@esbuild/win32-arm64@0.27.7':
optional: true
+ '@esbuild/win32-arm64@0.28.0':
+ optional: true
+
'@esbuild/win32-ia32@0.25.12':
optional: true
'@esbuild/win32-ia32@0.27.7':
optional: true
+ '@esbuild/win32-ia32@0.28.0':
+ optional: true
+
'@esbuild/win32-x64@0.25.12':
optional: true
'@esbuild/win32-x64@0.27.7':
optional: true
+ '@esbuild/win32-x64@0.28.0':
+ optional: true
+
'@eslint-community/eslint-utils@4.9.1(eslint@10.1.0(jiti@2.6.1))':
dependencies:
eslint: 10.1.0(jiti@2.6.1)
@@ -4190,12 +4438,12 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
- '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
+ '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
dependencies:
- vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
+ vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
vue: 3.5.32(typescript@5.9.3)
- '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)))':
+ '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)))':
dependencies:
'@bcoe/v8-coverage': 1.0.2
'@vitest/utils': 4.1.2
@@ -4207,7 +4455,7 @@ snapshots:
obug: 2.1.1
std-env: 4.0.0
tinyrainbow: 3.1.0
- vitest: 4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))
+ vitest: 4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))
'@vitest/expect@4.1.2':
dependencies:
@@ -4218,13 +4466,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.2(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))':
+ '@vitest/mocker@4.1.2(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))':
dependencies:
'@vitest/spy': 4.1.2
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
+ vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
'@vitest/pretty-format@4.1.2':
dependencies:
@@ -4448,7 +4696,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- astro@6.1.3(@types/node@25.5.1)(jiti@2.6.1)(rollup@4.60.1)(terser@5.46.1)(typescript@5.9.3)(yaml@2.8.3):
+ astro@6.1.3(@types/node@25.5.1)(jiti@2.6.1)(rollup@4.60.1)(terser@5.46.1)(tsx@4.22.1)(typescript@5.9.3)(yaml@2.8.3):
dependencies:
'@astrojs/compiler': 3.0.1
'@astrojs/internal-helpers': 0.8.0
@@ -4500,8 +4748,8 @@ snapshots:
unist-util-visit: 5.1.0
unstorage: 1.17.5
vfile: 6.0.3
- vite: 7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
- vitefu: 1.1.3(vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))
+ vite: 7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
+ vitefu: 1.1.3(vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))
xxhash-wasm: 1.1.0
yargs-parser: 22.0.0
zod: 4.3.6
@@ -4859,6 +5107,35 @@ snapshots:
'@esbuild/win32-ia32': 0.27.7
'@esbuild/win32-x64': 0.27.7
+ esbuild@0.28.0:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.0
+ '@esbuild/android-arm': 0.28.0
+ '@esbuild/android-arm64': 0.28.0
+ '@esbuild/android-x64': 0.28.0
+ '@esbuild/darwin-arm64': 0.28.0
+ '@esbuild/darwin-x64': 0.28.0
+ '@esbuild/freebsd-arm64': 0.28.0
+ '@esbuild/freebsd-x64': 0.28.0
+ '@esbuild/linux-arm': 0.28.0
+ '@esbuild/linux-arm64': 0.28.0
+ '@esbuild/linux-ia32': 0.28.0
+ '@esbuild/linux-loong64': 0.28.0
+ '@esbuild/linux-mips64el': 0.28.0
+ '@esbuild/linux-ppc64': 0.28.0
+ '@esbuild/linux-riscv64': 0.28.0
+ '@esbuild/linux-s390x': 0.28.0
+ '@esbuild/linux-x64': 0.28.0
+ '@esbuild/netbsd-arm64': 0.28.0
+ '@esbuild/netbsd-x64': 0.28.0
+ '@esbuild/openbsd-arm64': 0.28.0
+ '@esbuild/openbsd-x64': 0.28.0
+ '@esbuild/openharmony-arm64': 0.28.0
+ '@esbuild/sunos-x64': 0.28.0
+ '@esbuild/win32-arm64': 0.28.0
+ '@esbuild/win32-ia32': 0.28.0
+ '@esbuild/win32-x64': 0.28.0
+
escalade@3.2.0: {}
escape-string-regexp@4.0.0: {}
@@ -6281,6 +6558,12 @@ snapshots:
tslib@2.8.1:
optional: true
+ tsx@4.22.1:
+ dependencies:
+ esbuild: 0.28.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
@@ -6398,7 +6681,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3):
+ vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.4)
@@ -6411,9 +6694,10 @@ snapshots:
fsevents: 2.3.3
jiti: 2.6.1
terser: 5.46.1
+ tsx: 4.22.1
yaml: 2.8.3
- vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3):
+ vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3):
dependencies:
esbuild: 0.27.7
fdir: 6.5.0(picomatch@4.0.4)
@@ -6426,16 +6710,17 @@ snapshots:
fsevents: 2.3.3
jiti: 2.6.1
terser: 5.46.1
+ tsx: 4.22.1
yaml: 2.8.3
- vitefu@1.1.3(vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)):
+ vitefu@1.1.3(vite@7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)):
optionalDependencies:
- vite: 7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
+ vite: 7.3.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
- vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)):
+ vitest@4.1.2(@types/node@25.5.1)(happy-dom@20.8.9)(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)):
dependencies:
'@vitest/expect': 4.1.2
- '@vitest/mocker': 4.1.2(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3))
+ '@vitest/mocker': 4.1.2(vite@6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3))
'@vitest/pretty-format': 4.1.2
'@vitest/runner': 4.1.2
'@vitest/snapshot': 4.1.2
@@ -6452,7 +6737,7 @@ snapshots:
tinyexec: 1.0.4
tinyglobby: 0.2.15
tinyrainbow: 3.1.0
- vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(yaml@2.8.3)
+ vite: 6.4.1(@types/node@25.5.1)(jiti@2.6.1)(terser@5.46.1)(tsx@4.22.1)(yaml@2.8.3)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 25.5.1