diff --git a/.github/workflows/napi_build.yaml b/.github/workflows/napi_build.yaml new file mode 100644 index 0000000..0efbc28 --- /dev/null +++ b/.github/workflows/napi_build.yaml @@ -0,0 +1,231 @@ +name: Build N-API + +env: + DEBUG: napi:* + APP_NAME: bilicli-napi + APP_DIR: packages/bilicli-napi + +on: + workflow_dispatch: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + if: '!contains(github.event.head_commit.message, ''skip ci'')' + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + architecture: x64 + build: | + cd $APP_DIR + pnpm build + strip -x *.node + - host: windows-latest + build: | + cd $APP_DIR + pnpm build + target: x86_64-pc-windows-msvc + architecture: x64 + - host: windows-latest + build: | + cd $APP_DIR + pnpm build --target i686-pc-windows-msvc + target: i686-pc-windows-msvc + architecture: x86 + - host: ubuntu-latest + target: x86_64-unknown-linux-gnu + setup: | + sudo apt-get update + sudo apt-get install pkg-config libx11-dev libssl-dev + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian + build: |- + set -e && + rustup target add x86_64-unknown-linux-gnu && + pnpm build --target x86_64-unknown-linux-gnu && + llvm-strip -x *.node + - host: ubuntu-latest + target: x86_64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: set -e && apk add perl && pnpm build && strip *.node + - host: macos-latest + target: aarch64-apple-darwin + build: | + cd $APP_DIR + sudo rm -Rf /Library/Developer/CommandLineTools/SDKs/*; + export CC=$(xcrun -f clang); + export CXX=$(xcrun -f clang++); + SYSROOT=$(xcrun --sdk macosx --show-sdk-path); + export CFLAGS="-isysroot $SYSROOT -isystem $SYSROOT"; + pnpm build --target aarch64-apple-darwin + strip -x *.node + - host: ubuntu-latest + target: aarch64-unknown-linux-gnu + setup: | + sudo apt-get update + sudo apt-get install pkg-config libx11-dev libssl-dev + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 + build: >- + set -e && + export CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc && + export CC=aarch64-linux-gnu-gcc && + sudo apt update && + sudo apt install -y gcc-aarch64-linux-gnu && + rustup target add aarch64-unknown-linux-gnu && + pnpm build --target aarch64-unknown-linux-gnu && + aarch64-unknown-linux-gnu-strip *.node + - host: ubuntu-latest + architecture: x64 + target: armv7-unknown-linux-gnueabihf + setup: | + sudo apt-get update + sudo apt-get install libssl-dev gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y + build: | + cd $APP_DIR + pnpm build --target=armv7-unknown-linux-gnueabihf + arm-linux-gnueabihf-strip *.node + - host: ubuntu-latest + architecture: x64 + target: aarch64-unknown-linux-musl + docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + build: |- + set -e && + apk add perl && + rustup target add aarch64-unknown-linux-musl && + pnpm build --target aarch64-unknown-linux-musl && + /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node + - host: windows-latest + architecture: x64 + target: aarch64-pc-windows-msvc + build: | + cd $APP_DIR + pnpm build --target aarch64-pc-windows-msvc + name: stable - ${{ matrix.settings.target }} - node@20 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v3 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + - name: Setup node + uses: actions/setup-node@v3 + if: ${{ !matrix.settings.docker }} + with: + node-version: latest + check-latest: true + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + architecture: ${{ matrix.settings.architecture }} + - name: Install + uses: actions-rs/toolchain@v1 + if: ${{ !matrix.settings.docker }} + with: + toolchain: nightly + override: true + components: rustfmt, clippy + target: ${{ matrix.settings.target }} + - name: Cache cargo + uses: actions/cache@v3 + with: + path: ~/.cargo/registry + key: ${{ matrix.settings.target }}-cargo-registry + - name: Cache cargo index + uses: actions/cache@v3 + with: + path: ~/.cargo/git + key: ${{ matrix.settings.target }}-cargo-index + - name: Cache NPM dependencies + uses: actions/cache@v3 + with: + path: ${{ env.APP_DIR }}/node_modules + key: npm-cache-build-${{ matrix.settings.target }}-node@16 + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Install dependencies + working-directory: ${{ env.APP_DIR }} + run: pnpm install --no-frozen-lockfile --registry https://registry.npmjs.org + - name: Build in docker + uses: addnab/docker-run-action@v3 + if: ${{ matrix.settings.docker }} + with: + image: ${{ matrix.settings.docker }} + options: '-v ${{ env.HOME }}/.cargo/git:/root/.cargo/git -v ${{ env.HOME }}/.cargo/registry:/root/.cargo/registry -v ${{ github.workspace }}:/build -w /build/${{ env.APP_DIR }}' + run: ${{ matrix.settings.build }} + - name: Build + run: ${{ matrix.settings.build }} + if: ${{ !matrix.settings.docker }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v3 + with: + name: bindings-${{ matrix.settings.target }} + path: ${{ env.APP_DIR }}/${{ env.APP_NAME }}.*.node + if-no-files-found: error + + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - build + steps: + - uses: actions/checkout@v3 + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + - name: Setup node + uses: actions/setup-node@v3 + with: + node-version: latest + check-latest: true + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + - name: Cache NPM dependencies + uses: actions/cache@v3 + with: + path: node_modules + key: npm-cache-ubuntu-latest-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + npm-cache- + - name: Install dependencies + working-directory: ${{ env.APP_DIR }} + run: pnpm install --no-frozen-lockfile --registry https://registry.npmjs.org + - name: Download all artifacts + uses: actions/download-artifact@v3 + with: + path: ${{ env.APP_DIR }}/artifacts + - name: Move artifacts + working-directory: ${{ env.APP_DIR }} + run: pnpm artifacts + - name: List packages + working-directory: ${{ env.APP_DIR }} + run: ls -R ./npm + shell: bash + - name: Publish + working-directory: ${{ env.APP_DIR }} + run: | + if git log -1 --pretty=%B | grep "chore: release v[0-9]\+\.[0-9]\+\.[0-9]\+$"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --access public + elif git log -1 --pretty=%B | grep "chore: release v[0-9]\+\.[0-9]\+\.[0-9]\+"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --tag next --access public + else + echo "Not a release, skipping publish" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4149784..712c8d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,14 +9,14 @@ jobs: release: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: - node-version: 16.x + node-version: lts/* - - run: npx changelogithub # or changelogithub@0.12 if ensure the stable result + - run: npx changelogithub env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} \ No newline at end of file + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.vscode/settings.json b/.vscode/settings.json index a04e4cf..ceaf16a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,12 @@ "blive", "danmu", "temir" - ] -} \ No newline at end of file + ], + "rust-analyzer.linkedProjects": [ + "./packages/bilicli-napi/Cargo.toml" + ], + "rust-analyzer.cargo.features": [ + "platform-napi" + ], + "rust-analyzer.procMacro.ignored": { "napi-derive": ["napi"] } +} diff --git a/package.json b/package.json index 143ad1c..2d5733c 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,12 @@ "tui" ], "author": "ddiu8081 ", + "scripts": { + "build": "pnpm -r --parallel build" + }, "devDependencies": { - "@types/node": "^18.11.10", - "tsup": "^6.5.0", - "typescript": "^4.9.3" + "@types/node": "22.5.2", + "tsup": "8.2.4", + "typescript": "5.5.4" } } diff --git a/packages/bilicli-napi/.cargo/config.toml b/packages/bilicli-napi/.cargo/config.toml new file mode 100644 index 0000000..eb0d042 --- /dev/null +++ b/packages/bilicli-napi/.cargo/config.toml @@ -0,0 +1,15 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" + +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" + +[target.x86_64-unknown-linux-musl] +rustflags = [ + "-C", + "target-feature=-crt-static", +] + +[target.aarch64-unknown-linux-musl] +linker = "aarch64-linux-musl-gcc" +rustflags = ["-C", "target-feature=-crt-static"] diff --git a/packages/bilicli-napi/.gitignore b/packages/bilicli-napi/.gitignore new file mode 100644 index 0000000..5e2577b --- /dev/null +++ b/packages/bilicli-napi/.gitignore @@ -0,0 +1,197 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# End of https://www.toptal.com/developers/gitignore/api/node + +# Created by https://www.toptal.com/developers/gitignore/api/macos +# Edit at https://www.toptal.com/developers/gitignore?templates=macos + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +# End of https://www.toptal.com/developers/gitignore/api/macos + +# Created by https://www.toptal.com/developers/gitignore/api/windows +# Edit at https://www.toptal.com/developers/gitignore?templates=windows + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/windows + +#Added by cargo + +/target +Cargo.lock + +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +*.node diff --git a/packages/bilicli-napi/Cargo.toml b/packages/bilicli-napi/Cargo.toml new file mode 100644 index 0000000..5bdbf81 --- /dev/null +++ b/packages/bilicli-napi/Cargo.toml @@ -0,0 +1,35 @@ +[package] +name = "bilicli_napi" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib"] + +[features] +platform-napi = [] + +[dependencies] +ratatui = { version = "0.28" } +crossterm = { version = "0.28", features = ["event-stream"] } +tui-textarea = "0.6" +chrono = "0.4.38" +strum = "0.26.3" +serde = { version = "1", features = ["derive"] } +serde_json = "1.0" +reqwest = { version = "0.12.7", default-features = false, features = ["json", "rustls-tls"] } +napi = { version = "2.16.9", features = ["async"] } +napi-derive = "2.16.11" +tokio = { version = "1.40.0", features = ["time", "sync", "macros"] } +futures = "0.3.30" +unicode-width = "0.1.13" + +[build-dependencies] +napi-build = "2.1.3" + +[profile.release] +lto = true +opt-level = "z" +strip = true +panic = "abort" +codegen-units = 1 diff --git a/packages/bilicli-napi/build.rs b/packages/bilicli-napi/build.rs new file mode 100644 index 0000000..902d4a9 --- /dev/null +++ b/packages/bilicli-napi/build.rs @@ -0,0 +1,5 @@ +use napi_build::setup; + +fn main() { + setup(); +} diff --git a/packages/bilicli-napi/index.d.ts b/packages/bilicli-napi/index.d.ts new file mode 100644 index 0000000..bdec815 --- /dev/null +++ b/packages/bilicli-napi/index.d.ts @@ -0,0 +1,52 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export const enum AppState { + Running = 0, + Quitting = 1, + Quit = 2 +} +export const enum MsgType { + Danmu = 0, + SuperChat = 1, + Gift = 2, + GuardBuy = 3, + UserAction = 4 +} +export declare function restoreTerminal(): void +export declare class Tui { + constructor(roomId: number, cookie?: string | undefined | null) + get state(): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + run(): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + stop(): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + sendAttentionChange(attention: number): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + sendWatcherChange(watcher: number): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + sendLiveChange(live: boolean): Promise + /** + * # Safety + * This function is marked as unsafe because it requires exclusive access to the state. + */ + sendMsg(t: MsgType, msg: string): Promise +} diff --git a/packages/bilicli-napi/index.js b/packages/bilicli-napi/index.js new file mode 100644 index 0000000..caa907d --- /dev/null +++ b/packages/bilicli-napi/index.js @@ -0,0 +1,318 @@ +/* tslint:disable */ +/* eslint-disable */ +/* prettier-ignore */ + +/* auto-generated by NAPI-RS */ + +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + const lddPath = require('child_process').execSync('which ldd').toString().trim() + return readFileSync(lddPath, 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'bilicli-napi.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.android-arm64.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'bilicli-napi.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.android-arm-eabi.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.win32-x64-msvc.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.win32-ia32-msvc.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.win32-arm64-msvc.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + localFileExisted = existsSync(join(__dirname, 'bilicli-napi.darwin-universal.node')) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.darwin-universal.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-darwin-universal') + } + break + } catch {} + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'bilicli-napi.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.darwin-x64.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.darwin-arm64.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'bilicli-napi.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.freebsd-x64.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-x64-musl.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-x64-gnu.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-arm64-musl.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-arm64-gnu.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-arm-musleabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-arm-musleabihf.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-arm-musleabihf') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + } + break + case 'riscv64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-riscv64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-riscv64-musl.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-riscv64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-riscv64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-riscv64-gnu.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-riscv64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 's390x': + localFileExisted = existsSync( + join(__dirname, 'bilicli-napi.linux-s390x-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./bilicli-napi.linux-s390x-gnu.node') + } else { + nativeBinding = require('@bilicli/bilicli-napi-linux-s390x-gnu') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { AppState, MsgType, Tui, restoreTerminal } = nativeBinding + +module.exports.AppState = AppState +module.exports.MsgType = MsgType +module.exports.Tui = Tui +module.exports.restoreTerminal = restoreTerminal diff --git a/packages/bilicli-napi/npm/darwin-arm64/README.md b/packages/bilicli-napi/npm/darwin-arm64/README.md new file mode 100644 index 0000000..82a3ae1 --- /dev/null +++ b/packages/bilicli-napi/npm/darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/darwin-arm64/package.json b/packages/bilicli-napi/npm/darwin-arm64/package.json new file mode 100644 index 0000000..1acb021 --- /dev/null +++ b/packages/bilicli-napi/npm/darwin-arm64/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-darwin-arm64", + "version": "0.0.2", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "license": "MIT", + "main": "bilicli-napi.darwin-arm64.node", + "files": [ + "bilicli-napi.darwin-arm64.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/darwin-x64/README.md b/packages/bilicli-napi/npm/darwin-x64/README.md new file mode 100644 index 0000000..a4c12d3 --- /dev/null +++ b/packages/bilicli-napi/npm/darwin-x64/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-darwin-x64` + +This is the **x86_64-apple-darwin** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/darwin-x64/package.json b/packages/bilicli-napi/npm/darwin-x64/package.json new file mode 100644 index 0000000..6dfb2f5 --- /dev/null +++ b/packages/bilicli-napi/npm/darwin-x64/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-darwin-x64", + "version": "0.0.2", + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "license": "MIT", + "main": "bilicli-napi.darwin-x64.node", + "files": [ + "bilicli-napi.darwin-x64.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/linux-arm-gnueabihf/README.md b/packages/bilicli-napi/npm/linux-arm-gnueabihf/README.md new file mode 100644 index 0000000..db14a43 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm-gnueabihf/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-linux-arm-gnueabihf` + +This is the **armv7-unknown-linux-gnueabihf** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/linux-arm-gnueabihf/package.json b/packages/bilicli-napi/npm/linux-arm-gnueabihf/package.json new file mode 100644 index 0000000..6b9718d --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm-gnueabihf/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-linux-arm-gnueabihf", + "version": "0.0.2", + "os": [ + "linux" + ], + "cpu": [ + "arm" + ], + "license": "MIT", + "main": "bilicli-napi.linux-arm-gnueabihf.node", + "files": [ + "bilicli-napi.linux-arm-gnueabihf.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/linux-arm64-gnu/README.md b/packages/bilicli-napi/npm/linux-arm64-gnu/README.md new file mode 100644 index 0000000..29ed817 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm64-gnu/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-linux-arm64-gnu` + +This is the **aarch64-unknown-linux-gnu** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/linux-arm64-gnu/package.json b/packages/bilicli-napi/npm/linux-arm64-gnu/package.json new file mode 100644 index 0000000..2060ed5 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm64-gnu/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-linux-arm64-gnu", + "version": "0.0.2", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "license": "MIT", + "main": "bilicli-napi.linux-arm64-gnu.node", + "files": [ + "bilicli-napi.linux-arm64-gnu.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/linux-arm64-musl/README.md b/packages/bilicli-napi/npm/linux-arm64-musl/README.md new file mode 100644 index 0000000..49e2e71 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm64-musl/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-linux-arm64-musl` + +This is the **aarch64-unknown-linux-musl** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/linux-arm64-musl/package.json b/packages/bilicli-napi/npm/linux-arm64-musl/package.json new file mode 100644 index 0000000..366cbf1 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-arm64-musl/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-linux-arm64-musl", + "version": "0.0.2", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "license": "MIT", + "main": "bilicli-napi.linux-arm64-musl.node", + "files": [ + "bilicli-napi.linux-arm64-musl.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/linux-x64-gnu/README.md b/packages/bilicli-napi/npm/linux-x64-gnu/README.md new file mode 100644 index 0000000..a7cc440 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-x64-gnu/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-linux-x64-gnu` + +This is the **x86_64-unknown-linux-gnu** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/linux-x64-gnu/package.json b/packages/bilicli-napi/npm/linux-x64-gnu/package.json new file mode 100644 index 0000000..6a992f2 --- /dev/null +++ b/packages/bilicli-napi/npm/linux-x64-gnu/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-linux-x64-gnu", + "version": "0.0.2", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "license": "MIT", + "main": "bilicli-napi.linux-x64-gnu.node", + "files": [ + "bilicli-napi.linux-x64-gnu.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/linux-x64-musl/README.md b/packages/bilicli-napi/npm/linux-x64-musl/README.md new file mode 100644 index 0000000..336506c --- /dev/null +++ b/packages/bilicli-napi/npm/linux-x64-musl/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-linux-x64-musl` + +This is the **x86_64-unknown-linux-musl** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/linux-x64-musl/package.json b/packages/bilicli-napi/npm/linux-x64-musl/package.json new file mode 100644 index 0000000..b55cd2a --- /dev/null +++ b/packages/bilicli-napi/npm/linux-x64-musl/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-linux-x64-musl", + "version": "0.0.2", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "license": "MIT", + "main": "bilicli-napi.linux-x64-musl.node", + "files": [ + "bilicli-napi.linux-x64-musl.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/win32-arm64-msvc/README.md b/packages/bilicli-napi/npm/win32-arm64-msvc/README.md new file mode 100644 index 0000000..808a135 --- /dev/null +++ b/packages/bilicli-napi/npm/win32-arm64-msvc/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-win32-arm64-msvc` + +This is the **aarch64-pc-windows-msvc** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/win32-arm64-msvc/package.json b/packages/bilicli-napi/npm/win32-arm64-msvc/package.json new file mode 100644 index 0000000..9e30e6e --- /dev/null +++ b/packages/bilicli-napi/npm/win32-arm64-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-win32-arm64-msvc", + "version": "0.0.2", + "os": [ + "win32" + ], + "cpu": [ + "arm64" + ], + "license": "MIT", + "main": "bilicli-napi.win32-arm64-msvc.node", + "files": [ + "bilicli-napi.win32-arm64-msvc.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/win32-ia32-msvc/README.md b/packages/bilicli-napi/npm/win32-ia32-msvc/README.md new file mode 100644 index 0000000..6595e43 --- /dev/null +++ b/packages/bilicli-napi/npm/win32-ia32-msvc/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-win32-ia32-msvc` + +This is the **i686-pc-windows-msvc** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/win32-ia32-msvc/package.json b/packages/bilicli-napi/npm/win32-ia32-msvc/package.json new file mode 100644 index 0000000..796a816 --- /dev/null +++ b/packages/bilicli-napi/npm/win32-ia32-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-win32-ia32-msvc", + "version": "0.0.2", + "os": [ + "win32" + ], + "cpu": [ + "ia32" + ], + "license": "MIT", + "main": "bilicli-napi.win32-ia32-msvc.node", + "files": [ + "bilicli-napi.win32-ia32-msvc.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/npm/win32-x64-msvc/README.md b/packages/bilicli-napi/npm/win32-x64-msvc/README.md new file mode 100644 index 0000000..65ac91e --- /dev/null +++ b/packages/bilicli-napi/npm/win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `@bilicli/bilicli-napi-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `@bilicli/bilicli-napi` diff --git a/packages/bilicli-napi/npm/win32-x64-msvc/package.json b/packages/bilicli-napi/npm/win32-x64-msvc/package.json new file mode 100644 index 0000000..ba97b60 --- /dev/null +++ b/packages/bilicli-napi/npm/win32-x64-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "@bilicli/bilicli-napi-win32-x64-msvc", + "version": "0.0.2", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "license": "MIT", + "main": "bilicli-napi.win32-x64-msvc.node", + "files": [ + "bilicli-napi.win32-x64-msvc.node" + ], + "engines": { + "node": ">= 10" + } +} diff --git a/packages/bilicli-napi/package.json b/packages/bilicli-napi/package.json new file mode 100644 index 0000000..86713ba --- /dev/null +++ b/packages/bilicli-napi/package.json @@ -0,0 +1,47 @@ +{ + "name": "@bilicli/bilicli-napi", + "version": "0.0.2", + "description": "Node.js binding for Rust", + "license": "MIT", + "main": "index.js", + "types": "index.d.ts", + "engines": { + "node": ">=18" + }, + "napi": { + "name": "bilicli-napi", + "triples": { + "additional": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl", + "i686-pc-windows-msvc" + ] + } + }, + "scripts": { + "artifacts": "napi artifacts", + "build": "napi build --platform --release --features=platform-napi", + "build:debug": "napi build --platform --features=platform-napi", + "prepublishOnly": "napi prepublish -t npm", + "version": "napi version" + }, + "optionalDependencies": { + "@bilicli/bilicli-napi-darwin-arm64": "*", + "@bilicli/bilicli-napi-darwin-x64": "*", + "@bilicli/bilicli-napi-linux-arm-gnueabihf": "*", + "@bilicli/bilicli-napi-linux-arm64-gnu": "*", + "@bilicli/bilicli-napi-linux-arm64-musl": "*", + "@bilicli/bilicli-napi-linux-x64-gnu": "*", + "@bilicli/bilicli-napi-linux-x64-musl": "*", + "@bilicli/bilicli-napi-win32-arm64-msvc": "*", + "@bilicli/bilicli-napi-win32-ia32-msvc": "*", + "@bilicli/bilicli-napi-win32-x64-msvc": "*" + }, + "devDependencies": { + "@napi-rs/cli": "^2.18.2" + } +} diff --git a/packages/bilicli-napi/src/api/get_info.rs b/packages/bilicli-napi/src/api/get_info.rs new file mode 100644 index 0000000..3bdbd49 --- /dev/null +++ b/packages/bilicli-napi/src/api/get_info.rs @@ -0,0 +1,48 @@ +use serde::Deserialize; + +#[derive(Clone, Deserialize, Debug)] +pub struct RoomInfo { + pub uid: u64, + pub room_id: u32, + pub short_id: u32, + pub attention: u32, + pub online: u32, + pub is_portrait: bool, + pub description: String, + pub live_status: u32, + pub area_id: u32, + pub parent_area_id: u32, + pub parent_area_name: String, + pub background: String, + pub title: String, + pub user_cover: String, + pub keyframe: String, + pub live_time: String, + pub area_name: String, +} + +#[derive(Deserialize)] +pub struct GetRoomInfoResponse { + pub code: i32, + pub message: String, + pub data: RoomInfo, +} + +pub async fn get_room_info(room_id: u32) -> Result> { + let response = reqwest::get(format!( + "https://api.live.bilibili.com/room/v1/Room/get_info?room_id={}", + room_id + )) + .await?; + + let response = response.json::().await?; + + if response.code != 0 { + Err(Box::new(std::io::Error::new( + std::io::ErrorKind::NotFound, + response.message, + )))? + } + + Ok(response.data) +} diff --git a/packages/bilicli-napi/src/api/get_room_by_user.rs b/packages/bilicli-napi/src/api/get_room_by_user.rs new file mode 100644 index 0000000..b339d1e --- /dev/null +++ b/packages/bilicli-napi/src/api/get_room_by_user.rs @@ -0,0 +1,39 @@ +use serde::Deserialize; + +#[derive(Deserialize, Default, Debug)] +pub struct WearedV2 { + pub(crate) name: String, + pub(crate) level: u32, + pub(crate) guard_level: u32, + pub(crate) v2_medal_color_text: String, + pub(crate) v2_medal_color_level: String, +} + +#[derive(Deserialize)] +pub struct Medal { + pub(crate) curr_weared_v2: WearedV2, +} + +#[derive(Deserialize)] +pub struct RoomUserInfo { + pub medal: Medal, +} + +#[derive(Deserialize)] +struct GetRoomByUserResponse { + code: u32, + message: String, + data: RoomUserInfo, +} + +pub async fn get_room_by_user(room_id: u32) -> Result { + let resp = reqwest::get(format!( + "https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByUser?room_id={}", + room_id + )) + .await? + .json::() + .await?; + + Ok(resp.data) +} diff --git a/packages/bilicli-napi/src/api/mod.rs b/packages/bilicli-napi/src/api/mod.rs new file mode 100644 index 0000000..fec6fe7 --- /dev/null +++ b/packages/bilicli-napi/src/api/mod.rs @@ -0,0 +1,9 @@ +mod get_info; +mod get_room_by_user; +mod send_danmu; + +pub use get_info::get_room_info; +pub use get_info::RoomInfo; +pub use get_room_by_user::get_room_by_user; +pub use get_room_by_user::WearedV2; +pub use send_danmu::send_danmu; diff --git a/packages/bilicli-napi/src/api/send_danmu.rs b/packages/bilicli-napi/src/api/send_danmu.rs new file mode 100644 index 0000000..02a1d84 --- /dev/null +++ b/packages/bilicli-napi/src/api/send_danmu.rs @@ -0,0 +1,87 @@ +#![allow(unused)] + +use std::collections::HashMap; + +use chrono::{Local, Timelike}; +use reqwest::header::{HeaderMap, HeaderValue, COOKIE}; +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct BaseUserInfo { + pub(crate) name: String, + pub(crate) face: String, +} + +#[derive(Deserialize)] +pub struct User { + pub(crate) uid: u64, + pub(crate) base: BaseUserInfo, +} + +#[derive(Deserialize)] +pub struct ModeInfo { + mode: i32, + pub(crate) user: User, +} + +#[derive(Deserialize)] +pub struct SendDanmuData { + pub(crate) mode_info: ModeInfo, +} + +#[derive(Deserialize)] +pub struct SendDanmuResponse { + code: i32, + message: String, + data: Option, +} + +pub async fn send_danmu( + room_id: u32, + content: &str, + cookie: String, +) -> Result { + let mut headers = HeaderMap::new(); + headers.insert(COOKIE, HeaderValue::from_str(&cookie).unwrap()); + + let kv: Vec<&str> = cookie.split("; ").collect::>(); + let cookie = if let Some(cookie) = kv.iter().find(|s| s.starts_with("bili_jct=")) { + if let Some(cookie) = cookie.split("=").nth(1) { + cookie.to_string() + } else { + return Err("无法找到 csrf token".to_string()); + } + } else { + return Err("无法找到 csrf token".to_string()); + }; + + let mut params = HashMap::new(); + params.insert("csrf", cookie.to_string()); + params.insert("csrf_token", cookie.to_string()); + params.insert("color", "16777215".to_string()); + params.insert("fontsize", "25".to_string()); + params.insert("mode", "1".to_string()); + params.insert("msg", content.to_string()); + params.insert("rnd", Local::now().timestamp().to_string()); + params.insert("roomid", room_id.to_string()); + + let client = reqwest::Client::new(); + + let response = client + .post("https://api.live.bilibili.com/msg/send") + .headers(headers) + .form(¶ms) + .send() + .await + .unwrap(); + + if response.status().is_success() { + let body = response.json::().await.unwrap(); + if body.code != 0 { + return Err(body.message); + } + Ok(body.data.unwrap()) + } else { + Err(response.text().await.unwrap()) + } +} diff --git a/packages/bilicli-napi/src/app.rs b/packages/bilicli-napi/src/app.rs new file mode 100644 index 0000000..7be35ef --- /dev/null +++ b/packages/bilicli-napi/src/app.rs @@ -0,0 +1,366 @@ +#![allow(clippy::new_without_default)] + +use std::time::Duration; + +use crate::{ + api::send_danmu, + ui::{ + footer::Footer, header::Header, helper::centered_rect, tabs::Tabs, AppState, InputMode, + SliderBarState, + }, + TuiState, +}; +use crossterm::event::{Event, EventStream, KeyCode, KeyEventKind, MouseEventKind}; +use futures::StreamExt; +use ratatui::{ + prelude::*, + style::palette::tailwind, + widgets::{block::Title, Block, Borders, List, ListItem, Padding, Paragraph, Wrap}, +}; +use tui_textarea::TextArea; + +pub const MAX_INPUT_LENGTH: usize = 40; + +pub type Result = std::result::Result>; + +#[derive(Debug, Default)] +pub struct App { + pub input_mode: InputMode, + header: Header, + footer: Footer, + tabs: Tabs, + pub textarea: TextArea<'static>, + pub will_send_message: Vec, + err_text: Option, +} + +unsafe impl Send for App {} + +impl App { + const FRAMES_PER_SECOND: f32 = 60.0; + + pub async fn run( + &mut self, + terminal: &mut Terminal, + state: &mut TuiState, + ) -> Result<()> { + let mut interval = + tokio::time::interval(Duration::from_secs_f32(1.0 / Self::FRAMES_PER_SECOND)); + let mut events = EventStream::new(); + + if !self.will_send_message.is_empty() { + self.send_danmu(state).await.unwrap_or_default(); + } + + tokio::select! { + _ = interval.tick() => self.draw(terminal, state)?, + Some(Ok(event)) = events.next() => self.handle_events(&event, state)?, + } + + Ok(()) + } + + fn draw(&mut self, terminal: &mut Terminal, state: &mut TuiState) -> Result<()> { + terminal.draw(|f| f.render_stateful_widget(self, f.area(), state))?; + + Ok(()) + } + + pub async fn send_danmu(&mut self, state: &mut TuiState) -> Result<()> { + self.err_text = None; + let content = self.will_send_message.remove(0); + let room_id = state.room_id; + let cookie = state.cookie.clone(); + let will_send_message = content.clone(); + let result = tokio::spawn(async move { + if let Some(cookie) = cookie { + send_danmu(room_id, will_send_message.as_str(), cookie).await + } else { + Err("未登录".to_string()) + } + }) + .await + .unwrap(); + + // if self.weared_v2.is_none() { + // let result = get_room_by_user(room_id).await; + // if result.is_ok() { + // self.weared_v2 = Some(result.unwrap().medal.curr_weared_v2); + // } + // } + + if result.is_err() { + self.err_text = Some(result.err().unwrap()); + } else { + // let timestamp = Local::now().timestamp_millis(); + // let data = result.unwrap(); + // let mut user: User = User { + // uid: data.mode_info.user.uid, + // uname: data.mode_info.user.base.name, + // face: None, + // badge: None, + // identity: None, + // }; + // if let Some(weared_v2) = &self.weared_v2 { + // user.badge = Some(Badge::new( + // weared_v2.name.clone(), + // weared_v2.level as u8, + // weared_v2.v2_medal_color_text.clone(), + // None, + // None, + // None, + // )); + // } + // let msg = DanmuMsg::new(user, content, timestamp, false, None); + // state + // .messages + // .push((MsgType::Danmu, serde_json::to_string(&msg).unwrap())); + } + + Ok(()) + } + + pub fn handle_events(&mut self, event: &Event, state: &mut TuiState) -> crate::app::Result<()> { + match event { + Event::Key(key) => match self.input_mode { + InputMode::Normal if key.kind == KeyEventKind::Press => match key.code { + KeyCode::Up if state.state == AppState::Running => self.previous_tab(), + KeyCode::Down if state.state == AppState::Running => self.next_tab(), + KeyCode::Char('w') if state.state == AppState::Running => self.scroll_up(), + KeyCode::Char('s') if state.state == AppState::Running => self.scroll_down(), + KeyCode::Char('q') if state.state == AppState::Running => state.quit(), + KeyCode::Char('q') if state.state == AppState::Quitting => state.quit(), + KeyCode::Char('y') if state.state == AppState::Quitting => { + state.state = AppState::Quit + } + KeyCode::Char('n') if state.state == AppState::Quitting => { + state.state = AppState::Running; + } + KeyCode::Char('t') if state.state == AppState::Running => { + self.toggle_slider_bar(state) + } + KeyCode::Enter + if state.state == AppState::Running && state.cookie.is_some() => + { + self.input_mode = InputMode::Editing; + self.textarea + .set_style(Style::default().fg(Color::LightGreen)); + } + _ => {} + }, + InputMode::Editing if key.kind == KeyEventKind::Press => match key.code { + KeyCode::Up => { + self.previous_tab(); + } + KeyCode::Down => { + self.next_tab(); + } + KeyCode::Enter => { + if !self.textarea.lines()[0].is_empty() { + self.will_send_message + .push(self.textarea.lines()[0].to_string()); + self.input_mode = InputMode::Normal; + } + } + KeyCode::Esc => { + self.input_mode = InputMode::Normal; + } + _ => { + if self.textarea.input(*key) + && self.textarea.lines()[0].len() > MAX_INPUT_LENGTH + { + self.textarea.delete_char(); + } + } + }, + _ => {} + }, + Event::Mouse(mouse) => match mouse.kind { + MouseEventKind::ScrollDown => { + self.scroll_down(); + } + MouseEventKind::ScrollUp => { + self.scroll_up(); + } + _ => {} + }, + _ => {} + } + + Ok(()) + } + + pub fn toggle_slider_bar(&mut self, state: &mut TuiState) { + state.slider_bar_state = match state.slider_bar_state { + SliderBarState::Normal => SliderBarState::Hiding, + SliderBarState::Hiding => SliderBarState::Normal, + }; + } + + pub fn scroll_up(&mut self) { + if let Some(index) = self.tabs.state.selected() { + let tab = &mut self.tabs.tabs[index]; + tab.scroll_up(); + } + } + + pub fn scroll_down(&mut self) { + if let Some(index) = self.tabs.state.selected() { + let tab = &mut self.tabs.tabs[index]; + tab.scroll_down(); + } + } + + pub fn next_tab(&mut self) { + self.tabs.next_tab(); + } + + pub fn previous_tab(&mut self) { + self.tabs.previous_tab(); + } +} + +impl StatefulWidget for &mut App { + type State = TuiState; + + fn render(self, root: Rect, buf: &mut Buffer, state: &mut Self::State) { + if state.state == AppState::Quitting { + self.render_quit_question(root, buf); + return; + } + + let vertical = Layout::vertical([ + Constraint::Length(3), + Constraint::Fill(1), + Constraint::Length(3), + ]); + + let horizontal: Layout = { + if state.slider_bar_state == SliderBarState::Normal { + Layout::horizontal([Constraint::Length(8), Constraint::Fill(1)]) + } else { + Layout::horizontal([Constraint::Length(0), Constraint::Fill(1)]) + } + }; + + let [header_area, inner_area, footer_area] = vertical.areas(root); + let [tabs_area, content_area] = horizontal.areas(inner_area); + + self.header.render(header_area, buf, state); + + if state.slider_bar_state == SliderBarState::Normal { + self.render_tabs(tabs_area, buf); + } + + self.render_selected_tab(content_area, buf, state); + + if self.input_mode == InputMode::Editing { + self.render_input(footer_area, buf); + } else { + self.footer.render(footer_area, buf, state); + } + } +} + +impl App { + fn render_quit_question(&self, area: Rect, buf: &mut Buffer) { + let area = centered_rect(60, 40, area); + let block = Block::bordered() + .title(" 提示 ") + .title_alignment(Alignment::Center) + .border_set(symbols::border::ROUNDED) + .border_style(Style::default().fg(tailwind::ORANGE.c400)) + .padding(Padding::uniform(1)); + + Paragraph::new(vec![ + Line::from("你确定要退出吗?".bold()).centered(), + Line::raw(""), + Line::raw(""), + Line::from(vec![ + Span::from("确定 (按 Y/y)").bold().fg(tailwind::ORANGE.c300), + Span::raw(" "), + Span::from("取消 (按 N/n)").bold().fg(tailwind::RED.c300), + ]) + .centered(), + ]) + .block(block) + .wrap(Wrap { trim: true }) + .render(area, buf); + } + + fn render_tabs(&mut self, area: Rect, buf: &mut Buffer) { + let highlight_style = Style::default() + .bg(tailwind::YELLOW.c300) + .fg(tailwind::BLACK) + .bold(); + + let block = Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)); + + let tabs: Vec = self + .tabs + .tabs + .iter() + .map(|tab| ListItem::from(tab.title())) + .collect(); + + let list = List::new(tabs) + .block(block) + .highlight_style(highlight_style) + .highlight_spacing(ratatui::widgets::HighlightSpacing::WhenSelected); + + StatefulWidget::render(list, area, buf, &mut self.tabs.state); + } + + fn render_selected_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let tab = if let Some(index) = self.tabs.state.selected() { + &mut self.tabs.tabs[index] + } else { + self.tabs.state.select_first(); + &mut self.tabs.tabs[0] + }; + + tab.render(area, buf, state); + } + + fn render_input(&mut self, area: Rect, buf: &mut Buffer) { + self.textarea + .set_placeholder_text("按 Enter 发送弹幕, Esc 取消输入"); + self.textarea + .set_style(Style::default().fg(Color::LightCyan)); + let style = { + if !self.textarea.lines()[0].is_empty() { + Style::default() + .fg(Color::Green) + .bg(Color::default()) + .bold() + .add_modifier(Modifier::BOLD) + } else { + Style::default() + } + }; + self.textarea.set_cursor_line_style(style); + self.textarea.set_block( + Block::default() + .border_type(ratatui::widgets::BorderType::Rounded) + .border_style(Color::LightGreen) + .borders(Borders::ALL) + .padding(Padding::left(1)) + .title({ + if let Some(err_text) = &self.err_text { + Title::from(format!("错误: {} ", err_text).red()) + } else { + Title::from(format!( + " {} / {} ", + self.textarea.lines()[0].len(), + MAX_INPUT_LENGTH + )) + } + }) + .title_alignment(Alignment::Center), + ); + + self.textarea.render(area, buf); + } +} diff --git a/packages/bilicli-napi/src/lib.rs b/packages/bilicli-napi/src/lib.rs new file mode 100644 index 0000000..7cc5a9d --- /dev/null +++ b/packages/bilicli-napi/src/lib.rs @@ -0,0 +1,238 @@ +#[cfg(feature = "platform-napi")] +use std::{io::stdout, sync::Arc}; + +#[cfg(feature = "platform-napi")] +use crate::{ + api::get_room_info, + app::App, + ui::{AppState, MsgType}, +}; + +use api::RoomInfo; +use chrono::NaiveDateTime; +#[cfg(feature = "platform-napi")] +use napi::bindgen_prelude::*; +#[cfg(feature = "platform-napi")] +use napi_derive::napi; + +#[cfg(feature = "platform-napi")] +use ratatui::{ + backend::CrosstermBackend, + crossterm::{ + event::{DisableMouseCapture, EnableMouseCapture}, + execute, + terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, + }, + Terminal, +}; + +#[cfg(not(feature = "platform-napi"))] +use ratatui::crossterm::{ + event::DisableMouseCapture, + execute, + terminal::{disable_raw_mode, LeaveAlternateScreen}, +}; +#[cfg(feature = "platform-napi")] +use tokio::sync::Mutex; +use ui::SliderBarState; + +pub mod api; +pub mod app; +pub mod ui; + +#[cfg(feature = "platform-napi")] +#[napi] +pub struct Tui { + room_id: u32, + app: Arc>, + state: Arc>, +} + +#[cfg(feature = "platform-napi")] +#[napi] +impl Tui { + #[napi(constructor)] + pub fn new(room_id: u32, cookie: Option) -> Result { + Ok(Self { + room_id, + app: Arc::new(Mutex::new(App::default())), + state: Arc::new(Mutex::new(TuiState::new(room_id, cookie))), + }) + } + + #[napi(getter)] + pub async fn state(&self) -> AppState { + self.state.lock().await.state + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn run(&mut self) -> Result<()> { + let state = Arc::clone(&self.state); + tokio::spawn(async move { + let mut state = state.lock().await; + let info = get_room_info(state.room_id).await.unwrap(); + state.update_info(info); + }) + .await + .unwrap_or_default(); + + let state = Arc::clone(&self.state); + let app = Arc::clone(&self.app); + + tokio::spawn(async move { + let mut stdout = stdout(); + enable_raw_mode().unwrap(); + execute!(stdout, EnterAlternateScreen, EnableMouseCapture).unwrap(); + let mut terminal = Terminal::new(CrosstermBackend::new(stdout)).unwrap(); + let mut app_state = AppState::Running; + while app_state != AppState::Quit { + let mut state = state.lock().await; + let mut app = app.lock().await; + app.run(&mut terminal, &mut state).await.unwrap(); + app_state = state.state; + } + }) + .await + .unwrap_or_default(); + + disable_raw_mode()?; + execute!(stdout(), LeaveAlternateScreen, DisableMouseCapture)?; + + Ok(()) + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn stop(&mut self) -> Result<()> { + let mut state = self.state.lock().await; + state.state = AppState::Quit; + + Ok(()) + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn send_attention_change(&mut self, attention: u32) { + if attention == 1 { + let info = get_room_info(self.room_id).await.unwrap(); + let mut state = self.state.lock().await; + state.update_info(info); + } else { + let mut state = self.state.lock().await; + state.update_attention(attention); + } + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn send_watcher_change(&mut self, watcher: u32) { + let mut state = self.state.lock().await; + state.update_watcher(watcher); + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn send_live_change(&mut self, live: bool) { + let mut state = self.state.lock().await; + state.update_live(live); + } + + /// # Safety + /// This function is marked as unsafe because it requires exclusive access to the state. + #[napi] + pub async unsafe fn send_msg(&mut self, t: MsgType, msg: String) { + let mut state = self.state.lock().await; + state.messages.push((t, msg)); + } +} + +#[cfg(feature = "platform-napi")] +#[napi] +pub fn restore_terminal() { + let mut stdout = stdout(); + disable_raw_mode().unwrap(); + execute!(stdout, LeaveAlternateScreen, DisableMouseCapture).unwrap(); +} + +#[cfg(not(feature = "platform-napi"))] +pub fn init_panic_hook() { + use std::panic::{set_hook, take_hook}; + + let original_hook = take_hook(); + set_hook(Box::new(move |panic_info| { + let _ = disable_raw_mode(); + let _ = execute!(stdout(), LeaveAlternateScreen, DisableMouseCapture); + original_hook(panic_info); + })); +} + +#[derive(Clone, Default, Debug)] +pub struct TuiState { + pub cookie: Option, + pub slider_bar_state: SliderBarState, + pub state: AppState, + pub room_id: u32, + pub attention: u32, + pub watchers: u32, + pub is_live: bool, + pub start_time: NaiveDateTime, + pub area_name: String, + pub parent_area_name: String, + pub title: String, + pub messages: Vec<(MsgType, String)>, +} + +impl TuiState { + pub fn new(room_id: u32, cookie: Option) -> Self { + Self { + room_id, + cookie, + slider_bar_state: SliderBarState::Hiding, + ..Default::default() + } + } +} + +impl TuiState { + pub fn quit(&mut self) { + if self.state == AppState::Quit { + return; + } + + if self.state == AppState::Quitting { + self.state = AppState::Quit; + return; + } + + self.state = AppState::Quitting; + } + + pub fn update_info(&mut self, info: RoomInfo) { + self.area_name = info.area_name; + self.parent_area_name = info.parent_area_name; + self.title = info.title; + self.attention = info.attention; + self.is_live = info.live_status == 1; + self.start_time = + NaiveDateTime::parse_from_str(&info.live_time, "%Y-%m-%d %H:%M:%S").unwrap_or_default(); + self.watchers = info.online; + } + + pub fn update_attention(&mut self, attention: u32) { + self.attention = attention; + } + + pub fn update_watcher(&mut self, watcher: u32) { + self.watchers = watcher; + } + + pub fn update_live(&mut self, live: bool) { + self.is_live = live; + } +} diff --git a/packages/bilicli-napi/src/ui/colors.rs b/packages/bilicli-napi/src/ui/colors.rs new file mode 100644 index 0000000..dccbcc5 --- /dev/null +++ b/packages/bilicli-napi/src/ui/colors.rs @@ -0,0 +1,6 @@ +use ratatui::style::Color; +use std::sync::OnceLock; + +pub const USER_COLORS: [&str; 4] = ["#967E76", "#FF7C28", "#E17AFF", "#00D1F1"]; + +pub static GRAY_COLOR: OnceLock = OnceLock::new(); diff --git a/packages/bilicli-napi/src/ui/footer.rs b/packages/bilicli-napi/src/ui/footer.rs new file mode 100644 index 0000000..1a400da --- /dev/null +++ b/packages/bilicli-napi/src/ui/footer.rs @@ -0,0 +1,219 @@ +use chrono::prelude::*; +use ratatui::{ + prelude::*, + widgets::{block::Title, Block, Padding, Paragraph}, +}; + +use unicode_width::UnicodeWidthStr; + +use crate::TuiState; + +use super::{helper::render_basic_info, MsgType, UserActionMsg}; + +#[derive(Debug, Default)] +pub struct Footer; + +impl StatefulWidget for &mut Footer { + type State = TuiState; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { + let enter = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::UserAction) + .filter(|(_, msg)| { + if let Ok(msg) = serde_json::from_str::(msg) { + msg.action.as_str() == "enter" + } else { + false + } + }) + .last(); + + let enter_text = { + if let Some(enter) = enter { + let (_, msg) = enter; + if let Ok(msg) = serde_json::from_str::(msg) { + render_enter_text(msg) + } else if state.cookie.is_some() { + Line::from(" 按 Enter 输入弹幕信息, Esc 取消输入 ") + } else { + Line::from(" 登录后(Cookie)按 Enter 输入弹幕信息, Esc 取消输入 ") + } + } else if state.cookie.is_some() { + Line::from(" 按 Enter 输入弹幕信息, Esc 取消输入 ") + } else { + Line::from(" 登录后(Cookie)按 Enter 输入弹幕信息, Esc 取消输入 ") + } + }; + + let enter_text_width = enter_text.width() + 4; + + let [left, right] = Layout::horizontal([Constraint::Fill(1), Constraint::Min(60)]) + .flex(layout::Flex::SpaceBetween) + .areas(area); + + let [left, right] = { + if (enter_text_width as u16) < left.width { + [left, right] + } else { + Layout::horizontal([Constraint::Length(0), Constraint::Fill(1)]) + .flex(layout::Flex::SpaceBetween) + .areas(area) + } + }; + + let watcher_text = format!("👀 {}", small_num_text(state.watchers)); + let attention_text = format!("🔥 {}", small_num_text(state.attention)); + let watcher_text_width = watcher_text.width() + 4; + let attention_text_width = attention_text.width() + 4; + + let [info_area, watcher_area, attention_area] = Layout::horizontal([ + Constraint::Fill(1), + Constraint::Length(watcher_text_width as u16), + Constraint::Length(attention_text_width as u16), + ]) + .flex(layout::Flex::SpaceBetween) + .areas(right); + + Paragraph::new(enter_text) + .block( + Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)) + .title(if enter.is_some() && state.cookie.is_some() { + Title::from("按 Enter 输入弹幕信息, Esc 取消输入") + } else { + Title::from("提示") + }) + .title_style(if enter.is_none() { + Style::default().fg(Color::Red) + } else { + Style::default() + }) + .title_alignment(Alignment::Center), + ) + .render(left, buf); + + if state.is_live { + let text = format_duration(state.start_time); + Paragraph::new(Line::from(vec![ + "🔴" + .to_string() + .fg(Color::LightGreen) + .add_modifier(Modifier::BOLD), + Span::from(" "), + Span::from({ + let live_text = format!("直播时长: {}", text); + if live_text.width() > info_area.width as usize { + text + } else { + live_text + } + }), + ])) + .block( + Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)) + .title(Title::from(format!( + " Start at {} ", + state.start_time.format("%H:%M") + ))) + .title_style(Style::default().fg(Color::LightGreen)) + .title_alignment(Alignment::Center), + ) + .render(info_area, buf); + } else { + Paragraph::new(Line::from(vec![ + "⚫️" + .to_string() + .fg(Color::LightGreen) + .add_modifier(Modifier::BOLD), + Span::from(" "), + Span::from("未开播").fg(Color::Red), + ])) + .block( + Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)), + ) + .render(info_area, buf); + } + + Paragraph::new(Line::from(watcher_text.fg(Color::LightGreen).bold())) + .block( + Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)), + ) + .render(watcher_area, buf); + + Paragraph::new(Line::from(attention_text.fg(Color::LightGreen).bold())) + .block( + Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)), + ) + .render(attention_area, buf); + } +} + +fn format_duration(start_time: NaiveDateTime) -> String { + let now = Local::now().naive_local(); + let diff = now.signed_duration_since(start_time); + let seconds = diff.num_seconds(); + + let hours = seconds / 3600; + let minutes = (seconds - hours * 3600) / 60; + let secs = seconds - hours * 3600 - minutes * 60; + + let format_hours = { + if hours > 0 { + format!("{}", hours).to_string() + } else { + "".to_string() + } + }; + + let format_minutes = { + if hours > 0 { + if minutes < 10 { + format!("0{}", minutes).to_string() + } else { + format!("{}", minutes).to_string() + } + } else { + format!("{}", minutes).to_string() + } + }; + + let format_seconds = { + if secs < 10 { + format!("0{}", secs).to_string() + } else { + format!("{}", secs).to_string() + } + }; + + if format_hours.is_empty() { + format!("{}:{}", format_minutes, format_seconds).to_string() + } else { + format!("{}:{}:{}", format_hours, format_minutes, format_seconds).to_string() + } +} + +fn small_num_text(num: u32) -> String { + if num > 10000 { + format!("{:.1} 万", num as f32 / 10000.0).to_string() + } else { + format!("{}", num).to_string() + } +} + +fn render_enter_text(msg: UserActionMsg) -> Line<'static> { + let mut spans = render_basic_info(None, msg.user, None); + spans.push(Span::from("进入你的直播间")); + + Line::from(spans) +} diff --git a/packages/bilicli-napi/src/ui/header.rs b/packages/bilicli-napi/src/ui/header.rs new file mode 100644 index 0000000..70cbfeb --- /dev/null +++ b/packages/bilicli-napi/src/ui/header.rs @@ -0,0 +1,33 @@ +use ratatui::{ + prelude::*, + widgets::{Block, Padding, Paragraph}, +}; + +use crate::TuiState; + +#[derive(Default, Debug)] +pub struct Header; + +impl StatefulWidget for &Header { + type State = TuiState; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { + let block = Block::bordered() + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)); + + Paragraph::new( + Line::from(vec![ + Span::from(format!("{}", state.room_id)).fg(Color::Green), + Span::raw(" "), + Span::from(format!("({}·{})", state.area_name, state.parent_area_name)) + .fg(Color::LightGreen), + Span::raw(" "), + Span::from(state.title.clone()), + ]) + .bold(), + ) + .block(block) + .render(area, buf); + } +} diff --git a/packages/bilicli-napi/src/ui/helper.rs b/packages/bilicli-napi/src/ui/helper.rs new file mode 100644 index 0000000..9a37b7e --- /dev/null +++ b/packages/bilicli-napi/src/ui/helper.rs @@ -0,0 +1,212 @@ +use std::str::FromStr; + +use chrono::prelude::*; +use ratatui::{prelude::*, style::palette::tailwind}; + +use super::{ + colors::{GRAY_COLOR, USER_COLORS}, + DanmuMsg, GiftMsg, GuardBuyMsg, MsgType, SuperChatMsg, User, UserActionMsg, +}; + +/// helper function to create a centered rect using up certain percentage of the available rect `r` +pub fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { + let popup_layout = Layout::vertical([ + Constraint::Percentage((100 - percent_y) / 2), + Constraint::Percentage(percent_y), + Constraint::Percentage((100 - percent_y) / 2), + ]) + .split(r); + + Layout::horizontal([ + Constraint::Percentage((100 - percent_x) / 2), + Constraint::Percentage(percent_x), + Constraint::Percentage((100 - percent_x) / 2), + ]) + .split(popup_layout[1])[1] +} + +/// replace emoji to unicode +pub fn replace_emoji_to_unicode(emoji_str: &str) -> String { + emoji_str + .replace("[dog]", "🐶") + .replace("[手机]", "📱") + .replace("[花]", "🌹") + .replace("[吃瓜]", "🍉") + .replace("[比心]", "❤️") +} + +pub fn render_basic_info( + t: Option, + user: User, + time: Option>, +) -> Vec> { + let mut spans = vec![]; + + let color = *GRAY_COLOR.get_or_init(|| Color::from_hsl(0.0, 0.0, 40.0)); + + if let Some(time) = time { + spans.push(Span::from(format!("{}", time.format("%H:%M:%S"))).fg(color)); + } + + if let Some(t) = t { + spans.push(Span::from(format!(" [{}] ", t)).fg(Color::LightYellow)); + } else { + spans.push(Span::raw(" ")); + } + + if let Some(ref badge) = user.badge { + let mut color = *GRAY_COLOR.get().unwrap(); + if let Some(ref anchor) = badge.anchor { + if let Some(is_same_room) = anchor.is_same_room { + if is_same_room { + color = Color::from_str(&badge.color).unwrap_or(color) + } + } + } + + spans.push(Span::from(format!(" {} ", badge.name)).bg(color)); + spans.push( + Span::from(format!(" {} ", badge.level)) + .fg(color) + .bg(Color::White), + ); + + spans.push(Span::raw(" ")); + } + + if let Some(identity) = user.identity { + let index = identity.guard_level as usize % USER_COLORS.len(); + let color = + Color::from_str(USER_COLORS[index]).unwrap_or(Color::from_str(USER_COLORS[0]).unwrap()); + + spans.push(Span::from(user.uname).bold().fg(color)); + } else { + spans.push( + Span::from(user.uname) + .bold() + .fg(Color::from_str(USER_COLORS[0]).unwrap()), + ); + } + + spans.push(Span::raw(": ")); + + spans +} + +/// render danmu message +pub fn render_danmu_message( + msg: DanmuMsg, + time: DateTime, + render_type: bool, +) -> Line<'static> { + let mut spans = render_basic_info( + get_msg_type(render_type, MsgType::Danmu), + msg.user, + Some(time), + ); + spans.push(Span::from(replace_emoji_to_unicode(&msg.content))); + + Line::from(spans) +} + +/// render super chat message +pub fn render_super_chat_message( + msg: SuperChatMsg, + time: DateTime, + render_type: bool, +) -> Line<'static> { + let mut spans = render_basic_info( + get_msg_type(render_type, MsgType::SuperChat), + msg.user, + Some(time), + ); + spans.push(Span::from(format!("({} 元)", msg.price))); + spans.push(Span::raw(" ")); + spans.push(Span::from(msg.content)); + + Line::from(spans) +} + +/// render gift message +pub fn render_gift_message( + msg: GiftMsg, + time: DateTime, + render_type: bool, +) -> Line<'static> { + let mut spans = render_basic_info( + get_msg_type(render_type, MsgType::Gift), + msg.user, + Some(time), + ); + spans.push(Span::from(format!( + "赠送了{} * {} ", + msg.gift_name, msg.amount + ))); + + let total = (msg.price * msg.amount) as f32 / 1000.0; + if total > 0.0 { + spans.push( + Span::from(format!("({:.1} 元)", total)) + .fg(Color::LightMagenta) + .bold(), + ); + } + + if let Some(master) = msg.send_master { + spans.push(Span::from(format!(" 给 {}", master.uname))); + } + + Line::from(spans) +} + +/// render guard buy message +pub fn render_guard_buy_message( + msg: GuardBuyMsg, + time: DateTime, + render_type: bool, +) -> Line<'static> { + let mut spans = render_basic_info( + get_msg_type(render_type, MsgType::GuardBuy), + msg.user, + Some(time), + ); + spans.push(Span::raw("在你的直播间购买了")); + spans.push(Span::from(msg.gift_name).fg(tailwind::GREEN.c400).bold()); + spans.push(Span::raw(" ")); + spans.push(Span::from(format!("({} 元)", msg.price / 1000))); + + Line::from(spans) +} + +/// render user action message +pub fn render_user_action_message( + msg: UserActionMsg, + time: DateTime, + render_type: bool, +) -> Line<'static> { + let mut spans = render_basic_info( + get_msg_type(render_type, MsgType::UserAction), + msg.user, + Some(time), + ); + spans.push({ + match msg.action.as_str() { + "enter" => Span::from("进入你的直播间"), + "follow" => Span::from("关注了你"), + "share" => Span::from("分享了你的直播间"), + "like" => Span::from("为你的直播间点赞"), + _ => Span::from(""), + } + }); + + Line::from(spans) +} + +#[inline] +fn get_msg_type(render_type: bool, msg_type: MsgType) -> Option { + if render_type { + Some(msg_type) + } else { + None + } +} diff --git a/packages/bilicli-napi/src/ui/mod.rs b/packages/bilicli-napi/src/ui/mod.rs new file mode 100644 index 0000000..362972f --- /dev/null +++ b/packages/bilicli-napi/src/ui/mod.rs @@ -0,0 +1,223 @@ +#![allow(dead_code)] + +#[cfg(feature = "platform-napi")] +use napi_derive::napi; +use serde::{Deserialize, Serialize}; +use strum::{Display, EnumIter, FromRepr}; + +pub mod colors; +pub mod footer; +pub mod header; +pub mod helper; +pub mod tabs; + +#[cfg(feature = "platform-napi")] +#[napi] +#[derive(Default, PartialEq, Eq, Debug)] +pub enum AppState { + #[default] + Running, + Quitting, + Quit, +} + +#[cfg(not(feature = "platform-napi"))] +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug)] +pub enum AppState { + #[default] + Running, + Quitting, + Quit, +} + +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug)] +pub enum InputMode { + #[default] + Normal, + Editing, +} + +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug)] +pub enum SliderBarState { + #[default] + Normal, + Hiding, +} + +#[cfg(feature = "platform-napi")] +#[napi] +#[derive(Debug, Display, FromRepr, EnumIter, PartialEq, Eq)] +pub enum MsgType { + #[strum(to_string = "弹幕")] + Danmu, + #[strum(to_string = " SC ")] + SuperChat, + #[strum(to_string = "礼物")] + Gift, + #[strum(to_string = "上舰")] + GuardBuy, + #[strum(to_string = "进场")] + UserAction, +} + +#[cfg(not(feature = "platform-napi"))] +#[derive(Debug, Clone, Copy, Display, FromRepr, EnumIter, PartialEq, Eq)] +pub enum MsgType { + #[strum(to_string = "弹幕")] + Danmu, + #[strum(to_string = " SC ")] + SuperChat, + #[strum(to_string = "礼物")] + Gift, + #[strum(to_string = "上舰")] + GuardBuy, + #[strum(to_string = "进场")] + UserAction, +} + +#[derive(Deserialize, Serialize)] +pub struct Anchor { + uid: u64, + uname: String, + room_id: u32, + is_same_room: Option, +} + +#[derive(Deserialize, Serialize)] +pub struct Identity { + rank: u8, + guard_level: u8, + room_admin: bool, +} + +#[derive(Deserialize, Serialize)] +pub struct Badge { + // active: bool, + pub(crate) name: String, + pub(crate) level: u8, + pub(crate) color: String, + gradient: Option>, + anchor: Option, + identity: Option, +} + +impl Badge { + pub fn new( + name: String, + level: u8, + color: String, + gradient: Option>, + anchor: Option, + identity: Option, + ) -> Self { + Self { + name, + level, + color, + gradient, + anchor, + identity, + } + } +} + +#[derive(Deserialize, Serialize)] +pub struct User { + pub uid: u64, + pub uname: String, + pub face: Option, + pub badge: Option, + pub identity: Option, +} + +#[derive(Deserialize, Serialize)] +pub struct Emoticon { + id: String, + height: i32, + width: i32, + url: String, +} + +#[derive(Deserialize, Serialize)] +pub struct DanmuMsg { + user: User, + content: String, + timestamp: i64, + lottery: bool, + emoticon: Option, +} + +impl DanmuMsg { + pub fn new( + user: User, + content: String, + timestamp: i64, + lottery: bool, + emoticon: Option, + ) -> Self { + Self { + user, + content, + timestamp, + lottery, + emoticon, + } + } +} + +#[derive(Deserialize)] +pub struct GuardBuyMsg { + timestamp: i64, + user: User, + gift_id: u32, + gift_name: String, + guard_level: u8, + price: u32, + start_time: u32, + end_time: u32, +} + +#[derive(Deserialize)] +pub struct SuperChatMsg { + id: u64, + user: User, + content: String, + content_color: String, + price: u32, + time: u32, + timestamp: i64, +} + +#[derive(Deserialize)] +pub struct Master { + uid: u64, + uname: String, + room_id: u32, +} + +#[derive(Deserialize)] +pub struct Combo { + batch_id: String, + combo_num: u32, + total_price: u32, +} + +#[derive(Deserialize)] +pub struct GiftMsg { + timestamp: i64, + user: User, + gift_id: u32, + gift_name: String, + coin_type: String, + price: u32, + amount: u32, + send_master: Option, + combo: Option, +} + +#[derive(Deserialize)] +pub struct UserActionMsg { + user: User, + action: String, + timestamp: i64, +} diff --git a/packages/bilicli-napi/src/ui/tabs.rs b/packages/bilicli-napi/src/ui/tabs.rs new file mode 100644 index 0000000..1eeff3b --- /dev/null +++ b/packages/bilicli-napi/src/ui/tabs.rs @@ -0,0 +1,445 @@ +use std::fmt; + +use chrono::{DateTime, Local, TimeZone, Utc}; +use ratatui::{ + prelude::*, + widgets::{block::Title, Block, ListState, Padding, Paragraph, Scrollbar, ScrollbarState}, +}; + +use crate::TuiState; + +use super::{ + helper::{ + render_danmu_message, render_gift_message, render_guard_buy_message, + render_super_chat_message, render_user_action_message, + }, + DanmuMsg, GiftMsg, GuardBuyMsg, MsgType, SliderBarState, SuperChatMsg, UserActionMsg, +}; + +#[derive(Clone)] +pub enum Tab { + AllTab(usize, ScrollbarState), + DanMuTab(usize, ScrollbarState), + SCTab(usize, ScrollbarState), + GiftTab(usize, ScrollbarState), + CaptainTab(usize, ScrollbarState), + EnterTab(usize, ScrollbarState), +} + +impl Tab { + pub fn title(&self) -> String { + match self { + Tab::AllTab(_, _) => "全部".to_string(), + Tab::DanMuTab(_, _) => "弹幕".to_string(), + Tab::SCTab(_, _) => " SC ".to_string(), + Tab::GiftTab(_, _) => "礼物".to_string(), + Tab::CaptainTab(_, _) => "上舰".to_string(), + Tab::EnterTab(_, _) => "入场".to_string(), + } + } + + pub fn scroll_up(&mut self) { + match self { + Tab::AllTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + Tab::DanMuTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + Tab::SCTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + Tab::GiftTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + Tab::CaptainTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + Tab::EnterTab(scroll, state) => { + *scroll = scroll.saturating_sub(1); + *state = state.position(*scroll); + } + }; + } + + pub fn scroll_down(&mut self) { + match self { + Tab::AllTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + Tab::DanMuTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + Tab::SCTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + Tab::GiftTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + Tab::CaptainTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + Tab::EnterTab(scroll, state) => { + *scroll = scroll.saturating_add(1); + *state = state.position(*scroll); + } + }; + } + + pub fn scroll(&self) -> usize { + match self { + Tab::AllTab(scroll, _) => *scroll, + Tab::DanMuTab(scroll, _) => *scroll, + Tab::SCTab(scroll, _) => *scroll, + Tab::GiftTab(scroll, _) => *scroll, + Tab::CaptainTab(scroll, _) => *scroll, + Tab::EnterTab(scroll, _) => *scroll, + } + } + + pub fn set_state_content_length(&mut self, content_length: usize) { + match self { + Tab::AllTab(_, state) => *state = state.content_length(content_length), + Tab::DanMuTab(_, state) => *state = state.content_length(content_length), + Tab::SCTab(_, state) => *state = state.content_length(content_length), + Tab::GiftTab(_, state) => *state = state.content_length(content_length), + Tab::CaptainTab(_, state) => *state = state.content_length(content_length), + Tab::EnterTab(_, state) => *state = state.content_length(content_length), + }; + } + + pub fn set_state_viewport_content_length(&mut self, viewport_content_length: usize) { + match self { + Tab::AllTab(_, state) => { + *state = state.viewport_content_length(viewport_content_length) + } + Tab::DanMuTab(_, state) => { + *state = state.viewport_content_length(viewport_content_length) + } + Tab::SCTab(_, state) => *state = state.viewport_content_length(viewport_content_length), + Tab::GiftTab(_, state) => { + *state = state.viewport_content_length(viewport_content_length) + } + Tab::CaptainTab(_, state) => { + *state = state.viewport_content_length(viewport_content_length) + } + Tab::EnterTab(_, state) => { + *state = state.viewport_content_length(viewport_content_length) + } + }; + } + + pub fn state(&mut self) -> &mut ScrollbarState { + match self { + Tab::AllTab(_, state) => state, + Tab::DanMuTab(_, state) => state, + Tab::SCTab(_, state) => state, + Tab::GiftTab(_, state) => state, + Tab::CaptainTab(_, state) => state, + Tab::EnterTab(_, state) => state, + } + } +} + +impl StatefulWidget for &mut Tab { + type State = TuiState; + + fn render(self, area: Rect, buf: &mut Buffer, state: &mut Self::State) { + match self { + Tab::AllTab(_, _) => self.render_all_tab(area, buf, state), + Tab::DanMuTab(_, _) => self.render_danmu_tab(area, buf, state), + Tab::SCTab(_, _) => self.render_sc_tab(area, buf, state), + Tab::GiftTab(_, _) => self.render_gift_tab(area, buf, state), + Tab::CaptainTab(_, _) => self.render_captain_tab(area, buf, state), + Tab::EnterTab(_, _) => self.render_enter_tab(area, buf, state), + } + } +} + +impl Tab { + fn should_scroll_down(&mut self, content_length: usize, area: &Rect) -> bool { + self.scroll() + area.height as usize - 2 < content_length + } + + fn should_scroll_up(&mut self, area: &Rect, content_length: usize) -> bool { + self.scroll() > 0 && area.height > content_length as u16 + } + + fn block(&self, state: &TuiState) -> Block { + Block::bordered() + .title({ + if state.slider_bar_state == SliderBarState::Hiding { + Title::from(format!(" {} ", self.title())).alignment(Alignment::Center) + } else { + Title::from("") + } + }) + .border_type(ratatui::widgets::BorderType::Rounded) + .padding(Padding::horizontal(1)) + } + + fn setup_scrollbar(&mut self, len: usize, area: Rect) { + self.set_state_content_length(len); + while self.should_scroll_down(len, &area) { + self.scroll_down(); + } + } + + fn render_all_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t != MsgType::UserAction) + .map(|(t, b)| Self::render_msg(*t, b.clone(), true)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } + + fn render_danmu_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::Danmu) + .map(|(t, b)| Self::render_msg(*t, b.clone(), false)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } + + fn render_sc_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::SuperChat) + .map(|(t, b)| Self::render_msg(*t, b.clone(), false)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } + + fn render_gift_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::Gift) + .map(|(t, b)| Self::render_msg(*t, b.clone(), false)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } + + fn render_captain_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::GuardBuy) + .map(|(t, b)| Self::render_msg(*t, b.clone(), false)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } + + fn render_enter_tab(&mut self, area: Rect, buf: &mut Buffer, state: &mut TuiState) { + let text: Vec> = state + .messages + .iter() + .filter(|(t, _)| *t == MsgType::UserAction) + .map(|(t, b)| Self::render_msg(*t, b.clone(), false)) + .collect(); + + self.setup_scrollbar(text.len(), area); + + Paragraph::new(text) + .block(self.block(state)) + .scroll((self.scroll() as u16, 0)) + .render(area, buf); + + let scrollbar = Scrollbar::new(ratatui::widgets::ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("w")) + .end_symbol(Some("s")); + + StatefulWidget::render(scrollbar, area, buf, self.state()); + } +} + +impl Tab { + fn render_msg(t: MsgType, b: String, render_type: bool) -> Line<'static> { + match t { + MsgType::Danmu => { + if let Ok(msg) = serde_json::from_str::(&b) { + let time = get_local_time_from_timestamp(msg.timestamp); + + render_danmu_message(msg, time, render_type) + } else { + Line::from(vec![Span::from("解析弹幕消息失败")]) + .red() + .bold() + } + } + MsgType::SuperChat => { + if let Ok(msg) = serde_json::from_str::(&b) { + let time = get_local_time_from_timestamp(msg.timestamp); + + render_super_chat_message(msg, time, render_type) + } else { + Line::from(vec![Span::from("解析SC消息失败")]).red().bold() + } + } + MsgType::Gift => { + if let Ok(msg) = serde_json::from_str::(&b) { + let time = get_local_time_from_timestamp(msg.timestamp); + + render_gift_message(msg, time, render_type) + } else { + Line::from(vec![Span::from("解析礼物消息失败")]) + .red() + .bold() + } + } + MsgType::GuardBuy => { + if let Ok(msg) = serde_json::from_str::(&b) { + let time = get_local_time_from_timestamp(msg.timestamp); + + render_guard_buy_message(msg, time, render_type) + } else { + Line::from(vec![Span::from("解析上舰消息失败")]) + .red() + .bold() + } + } + MsgType::UserAction => { + if let Ok(msg) = serde_json::from_str::(&b) { + let time = get_local_time_from_timestamp(msg.timestamp); + + render_user_action_message(msg, time, render_type) + } else { + Line::from(vec![Span::from("解析用户操作消息失败")]) + .red() + .bold() + } + } + } + } +} + +pub struct Tabs { + pub tabs: Vec, + pub state: ListState, +} + +impl Tabs { + pub fn next_tab(&mut self) { + let selected = self.state.selected().unwrap(); + if selected + 1 < self.tabs.len() { + self.state.select(Some(selected + 1)); + } else { + self.state.select(Some(0)); + } + } + + pub fn previous_tab(&mut self) { + let selected = self.state.selected().unwrap(); + if selected > 0 { + self.state.select(Some(selected - 1)); + } else { + self.state.select(Some(self.tabs.len() - 1)); + } + } +} + +impl fmt::Debug for Tabs { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Tabs").finish() + } +} + +impl Default for Tabs { + fn default() -> Self { + let mut state = ListState::default(); + state.select(Some(0)); + + Self { + tabs: vec![ + Tab::AllTab(0, ScrollbarState::default()), + Tab::DanMuTab(0, ScrollbarState::default()), + Tab::SCTab(0, ScrollbarState::default()), + Tab::GiftTab(0, ScrollbarState::default()), + Tab::CaptainTab(0, ScrollbarState::default()), + Tab::EnterTab(0, ScrollbarState::default()), + ], + state, + } + } +} + +fn get_local_time_from_timestamp(timestamp: i64) -> DateTime { + let time = DateTime::from_timestamp_millis(timestamp).unwrap_or(Utc::now()); + let time = time.naive_local(); + Local.from_utc_datetime(&time) +} diff --git a/packages/bilicli/src/actions/edit.ts b/packages/bilicli/src/actions/edit.ts new file mode 100644 index 0000000..453e4f7 --- /dev/null +++ b/packages/bilicli/src/actions/edit.ts @@ -0,0 +1,9 @@ +import { openEditor } from '@bilicli/live-full' + +export interface EditOptions { + config: string +} + +export function edit(options: EditOptions) { + openEditor(options.config) +} diff --git a/packages/bilicli/src/actions/live-full.ts b/packages/bilicli/src/actions/live-full.ts index baef322..065fd0f 100644 --- a/packages/bilicli/src/actions/live-full.ts +++ b/packages/bilicli/src/actions/live-full.ts @@ -5,8 +5,8 @@ interface ArgOptions { rank: boolean } -const liveFull = async(roomId: string, options: ArgOptions) => { - startApp(~~roomId, { +const liveFull = async (roomId: string, options: ArgOptions) => { + await startApp(~~roomId, { badge: options.badge, rank: options.rank, }) diff --git a/packages/bilicli/src/actions/live-mini.ts b/packages/bilicli/src/actions/live-mini.ts index 460ecdf..be8464c 100644 --- a/packages/bilicli/src/actions/live-mini.ts +++ b/packages/bilicli/src/actions/live-mini.ts @@ -5,8 +5,8 @@ interface ArgOptions { rank: boolean } -const liveMini = async(roomId: string, options: ArgOptions) => { - startApp(~~roomId, { +const liveMini = async (roomId: string, options: ArgOptions) => { + await startApp(~~roomId, { badge: options.badge, rank: options.rank, }) diff --git a/packages/bilicli/src/index.ts b/packages/bilicli/src/index.ts index 722fb22..17ede77 100644 --- a/packages/bilicli/src/index.ts +++ b/packages/bilicli/src/index.ts @@ -4,10 +4,10 @@ import { cac } from 'cac' import { liveFull } from './actions/live-full' import { liveMini } from './actions/live-mini' +import { edit } from './actions/edit' const cli = cac(name) -// live(mini) cli .command('live ', 'Open live console in mini mode') .option('--no-badge', 'Hide badge of user') @@ -18,8 +18,16 @@ cli .command('live-full ', 'Open live console in full mode') .option('--no-badge', 'Hide badge of user') .option('--no-rank', 'Hide rank of user') + .option('--cookie ', 'Your bilibili cookie') + .option('--uid ', 'Your bilibili uid, and you can get it from https://space.bilibili.com') + .option('--config [config]', 'Cli config file path', { default: 'bilicli.config.js' }) .action(liveFull) + cli + .command('edit', 'Open editor to edit cli config file') + .option('--config [config]', 'Custom config file path', { default: 'bilicli.config.js' }) + .action(edit) + cli.help() cli.version(version) diff --git a/packages/live-full/package.json b/packages/live-full/package.json index cfd172f..e5ec870 100644 --- a/packages/live-full/package.json +++ b/packages/live-full/package.json @@ -3,8 +3,8 @@ "version": "0.3.3", "description": "Bili-Live danmu client", "scripts": { - "dev": "temir src/index.ts", - "build": "temir build src/index.ts" + "dev": "tsup --watch", + "build": "tsup" }, "type": "module", "main": "dist/index.js", @@ -25,16 +25,10 @@ ], "author": "ddiu8081 ", "license": "MIT", - "devDependencies": { - "@temir/cli": "^0.0.20" - }, "dependencies": { - "@temir/core": "^0.0.20", - "@temir/link": "^0.0.20", - "@temir/tab": "^0.0.20", - "blive-message-listener": "^0.4.0", - "dayjs": "^1.11.6", - "ohmyfetch": "^0.4.21", - "vue": "^3.2.45" + "blive-message-listener": "0.5.0", + "ofetch": "1.3.4", + "@bilicli/bilicli-napi": "workspace:*", + "open": "^10.1.0" } } diff --git a/packages/live-full/src/App.vue b/packages/live-full/src/App.vue deleted file mode 100644 index 940238f..0000000 --- a/packages/live-full/src/App.vue +++ /dev/null @@ -1,183 +0,0 @@ - - - diff --git a/packages/live-full/src/app.d.ts b/packages/live-full/src/app.d.ts deleted file mode 100644 index fbe0b9b..0000000 --- a/packages/live-full/src/app.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -declare module '*.vue' { - import { type DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - export default component -} - -interface AppOptions { - badge: boolean - rank: boolean -} \ No newline at end of file diff --git a/packages/live-full/src/app.ts b/packages/live-full/src/app.ts new file mode 100644 index 0000000..bfc83cd --- /dev/null +++ b/packages/live-full/src/app.ts @@ -0,0 +1,173 @@ +import { Tui, MsgType, restoreTerminal } from '@bilicli/bilicli-napi' +import { Message, MsgHandler, startListen } from 'blive-message-listener' +import open from 'open' +import { isAbsolute, join } from 'node:path' +import { homedir, userInfo } from 'node:os' +import { existsSync, mkdirSync, writeFileSync } from 'node:fs' +import { createRequire } from 'node:module' + +export interface AppOptions { + cookie?: string + config?: string + uid?: string + badge: boolean + rank: boolean +} + +export interface EditOptions { + config: string +} + +export class App { + private readonly roomId: number + private readonly tui: Tui + + constructor(roomId: string | undefined | number, private options: AppOptions) { + if (!roomId) { + const config = getConfigPath(this.options.config) + + if (!existsSync(config)) { + throw new Error('房间号或配置文件路径不能为空') + } + + try { + const require = createRequire(join(config, '..')) + const c = require(config.endsWith('.js') ? config : `${config}.js`) + + roomId = c.roomId + this.options.cookie = c?.cookie || '' + this.options.uid = c?.uid + } catch (error) { + throw new Error('配置文件格式不正确') + } + } else if(!this.options?.cookie || !this.options?.uid) { + const config = getConfigPath(this.options.config) + if (existsSync(config)) { + try { + const require = createRequire(join(config, '..')) + const c = require(config.endsWith('.js') ? config : `${config}.js`) + if(!roomId && c.roomId) { + roomId = c.roomId + } + if(!this.options.cookie && c.cookie) { + this.options.cookie = c.cookie + } + if(!this.options.uid && c.uid) { + this.options.uid = c.uid + } + } catch { + // ignore + } + } + } + + if(typeof roomId === 'number') { + this.roomId = roomId + } else { + this.roomId = parseInt(roomId!) + } + + + if (isNaN(this.roomId)) { + throw new Error('房间号格式不正确') + } + + this.tui = new Tui(this.roomId, this.options?.cookie) + + const handler: MsgHandler = { + onAttentionChange: ({ body }) => this.tui.sendAttentionChange(body.attention), + onWatchedChange: ({ body }) => this.tui.sendWatcherChange(body.num), + onLiveStart: () => this.tui.sendLiveChange(true), + onLiveEnd: () => this.tui.sendLiveChange(false), + onIncomeDanmu: (msg) => this.tui.sendMsg(MsgType.Danmu, JSON.stringify(this.mixTimestamp2Body(msg))), + onIncomeSuperChat: (msg) => this.tui.sendMsg(MsgType.SuperChat, JSON.stringify(this.mixTimestamp2Body(msg))), + onGift: (msg) => this.tui.sendMsg(MsgType.Gift, JSON.stringify(this.mixTimestamp2Body(msg))), + onGuardBuy: (msg) => this.tui.sendMsg(MsgType.GuardBuy, JSON.stringify(this.mixTimestamp2Body(msg))), + onUserAction: (msg) => this.tui.sendMsg(MsgType.UserAction, JSON.stringify(this.mixTimestamp2Body(msg))), + } + + let uid: number | undefined + if (this.options?.uid) { + uid = parseInt(this.options.uid) + if (isNaN(uid)) { + throw new Error('UID 格式不正确') + } + } + + startListen(this.roomId, handler, { + ws: { + headers: { + 'Cookie': this.options?.cookie || "", + }, + uid, + }, + }) + } + + async run() { + try { + await this.tui.run() + } catch { + restoreTerminal() + } + } + + private mixTimestamp2Body(msg: Message) { + return { + ...msg.body, + timestamp: msg?.timestamp || Date.now(), + } + } +} + +function getConfigPath(config: string = 'bilicli.config.js') { + let target = config + let userinfo = userInfo() + + switch (process.platform) { + case 'darwin': + if(!isAbsolute(config)) { + target = join(homedir(), userinfo.username, '.config', 'bilicli') + if(!existsSync(target)) { + mkdirSync(target, { recursive: true }) + } + target = join(target, config) + } + break + case 'win32': + if(!isAbsolute(config)) { + target = join(homedir(), userinfo.username, 'AppData', 'Roaming', 'bilicli') + if(!existsSync(target)) { + mkdirSync(target, { recursive: true }) + } + target = join(target, config) + } + break + default: + if(!isAbsolute(config)) { + target = join(homedir(), userinfo.username, '.config', 'bilicli') + if(!existsSync(target)) { + mkdirSync(target, { recursive: true }) + } + target = join(target, config) + } + } + + return target +} + +export async function openEditor(config: string) { + let target = getConfigPath(config) + + if(!existsSync(target)) { + writeFileSync(target, ` +module.exports = { + cookie: '', + uid: undefined, + // roomId: 1, +} + `) + } + + await open(target) +} diff --git a/packages/live-full/src/components/CliFooter.vue b/packages/live-full/src/components/CliFooter.vue deleted file mode 100644 index 0fb0955..0000000 --- a/packages/live-full/src/components/CliFooter.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/CliHeader.vue b/packages/live-full/src/components/CliHeader.vue deleted file mode 100644 index 207721c..0000000 --- a/packages/live-full/src/components/CliHeader.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/MsgTime.vue b/packages/live-full/src/components/MsgTime.vue deleted file mode 100644 index 6a45fa1..0000000 --- a/packages/live-full/src/components/MsgTime.vue +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/live-full/src/components/MsgType.vue b/packages/live-full/src/components/MsgType.vue deleted file mode 100644 index f63693b..0000000 --- a/packages/live-full/src/components/MsgType.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - - \ No newline at end of file diff --git a/packages/live-full/src/components/TabSelector.vue b/packages/live-full/src/components/TabSelector.vue deleted file mode 100644 index 29bd157..0000000 --- a/packages/live-full/src/components/TabSelector.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/UserName.vue b/packages/live-full/src/components/UserName.vue deleted file mode 100644 index 2d19d74..0000000 --- a/packages/live-full/src/components/UserName.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - diff --git a/packages/live-full/src/components/msgCom/DanmuMsgCom.vue b/packages/live-full/src/components/msgCom/DanmuMsgCom.vue deleted file mode 100644 index 6dd02a4..0000000 --- a/packages/live-full/src/components/msgCom/DanmuMsgCom.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/msgCom/GiftMsgCom.vue b/packages/live-full/src/components/msgCom/GiftMsgCom.vue deleted file mode 100644 index f9aafb2..0000000 --- a/packages/live-full/src/components/msgCom/GiftMsgCom.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/msgCom/GuardBuyMsgCom.vue b/packages/live-full/src/components/msgCom/GuardBuyMsgCom.vue deleted file mode 100644 index e8399f7..0000000 --- a/packages/live-full/src/components/msgCom/GuardBuyMsgCom.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/msgCom/SuperChatMsgCom.vue b/packages/live-full/src/components/msgCom/SuperChatMsgCom.vue deleted file mode 100644 index aab2f07..0000000 --- a/packages/live-full/src/components/msgCom/SuperChatMsgCom.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/components/msgCom/UserActionMsgCom.vue b/packages/live-full/src/components/msgCom/UserActionMsgCom.vue deleted file mode 100644 index aaa114d..0000000 --- a/packages/live-full/src/components/msgCom/UserActionMsgCom.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - \ No newline at end of file diff --git a/packages/live-full/src/index.ts b/packages/live-full/src/index.ts index 3eca88e..a78141c 100644 --- a/packages/live-full/src/index.ts +++ b/packages/live-full/src/index.ts @@ -1,27 +1,9 @@ -import { render } from '@temir/core' -import { h } from 'vue' -import App from './App.vue' - -import { getRoomInfo } from './utils/getInfo' +import { App, AppOptions, openEditor } from "./app" const startApp = async (roomId: number, options: AppOptions) => { - const roomInfo = await getRoomInfo(roomId) - if (!roomInfo) { - console.log('房间不存在') - return process.exit(1) - } - - const NewApp = { - render() { - return h(App, { - roomId, - roomInfo, - options - }) - } - } - - render(NewApp) + const app = new App(roomId, options) + await app.run() + process.exit(0) } -export { startApp } +export { startApp, openEditor } diff --git a/packages/live-full/src/tsconfig.json b/packages/live-full/src/tsconfig.json index 5991227..42d15d3 100644 --- a/packages/live-full/src/tsconfig.json +++ b/packages/live-full/src/tsconfig.json @@ -8,9 +8,9 @@ "jsx": "preserve", "sourceMap": true, "resolveJsonModule": true, - "isolatedModules": true, + "isolatedModules": false, "esModuleInterop": true, "lib": ["ESNext", "DOM"], "skipLibCheck": true } -} \ No newline at end of file +} diff --git a/packages/live-full/src/utils/format.ts b/packages/live-full/src/utils/format.ts deleted file mode 100644 index c3613aa..0000000 --- a/packages/live-full/src/utils/format.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type { GuardLevel } from "blive-message-listener" - -export const addSpace = (str: string) => { - return ' ' + str + ' ' -} - -export const getGuardColor = (level: GuardLevel = 0) => { - const colorDict = ['#967E76', '#FF7C28', '#E17AFF', '#00D1F1'] - return colorDict[level] -} diff --git a/packages/live-full/src/utils/getInfo.ts b/packages/live-full/src/utils/getInfo.ts deleted file mode 100644 index 42fe0d1..0000000 --- a/packages/live-full/src/utils/getInfo.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { $fetch } from 'ohmyfetch' - -export interface RoomInfo { - uid: number - room_id: number - short_id: number - attention: number - online: number - is_portrait: boolean - description: string - live_status: number - area_id: number - parent_area_id: number - parent_area_name: string - background: string - title: string - user_cover: string - keyframe: string - live_time: string - area_name: string -} - -interface RoomInfoResponse { - code: number - msg: string - message: string - data: RoomInfo -} - -export const getRoomInfo = async (roomId: number) => { - const url = `https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${roomId}` - const response = await $fetch(url) - return response.code === 0 ? response.data : null -} \ No newline at end of file diff --git a/packages/live-full/src/utils/readline.ts b/packages/live-full/src/utils/readline.ts deleted file mode 100644 index 243695c..0000000 --- a/packages/live-full/src/utils/readline.ts +++ /dev/null @@ -1,26 +0,0 @@ -import readline from 'readline' - -export const listenQuitCommand = () => { - let rl: readline.Interface = readline.createInterface({ input: process.stdin, escapeCodeTimeout: 50 }) - - readline.emitKeypressEvents(process.stdin, rl) - if (process.stdin.isTTY) { - process.stdin.setRawMode(true) - } - - function keypressHandler(str: string, key: any) { - // ctrl-c or esc - if (str === '\x03' || str === '\x1B' || (key && key.ctrl && key.name === 'c')) { - return process.exit() - } - - const name = key?.name - - // quit - if (name === 'q') { - return process.exit() - } - } - - process.stdin.on('keypress', keypressHandler) -} \ No newline at end of file diff --git a/packages/live-mini/package.json b/packages/live-mini/package.json index 14f15ca..0772c00 100644 --- a/packages/live-mini/package.json +++ b/packages/live-mini/package.json @@ -30,8 +30,8 @@ "author": "ddiu8081 ", "license": "MIT", "dependencies": { - "ansis": "^1.5.5", - "blive-message-listener": "^0.4.0", - "ohmyfetch": "^0.4.21" + "ansis": "3.3.2", + "blive-message-listener": "0.5.0", + "ofetch": "1.3.4" } } diff --git a/packages/live-mini/src/app.d.ts b/packages/live-mini/src/app.d.ts deleted file mode 100644 index 6e1c207..0000000 --- a/packages/live-mini/src/app.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -interface AppOptions { - badge: boolean - rank: boolean -} - -declare namespace NodeJS { - export interface Global { - appOptions: AppOptions; - } -} - -declare var appOptions: AppOptions; \ No newline at end of file diff --git a/packages/live-mini/src/index.ts b/packages/live-mini/src/index.ts index eb6e0f3..8f77b4d 100644 --- a/packages/live-mini/src/index.ts +++ b/packages/live-mini/src/index.ts @@ -2,6 +2,11 @@ import { startInstance } from './instance' import { getRoomInfo } from './utils/getInfo' import { roomInfoCom } from './component/roomInfo' +export interface AppOptions { + badge: boolean + rank: boolean +} + const startApp = async (roomId: number, options: AppOptions) => { const roomInfo = await getRoomInfo(roomId) if (!roomInfo) { diff --git a/packages/live-mini/src/utils/getInfo.ts b/packages/live-mini/src/utils/getInfo.ts index 42fe0d1..007b6a1 100644 --- a/packages/live-mini/src/utils/getInfo.ts +++ b/packages/live-mini/src/utils/getInfo.ts @@ -1,4 +1,4 @@ -import { $fetch } from 'ohmyfetch' +import { $fetch } from 'ofetch' export interface RoomInfo { uid: number @@ -31,4 +31,4 @@ export const getRoomInfo = async (roomId: number) => { const url = `https://api.live.bilibili.com/room/v1/Room/get_info?room_id=${roomId}` const response = await $fetch(url) return response.code === 0 ? response.data : null -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d5cdbd..010d66a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,2340 +1,1535 @@ -lockfileVersion: 5.4 +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false importers: .: - specifiers: - '@types/node': ^18.11.10 - tsup: ^6.5.0 - typescript: ^4.9.3 devDependencies: - '@types/node': 18.11.10 - tsup: 6.5.0_typescript@4.9.3 - typescript: 4.9.3 + '@types/node': + specifier: 22.5.2 + version: 22.5.2 + tsup: + specifier: 8.2.4 + version: 8.2.4(postcss@8.4.44)(typescript@5.5.4) + typescript: + specifier: 5.5.4 + version: 5.5.4 packages/bilicli: - specifiers: - '@bilicli/live-full': workspace:* - '@bilicli/live-mini': workspace:* - cac: ^6.7.14 dependencies: - '@bilicli/live-full': link:../live-full - '@bilicli/live-mini': link:../live-mini - cac: 6.7.14 + '@bilicli/live-full': + specifier: workspace:* + version: link:../live-full + '@bilicli/live-mini': + specifier: workspace:* + version: link:../live-mini + cac: + specifier: ^6.7.14 + version: 6.7.14 + + packages/bilicli-napi: + devDependencies: + '@napi-rs/cli': + specifier: ^2.18.2 + version: 2.18.4 packages/live-full: - specifiers: - '@temir/cli': ^0.0.20 - '@temir/core': ^0.0.20 - '@temir/link': ^0.0.20 - '@temir/tab': ^0.0.20 - blive-message-listener: ^0.4.0 - dayjs: ^1.11.6 - ohmyfetch: ^0.4.21 - vue: ^3.2.45 - dependencies: - '@temir/core': 0.0.20 - '@temir/link': 0.0.20 - '@temir/tab': 0.0.20 - blive-message-listener: 0.4.0 - dayjs: 1.11.6 - ohmyfetch: 0.4.21 - vue: 3.2.45 - devDependencies: - '@temir/cli': 0.0.20_vue@3.2.45 + dependencies: + '@bilicli/bilicli-napi': + specifier: workspace:* + version: link:../bilicli-napi + blive-message-listener: + specifier: 0.5.0 + version: 0.5.0 + ofetch: + specifier: 1.3.4 + version: 1.3.4 + open: + specifier: ^10.1.0 + version: 10.1.0 packages/live-mini: - specifiers: - ansis: ^1.5.5 - blive-message-listener: ^0.4.0 - ohmyfetch: ^0.4.21 dependencies: - ansis: 1.5.5 - blive-message-listener: 0.4.0 - ohmyfetch: 0.4.21 + ansis: + specifier: 3.3.2 + version: 3.3.2 + blive-message-listener: + specifier: 0.5.0 + version: 0.5.0 + ofetch: + specifier: 1.3.4 + version: 1.3.4 packages: - /@ampproject/remapping/2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - - /@babel/code-frame/7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/compat-data/7.19.4: - resolution: {integrity: sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core/7.19.3: - resolution: {integrity: sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.5 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.19.3 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helpers': 7.19.4 - '@babel/parser': 7.19.4 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - convert-source-map: 1.9.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - /@babel/generator/7.19.5: - resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - /@babel/helper-annotate-as-pure/7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.3: - resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.4 - '@babel/core': 7.19.3 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - dev: true - - /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.19.3: - resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor/7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name/7.19.0: - resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-hoist-variables/7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-member-expression-to-functions/7.18.9: - resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-module-imports/7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true - - /@babel/helper-module-transforms/7.19.0: - resolution: {integrity: sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.19.4 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - /@babel/helper-optimise-call-expression/7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - /@babel/helper-plugin-utils/7.19.0: - resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} - engines: {node: '>=6.9.0'} - dev: true + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - /@babel/helper-replace-supers/7.19.1: - resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - /@babel/helper-simple-access/7.19.4: - resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - /@babel/helper-split-export-declaration/7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.4 - dev: true + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - /@babel/helper-string-parser/7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - /@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - /@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} - engines: {node: '>=6.9.0'} - dev: true + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - /@babel/helpers/7.19.4: - resolution: {integrity: sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - transitivePeerDependencies: - - supports-color - dev: true + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - /@babel/highlight/7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - /@babel/parser/7.19.4: - resolution: {integrity: sha512-qpVT7gtuOLjWeDTKLkJ6sryqLliBaFpAtGeqw5cs5giLldvh+Ch0plqnUMKoVAUS6ZEueQQiZV+p5pxtPitEsA==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.19.4 + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.19.3: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.19.3: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.19.3: - resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - /@babel/plugin-transform-typescript/7.19.3_@babel+core@7.19.3: - resolution: {integrity: sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.19.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.19.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.19.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/template/7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - dev: true - - /@babel/traverse/7.19.4: - resolution: {integrity: sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.19.4 - '@babel/types': 7.19.4 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - /@babel/types/7.19.4: - resolution: {integrity: sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - /@esbuild/android-arm/0.15.11: - resolution: {integrity: sha512-PzMcQLazLBkwDEkrNPi9AbjFt6+3I7HKbiYF2XtWQ7wItrHvEOeO3T8Am434zAozWtVP7lrTue1bEfc2nYWeCA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - /@esbuild/linux-loong64/0.14.54: - resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - /@esbuild/linux-loong64/0.15.11: - resolution: {integrity: sha512-geWp637tUhNmhL3Xgy4Bj703yXB9dqiLJe05lCUfjSFDrQf9C/8pArusyPUbUbPwlC/EAUjBw32sxuIl/11dZw==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - /@jridgewell/gen-mapping/0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/gen-mapping/0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.17 - dev: true - /@jridgewell/resolve-uri/3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/set-array/1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - /@jridgewell/sourcemap-codec/1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - /@jridgewell/trace-mapping/0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true + '@napi-rs/cli@2.18.4': + resolution: {integrity: sha512-SgJeA4df9DE2iAEpr3M2H0OKl/yjtg1BnRI5/JyowS71tUWhrfSu2LT0V3vlHET+g1hBVlrO60PmEXwUEKp8Mg==} + engines: {node: '>= 10'} + hasBin: true - /@nodelib/fs.scandir/2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat/2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk/1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 - dev: true - - /@temir/cli/0.0.20_vue@3.2.45: - resolution: {integrity: sha512-w/YMxbFeXCr5MYlZj2p+kh2QNIEIMNDhU9KnkQ/aAGH5e8GE6zsnlrcGmgM9S23ndNAk7M8Z2GFB1rrk8Nfy0A==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@babel/core': 7.19.3 - '@vitejs/plugin-vue': 3.0.1_vite@3.0.5+vue@3.2.45 - '@vitejs/plugin-vue-jsx': 2.0.0_vite@3.0.5+vue@3.2.45 - '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.3 - '@vue/compiler-sfc': 3.2.41 - cac: 6.7.14 - hash-sum: 2.0.0 - resolve-from: 5.0.0 - tsup: 6.5.0 - vite: 3.0.5 - vite-node: 0.21.1 - transitivePeerDependencies: - - '@swc/core' - - less - - postcss - - sass - - stylus - - supports-color - - terser - - ts-node - - typescript - - vue - dev: true - - /@temir/core/0.0.20: - resolution: {integrity: sha512-Htxa0yAFx+yWICui7Jaf/0kqa6ej4fCXnEge95azL77hebUSAs2fV5d8MmNwGNLG+vR++MbEXAFKx9t9944VTg==} - engines: {node: '>=14'} - dependencies: - '@vue/runtime-core': 3.2.41 - ansi-escapes: 4.3.2 - ansi-styles: 5.2.0 - auto-bind: 4.0.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - cli-cursor: 3.1.0 - cli-truncate: 2.1.0 - indent-string: 4.0.0 - is-ci: 3.0.1 - is-fullwidth-code-point: 3.0.0 - lodash: 4.17.21 - lodash-es: 4.17.21 - patch-console: 1.0.0 - signal-exit: 3.0.7 - slice-ansi: 4.0.0 - string-width: 4.2.3 - vue: 3.2.45 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - yoga-layout-prebuilt: 1.10.0 - dev: false - - /@temir/link/0.0.20: - resolution: {integrity: sha512-l+64ncBBMxdyR+9KzQEmnxm4jkayt92NN8EC2Ix57pLkbO9b6jYLm5KZgFrIJAqFnu7Kb0xJCfzpEEK/y+jdIQ==} - engines: {node: '>=14'} - dependencies: - '@temir/core': 0.0.20 - '@vue/runtime-core': 3.2.41 - terminal-link: 2.1.1 - dev: false - /@temir/tab/0.0.20: - resolution: {integrity: sha512-RlmnCqbhNckPGP2cPHLgConXEQLBOYLb9h1xnQLf2uXLyoXEqyYUuidiyODTLQOSeul8iYrShG3Fu7yrNRx4Bg==} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - dependencies: - '@temir/core': 0.0.20 - '@vue/runtime-core': 3.2.41 - readline: 1.3.0 - dev: false - - /@types/node/18.11.10: - resolution: {integrity: sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==} - dev: true - - /@types/yoga-layout/1.9.2: - resolution: {integrity: sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==} - dev: false - - /@vitejs/plugin-vue-jsx/2.0.0_vite@3.0.5+vue@3.2.45: - resolution: {integrity: sha512-WF9ApZ/ivyyW3volQfu0Td0KNPhcccYEaRNzNY1NxRLVJQLSX0nFqquv3e2g7MF74p1XZK4bGtDL2y5i5O5+1A==} - engines: {node: '>=14.18.0'} - peerDependencies: - vite: ^3.0.0 - vue: ^3.0.0 - dependencies: - '@babel/core': 7.19.3 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.19.3 - '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.19.3 - '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.19.3 - vite: 3.0.5 - vue: 3.2.45 - transitivePeerDependencies: - - supports-color - dev: true - /@vitejs/plugin-vue/3.0.1_vite@3.0.5+vue@3.2.45: - resolution: {integrity: sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^3.0.0 - vue: ^3.2.25 - dependencies: - vite: 3.0.5 - vue: 3.2.45 - dev: true - - /@vue/babel-helper-vue-transform-on/1.0.2: - resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} - dev: true - - /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.19.3: - resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} - dependencies: - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.19.3 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.4 - '@babel/types': 7.19.4 - '@vue/babel-helper-vue-transform-on': 1.0.2 - camelcase: 6.3.0 - html-tags: 3.2.0 - svg-tags: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: true - - /@vue/compiler-core/3.2.41: - resolution: {integrity: sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/shared': 3.2.41 - estree-walker: 2.0.2 - source-map: 0.6.1 - dev: true - - /@vue/compiler-core/3.2.45: - resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/shared': 3.2.45 - estree-walker: 2.0.2 - source-map: 0.6.1 - - /@vue/compiler-dom/3.2.41: - resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==} - dependencies: - '@vue/compiler-core': 3.2.41 - '@vue/shared': 3.2.41 - dev: true + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} + cpu: [arm] + os: [android] - /@vue/compiler-dom/3.2.45: - resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} - dependencies: - '@vue/compiler-core': 3.2.45 - '@vue/shared': 3.2.45 + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} + cpu: [arm64] + os: [android] - /@vue/compiler-sfc/3.2.41: - resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/compiler-core': 3.2.41 - '@vue/compiler-dom': 3.2.41 - '@vue/compiler-ssr': 3.2.41 - '@vue/reactivity-transform': 3.2.41 - '@vue/shared': 3.2.41 - estree-walker: 2.0.2 - magic-string: 0.25.9 - postcss: 8.4.18 - source-map: 0.6.1 - dev: true + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} + cpu: [arm64] + os: [darwin] - /@vue/compiler-sfc/3.2.45: - resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/compiler-core': 3.2.45 - '@vue/compiler-dom': 3.2.45 - '@vue/compiler-ssr': 3.2.45 - '@vue/reactivity-transform': 3.2.45 - '@vue/shared': 3.2.45 - estree-walker: 2.0.2 - magic-string: 0.25.9 - postcss: 8.4.18 - source-map: 0.6.1 + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} + cpu: [x64] + os: [darwin] - /@vue/compiler-ssr/3.2.41: - resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==} - dependencies: - '@vue/compiler-dom': 3.2.41 - '@vue/shared': 3.2.41 - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} + cpu: [arm] + os: [linux] - /@vue/compiler-ssr/3.2.45: - resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} - dependencies: - '@vue/compiler-dom': 3.2.45 - '@vue/shared': 3.2.45 + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} + cpu: [arm] + os: [linux] - /@vue/reactivity-transform/3.2.41: - resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/compiler-core': 3.2.41 - '@vue/shared': 3.2.41 - estree-walker: 2.0.2 - magic-string: 0.25.9 - dev: true + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} + cpu: [arm64] + os: [linux] - /@vue/reactivity-transform/3.2.45: - resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} - dependencies: - '@babel/parser': 7.19.4 - '@vue/compiler-core': 3.2.45 - '@vue/shared': 3.2.45 - estree-walker: 2.0.2 - magic-string: 0.25.9 + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} + cpu: [arm64] + os: [linux] - /@vue/reactivity/3.2.41: - resolution: {integrity: sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==} - dependencies: - '@vue/shared': 3.2.41 - dev: false + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} + cpu: [ppc64] + os: [linux] - /@vue/reactivity/3.2.45: - resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} - dependencies: - '@vue/shared': 3.2.45 + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} + cpu: [riscv64] + os: [linux] - /@vue/runtime-core/3.2.41: - resolution: {integrity: sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==} - dependencies: - '@vue/reactivity': 3.2.41 - '@vue/shared': 3.2.41 - dev: false + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} + cpu: [s390x] + os: [linux] - /@vue/runtime-core/3.2.45: - resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} - dependencies: - '@vue/reactivity': 3.2.45 - '@vue/shared': 3.2.45 + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} + cpu: [x64] + os: [linux] - /@vue/runtime-dom/3.2.45: - resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} - dependencies: - '@vue/runtime-core': 3.2.45 - '@vue/shared': 3.2.45 - csstype: 2.6.21 + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} + cpu: [x64] + os: [linux] - /@vue/server-renderer/3.2.45_vue@3.2.45: - resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} - peerDependencies: - vue: 3.2.45 - dependencies: - '@vue/compiler-ssr': 3.2.45 - '@vue/shared': 3.2.45 - vue: 3.2.45 + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} + cpu: [arm64] + os: [win32] - /@vue/shared/3.2.41: - resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} + cpu: [ia32] + os: [win32] - /@vue/shared/3.2.45: - resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} + cpu: [x64] + os: [win32] - /acorn/8.8.0: - resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - /ansi-escapes/4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: false + '@types/node@22.5.2': + resolution: {integrity: sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==} - /ansi-regex/5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} - /ansi-styles/4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: false + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} - /ansis/1.5.5: - resolution: {integrity: sha512-DNctovTacxs/NfZpGo6bIGWgLd2oZsDO7RJbiYX6Ttj40LPZM1XKv9WtesH13ieOEm1GajjD+Vik2n9YnSTPdA==} - engines: {node: '>=12.13'} - dev: false + ansis@3.3.2: + resolution: {integrity: sha512-cFthbBlt+Oi0i9Pv/j6YdVWJh54CtjGACaMPCIrEV4Ha7HWsIjXDwseYV79TIL0B4+KfSwD5S70PeQDkPUd1rA==} + engines: {node: '>=15'} - /any-promise/1.3.0: + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /array-union/2.1.0: + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true - /astral-regex/2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: false - - /auto-bind/4.0.0: - resolution: {integrity: sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==} - engines: {node: '>=8'} - dev: false - - /balanced-match/1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - dev: true - /blive-message-listener/0.4.0: - resolution: {integrity: sha512-JiKwtl8zxOqvYs6fvjYu5mvC9BuNX8UJOaCRiOj146UfGFQJoTxEJVh49U4OjmEl9EFR+JN3KzMhve51uDFCug==} - dependencies: - tiny-bilibili-ws: 0.0.5 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false + blive-message-listener@0.5.0: + resolution: {integrity: sha512-XAeHQ/C/EraBskmlL6k4vbH1rGwKZBLW06MObD8FiumHtOe9wBi9IKYiIXM5aL1Ik3V+u2lovvR/y/+++zb6Eg==} - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - /browserslist/4.21.4: - resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001420 - electron-to-chromium: 1.4.283 - node-releases: 2.0.6 - update-browserslist-db: 1.0.10_browserslist@4.21.4 - dev: true + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} - /bundle-require/3.1.2_esbuild@0.15.11: - resolution: {integrity: sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==} + bundle-require@5.0.0: + resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.13' - dependencies: - esbuild: 0.15.11 - load-tsconfig: 0.2.3 - dev: true - - /busboy/1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false + esbuild: '>=0.18' - /cac/6.7.14: + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite/1.0.30001420: - resolution: {integrity: sha512-OnyeJ9ascFA9roEj72ok2Ikp7PHJTKubtEJIQ/VK3fdsS50q4KWy+Z5X0A1/GswEItKX0ctAp8n4SYDE7wTu6A==} - dev: true - - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /ci-info/3.5.0: - resolution: {integrity: sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw==} - dev: false - - /cli-boxes/2.2.1: - resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} - engines: {node: '>=6'} - dev: false - - /cli-cursor/3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: false - - /cli-truncate/2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: false - - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - /color-convert/2.0.1: + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name/1.1.4: + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - /commander/4.1.1: + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} - dev: true - - /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} - dev: true - /convert-source-map/1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true + consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} - /cross-spawn/7.0.3: + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /csstype/2.6.21: - resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} - - /dayjs/1.11.6: - resolution: {integrity: sha512-zZbY5giJAinCG+7AGaw0wIhNZ6J8AhWuSXKvuc1KAyMiRsvGQWqh4L+MomvhdAYjN+lqvVCMq1I41e3YHvXkyQ==} - dev: false - - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - dev: true - /destr/1.2.1: - resolution: {integrity: sha512-ud8w0qMLlci6iFG7CNgeRr8OcbUWMsbfjtWft1eJ5Luqrz/M8Ebqk/KCzne8rKUlIQWWfLv0wD6QHrqOf4GshA==} - dev: false + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} - /dir-glob/3.0.1: + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + destr@2.0.3: + resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - /electron-to-chromium/1.4.283: - resolution: {integrity: sha512-g6RQ9zCOV+U5QVHW9OpFR7rdk/V7xfopNXnyAamdpFgCHgZ1sjI8VuR1+zG2YG/TZk+tQ8mpNkug4P8FU0fuOA==} - dev: true + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /emoji-regex/8.0.0: + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - /esbuild-android-64/0.14.54: - resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-fetch-native@1.6.4: + resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + ofetch@1.3.4: + resolution: {integrity: sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss@8.4.44: + resolution: {integrity: sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==} + engines: {node: ^10 || ^12 || >=14} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-64/0.15.11: - resolution: {integrity: sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-arm64/0.14.54: - resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + tiny-bilibili-ws@1.0.0: + resolution: {integrity: sha512-fMyAyzPMcGSwIZGSmUQ4W/k5i5cWIkQtrq/IfNDauKbkG7PALKaMDNk4YQerJMQWKnWYutEcwOILVytTvKm/nw==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsup@8.2.4: + resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + +snapshots: + + '@esbuild/aix-ppc64@0.23.1': optional: true - /esbuild-android-arm64/0.15.11: - resolution: {integrity: sha512-/hDubOg7BHOhUUsT8KUIU7GfZm5bihqssvqK5PfO4apag7YuObZRZSzViyEKcFn2tPeHx7RKbSBXvAopSHDZJQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true + '@esbuild/android-arm64@0.23.1': optional: true - /esbuild-darwin-64/0.14.54: - resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/android-arm@0.23.1': optional: true - /esbuild-darwin-64/0.15.11: - resolution: {integrity: sha512-1DqHD0ms3AhiwkKnjRUzmiW7JnaJJr5FKrPiR7xuyMwnjDqvNWDdMq4rKSD9OC0piFNK6n0LghsglNMe2MwJtA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/android-x64@0.23.1': optional: true - /esbuild-darwin-arm64/0.14.54: - resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-arm64@0.23.1': optional: true - /esbuild-darwin-arm64/0.15.11: - resolution: {integrity: sha512-OMzhxSbS0lwwrW40HHjRCeVIJTURdXFA8c3GU30MlHKuPCcvWNUIKVucVBtNpJySXmbkQMDJdJNrXzNDyvoqvQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true + '@esbuild/darwin-x64@0.23.1': optional: true - /esbuild-freebsd-64/0.14.54: - resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-arm64@0.23.1': optional: true - /esbuild-freebsd-64/0.15.11: - resolution: {integrity: sha512-8dKP26r0/Qyez8nTCwpq60QbuYKOeBygdgOAWGCRalunyeqWRoSZj9TQjPDnTTI9joxd3QYw3UhVZTKxO9QdRg==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/freebsd-x64@0.23.1': optional: true - /esbuild-freebsd-arm64/0.14.54: - resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/linux-arm64@0.23.1': optional: true - /esbuild-freebsd-arm64/0.15.11: - resolution: {integrity: sha512-aSGiODiukLGGnSg/O9+cGO2QxEacrdCtCawehkWYTt5VX1ni2b9KoxpHCT9h9Y6wGqNHmXFnB47RRJ8BIqZgmQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true + '@esbuild/linux-arm@0.23.1': optional: true - /esbuild-linux-32/0.14.54: - resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ia32@0.23.1': optional: true - /esbuild-linux-32/0.15.11: - resolution: {integrity: sha512-lsrAfdyJBGx+6aHIQmgqUonEzKYeBnyfJPkT6N2dOf1RoXYYV1BkWB6G02tjsrz1d5wZzaTc3cF+TKmuTo/ZwA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-loong64@0.23.1': optional: true - /esbuild-linux-64/0.14.54: - resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-mips64el@0.23.1': optional: true - /esbuild-linux-64/0.15.11: - resolution: {integrity: sha512-Y2Rh+PcyVhQqXKBTacPCltINN3uIw2xC+dsvLANJ1SpK5NJUtxv8+rqWpjmBgaNWKQT1/uGpMmA9olALy9PLVA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-ppc64@0.23.1': optional: true - /esbuild-linux-arm/0.14.54: - resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-riscv64@0.23.1': optional: true - /esbuild-linux-arm/0.15.11: - resolution: {integrity: sha512-TJllTVk5aSyqPFvvcHTvf6Wu1ZKhWpJ/qNmZO8LL/XeB+LXCclm7HQHNEIz6MT7IX8PmlC1BZYrOiw2sXSB95A==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-s390x@0.23.1': optional: true - /esbuild-linux-arm64/0.14.54: - resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/linux-x64@0.23.1': optional: true - /esbuild-linux-arm64/0.15.11: - resolution: {integrity: sha512-uhcXiTwTmD4OpxJu3xC5TzAAw6Wzf9O1XGWL448EE9bqGjgV1j+oK3lIHAfsHnuIn8K4nDW8yjX0Sv5S++oRuw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/netbsd-x64@0.23.1': optional: true - /esbuild-linux-mips64le/0.14.54: - resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/openbsd-arm64@0.23.1': optional: true - /esbuild-linux-mips64le/0.15.11: - resolution: {integrity: sha512-WD61y/R1M4BLe4gxXRypoQ0Ci+Vjf714QYzcPNkiYv5I8K8WDz2ZR8Bm6cqKxd6rD+e/rZgPDbhQ9PCf7TMHmA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/openbsd-x64@0.23.1': optional: true - /esbuild-linux-ppc64le/0.14.54: - resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/sunos-x64@0.23.1': optional: true - /esbuild-linux-ppc64le/0.15.11: - resolution: {integrity: sha512-JVleZS9oPVLTlBhPTWgOwxFWU/wMUdlBwTbGA4GF8c38sLbS13cupj+C8bLq929jU7EMWry4SaL+tKGIaTlqKg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/win32-arm64@0.23.1': optional: true - /esbuild-linux-riscv64/0.14.54: - resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/win32-ia32@0.23.1': optional: true - /esbuild-linux-riscv64/0.15.11: - resolution: {integrity: sha512-9aLIalZ2HFHIOZpmVU11sEAS9F8TnHw49daEjcgMpBXHFF57VuT9f9/9LKJhw781Gda0P9jDkuCWJ0tFbErvJw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true + '@esbuild/win32-x64@0.23.1': optional: true - /esbuild-linux-s390x/0.14.54: - resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@napi-rs/cli@2.18.4': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': optional: true - /esbuild-linux-s390x/0.15.11: - resolution: {integrity: sha512-sZHtiXXOKsLI3XGBGoYO4qKBzJlb8xNsWmvFiwFMHFzA4AXgDP1KDp7Dawe9C2pavTRBDvl+Ok4n/DHQ59oaTg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm-eabi@4.21.2': optional: true - /esbuild-netbsd-64/0.14.54: - resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@rollup/rollup-android-arm64@4.21.2': optional: true - /esbuild-netbsd-64/0.15.11: - resolution: {integrity: sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-arm64@4.21.2': optional: true - /esbuild-openbsd-64/0.14.54: - resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@rollup/rollup-darwin-x64@4.21.2': optional: true - /esbuild-openbsd-64/0.15.11: - resolution: {integrity: sha512-0bBo9SQR4t66Wd91LGMAqmWorzO0TTzVjYiifwoFtel8luFeXuPThQnEm5ztN4g0fnvcp7AnUPPzS/Depf17wQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': optional: true - /esbuild-sunos-64/0.14.54: - resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm-musleabihf@4.21.2': optional: true - /esbuild-sunos-64/0.15.11: - resolution: {integrity: sha512-EuBdTGlsMTjEl1sQnBX2jfygy7iR6CKfvOzi+gEOfhDqbHXsmY1dcpbVtcwHAg9/2yUZSfMJHMAgf1z8M4yyyw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-gnu@4.21.2': optional: true - /esbuild-windows-32/0.14.54: - resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-arm64-musl@4.21.2': optional: true - /esbuild-windows-32/0.15.11: - resolution: {integrity: sha512-O0/Wo1Wk6dc0rZSxkvGpmTNIycEznHmkObTFz2VHBhjPsO4ZpCgfGxNkCpz4AdAIeMczpTXt/8d5vdJNKEGC+Q==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': optional: true - /esbuild-windows-64/0.14.54: - resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-riscv64-gnu@4.21.2': optional: true - /esbuild-windows-64/0.15.11: - resolution: {integrity: sha512-x977Q4HhNjnHx00b4XLAnTtj5vfbdEvkxaQwC1Zh5AN8g5EX+izgZ6e5QgqJgpzyRNJqh4hkgIJF1pyy1be0mQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-s390x-gnu@4.21.2': optional: true - /esbuild-windows-arm64/0.14.54: - resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-gnu@4.21.2': optional: true - /esbuild-windows-arm64/0.15.11: - resolution: {integrity: sha512-VwUHFACuBahrvntdcMKZteUZ9HaYrBRODoKe4tIWxguQRvvYoYb7iu5LrcRS/FQx8KPZNaa72zuqwVtHeXsITw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true + '@rollup/rollup-linux-x64-musl@4.21.2': optional: true - /esbuild/0.14.54: - resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/linux-loong64': 0.14.54 - esbuild-android-64: 0.14.54 - esbuild-android-arm64: 0.14.54 - esbuild-darwin-64: 0.14.54 - esbuild-darwin-arm64: 0.14.54 - esbuild-freebsd-64: 0.14.54 - esbuild-freebsd-arm64: 0.14.54 - esbuild-linux-32: 0.14.54 - esbuild-linux-64: 0.14.54 - esbuild-linux-arm: 0.14.54 - esbuild-linux-arm64: 0.14.54 - esbuild-linux-mips64le: 0.14.54 - esbuild-linux-ppc64le: 0.14.54 - esbuild-linux-riscv64: 0.14.54 - esbuild-linux-s390x: 0.14.54 - esbuild-netbsd-64: 0.14.54 - esbuild-openbsd-64: 0.14.54 - esbuild-sunos-64: 0.14.54 - esbuild-windows-32: 0.14.54 - esbuild-windows-64: 0.14.54 - esbuild-windows-arm64: 0.14.54 - dev: true - - /esbuild/0.15.11: - resolution: {integrity: sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.15.11 - '@esbuild/linux-loong64': 0.15.11 - esbuild-android-64: 0.15.11 - esbuild-android-arm64: 0.15.11 - esbuild-darwin-64: 0.15.11 - esbuild-darwin-arm64: 0.15.11 - esbuild-freebsd-64: 0.15.11 - esbuild-freebsd-arm64: 0.15.11 - esbuild-linux-32: 0.15.11 - esbuild-linux-64: 0.15.11 - esbuild-linux-arm: 0.15.11 - esbuild-linux-arm64: 0.15.11 - esbuild-linux-mips64le: 0.15.11 - esbuild-linux-ppc64le: 0.15.11 - esbuild-linux-riscv64: 0.15.11 - esbuild-linux-s390x: 0.15.11 - esbuild-netbsd-64: 0.15.11 - esbuild-openbsd-64: 0.15.11 - esbuild-sunos-64: 0.15.11 - esbuild-windows-32: 0.15.11 - esbuild-windows-64: 0.15.11 - esbuild-windows-arm64: 0.15.11 - dev: true - - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true + '@rollup/rollup-win32-arm64-msvc@4.21.2': + optional: true - /escape-string-regexp/1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true + '@rollup/rollup-win32-ia32-msvc@4.21.2': + optional: true - /estree-walker/2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true - /eventemitter3/4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false + '@types/estree@1.0.5': {} - /execa/5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + '@types/node@22.5.2': dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true + undici-types: 6.19.8 - /fast-glob/3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + ansis@3.3.2: {} + + any-promise@1.3.0: {} - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + anymatch@3.1.3: dependencies: - reusify: 1.0.4 - dev: true + normalize-path: 3.0.0 + picomatch: 2.3.1 - /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + array-union@2.1.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + blive-message-listener@0.5.0: dependencies: - to-regex-range: 5.0.1 - dev: true + tiny-bilibili-ws: 1.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - /fs.realpath/1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true + braces@3.0.3: + dependencies: + fill-range: 7.1.1 - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 - /gensync/1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + bundle-require@5.0.0(esbuild@0.23.1): + dependencies: + esbuild: 0.23.1 + load-tsconfig: 0.2.5 - /get-stream/6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + cac@6.7.14: {} - /glob-parent/5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + chokidar@3.6.0: dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 is-glob: 4.0.3 - dev: true + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - /glob/7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + color-convert@2.0.1: dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true + color-name: 1.1.4 - /globals/11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + color-name@1.1.4: {} - /globby/11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + commander@4.1.1: {} + + consola@3.2.3: {} + + cross-spawn@7.0.3: dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true + debug@4.3.6: + dependencies: + ms: 2.1.2 - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false + default-browser-id@5.0.0: {} - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + default-browser@5.2.1: dependencies: - function-bind: 1.1.1 - dev: true + bundle-name: 4.1.0 + default-browser-id: 5.0.0 - /hash-sum/2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: true + define-lazy-prop@3.0.0: {} - /html-tags/3.2.0: - resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} - engines: {node: '>=8'} - dev: true + destr@2.0.3: {} - /human-signals/2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true + eastasianwidth@0.2.0: {} - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: false + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 - /inflight/1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + fast-glob@3.3.2: dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true + get-stream@6.0.1: {} - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + glob-parent@5.1.2: dependencies: - binary-extensions: 2.2.0 - dev: true + is-glob: 4.0.3 - /is-ci/3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true + glob@10.4.5: dependencies: - ci-info: 3.5.0 - dev: false + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 - /is-core-module/2.10.0: - resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} + globby@11.1.0: dependencies: - has: 1.0.3 - dev: true + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 - /is-extglob/2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true + human-signals@2.1.0: {} - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false + ignore@5.3.2: {} - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-binary-path@2.1.0: dependencies: - is-extglob: 2.1.1 - dev: true + binary-extensions: 2.3.0 - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true + is-docker@3.0.0: {} - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-extglob@2.1.1: {} - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + is-fullwidth-code-point@3.0.0: {} - /joycon/3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: true + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 - /jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + is-number@7.0.0: {} - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} - engines: {node: '>=6'} - hasBin: true - dev: true + is-stream@2.0.1: {} - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 - /lilconfig/2.0.6: - resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} - engines: {node: '>=10'} - dev: true + isexe@2.0.0: {} - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - /load-tsconfig/0.2.3: - resolution: {integrity: sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + joycon@3.1.1: {} - /lodash-es/4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lilconfig@3.1.2: {} - /lodash.sortby/4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: true + lines-and-columns@1.2.4: {} - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + load-tsconfig@0.2.5: {} - /magic-string/0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - dependencies: - sourcemap-codec: 1.4.8 + lodash.sortby@4.7.0: {} - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + lru-cache@10.4.3: {} - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge-stream@2.0.0: {} - /micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + merge2@1.4.1: {} + + micromatch@4.0.8: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: dependencies: - brace-expansion: 1.1.11 - dev: true + brace-expansion: 2.0.1 - /mlly/0.5.16: - resolution: {integrity: sha512-LaJ8yuh4v0zEmge/g3c7jjFlhoCPfQn6RCjXgm9A0Qiuochq4BcuOxVfWmdnCoLTlg2MV+hqhOek+W2OhG0Lwg==} - dependencies: - acorn: 8.8.0 - pathe: 0.3.9 - pkg-types: 0.3.5 - ufo: 0.8.6 - dev: true + minipass@7.1.2: {} - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true + ms@2.1.2: {} - /mz/2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: true - - /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - /node-fetch-native/0.1.8: - resolution: {integrity: sha512-ZNaury9r0NxaT2oL65GvdGDy+5PlSaHTovT6JV5tOW07k1TQmgC0olZETa4C9KZg0+6zBr99ctTYa3Utqj9P/Q==} - dev: false + nanoid@3.3.7: + optional: true - /node-releases/2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: true + node-fetch-native@1.6.4: {} - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true + normalize-path@3.0.0: {} - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - /ohmyfetch/0.4.21: - resolution: {integrity: sha512-VG7f/JRvqvBOYvL0tHyEIEG7XHWm7OqIfAs6/HqwWwDfjiJ1g0huIpe5sFEmyb+7hpFa1EGNH2aERWR72tlClw==} - dependencies: - destr: 1.2.1 - node-fetch-native: 0.1.8 - ufo: 0.8.6 - undici: 5.13.0 - dev: false + object-assign@4.1.1: {} - /once/1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + ofetch@1.3.4: dependencies: - wrappy: 1.0.2 - dev: true + destr: 2.0.3 + node-fetch-native: 1.6.4 + ufo: 1.5.4 - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /pako/2.0.4: - resolution: {integrity: sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==} - dev: false - - /patch-console/1.0.0: - resolution: {integrity: sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==} - engines: {node: '>=10'} - dev: false - - /path-is-absolute/1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true + package-json-from-dist@1.0.0: {} - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + pako@2.1.0: {} - /pathe/0.2.0: - resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} - dev: true + path-key@3.1.1: {} - /pathe/0.3.9: - resolution: {integrity: sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g==} - dev: true + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + path-type@4.0.0: {} - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true + picocolors@1.0.1: {} - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true + picomatch@2.3.1: {} - /pkg-types/0.3.5: - resolution: {integrity: sha512-VkxCBFVgQhNHYk9subx+HOhZ4jzynH11ah63LZsprTKwPCWG9pfWBlkElWFbvkP9BVR0dP1jS9xPdhaHQNK74Q==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 0.5.16 - pathe: 0.3.9 - dev: true + pirates@4.0.6: {} - /postcss-load-config/3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@6.0.1(postcss@8.4.44): dependencies: - lilconfig: 2.0.6 - yaml: 1.10.2 - dev: true + lilconfig: 3.1.2 + optionalDependencies: + postcss: 8.4.44 - /postcss/8.4.18: - resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.44: dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + optional: true - /punycode/2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /queue-microtask/1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - - /readline/1.3.0: - resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - dev: false - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve/1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.10.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true + reusify@1.0.4: {} - /restore-cursor/3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + rollup@4.21.2: dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false - - /reusify/1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rollup/2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /rollup/3.5.1: - resolution: {integrity: sha512-hdQWTvPeiAbM6SUkxV70HdGUVxsgsc+CLy5fuh4KdgUBJ0SowXiix8gANgXoG3wEuLwfoJhCT2V+WwxfWq9Ikw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true + '@types/estree': 1.0.5 optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel/1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 + fsevents: 2.3.3 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /shebang-command/2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex/3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + shebang-regex@3.0.0: {} - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slice-ansi/3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: false + signal-exit@3.0.7: {} - /slice-ansi/4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: false + signal-exit@4.1.0: {} - /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + slash@3.0.0: {} - /source-map/0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map-js@1.2.0: + optional: true - /source-map/0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 - dev: true - /sourcemap-codec/1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - - /streamsearch/1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: false - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 - /sucrase/3.28.0: - resolution: {integrity: sha512-TK9600YInjuiIhVM3729rH4ZKPOsGeyXUwY+Ugu9eilNbdTFyHr6XcAGYbRVZPDgWj6tgI7bx95aaJjHnbffag==} - engines: {node: '>=8'} - hasBin: true + strip-final-newline@2.0.0: {} + + sucrase@3.35.0: dependencies: + '@jridgewell/gen-mapping': 0.3.5 commander: 4.1.1 - glob: 7.1.6 + glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.5 + pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: true - - /supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /supports-hyperlinks/2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: false - - /supports-preserve-symlinks-flag/1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /svg-tags/1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true - - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - dev: false - /thenify-all/1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: true - /thenify/3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: true - /tiny-bilibili-ws/0.0.5: - resolution: {integrity: sha512-MRJfp4h2BOuJE05RGEXP+chVa+6xlvKZXFVKWrXW+B50kuF5R4q0sX6P6ZzRS3gV8rsXCKgdWI9vk5DvbUkGHw==} + tiny-bilibili-ws@1.0.0: dependencies: - eventemitter3: 4.0.7 - pako: 2.0.4 - ws: 8.9.0 + pako: 2.1.0 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - - /to-fast-properties/2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - /to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: true - /tr46/1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + tr46@1.0.1: dependencies: - punycode: 2.1.1 - dev: true - - /tree-kill/1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + punycode: 2.3.1 - /ts-interface-checker/0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true + tree-kill@1.2.2: {} - /tsup/6.5.0: - resolution: {integrity: sha512-36u82r7rYqRHFkD15R20Cd4ercPkbYmuvRkz3Q1LCm5BsiFNUgpo36zbjVhCOgvjyxNBWNKHsaD5Rl8SykfzNA==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: ^4.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - dependencies: - bundle-require: 3.1.2_esbuild@0.15.11 - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.15.11 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss-load-config: 3.1.4 - resolve-from: 5.0.0 - rollup: 3.5.1 - source-map: 0.8.0-beta.0 - sucrase: 3.28.0 - tree-kill: 1.2.2 - transitivePeerDependencies: - - supports-color - - ts-node - dev: true + ts-interface-checker@0.1.13: {} - /tsup/6.5.0_typescript@4.9.3: - resolution: {integrity: sha512-36u82r7rYqRHFkD15R20Cd4ercPkbYmuvRkz3Q1LCm5BsiFNUgpo36zbjVhCOgvjyxNBWNKHsaD5Rl8SykfzNA==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: ^4.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true + tsup@8.2.4(postcss@8.4.44)(typescript@5.5.4): dependencies: - bundle-require: 3.1.2_esbuild@0.15.11 + bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.15.11 + chokidar: 3.6.0 + consola: 3.2.3 + debug: 4.3.6 + esbuild: 0.23.1 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 3.1.4 + picocolors: 1.0.1 + postcss-load-config: 6.0.1(postcss@8.4.44) resolve-from: 5.0.0 - rollup: 3.5.1 + rollup: 4.21.2 source-map: 0.8.0-beta.0 - sucrase: 3.28.0 + sucrase: 3.35.0 tree-kill: 1.2.2 - typescript: 4.9.3 + optionalDependencies: + postcss: 8.4.44 + typescript: 5.5.4 transitivePeerDependencies: + - jiti - supports-color - - ts-node - dev: true - - /type-fest/0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: false + - tsx + - yaml - /typescript/4.9.3: - resolution: {integrity: sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - - /ufo/0.8.6: - resolution: {integrity: sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==} - - /undici/5.13.0: - resolution: {integrity: sha512-UDZKtwb2k7KRsK4SdXWG7ErXiL7yTGgLWvk2AXO1JMjgjh404nFo6tWSCM2xMpJwMPx3J8i/vfqEh1zOqvj82Q==} - engines: {node: '>=12.18'} - dependencies: - busboy: 1.6.0 - dev: false - - /update-browserslist-db/1.0.10_browserslist@4.21.4: - resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.4 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true + typescript@5.5.4: {} - /vite-node/0.21.1: - resolution: {integrity: sha512-JYEGMLovQOFoInIbSEXWApBp9ycEJEvlHFLheeR27ZXwpN7Oqy0jNJzh4gsmowTJt1VxtDwjkIU1p359Q/anAw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - debug: 4.3.4 - mlly: 0.5.16 - pathe: 0.2.0 - vite: 3.0.5 - transitivePeerDependencies: - - less - - sass - - stylus - - supports-color - - terser - dev: true - - /vite/3.0.5: - resolution: {integrity: sha512-bRvrt9Tw8EGW4jj64aYFTnVg134E8hgDxyl/eEHnxiGqYk7/pTPss6CWlurqPOUzqvEoZkZ58Ws+Iu8MB87iMA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - less: '*' - sass: '*' - stylus: '*' - terser: ^5.4.0 - peerDependenciesMeta: - less: - optional: true - sass: - optional: true - stylus: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.14.54 - postcss: 8.4.18 - resolve: 1.22.1 - rollup: 2.79.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true + ufo@1.5.4: {} - /vue/3.2.45: - resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} - dependencies: - '@vue/compiler-dom': 3.2.45 - '@vue/compiler-sfc': 3.2.45 - '@vue/runtime-dom': 3.2.45 - '@vue/server-renderer': 3.2.45_vue@3.2.45 - '@vue/shared': 3.2.45 + undici-types@6.19.8: {} - /webidl-conversions/4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: true + webidl-conversions@4.0.2: {} - /whatwg-url/7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + whatwg-url@7.1.0: dependencies: lodash.sortby: 4.7.0 tr46: 1.0.1 webidl-conversions: 4.0.2 - dev: true - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - - /widest-line/3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - dependencies: - string-width: 4.2.3 - dev: false - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - - /wrappy/1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /ws/8.9.0: - resolution: {integrity: sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - /yaml/1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yoga-layout-prebuilt/1.10.0: - resolution: {integrity: sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==} - engines: {node: '>=8'} + wrap-ansi@8.1.0: dependencies: - '@types/yoga-layout': 1.9.2 - dev: false + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + ws@8.18.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eccc335..924b55f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,2 @@ packages: - - 'packages/**' \ No newline at end of file + - packages/*