From 53e5ce6798a37828d24770e5965f8c6c744803ba Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Wed, 26 Nov 2025 21:43:37 +0800 Subject: [PATCH] feat(vite-plugin-warpdrive): new Vite plugin for uploading large assets to S3 compatible storages --- apps/stage-tamagotchi/electron.vite.config.ts | 11 +- apps/stage-tamagotchi/package.json | 2 +- apps/stage-web/package.json | 3 +- apps/stage-web/vite.config.ts | 55 ++- apps/stage-web/wrangler.toml | 3 - cspell.config.yaml | 1 + packages/stage-ui/package.json | 1 + packages/stage-ui/vite.config.ts | 41 ++ packages/vite-plugin-warpdrive/README.md | 66 +++ packages/vite-plugin-warpdrive/package.json | 40 ++ packages/vite-plugin-warpdrive/src/index.ts | 282 +++++++++++ .../vite-plugin-warpdrive/src/providers/s3.ts | 100 ++++ .../src/providers/types.ts | 12 + packages/vite-plugin-warpdrive/tsconfig.json | 18 + .../vite-plugin-warpdrive/tsdown.config.ts | 9 + pnpm-lock.yaml | 459 +++++++++++++----- 16 files changed, 964 insertions(+), 139 deletions(-) create mode 100644 packages/vite-plugin-warpdrive/README.md create mode 100644 packages/vite-plugin-warpdrive/package.json create mode 100644 packages/vite-plugin-warpdrive/src/index.ts create mode 100644 packages/vite-plugin-warpdrive/src/providers/s3.ts create mode 100644 packages/vite-plugin-warpdrive/src/providers/types.ts create mode 100644 packages/vite-plugin-warpdrive/tsconfig.json create mode 100644 packages/vite-plugin-warpdrive/tsdown.config.ts diff --git a/apps/stage-tamagotchi/electron.vite.config.ts b/apps/stage-tamagotchi/electron.vite.config.ts index 246722613..6218870fd 100644 --- a/apps/stage-tamagotchi/electron.vite.config.ts +++ b/apps/stage-tamagotchi/electron.vite.config.ts @@ -15,6 +15,9 @@ import { DownloadLive2DSDK } from '@proj-airi/unplugin-live2d-sdk' import { templateCompilerOptions } from '@tresjs/core' import { defineConfig, externalizeDepsPlugin } from 'electron-vite' +const stageUIAssetsRoot = resolve(join(import.meta.dirname, '..', '..', 'packages', 'stage-ui', 'src', 'assets')) +const sharedCacheDir = resolve(join(import.meta.dirname, '..', '..', '.cache')) + export default defineConfig({ main: { plugins: [externalizeDepsPlugin()], @@ -130,10 +133,10 @@ export default defineConfig({ }), DownloadLive2DSDK(), - Download('https://dist.ayaka.moe/live2d-models/hiyori_free_zh.zip', 'hiyori_free_zh.zip', 'assets/live2d/models'), - Download('https://dist.ayaka.moe/live2d-models/hiyori_pro_zh.zip', 'hiyori_pro_zh.zip', 'assets/live2d/models'), - Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-A/AvatarSample_A.vrm', 'AvatarSample_A.vrm', 'assets/vrm/models/AvatarSample-A'), - Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-B/AvatarSample_B.vrm', 'AvatarSample_B.vrm', 'assets/vrm/models/AvatarSample-B'), + Download('https://dist.ayaka.moe/live2d-models/hiyori_free_zh.zip', 'hiyori_free_zh.zip', 'live2d/models', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/live2d-models/hiyori_pro_zh.zip', 'hiyori_pro_zh.zip', 'live2d/models', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-A/AvatarSample_A.vrm', 'AvatarSample_A.vrm', 'vrm/models/AvatarSample-A', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-B/AvatarSample_B.vrm', 'AvatarSample_B.vrm', 'vrm/models/AvatarSample-B', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), ], }, }) diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index 24cf83190..1fc5dc3fe 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -135,7 +135,7 @@ "@proj-airi/lobe-icons": "^1.0.14", "@proj-airi/stage-shared": "workspace:^", "@proj-airi/ui-transitions": "workspace:^", - "@proj-airi/unplugin-fetch": "^0.1.7", + "@proj-airi/unplugin-fetch": "^0.2.0", "@proj-airi/unplugin-live2d-sdk": "^0.1.6", "@shikijs/markdown-it": "^3.15.0", "@types/culori": "^4.0.1", diff --git a/apps/stage-web/package.json b/apps/stage-web/package.json index e89158940..2e28e0026 100644 --- a/apps/stage-web/package.json +++ b/apps/stage-web/package.json @@ -105,8 +105,9 @@ "@iconify-json/vscode-icons": "^1.2.34", "@intlify/unplugin-vue-i18n": "^11.0.1", "@proj-airi/lobe-icons": "^1.0.14", - "@proj-airi/unplugin-fetch": "^0.1.7", + "@proj-airi/unplugin-fetch": "^0.2.0", "@proj-airi/unplugin-live2d-sdk": "^0.1.6", + "@proj-airi/vite-plugin-warpdrive": "workspace:*", "@shikijs/markdown-it": "^3.15.0", "@types/audioworklet": "^0.0.91", "@types/culori": "^4.0.1", diff --git a/apps/stage-web/vite.config.ts b/apps/stage-web/vite.config.ts index 93aa52a14..16a27b6cb 100644 --- a/apps/stage-web/vite.config.ts +++ b/apps/stage-web/vite.config.ts @@ -13,11 +13,15 @@ import Layouts from 'vite-plugin-vue-layouts' import { Download } from '@proj-airi/unplugin-fetch/vite' import { DownloadLive2DSDK } from '@proj-airi/unplugin-live2d-sdk/vite' +import { createS3Provider, WarpDrivePlugin } from '@proj-airi/vite-plugin-warpdrive' import { templateCompilerOptions } from '@tresjs/core' import { LFS, SpaceCard } from 'hfup/vite' import { defineConfig } from 'vite' import { VitePWA } from 'vite-plugin-pwa' +const stageUIAssetsRoot = resolve(join(import.meta.dirname, '..', '..', 'packages', 'stage-ui', 'src', 'assets')) +const sharedCacheDir = resolve(join(import.meta.dirname, '..', '..', '.cache')) + export default defineConfig({ optimizeDeps: { exclude: [ @@ -63,6 +67,7 @@ export default defineConfig({ ], }, }, + plugins: [ Info(), @@ -153,10 +158,10 @@ export default defineConfig({ VueDevTools(), DownloadLive2DSDK(), - Download('https://dist.ayaka.moe/live2d-models/hiyori_free_zh.zip', 'hiyori_free_zh.zip', 'assets/live2d/models'), - Download('https://dist.ayaka.moe/live2d-models/hiyori_pro_zh.zip', 'hiyori_pro_zh.zip', 'assets/live2d/models'), - Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-A/AvatarSample_A.vrm', 'AvatarSample_A.vrm', 'assets/vrm/models/AvatarSample-A'), - Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-B/AvatarSample_B.vrm', 'AvatarSample_B.vrm', 'assets/vrm/models/AvatarSample-B'), + Download('https://dist.ayaka.moe/live2d-models/hiyori_free_zh.zip', 'hiyori_free_zh.zip', 'live2d/models', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/live2d-models/hiyori_pro_zh.zip', 'hiyori_pro_zh.zip', 'live2d/models', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-A/AvatarSample_A.vrm', 'AvatarSample_A.vrm', 'vrm/models/AvatarSample-A', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), + Download('https://dist.ayaka.moe/vrm-models/VRoid-Hub/AvatarSample-B/AvatarSample_B.vrm', 'AvatarSample_B.vrm', 'vrm/models/AvatarSample-B', { parentDir: stageUIAssetsRoot, cacheDir: sharedCacheDir }), // HuggingFace Spaces LFS({ root: cwd(), extraGlobs: ['*.vrm', '*.vrma', '*.hdr', '*.cmo3', '*.png', '*.jpg', '*.jpeg', '*.gif', '*.webp', '*.bmp', '*.ttf'] }), @@ -175,5 +180,47 @@ export default defineConfig({ ], short_description: 'AI driven VTuber & Companion, supports Live2D and VRM.', }), + + // For the following example assets: + // + // dist/assets/ort-wasm-simd-threaded.jsep-B0T3yYHD.wasm 21,596.01 kB │ gzip: 5,121.95 kB + // dist/assets/XiaolaiSC-Regular-SNWuh554.ttf 22,183.94 kB + // dist/assets/cjkFonts_allseto_v1.11-ByBdljxl.ttf 31,337.14 kB + // dist/assets/duckdb-coi-CSr8FQO4.wasm 32,320.49 kB │ gzip: 7,194.65 kB + // dist/assets/duckdb-eh-BJOC5S4x.wasm 32,604.02 kB │ gzip: 7,133.37 kB + // dist/assets/duckdb-mvp-8HYqhb4i.wasm 37,345.64 kB │ gzip: 8,099.69 kB + // + // they are too large to be able to put into deployments like Cloudflare Workers or Pages, + // we need to upload them to external storage and use renderBuiltUrl to rewrite their URLs. + ...((!env.S3_ENDPOINT || !env.S3_ACCESS_KEY_ID || !env.S3_SECRET_ACCESS_KEY) + ? [] + : [ + WarpDrivePlugin({ + prefix: 'proj-airi/stage-web/', + include: [/\.wasm$/i, /\.ttf$/i, /\.vrm$/i, /\.zip$/i], // in existing assets, wasm, ttf, vrm files are the largest ones + manifest: true, + contentTypeBy: (filename: string) => { + if (filename.endsWith('.wasm')) { + return 'application/wasm' + } + if (filename.endsWith('.ttf')) { + return 'font/ttf' + } + if (filename.endsWith('.vrm')) { + return 'application/octet-stream' + } + if (filename.endsWith('.zip')) { + return 'application/zip' + } + }, + provider: createS3Provider({ + endpoint: env.S3_ENDPOINT, + accessKeyId: env.S3_ACCESS_KEY_ID, + secretAccessKey: env.S3_SECRET_ACCESS_KEY, + region: env.S3_REGION, + publicBaseUrl: env.WARP_DRIVE_PUBLIC_BASE ?? env.S3_ENDPOINT, + }), + }), + ]), ], }) diff --git a/apps/stage-web/wrangler.toml b/apps/stage-web/wrangler.toml index 7ae497f26..bd1d253ee 100644 --- a/apps/stage-web/wrangler.toml +++ b/apps/stage-web/wrangler.toml @@ -2,9 +2,6 @@ name = "airi" compatibility_date = "2025-04-01" preview_urls = true -[build] -command = "pnpm -F @proj-airi/stage-web run build && pnpm -F @proj-airi/docs run build:base && mv ./docs/.vitepress/dist ./apps/stage-web/dist/docs && cp ./apps/stage-web/dist/docs/sitemap.xml ./apps/stage-web/dist/sitemap.xml && pnpm -F @proj-airi/stage-ui run story:build && mv ./packages/stage-ui/.histoire/dist ./apps/stage-web/dist/ui" - [assets] directory = "./dist" not_found_handling = "single-page-application" diff --git a/cspell.config.yaml b/cspell.config.yaml index aa0cfc05b..89cd5f0be 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -289,6 +289,7 @@ words: - vtuber - vueuse - waapi + - warpdrive - Warudo - wavefile - webgpu diff --git a/packages/stage-ui/package.json b/packages/stage-ui/package.json index 7f6f46376..56ddd87c3 100644 --- a/packages/stage-ui/package.json +++ b/packages/stage-ui/package.json @@ -156,6 +156,7 @@ "@iconify-json/vscode-icons": "^1.2.34", "@moeru/std": "catalog:", "@proj-airi/lobe-icons": "^1.0.14", + "@proj-airi/vite-plugin-warpdrive": "workspace:*", "@types/audioworklet": "^0.0.91", "@types/culori": "^4.0.1", "@types/three": "^0.181.0", diff --git a/packages/stage-ui/vite.config.ts b/packages/stage-ui/vite.config.ts index d35dd73ca..7417b9197 100644 --- a/packages/stage-ui/vite.config.ts +++ b/packages/stage-ui/vite.config.ts @@ -1,12 +1,14 @@ import type { Plugin } from 'vite' import { join, resolve } from 'node:path' +import { env } from 'node:process' import Vue from '@vitejs/plugin-vue' import Unocss from 'unocss/vite' import Yaml from 'unplugin-yaml/vite' import Inspect from 'vite-plugin-inspect' +import { createS3Provider, WarpDrivePlugin } from '@proj-airi/vite-plugin-warpdrive' import { defineConfig } from 'vite' // For Histoire @@ -47,5 +49,44 @@ export default defineConfig({ // TODO: Type wrong for `unplugin-yaml` in Histoire required // Vite version, wait until Histoire updates to support Vite 7 Inspect() as Plugin, + + // For the following example assets: + // + // dist/assets/ort-wasm-simd-threaded.jsep-B0T3yYHD.wasm 21,596.01 kB │ gzip: 5,121.95 kB + // dist/assets/XiaolaiSC-Regular-SNWuh554.ttf 22,183.94 kB + // dist/assets/cjkFonts_allseto_v1.11-ByBdljxl.ttf 31,337.14 kB + // + // they are too large to be able to put into deployments like Cloudflare Workers or Pages, + // we need to upload them to external storage and use renderBuiltUrl to rewrite their URLs. + ...((!env.S3_ENDPOINT || !env.S3_ACCESS_KEY_ID || !env.S3_SECRET_ACCESS_KEY) + ? [] + : [ + WarpDrivePlugin({ + prefix: 'proj-airi/stage-ui/', + include: [/\.wasm$/i, /\.ttf$/i, /\.vrm$/i, /\.zip$/i], // in existing assets, wasm, ttf, vrm files are the largest ones + manifest: true, + contentTypeBy: (filename: string) => { + if (filename.endsWith('.wasm')) { + return 'application/wasm' + } + if (filename.endsWith('.ttf')) { + return 'font/ttf' + } + if (filename.endsWith('.vrm')) { + return 'application/octet-stream' + } + if (filename.endsWith('.zip')) { + return 'application/zip' + } + }, + provider: createS3Provider({ + endpoint: env.S3_ENDPOINT, + accessKeyId: env.S3_ACCESS_KEY_ID, + secretAccessKey: env.S3_SECRET_ACCESS_KEY, + region: env.S3_REGION, + publicBaseUrl: env.WARP_DRIVE_PUBLIC_BASE ?? env.S3_ENDPOINT, + }), + }), + ]), ], }) diff --git a/packages/vite-plugin-warpdrive/README.md b/packages/vite-plugin-warpdrive/README.md new file mode 100644 index 000000000..3e4b6929b --- /dev/null +++ b/packages/vite-plugin-warpdrive/README.md @@ -0,0 +1,66 @@ +# @proj-airi/vite-plugin-warpdrive + +Vite plugin that rewrites selected build assets (large WASM/TTF/VRM, etc.) to remote object storage and uploads them after build. It uses Vite's `renderBuiltUrl` hook so the generated bundles reference the remote URL while keeping the local file for upload. + +## Why + +- Keep HTML/JS bundles lean while serving heavy assets (WASM, fonts, models) from object storage/CDN. +- Simple provider abstraction; ships with an S3-compatible implementation via [`s3mini`](https://github.com/good-lly/s3mini). +- Emits an optional manifest (`remote-assets.manifest.json`) that maps built filenames to remote URLs plus hostId/hostType for debugging. + +## Install + +```bash +pnpm add -D @proj-airi/vite-plugin-warpdrive +``` + +## Usage + +```ts +import { createS3Provider, WarpDrivePlugin } from '@proj-airi/vite-plugin-warpdrive' +// vite.config.ts +import { defineConfig } from 'vite' + +export default defineConfig({ + plugins: [ + WarpDrivePlugin({ + prefix: 'remote-assets', // optional path prefix in the bucket + include: [/\.wasm$/i, /\.ttf$/i, /\.vrm$/i], // which assets to rewrite/upload + // includeBy: (file, ctx) => ctx.hostId?.includes('duckdb'), + // contentType: (file) => file.endsWith('.wasm') ? 'application/wasm' : undefined, + manifest: true, // emit remote-assets.manifest.json in dist + provider: createS3Provider({ + endpoint: process.env.S3_ENDPOINT!, + accessKeyId: process.env.S3_ACCESS_KEY_ID!, + secretAccessKey: process.env.S3_SECRET_ACCESS_KEY!, + region: process.env.S3_REGION, + publicBaseUrl: process.env.WARP_DRIVE_PUBLIC_BASE, // defaults to endpoint + }), + }), + ], +}) +``` + +### Options + +- `prefix`: string path prefix for uploaded keys and URLs (e.g. `remote-assets` -> `remote-assets/assets/foo.wasm`). +- `include`: array of regex or predicate functions to decide which assets to rewrite/upload. +- `includeBy`: optional `(filename, ctx) => boolean` for finer control (ctx has `hostId`, `hostType`). +- `manifest`: when true, emits `remote-assets.manifest.json` describing fileName/key/url/hostId/hostType/size. +- `contentType`: optional `(filename) => string | undefined` resolver passed to the provider upload. +- `logger`: optional logger ({ info, warn, error }) for custom logging sinks. +- `provider`: any object implementing `{ getPublicUrl(key): string; upload(localPath, key, contentType?): Promise }`. + +### createS3Provider + +Light wrapper around `s3mini`. Required fields: + +- `endpoint`: full bucket URL (e.g. `https://s3.example.com/my-bucket`). +- `accessKeyId`, `secretAccessKey`: credentials. +- Optional: `region`, `requestSizeInBytes`, `requestAbortTimeout`, `publicBaseUrl` (override public URL base). + +## How it works + +1. `renderBuiltUrl` returns the remote URL for matching assets while remembering the key/hostId/hostType. +2. In `generateBundle`, local artifacts are uploaded via the provider. +3. Optional manifest is emitted for traceability/debugging. diff --git a/packages/vite-plugin-warpdrive/package.json b/packages/vite-plugin-warpdrive/package.json new file mode 100644 index 000000000..a2227daf9 --- /dev/null +++ b/packages/vite-plugin-warpdrive/package.json @@ -0,0 +1,40 @@ +{ + "name": "@proj-airi/vite-plugin-warpdrive", + "type": "module", + "version": "0.0.0", + "private": true, + "description": "Vite plugin to rewrite and upload heavy build assets to remote object storage", + "author": { + "name": "Moeru AI Project AIRI Team", + "email": "airi@moeru.ai", + "url": "https://github.com/moeru-ai" + }, + "license": "MIT", + "exports": { + ".": { + "types": "./dist/index.d.mts", + "default": "./dist/index.mjs" + } + }, + "main": "./dist/index.mjs", + "types": "./dist/index.d.mts", + "files": [ + "README.md", + "dist", + "package.json" + ], + "scripts": { + "build": "tsdown", + "typecheck": "tsc --noEmit" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0" + }, + "dependencies": { + "rolldown": "1.0.0-beta.51", + "s3mini": "^0.7.0" + }, + "devDependencies": { + "@moeru/std": "catalog:" + } +} diff --git a/packages/vite-plugin-warpdrive/src/index.ts b/packages/vite-plugin-warpdrive/src/index.ts new file mode 100644 index 000000000..12c6388ae --- /dev/null +++ b/packages/vite-plugin-warpdrive/src/index.ts @@ -0,0 +1,282 @@ +import type { OutputAsset } from 'rollup' +import type { Plugin, RenderBuiltAssetUrl, ResolvedConfig } from 'vite' + +import type { UploadProvider } from './providers/types' + +import { Buffer } from 'node:buffer' +import { rm } from 'node:fs/promises' +import { join, resolve } from 'node:path' +import { cwd } from 'node:process' + +export { createS3Provider } from './providers/s3' +export type { S3ProviderOptions } from './providers/s3' +export type { UploadProvider } from './providers/types' + +type IncludeMatcher = RegExp | ((filename: string) => boolean) + +export interface WarpDrivePluginOptions { + provider: UploadProvider + /** + * Prefix to prepend before the asset filename when uploading and when rewriting URLs. + * e.g. `remote-assets` will produce `remote-assets/assets/duckdb-eh-123.wasm`. + */ + prefix?: string + /** + * Restrict which assets are rewritten/uploaded. + */ + include?: IncludeMatcher[] + /** + * Optional extra predicate that receives filename + host info to decide inclusion. + */ + includeBy?: (filename: string, ctx: { hostId?: string, hostType?: string }) => boolean + /** + * Optional content-type resolver. If omitted, uploads use the provider default. + */ + contentTypeBy?: (filename: string) => Promise | string | undefined + /** + * Emit a manifest with module id + URL for debugging. + */ + manifest?: boolean + /** + * Delete the uploaded local asset from disk after upload completes. Enabled by default. + */ + delete?: boolean + /** + * Clean the remote prefix before uploading (delete existing objects). Enabled by default. + */ + clean?: boolean + /** + * When enabled, skip cleaning and uploading; emit manifest/rewrite URLs only. + */ + dryRun?: boolean + /** + * Skip uploading assets that are already present and not modified. Enabled by default when supported. + */ + skipNotModified?: boolean +} + +export function WarpDrivePlugin(options: WarpDrivePluginOptions): Plugin { + const include = options.include ?? [] + const prefix = normalizePrefix(options.prefix ?? 'remote-assets') + const pluginName = 'proj-airi-warpdrive' + const shouldDeleteLocalAsset = options.delete !== false + const shouldCleanRemote = options.clean !== false + const shouldSkipNotModified = options.skipNotModified !== false + const isDryRun = options.dryRun === true + + const tracked = new Map() + const manifest: Array<{ + fileName: string + url: string + key: string + hostId?: string + hostType?: string + size: number + }> = [] + + let resolvedConfig: ResolvedConfig | undefined + let cleanedRemote = false + const pendingUploads: Array<{ + fileName: string + key: string + localPath: string + contentType?: string + }> = [] + + const shouldHandle = (filename: string, ctx: { hostId?: string, hostType?: string }) => { + const includeMatch = include.some((matcher) => { + if (matcher instanceof RegExp) + return matcher.test(filename) + + return matcher(filename) + }) + + if (!includeMatch) + return false + if (options.includeBy) + return options.includeBy(filename, ctx) + + return true + } + + const renderBuiltUrl: RenderBuiltAssetUrl = (filename, ctx) => { + if (!shouldHandle(filename, ctx)) + return + if (!options.provider) + return + + const key = prefix ? `${prefix}/${filename}` : filename + const url = options.provider.getPublicUrl(key) + + tracked.set(filename, { + key, + url, + hostId: ctx.hostId, + hostType: ctx.hostType, + }) + + return url + } + + return { + name: pluginName, + apply: 'build', + enforce: 'post', + config: () => { + return { + experimental: { + renderBuiltUrl, + }, + } + }, + configResolved(config) { + resolvedConfig = config + }, + async generateBundle(_, bundle) { + if (!resolvedConfig) { + console.warn?.(`[${pluginName}] Vite config not resolved, skipping upload step`) + return + } + if (!options.provider) { + resolvedConfig.logger?.warn?.(`[${pluginName}] no upload provider configured, skipping upload step`) + return + } + + const root = resolvedConfig.root || cwd() + const outDir = resolve(root, resolvedConfig.build.outDir) + + for (const [fileName, output] of Object.entries(bundle)) { + if (output.type !== 'asset') + continue + + const trackedMeta = tracked.get(fileName) + if (!trackedMeta) + continue + + const key = trackedMeta.key + const url = trackedMeta.url + const localPath = join(outDir, fileName) + const size = getAssetSize(output) + const contentType = await options.contentTypeBy?.(fileName) + + manifest.push({ + fileName, + url, + key, + hostId: trackedMeta.hostId, + hostType: trackedMeta.hostType, + size, + }) + + pendingUploads.push({ fileName, key, localPath, contentType }) + resolvedConfig.logger.info(`[${pluginName}] scheduled uploading: ${fileName} -> ${key} (${size} bytes)`) + } + + if (options.manifest && manifest.length) { + this.emitFile({ + type: 'asset', + fileName: 'remote-assets.manifest.json', + source: JSON.stringify({ assets: manifest }, null, 2), + }) + } + }, + async closeBundle() { + if (!resolvedConfig) { + console.warn?.(`[${pluginName}] Vite config not resolved, skipping upload step`) + return + } + if (!options.provider) { + resolvedConfig.logger?.warn?.(`[${pluginName}] no upload provider configured, skipping upload step`) + return + } + if (!pendingUploads.length) + return + if (isDryRun) { + resolvedConfig.logger.info?.( + `[${pluginName}] dry run enabled; skipping clean/upload for ${pendingUploads.length} assets`, + ) + return + } + + if (shouldCleanRemote && !cleanedRemote) { + if (!prefix) { + resolvedConfig.logger?.warn?.(`[${pluginName}] skipping clean step because no prefix provided`) + } + else if (typeof options.provider.cleanPrefix === 'function') { + resolvedConfig.logger.info?.(`[${pluginName}] cleaning remote prefix: ${prefix}`) + await options.provider.cleanPrefix(prefix) + resolvedConfig.logger.info?.(`[${pluginName}] cleaned remote prefix: ${prefix}`) + cleanedRemote = true + } + else { + resolvedConfig.logger?.warn?.( + `[${pluginName}] clean is enabled but provider does not support prefix cleaning; skipping`, + ) + } + } + + resolvedConfig.logger.info(`[${pluginName}] uploading ${pendingUploads.length} assets to remote storage...`) + const uploads: Array> = [] + + for (const { fileName, key, localPath, contentType } of pendingUploads) { + uploads.push((async () => { + if (shouldSkipNotModified && typeof options.provider.shouldSkipUpload === 'function') { + try { + const skip = await options.provider.shouldSkipUpload(localPath, key) + if (skip) { + resolvedConfig.logger.info?.( + `[${pluginName}] skipped upload (not modified): ${fileName} -> ${key}`, + ) + if (shouldDeleteLocalAsset) { + try { + await rm(localPath, { force: true }) + resolvedConfig.logger.info(`[${pluginName}] deleted local asset: ${fileName}`) + } + catch (error) { + resolvedConfig.logger.warn?.(`[${pluginName}] failed to delete local asset ${fileName}: ${error}`) + } + } + return + } + } + catch (error) { + resolvedConfig.logger.warn?.( + `[${pluginName}] could not determine if upload should be skipped for ${fileName}: ${error}`, + ) + } + } + try { + await options.provider.upload(localPath, key, contentType) + } + catch (error) { + resolvedConfig.logger.error(`[${pluginName}] upload failed, file: ${fileName} -> ${key}: ${error}`, { error }) + throw error + } + + if (shouldDeleteLocalAsset) { + try { + await rm(localPath, { force: true }) + resolvedConfig.logger.info(`[${pluginName}] deleted local asset: ${fileName}`) + } + catch (error) { + resolvedConfig.logger.warn?.(`[${pluginName}] failed to delete local asset ${fileName}: ${error}`) + } + } + })()) + } + + await Promise.all(uploads) + resolvedConfig.logger.info(`[${pluginName}] upload complete`) + }, + } +} + +function normalizePrefix(prefix: string) { + return prefix.replace(/^\/*/, '').replace(/\/*$/, '') +} + +function getAssetSize(asset: OutputAsset) { + if (typeof asset.source === 'string') + return Buffer.byteLength(asset.source) + return asset.source?.byteLength ?? 0 +} diff --git a/packages/vite-plugin-warpdrive/src/providers/s3.ts b/packages/vite-plugin-warpdrive/src/providers/s3.ts new file mode 100644 index 000000000..5ea173f79 --- /dev/null +++ b/packages/vite-plugin-warpdrive/src/providers/s3.ts @@ -0,0 +1,100 @@ +import { createHash } from 'node:crypto' +import { readFile } from 'node:fs/promises' +import { join } from 'node:path' + +import { S3mini } from 's3mini' + +import type { UploadProvider } from './types' + +export interface S3ProviderOptions { + endpoint: string + accessKeyId: string + secretAccessKey: string + region?: string + requestSizeInBytes?: number + requestAbortTimeout?: number + /** + * Skip uploading when the remote object ETag matches the local content hash (MD5). Enabled by default. + */ + skipNotModified?: boolean + /** + * Public base URL used in rewritten assets. Defaults to endpoint. + */ + publicBaseUrl?: string +} + +export function createS3Provider(options: S3ProviderOptions): UploadProvider { + const client = new S3mini({ + accessKeyId: options.accessKeyId, + secretAccessKey: options.secretAccessKey, + endpoint: options.endpoint, + region: options.region ?? 'auto', + requestAbortTimeout: options.requestAbortTimeout, + requestSizeInBytes: options.requestSizeInBytes, + }) + + const publicBaseUrl = options.publicBaseUrl ?? options.endpoint + const skipNotModified = options.skipNotModified !== false + + return { + async upload(localPath: string, key: string, contentType?: string) { + const data = await readFile(localPath) + await client.putObject(normalizeKey(key), data, contentType ?? 'application/octet-stream') + }, + async cleanPrefix(prefix: string) { + const normalizedPrefix = normalizePrefix(prefix) + if (!normalizedPrefix) + return + const objects = await client.listObjects('/', `${normalizedPrefix}/`) + if (!objects?.length) + return + + const keys = objects.map(obj => obj.Key) + await client.deleteObjects(keys) + }, + async shouldSkipUpload(localPath: string, key: string) { + if (!skipNotModified) + return false + + const data = await readFile(localPath) + return isMd5HashMatched(client, key, data) + }, + getPublicUrl(key: string) { + return joinUrl(publicBaseUrl, key) + }, + } +} + +async function isMd5HashMatched(client: S3mini, key: string, data: Buffer) { + try { + const etag = await client.getEtag(normalizeKey(key)) + if (!etag) + return false + + const normalizedEtag = sanitizeEtag(etag) + if (!normalizedEtag || normalizedEtag.includes('-')) + return false + + const localHash = createHash('md5').update(data).digest('hex') + return normalizedEtag.toLowerCase() === localHash.toLowerCase() + } + catch { + return false + } +} + +function normalizePrefix(prefix: string) { + return prefix.replace(/^\/*/, '').replace(/\/*$/, '') +} + +function normalizeKey(key: string) { + return key.replace(/^\/*/, '') +} + +function joinUrl(base: string, path: string) { + return `${base.replace(/\/+$/, '')}/${path.replace(/^\/+/, '')}` +} + +function sanitizeEtag(etag: string) { + return etag.replace(/^"+|"+$/g, '') +} diff --git a/packages/vite-plugin-warpdrive/src/providers/types.ts b/packages/vite-plugin-warpdrive/src/providers/types.ts new file mode 100644 index 000000000..3fd43b01a --- /dev/null +++ b/packages/vite-plugin-warpdrive/src/providers/types.ts @@ -0,0 +1,12 @@ +export interface UploadProvider { + getPublicUrl: (key: string) => string + upload: (localPath: string, key: string, contentType?: string) => Promise + /** + * Optionally clean a remote prefix before uploading new assets. + */ + cleanPrefix?: (prefix: string) => Promise + /** + * Optionally determine if an upload can be skipped (e.g., hash/etag match). + */ + shouldSkipUpload?: (localPath: string, key: string) => Promise +} diff --git a/packages/vite-plugin-warpdrive/tsconfig.json b/packages/vite-plugin-warpdrive/tsconfig.json new file mode 100644 index 000000000..00dcfd807 --- /dev/null +++ b/packages/vite-plugin-warpdrive/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": [ + "ESNext" + ], + "module": "ESNext", + "moduleResolution": "bundler", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "skipLibCheck": true + }, + "include": [ + "src/**/*.ts" + ] +} diff --git a/packages/vite-plugin-warpdrive/tsdown.config.ts b/packages/vite-plugin-warpdrive/tsdown.config.ts new file mode 100644 index 000000000..ef150f707 --- /dev/null +++ b/packages/vite-plugin-warpdrive/tsdown.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + entry: [ + './src/index.ts', + ], + dts: true, + sourcemap: true, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1fed4fc3..f2979fe5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -571,8 +571,8 @@ importers: specifier: workspace:^ version: link:../../packages/ui-transitions '@proj-airi/unplugin-fetch': - specifier: ^0.1.7 - version: 0.1.7(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^0.2.0 + version: 0.2.0(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@proj-airi/unplugin-live2d-sdk': specifier: ^0.1.6 version: 0.1.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) @@ -872,7 +872,7 @@ importers: version: 4.6.3(vue@3.5.24(typescript@5.9.3)) vue-sonner: specifier: ^2.0.9 - version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) + version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) workbox-window: specifier: ^7.3.0 version: 7.3.0 @@ -920,11 +920,14 @@ importers: specifier: ^1.0.14 version: 1.0.14 '@proj-airi/unplugin-fetch': - specifier: ^0.1.7 - version: 0.1.7(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + specifier: ^0.2.0 + version: 0.2.0(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) '@proj-airi/unplugin-live2d-sdk': specifier: ^0.1.6 version: 0.1.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + '@proj-airi/vite-plugin-warpdrive': + specifier: workspace:* + version: link:../../packages/vite-plugin-warpdrive '@shikijs/markdown-it': specifier: ^3.15.0 version: 3.15.0 @@ -969,13 +972,13 @@ importers: version: 1.2.4(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rollup@2.79.2) unplugin-vue-macros: specifier: ^2.14.5 - version: 2.14.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)) + version: 2.14.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)) unplugin-vue-router: specifier: ^0.17.0 version: 0.17.0(@vue/compiler-sfc@3.5.24)(typescript@5.9.3)(vue-router@4.6.3(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) unplugin-yaml: specifier: ^3.0.7 - version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2) + version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2) vite: specifier: catalog:rolldown-vite version: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) @@ -1053,7 +1056,7 @@ importers: version: 11.1.12(vue@3.5.24(typescript@5.9.3)) vue-sonner: specifier: ^2.0.9 - version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) + version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) devDependencies: '@iconify-json/lucide': specifier: ^1.2.73 @@ -1132,7 +1135,7 @@ importers: version: 0.1.3 unplugin-yaml: specifier: ^3.0.7 - version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vitepress: specifier: ^2.0.0-alpha.13 version: 2.0.0-alpha.13(@types/node@24.10.1)(change-case@5.4.4)(fuse.js@7.1.0)(jiti@2.6.1)(jwt-decode@4.0.0)(less@4.4.2)(lightningcss@1.30.2)(nprogress@0.2.0)(oxc-minify@0.80.0)(postcss@8.5.6)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) @@ -1588,7 +1591,7 @@ importers: version: 4.6.3(vue@3.5.24(typescript@5.9.3)) vue-sonner: specifier: ^2.0.9 - version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) + version: 2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)) vue-tsc: specifier: ^3.1.4 version: 3.1.4(typescript@5.9.3) @@ -1665,6 +1668,9 @@ importers: '@proj-airi/lobe-icons': specifier: ^1.0.14 version: 1.0.14 + '@proj-airi/vite-plugin-warpdrive': + specifier: workspace:* + version: link:../vite-plugin-warpdrive '@types/audioworklet': specifier: ^0.0.91 version: 0.0.91 @@ -1697,7 +1703,7 @@ importers: version: 1.2.4(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(esbuild@0.25.9)(rollup@4.53.2)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) unplugin-yaml: specifier: ^3.0.7 - version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) vite: specifier: ^6.4.1 version: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) @@ -1827,7 +1833,7 @@ importers: version: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-vue-devtools: specifier: ^8.0.3 - version: 8.0.3(@nuxt/kit@4.0.3(magicast@0.3.5))(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) + version: 8.0.3(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) vue-router: specifier: ^4.6.3 version: 4.6.3(vue@3.5.24(typescript@5.9.3)) @@ -1861,7 +1867,7 @@ importers: version: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-vue-devtools: specifier: ^8.0.3 - version: 8.0.3(@nuxt/kit@4.0.3(magicast@0.3.5))(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) + version: 8.0.3(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) vue-router: specifier: ^4.6.3 version: 4.6.3(vue@3.5.24(typescript@5.9.3)) @@ -1887,6 +1893,22 @@ importers: specifier: '>=66' version: 66.5.6 + packages/vite-plugin-warpdrive: + dependencies: + rolldown: + specifier: 1.0.0-beta.51 + version: 1.0.0-beta.51 + s3mini: + specifier: ^0.7.0 + version: 0.7.0 + vite: + specifier: ^5.0.0 || ^6.0.0 + version: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + devDependencies: + '@moeru/std': + specifier: 'catalog:' + version: 0.1.0-beta.13 + plugins/airi-plugin-claude-code: dependencies: '@guiiai/logg': @@ -5505,6 +5527,9 @@ packages: '@oxc-project/types@0.97.0': resolution: {integrity: sha512-lxmZK4xFrdvU0yZiDwgVQTCvh2gHWBJCBk5ALsrtsBWhs0uDIi+FTOnXRQeQfs304imdvTdaakT/lqwQ8hkOXQ==} + '@oxc-project/types@0.98.0': + resolution: {integrity: sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==} + '@oxc-resolver/binding-darwin-arm64@4.2.0': resolution: {integrity: sha512-DP+KY4nXRJvL5XayKda0P7NCjcP1zZ5x6RZznMM/bMPCBrjcYNG4XKV9v/EbkSq3Et24mEJFYOM55WmPxtqf0w==} cpu: [arm64] @@ -6219,8 +6244,10 @@ packages: '@proj-airi/unocss-preset-chromatic@1.0.2': resolution: {integrity: sha512-qotJTmQcP58ZECsdgzP9nQPWpkLA7PB2qcamkDtjNkLNt0hr9MZMQteTt7bLvSYCTcMVOmJznoOBlTc0P1vi6Q==} - '@proj-airi/unplugin-fetch@0.1.7': - resolution: {integrity: sha512-hov3cEfFSTcq6nsGH6TZiPAt0LD/hFQ1KRiiVJNZ+YJNR6k+E6kZiy7y4TFGJBvUnPXQUfttQcYIeZdGYKePXA==} + '@proj-airi/unplugin-fetch@0.2.0': + resolution: {integrity: sha512-Y6uSShPcNfjKezK4TAGIUD7z8eW8MAMfUoXrZgaBu+zz3DhoeBup9vLPrkNv812N7hsJH/huNGF8yGaiHGt+/Q==} + peerDependencies: + vite: '>= 7' '@proj-airi/unplugin-live2d-sdk@0.1.6': resolution: {integrity: sha512-0rTQVPErYWjx6T1dCrUZRoawd9YgQkosVVF97CLmtWm40CqRAr+N4Ro1FJg/M/mnhACftVpyXNUJR2CxbVQRKQ==} @@ -6282,89 +6309,175 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.50': resolution: {integrity: sha512-+JRqKJhoFlt5r9q+DecAGPLZ5PxeLva+wCMtAuoFMWPoZzgcYrr599KQ+Ix0jwll4B4HGP43avu9My8KtSOR+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.50': resolution: {integrity: sha512-fFXDjXnuX7/gQZQm/1FoivVtRcyAzdjSik7Eo+9iwPQ9EgtA5/nB2+jmbzaKtMGG3q+BnZbdKHCtOacmNrkIDA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + resolution: {integrity: sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.50': resolution: {integrity: sha512-F1b6vARy49tjmT/hbloplzgJS7GIvwWZqt+tAHEstCh0JIh9sa8FAMVqEmYxDviqKBaAI8iVvUREm/Kh/PD26Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + resolution: {integrity: sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50': resolution: {integrity: sha512-U6cR76N8T8M6lHj7EZrQ3xunLPxSvYYxA8vJsBKZiFZkT8YV4kjgCO3KwMJL0NOjQCPGKyiXO07U+KmJzdPGRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + resolution: {integrity: sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50': resolution: {integrity: sha512-ONgyjofCrrE3bnh5GZb8EINSFyR/hmwTzZ7oVuyUB170lboza1VMCnb8jgE6MsyyRgHYmN8Lb59i3NKGrxrYjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.50': resolution: {integrity: sha512-L0zRdH2oDPkmB+wvuTl+dJbXCsx62SkqcEqdM+79LOcB+PxbAxxjzHU14BuZIQdXcAVDzfpMfaHWzZuwhhBTcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.50': resolution: {integrity: sha512-gyoI8o/TGpQd3OzkJnh1M2kxy1Bisg8qJ5Gci0sXm9yLFzEXIFdtc4EAzepxGvrT2ri99ar5rdsmNG0zP0SbIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.50': resolution: {integrity: sha512-zti8A7M+xFDpKlghpcCAzyOi+e5nfUl3QhU023ce5NCgUxRG5zGP2GR9LTydQ1rnIPwZUVBWd4o7NjZDaQxaXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.50': resolution: {integrity: sha512-eZUssog7qljrrRU9Mi0eqYEPm3Ch0UwB+qlWPMKSUXHNqhm3TvDZarJQdTevGEfu3EHAXJvBIe0YFYr0TPVaMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.50': resolution: {integrity: sha512-nmCN0nIdeUnmgeDXiQ+2HU6FT162o+rxnF7WMkBm4M5Ds8qTU7Dzv2Wrf22bo4ftnlrb2hKK6FSwAJSAe2FWLg==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + resolution: {integrity: sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50': resolution: {integrity: sha512-7kcNLi7Ua59JTTLvbe1dYb028QEPaJPJQHqkmSZ5q3tJueUeb6yjRtx8mw4uIqgWZcnQHAR3PrLN4XRJxvgIkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50': resolution: {integrity: sha512-lL70VTNvSCdSZkDPPVMwWn/M2yQiYvSoXw9hTLgdIWdUfC3g72UaruezusR6ceRuwHCY1Ayu2LtKqXkBO5LIwg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.50': resolution: {integrity: sha512-4qU4x5DXWB4JPjyTne/wBNPqkbQU8J45bl21geERBKtEittleonioACBL1R0PsBu0Aq21SwMK5a9zdBkWSlQtQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} '@rolldown/pluginutils@1.0.0-beta.50': resolution: {integrity: sha512-5e76wQiQVeL1ICOZVUg4LSOVYg9jyhGCin+icYozhsUzM+fHE7kddi1bdiE0jwVqTfkjba3jUFbEkoC9WkdvyA==} + '@rolldown/pluginutils@1.0.0-beta.51': + resolution: {integrity: sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -13975,6 +14088,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-beta.51: + resolution: {integrity: sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-visualizer@5.11.0: resolution: {integrity: sha512-exM0Ms2SN3AgTzMeW7y46neZQcyLY7eKwWAop1ZoRTCZwyrIRdMMJ6JjToAJbML77X/9N8ZEpmXG4Z/Clb9k8g==} engines: {node: '>=14'} @@ -14031,6 +14149,10 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + s3mini@0.7.0: + resolution: {integrity: sha512-f0oNjWm1gMkv0iF/ad11x69n3S/F3sdFlSRTy/AnQKrhayoVGBYQ30uSP7X/yIyhptqIvT38CaEgKUqZGxNAig==} + engines: {node: '>=20'} + sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} @@ -19466,7 +19588,7 @@ snapshots: - magicast optional: true - '@nuxt/vite-builder@4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1)': + '@nuxt/vite-builder@4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1)': dependencies: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@2.79.2) @@ -19489,7 +19611,7 @@ snapshots: pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.50)(rollup@2.79.2) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.51)(rollup@2.79.2) std-env: 3.10.0 ufo: 1.6.1 unenv: 2.0.0-rc.19 @@ -19524,7 +19646,7 @@ snapshots: - yaml optional: true - '@nuxt/vite-builder@4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1)': + '@nuxt/vite-builder@4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1)': dependencies: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.53.2) @@ -19547,7 +19669,7 @@ snapshots: pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.50)(rollup@4.53.2) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.51)(rollup@4.53.2) std-env: 3.10.0 ufo: 1.6.1 unenv: 2.0.0-rc.19 @@ -20368,6 +20490,8 @@ snapshots: '@oxc-project/types@0.97.0': {} + '@oxc-project/types@0.98.0': {} + '@oxc-resolver/binding-darwin-arm64@4.2.0': optional: true @@ -20963,22 +21087,10 @@ snapshots: '@proj-airi/unocss-preset-chromatic@1.0.2': {} - '@proj-airi/unplugin-fetch@0.1.7(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)': + '@proj-airi/unplugin-fetch@0.2.0(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: ofetch: 1.5.1 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml + vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) '@proj-airi/unplugin-live2d-sdk@0.1.6(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)': dependencies: @@ -21053,51 +21165,97 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.50': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.51': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.50': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.50': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.50': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.50': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.50': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.50': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.50': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.50': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.50': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.50': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.50': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.50': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.50': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + optional: true + '@rolldown/pluginutils@1.0.0-beta.29': {} '@rolldown/pluginutils@1.0.0-beta.50': {} + '@rolldown/pluginutils@1.0.0-beta.51': {} + '@rollup/plugin-alias@5.1.1(rollup@4.53.2)': optionalDependencies: rollup: 4.53.2 @@ -22355,7 +22513,7 @@ snapshots: '@babel/core': 7.28.3 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) - '@rolldown/pluginutils': 1.0.0-beta.50 + '@rolldown/pluginutils': 1.0.0-beta.51 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.3) vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) vue: 3.5.24(typescript@5.9.3) @@ -28931,7 +29089,7 @@ snapshots: next-tick@1.1.0: {} - nitropack@2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.50)(xml2js@0.6.2): + nitropack@2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.51)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.10(encoding@0.1.13)(rollup@4.53.2) @@ -28985,7 +29143,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.53.2 - rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.50)(rollup@4.53.2) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.51)(rollup@4.53.2) scule: 1.3.0 semver: 7.7.3 serve-placeholder: 2.0.2 @@ -29204,7 +29362,7 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): + nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 @@ -29212,7 +29370,7 @@ snapshots: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) + '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) '@unhead/vue': 2.0.14(vue@3.5.24(typescript@5.9.3)) '@vue/shared': 3.5.24 c12: 3.3.0(magicast@0.3.5) @@ -29239,7 +29397,7 @@ snapshots: mlly: 1.8.0 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.50)(xml2js@0.6.2) + nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.51)(xml2js@0.6.2) nypm: 0.6.1 ofetch: 1.5.1 ohash: 2.0.11 @@ -29329,7 +29487,7 @@ snapshots: - yaml optional: true - nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): + nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 @@ -29337,7 +29495,7 @@ snapshots: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) + '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) '@unhead/vue': 2.0.14(vue@3.5.24(typescript@5.9.3)) '@vue/shared': 3.5.24 c12: 3.3.0(magicast@0.3.5) @@ -29364,7 +29522,7 @@ snapshots: mlly: 1.8.0 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.50)(xml2js@0.6.2) + nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.51)(xml2js@0.6.2) nypm: 0.6.1 ofetch: 1.5.1 ohash: 2.0.11 @@ -29454,7 +29612,7 @@ snapshots: - yaml optional: true - nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): + nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 @@ -29462,7 +29620,7 @@ snapshots: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) + '@nuxt/vite-builder': 4.0.3(@types/node@24.10.1)(eslint@9.39.1(jiti@2.6.1))(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3))(yaml@2.8.1) '@unhead/vue': 2.0.14(vue@3.5.24(typescript@5.9.3)) '@vue/shared': 3.5.24 c12: 3.3.0(magicast@0.3.5) @@ -29489,7 +29647,7 @@ snapshots: mlly: 1.8.0 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.50)(xml2js@0.6.2) + nitropack: 2.12.4(@netlify/blobs@9.1.2)(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(rolldown@1.0.0-beta.51)(xml2js@0.6.2) nypm: 0.6.1 ofetch: 1.5.1 ohash: 2.0.11 @@ -31413,6 +31571,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.50 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.50 + rolldown@1.0.0-beta.51: + dependencies: + '@oxc-project/types': 0.98.0 + '@rolldown/pluginutils': 1.0.0-beta.51 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-x64': 1.0.0-beta.51 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.51 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.51 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.51 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.51 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.51 + rollup-plugin-visualizer@5.11.0(rollup@2.79.2): dependencies: open: 8.4.2 @@ -31431,25 +31609,25 @@ snapshots: optionalDependencies: rollup: 4.53.2 - rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.50)(rollup@2.79.2): + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.51)(rollup@2.79.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-beta.50 + rolldown: 1.0.0-beta.51 rollup: 2.79.2 optional: true - rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.50)(rollup@4.53.2): + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.51)(rollup@4.53.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-beta.50 + rolldown: 1.0.0-beta.51 rollup: 4.53.2 optional: true @@ -31510,6 +31688,8 @@ snapshots: tslib: 2.8.1 optional: true + s3mini@0.7.0: {} + sade@1.8.1: dependencies: mri: 1.2.0 @@ -32841,14 +33021,6 @@ snapshots: unpipe@1.0.0: {} - unplugin-combine@1.2.1(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(unplugin@1.16.1): - optionalDependencies: - esbuild: 0.25.9 - rolldown: 1.0.0-beta.50 - rollup: 2.79.2 - unplugin: 1.16.1 - vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - unplugin-combine@1.2.1(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@4.53.2)(unplugin@1.16.1): optionalDependencies: esbuild: 0.25.9 @@ -32857,6 +33029,14 @@ snapshots: unplugin: 1.16.1 vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + unplugin-combine@1.2.1(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(unplugin@1.16.1): + optionalDependencies: + esbuild: 0.25.9 + rolldown: 1.0.0-beta.51 + rollup: 2.79.2 + unplugin: 1.16.1 + vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + unplugin-info@1.2.4(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rollup@2.79.2): dependencies: ci-info: 4.3.1 @@ -32940,52 +33120,6 @@ snapshots: transitivePeerDependencies: - vue - unplugin-vue-macros@2.14.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)): - dependencies: - '@vue-macros/better-define': 1.11.4(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/boolean-prop': 0.5.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/chain-call': 0.4.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/common': 1.16.1(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/config': 0.6.1(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-emit': 0.5.4(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-models': 1.3.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-prop': 0.6.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-props': 4.0.6(@vue-macros/reactivity-transform@1.1.6(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-props-refs': 1.3.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-render': 1.6.6(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-slots': 1.2.6(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/define-stylex': 0.2.3(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/devtools': 0.4.1(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(typescript@5.9.3) - '@vue-macros/export-expose': 0.3.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/export-props': 0.6.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/export-render': 0.3.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/hoist-static': 1.7.0(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/jsx-directive': 0.10.6(typescript@5.9.3) - '@vue-macros/named-template': 0.5.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/reactivity-transform': 1.1.6(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/script-lang': 0.2.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/setup-block': 0.4.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/setup-component': 0.18.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/setup-sfc': 0.18.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/short-bind': 1.1.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/short-emits': 1.6.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/short-vmodel': 1.5.5(vue@3.5.24(typescript@5.9.3)) - '@vue-macros/volar': 0.30.15(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)) - unplugin: 1.16.1 - unplugin-combine: 1.2.1(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(unplugin@1.16.1) - unplugin-vue-define-options: 1.5.5(vue@3.5.24(typescript@5.9.3)) - vue: 3.5.24(typescript@5.9.3) - transitivePeerDependencies: - - '@rspack/core' - - '@vueuse/core' - - esbuild - - rolldown - - rollup - - typescript - - vite - - vue-tsc - - webpack - unplugin-vue-macros@2.14.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@4.53.2)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)): dependencies: '@vue-macros/better-define': 1.11.4(vue@3.5.24(typescript@5.9.3)) @@ -33032,6 +33166,52 @@ snapshots: - vue-tsc - webpack + unplugin-vue-macros@2.14.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)): + dependencies: + '@vue-macros/better-define': 1.11.4(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/boolean-prop': 0.5.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/chain-call': 0.4.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/common': 1.16.1(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/config': 0.6.1(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-emit': 0.5.4(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-models': 1.3.5(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-prop': 0.6.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-props': 4.0.6(@vue-macros/reactivity-transform@1.1.6(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-props-refs': 1.3.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-render': 1.6.6(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-slots': 1.2.6(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/define-stylex': 0.2.3(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/devtools': 0.4.1(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(typescript@5.9.3) + '@vue-macros/export-expose': 0.3.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/export-props': 0.6.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/export-render': 0.3.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/hoist-static': 1.7.0(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/jsx-directive': 0.10.6(typescript@5.9.3) + '@vue-macros/named-template': 0.5.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/reactivity-transform': 1.1.6(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/script-lang': 0.2.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/setup-block': 0.4.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/setup-component': 0.18.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/setup-sfc': 0.18.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/short-bind': 1.1.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/short-emits': 1.6.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/short-vmodel': 1.5.5(vue@3.5.24(typescript@5.9.3)) + '@vue-macros/volar': 0.30.15(typescript@5.9.3)(vue-tsc@3.1.4(typescript@5.9.3))(vue@3.5.24(typescript@5.9.3)) + unplugin: 1.16.1 + unplugin-combine: 1.2.1(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(unplugin@1.16.1) + unplugin-vue-define-options: 1.5.5(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + transitivePeerDependencies: + - '@rspack/core' + - '@vueuse/core' + - esbuild + - rolldown + - rollup + - typescript + - vite + - vue-tsc + - webpack + unplugin-vue-router@0.15.0(@vue/compiler-sfc@3.5.24)(typescript@5.9.3)(vue-router@4.6.3(vue@3.5.24(typescript@5.9.3)))(vue@3.5.24(typescript@5.9.3)): dependencies: '@vue-macros/common': 3.0.0-beta.16(vue@3.5.24(typescript@5.9.3)) @@ -33107,7 +33287,7 @@ snapshots: - tsx - yaml - unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2): + unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2): dependencies: '@rollup/pluginutils': 5.3.0(rollup@2.79.2) unplugin: 2.3.10 @@ -33117,7 +33297,7 @@ snapshots: '@nuxt/schema': 4.0.3 astro: 5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) esbuild: 0.25.9 - rolldown: 1.0.0-beta.50 + rolldown: 1.0.0-beta.51 rollup: 2.79.2 vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) @@ -33135,20 +33315,6 @@ snapshots: rollup: 4.53.2 vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): - dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.2) - unplugin: 2.3.10 - yaml: 2.8.1 - optionalDependencies: - '@nuxt/kit': 4.0.3(magicast@0.3.5) - '@nuxt/schema': 4.0.3 - astro: 5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) - esbuild: 0.25.9 - rolldown: 1.0.0-beta.50 - rollup: 4.53.2 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) - unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.53.2) @@ -33163,6 +33329,34 @@ snapshots: rollup: 4.53.2 vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + unplugin: 2.3.10 + yaml: 2.8.1 + optionalDependencies: + '@nuxt/kit': 4.0.3(magicast@0.3.5) + '@nuxt/schema': 4.0.3 + astro: 5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + esbuild: 0.25.9 + rolldown: 1.0.0-beta.51 + rollup: 4.53.2 + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + + unplugin-yaml@3.0.7(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(astro@5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1))(esbuild@0.25.9)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.53.2) + unplugin: 2.3.10 + yaml: 2.8.1 + optionalDependencies: + '@nuxt/kit': 4.0.3(magicast@0.3.5) + '@nuxt/schema': 4.0.3 + astro: 5.10.1(@netlify/blobs@9.1.2)(@types/node@24.10.1)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(encoding@0.1.13)(ioredis@5.7.0)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1) + esbuild: 0.25.9 + rolldown: 1.0.0-beta.51 + rollup: 4.53.2 + vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + unplugin@1.16.1: dependencies: acorn: 8.15.0 @@ -33481,7 +33675,6 @@ snapshots: '@nuxt/kit': 3.18.1(magicast@0.3.5) transitivePeerDependencies: - supports-color - optional: true vite-plugin-inspect@11.3.3(@nuxt/kit@3.18.1(magicast@0.3.5))(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: @@ -33560,6 +33753,20 @@ snapshots: - supports-color - vue + vite-plugin-vue-devtools@8.0.3(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)): + dependencies: + '@vue/devtools-core': 8.0.3(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.24(typescript@5.9.3)) + '@vue/devtools-kit': 8.0.3 + '@vue/devtools-shared': 8.0.3 + sirv: 3.0.2 + vite: rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(@nuxt/kit@3.18.1(magicast@0.3.5))(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + vite-plugin-vue-inspector: 5.3.2(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)) + transitivePeerDependencies: + - '@nuxt/kit' + - supports-color + - vue + vite-plugin-vue-inspector@5.3.2(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@babel/core': 7.28.3 @@ -33803,23 +34010,23 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.24(typescript@5.9.3) - vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): + vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): optionalDependencies: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 - nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.50)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) + nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown-vite@7.2.5(@types/node@24.10.1)(esbuild@0.25.9)(jiti@2.6.1)(less@4.4.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(rolldown@1.0.0-beta.51)(rollup@2.79.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) - vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): + vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): optionalDependencies: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 - nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) + nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) - vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): + vue-sonner@2.0.9(@nuxt/kit@4.0.3(magicast@0.3.5))(@nuxt/schema@4.0.3)(nuxt@4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1)): optionalDependencies: '@nuxt/kit': 4.0.3(magicast@0.3.5) '@nuxt/schema': 4.0.3 - nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.50)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) + nuxt: 4.0.3(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.0)(@types/node@24.10.1)(@vue/compiler-sfc@3.5.24)(bufferutil@4.0.9)(db0@0.3.2(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7)))(drizzle-orm@0.44.7(@opentelemetry/api@1.9.0)(@types/pg@8.15.6)(gel@2.0.0)(pg@8.16.3)(postgres@3.4.7))(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.4.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.51)(rollup@4.53.2)(terser@5.43.1)(tsx@4.20.6)(typescript@5.9.3)(utf-8-validate@5.0.10)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.4.2)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.6)(yaml@2.8.1))(vue-tsc@3.1.4(typescript@5.9.3))(xml2js@0.6.2)(yaml@2.8.1) vue-tsc@3.1.4(typescript@5.9.3): dependencies: