diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca4909f0ba..4b000961f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,45 +5,16 @@ on: branches: - master +permissions: + contents: write + env: IS_CI: 'true' jobs: - # CheckCode: - # name: Lint Code - # runs-on: ubuntu-latest - # steps: - # - name: Check out git repository - # uses: actions/checkout@v6 - - # - name: Install Node.js - # uses: actions/setup-node@v4 - # with: - # node-version: 20 - - # - name: Cache file - # uses: actions/cache@v4 - # with: - # path: | - # node_modules - # $HOME/.cache/electron - # $HOME/.cache/electron-builder - # $HOME/.npm/_prebuilds - # key: ${{ runner.os }}-build-caches-${{ hashFiles('**/package-lock.json') }} - # restore-keys: | - # ${{ runner.os }}-build- - - # - name: Install Dependencies - # run: | - # npm ci - - # - name: Lint src code - # run: npm run lint - Windows: name: Windows runs-on: windows-latest - # needs: CheckCode steps: - name: Check out git repository uses: actions/checkout@v6 @@ -65,26 +36,52 @@ jobs: git status --porcelain npm run build - - name: Release package - run: | - npm run publish:win:7z:x64 - npm run publish:win:7z:arm64 - npm run publish:win:setup:arm64 - npm run publish:win:setup:x64 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BT_TOKEN: ${{ secrets.BT_TOKEN }} + - name: Build Package Setup x64 + run: npm run pack:win:setup:x64 + + - name: Upload Artifact Setup x64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-x64-Setup + path: build/*-x64-Setup.exe + + - name: Build Package 7z x64 + run: npm run pack:win:7z:x64 + + - name: Upload Artifact 7z x64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-win_x64-green + path: build/*win_x64-green.7z + + - name: Build Package Setup arm64 + run: npm run pack:win:setup:arm64 + + - name: Upload Artifact Setup arm64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-arm64-Setup + path: build/*-arm64-Setup.exe + + - name: Build Package 7z arm64 + run: npm run pack:win:7z:arm64 + + - name: Upload Artifact 7z arm64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-win_arm64-green + path: build/*win_arm64-green.7z - name: Generate file MD5 run: | cd build Get-FileHash *.exe,*.7z -Algorithm MD5 | Format-List - Windows_7: name: Windows_7 runs-on: windows-latest - # needs: CheckCode + env: + BUILD_WIN7: true steps: - name: Check out git repository uses: actions/checkout@v6 @@ -115,14 +112,32 @@ jobs: npm install electron@22 pip.exe install setuptools - - name: Release win7 package - run: | - npm run publish:win7:setup:x64 - npm run publish:win7:7z:x64 - npm run publish:win7:7z:x86 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BT_TOKEN: ${{ secrets.BT_TOKEN }} + - name: Build Package win7 Setup x64 + run: npm run pack:win7:setup:x64 + + - name: Upload Artifact win7 Setup x64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-win7_x64-Setup + path: build/*win7_x64-Setup.exe + + - name: Build Package win7 7z x64 + run: npm run pack:win7:7z:x64 + + - name: Upload Artifact win7 7z x64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-win7_x64-green + path: build/*win7_x64-green.7z + + - name: Build Package win7 7z x86 + run: npm run pack:win7:7z:x86 + + - name: Upload Artifact win7 7z x86 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-win7_x86-green + path: build/*win7_x86-green.7z - name: Generate file MD5 run: | @@ -132,7 +147,6 @@ jobs: Mac: name: Mac runs-on: macos-latest - # needs: CheckCode steps: - name: Check out git repository uses: actions/checkout@v6 @@ -146,6 +160,7 @@ jobs: - name: Show Env run: echo "${{ env.NPM_CACHE }}" + - name: Setup Node Env env: NPM_CACHE: ${{ env.NPM_CACHE }} @@ -156,13 +171,24 @@ jobs: git status --porcelain npm run build - - name: Release package + - name: Build Package dmg run: | - npm run publish:mac:dmg - npm run publish:mac:dmg:arm64 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BT_TOKEN: ${{ secrets.BT_TOKEN }} + npm run pack:mac:dmg + npm run pack:mac:dmg:arm64 + + - name: Upload Artifact dmg + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-mac-dmg + path: | + build/*.dmg + !build/*-arm64.dmg + + - name: Upload Artifact dmg arm64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-mac-dmg-arm64 + path: build/*-arm64.dmg - name: Generate file MD5 run: | @@ -172,7 +198,6 @@ jobs: Linux: name: Linux runs-on: ubuntu-latest - # needs: CheckCode steps: - name: Install package run: sudo apt-get update && sudo apt-get install -y rpm libarchive-tools @@ -186,6 +211,7 @@ jobs: - name: Show Env run: echo "${{ env.NPM_CACHE }}" + - name: Setup Node Env env: NPM_CACHE: ${{ env.NPM_CACHE }} @@ -196,19 +222,130 @@ jobs: git status --porcelain npm run build - - name: Release package - run: | - npm run publish:linux:deb:amd64 - npm run publish:linux:deb:arm64 - npm run publish:linux:deb:armv7l - npm run publish:linux:appImage - npm run publish:linux:rpm - npm run publish:linux:pacman - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BT_TOKEN: ${{ secrets.BT_TOKEN }} + - name: Build Package deb amd64 + run: npm run pack:linux:deb:amd64 + + - name: Upload Artifact deb amd64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-deb-amd64 + path: build/*_amd64.deb + + - name: Build Package deb arm64 + run: npm run pack:linux:deb:arm64 + + - name: Upload Artifact deb arm64 + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-deb-arm64 + path: build/*_arm64.deb + + - name: Build Package deb armv7l + run: npm run pack:linux:deb:armv7l + + - name: Upload Artifact deb armv7l + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-deb-armv7l + path: build/*_armv7l.deb + + - name: Build Package x64 appImage + run: npm run pack:linux:appImage + + - name: Upload Artifact x64 appImage + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-x64-appImage + path: build/*_x64.AppImage + + - name: Build Package x64 rpm + run: npm run pack:linux:rpm + + - name: Upload Artifact x64 rpm + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-x64-rpm + path: build/*.x64.rpm + + - name: Build Package x64 pacman + run: npm run pack:linux:pacman + + - name: Upload Artifact x64 pacman + uses: actions/upload-artifact@v4 + with: + name: lx-music-desktop-x64-pacman + path: build/*_x64.pacman - name: Generate file MD5 run: | cd build md5sum *.deb *.rpm *.pacman *.AppImage + + Release: + name: Release + runs-on: ubuntu-latest + needs: + - Windows + - Windows_7 + - Mac + - Linux + steps: + - name: Check out git repository + uses: actions/checkout@v6 + + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: release-artifacts + + - name: Read version from package.json + id: version + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + echo "tag=v$VERSION" >> "$GITHUB_OUTPUT" + + - name: Flatten artifacts + run: | + mkdir -p release-files + find release-artifacts -type f -exec cp {} release-files/ \; + ls -la release-files + + - name: Delete duplicated draft release + env: + GH_TOKEN: ${{ github.token }} + run: | + gh release list --json tagName,isDraft,name | \ + jq -r '.[] | select(.isDraft == true and .name == "${{ steps.version.outputs.version }}") | .tagName' | \ + while read -r TAG_NAME; do + if [ -n "$TAG_NAME" ]; then + gh release delete "$TAG_NAME" --cleanup-tag --yes || true + fi + done + + - name: Create or update tag + env: + GH_TOKEN: ${{ github.token }} + run: | + if gh release view "${{ steps.version.outputs.tag }}" >/dev/null 2>&1; then + echo "Release already exists for ${{ steps.version.outputs.tag }}" + else + if git rev-parse "${{ steps.version.outputs.tag }}" >/dev/null 2>&1; then + echo "Tag ${{ steps.version.outputs.tag }} already exists" + else + git tag "${{ steps.version.outputs.tag }}" + git push origin "${{ steps.version.outputs.tag }}" + fi + fi + + - name: Create or update GitHub release + env: + GH_TOKEN: ${{ github.token }} + run: | + if gh release view "${{ steps.version.outputs.tag }}" >/dev/null 2>&1; then + gh release upload "${{ steps.version.outputs.tag }}" release-files/* --clobber + else + gh release create "${{ steps.version.outputs.tag }}" release-files/* \ + --title "${{ steps.version.outputs.version }}" \ + --notes "" + fi diff --git a/.gitignore b/.gitignore index 41dd8bdf81..cc0d4619ba 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,5 @@ publish/assets publish/utils/githubToken.js src/**/*-internal.js + +.worktrees/ diff --git a/build-config/build-pack.js b/build-config/build-pack.js index 569252c83b..63af4e9454 100644 --- a/build-config/build-pack.js +++ b/build-config/build-pack.js @@ -47,7 +47,7 @@ const options = { publish: [ { provider: 'github', - owner: 'lyswhut', + owner: 'sunny1028', repo: 'lx-music-desktop', }, ], diff --git a/build-config/pack.js b/build-config/pack.js index b9011d6679..25af558f89 100644 --- a/build-config/pack.js +++ b/build-config/pack.js @@ -8,6 +8,7 @@ const Spinnies = require('spinnies') const mainConfig = './main/webpack.config.prod' const rendererConfig = './renderer/webpack.config.prod' const rendererLyricConfig = './renderer-lyric/webpack.config.prod' +const rendererTaskbarLyricConfig = './renderer-taskbar-lyric/webpack.config.prod' const rendererScriptConfig = './renderer-scripts/webpack.config.prod' const errorLog = chalk.bgRed.white(' ERROR ') + ' ' @@ -24,6 +25,7 @@ function build() { spinners.add('main', { text: 'main building' }) spinners.add('renderer', { text: 'renderer building' }) spinners.add('renderer-lyric', { text: 'renderer-lyric building' }) + spinners.add('renderer-taskbar-lyric', { text: 'renderer-taskbar-lyric building' }) spinners.add('renderer-scripts', { text: 'renderer-scripts building' }) let results = '' @@ -69,6 +71,15 @@ function build() { console.error(`\n${err}\n`) process.exit(1) }), + pack(rendererTaskbarLyricConfig).then(result => { + results += result + '\n\n' + spinners.succeed('renderer-taskbar-lyric', { text: 'renderer-taskbar-lyric build success!' }) + }).catch(err => { + spinners.fail('renderer-taskbar-lyric', { text: 'renderer-taskbar-lyric build fail :(' }) + console.log(`\n ${errorLog}failed to build renderer-taskbar-lyric process`) + console.error(`\n${err}\n`) + process.exit(1) + }), pack(rendererScriptConfig).then(result => { results += result + '\n\n' spinners.succeed('renderer-scripts', { text: 'renderer-scripts build success!' }) diff --git a/build-config/renderer-taskbar-lyric/webpack.config.base.js b/build-config/renderer-taskbar-lyric/webpack.config.base.js new file mode 100644 index 0000000000..c07f084cd2 --- /dev/null +++ b/build-config/renderer-taskbar-lyric/webpack.config.base.js @@ -0,0 +1,147 @@ +const path = require('path') +const { VueLoaderPlugin } = require('vue-loader') +const HTMLPlugin = require('html-webpack-plugin') +const MiniCssExtractPlugin = require('mini-css-extract-plugin') +const ESLintPlugin = require('eslint-webpack-plugin') + +const vueLoaderConfig = require('../vue-loader.config') +const { mergeCSSLoader } = require('../utils') + +const isDev = process.env.NODE_ENV === 'development' + +module.exports = { + target: 'electron-renderer', + entry: { + 'renderer-taskbar-lyric': path.join(__dirname, '../../src/renderer-taskbar-lyric/main.ts'), + }, + output: { + filename: '[name].js', + library: { + type: 'commonjs2', + }, + path: path.join(__dirname, '../../dist'), + publicPath: '', + }, + resolve: { + alias: { + '@root': path.join(__dirname, '../../src'), + '@main': path.join(__dirname, '../../src/main'), + '@renderer': path.join(__dirname, '../../src/renderer'), + '@lyric': path.join(__dirname, '../../src/renderer-lyric'), + '@taskbar-lyric': path.join(__dirname, '../../src/renderer-taskbar-lyric'), + '@static': path.join(__dirname, '../../src/static'), + '@common': path.join(__dirname, '../../src/common'), + }, + extensions: ['.tsx', '.ts', '.js', '.json', '.node'], + }, + module: { + rules: [ + { + test: /\.tsx?$/, + exclude: /node_modules/, + use: { + loader: 'ts-loader', + options: { + appendTsSuffixTo: [/\.vue$/], + configFile: path.join(__dirname, '../../src/renderer-taskbar-lyric/tsconfig.json'), + }, + }, + }, + { + test: /\.node$/, + use: 'node-loader', + }, + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig, + }, + { + test: /\.pug$/, + loader: 'pug-plain-loader', + }, + { + test: /\.css$/, + oneOf: mergeCSSLoader(), + }, + { + test: /\.less$/, + oneOf: mergeCSSLoader({ + loader: 'less-loader', + options: { + sourceMap: true, + }, + }), + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + exclude: path.join(__dirname, '../../src/renderer/assets/svgs'), + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'imgs/[name]-[contenthash:8][ext]', + }, + }, + { + test: /\.svg$/, + include: path.join(__dirname, '../../src/renderer/assets/svgs'), + use: [ + { + loader: 'svg-sprite-loader', + options: { + symbolId: 'icon-[name]', + }, + }, + 'svg-transform-loader', + 'svgo-loader', + ], + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'media/[name]-[contenthash:8][ext]', + }, + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + type: 'asset', + parser: { + dataUrlCondition: { + maxSize: 10000, + }, + }, + generator: { + filename: 'fonts/[name]-[contenthash:8][ext]', + }, + }, + ], + }, + plugins: [ + new HTMLPlugin({ + filename: 'taskbar-lyric.html', + template: path.join(__dirname, '../../src/renderer-taskbar-lyric/index.html'), + isProd: process.env.NODE_ENV == 'production', + browser: process.browser, + __dirname, + }), + new VueLoaderPlugin(), + new MiniCssExtractPlugin({ + filename: isDev ? '[name].css' : '[name].[contenthash:8].css', + chunkFilename: isDev ? '[id].css' : '[id].[contenthash:8].css', + }), + new ESLintPlugin({ + extensions: ['js', 'vue'], + formatter: require('eslint-formatter-friendly'), + }), + ], +} diff --git a/build-config/renderer-taskbar-lyric/webpack.config.dev.js b/build-config/renderer-taskbar-lyric/webpack.config.dev.js new file mode 100644 index 0000000000..b3990efc61 --- /dev/null +++ b/build-config/renderer-taskbar-lyric/webpack.config.dev.js @@ -0,0 +1,26 @@ +const path = require('path') +const webpack = require('webpack') + +const { merge } = require('webpack-merge') + +const baseConfig = require('./webpack.config.base') + +module.exports = merge(baseConfig, { + mode: 'development', + devtool: 'eval-source-map', + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: '"development"', + ELECTRON_DISABLE_SECURITY_WARNINGS: 'true', + }, + __VUE_OPTIONS_API__: 'true', + __VUE_PROD_DEVTOOLS__: 'false', + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false', + staticPath: `"${path.join(__dirname, '../../src/static').replace(/\\/g, '\\\\')}"`, + }), + ], + performance: { + hints: false, + }, +}) diff --git a/build-config/renderer-taskbar-lyric/webpack.config.prod.js b/build-config/renderer-taskbar-lyric/webpack.config.prod.js new file mode 100644 index 0000000000..d90108b547 --- /dev/null +++ b/build-config/renderer-taskbar-lyric/webpack.config.prod.js @@ -0,0 +1,39 @@ +const webpack = require('webpack') +const CssMinimizerPlugin = require('css-minimizer-webpack-plugin') +const TerserPlugin = require('terser-webpack-plugin') +const { merge } = require('webpack-merge') + +const baseConfig = require('./webpack.config.base') +const buildConfig = require('../webpack-build-config') + +module.exports = merge(baseConfig, { + mode: 'production', + devtool: 'source-map', + externals: [], + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: '"production"', + }, + __VUE_OPTIONS_API__: 'true', + __VUE_PROD_DEVTOOLS__: 'false', + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false', + }), + ], + optimization: { + minimize: buildConfig.minimize, + minimizer: [ + new TerserPlugin(), + new CssMinimizerPlugin(), + ], + }, + performance: { + maxEntrypointSize: 1024 * 1024 * 10, + maxAssetSize: 1024 * 1024 * 20, + hints: 'warning', + }, + node: { + __dirname: false, + __filename: false, + }, +}) diff --git a/build-config/runner-dev.js b/build-config/runner-dev.js index 0f6ea64040..858b0e3f32 100644 --- a/build-config/runner-dev.js +++ b/build-config/runner-dev.js @@ -13,6 +13,7 @@ const webpackHotMiddleware = require('webpack-hot-middleware') const mainConfig = require('./main/webpack.config.dev') const rendererConfig = require('./renderer/webpack.config.dev') const rendererLyricConfig = require('./renderer-lyric/webpack.config.dev') +const rendererTaskbarLyricConfig = require('./renderer-taskbar-lyric/webpack.config.dev') const rendererScriptConfig = require('./renderer-scripts/webpack.config.dev') const { Arch } = require('electron-builder') const replaceLib = require('./build-before-pack') @@ -22,6 +23,7 @@ const { debounce } = require('./utils') let electronProcess = null let hotMiddlewareRenderer let hotMiddlewareRendererLyric +let hotMiddlewareRendererTaskbarLyric function startRenderer() { @@ -120,6 +122,42 @@ function startRendererLyric() { }) } +function startRendererTaskbarLyric() { + return new Promise((resolve, reject) => { + const compiler = webpack(rendererTaskbarLyricConfig) + hotMiddlewareRendererTaskbarLyric = webpackHotMiddleware(compiler, { + log: false, + heartbeat: 2500, + }) + + compiler.hooks.compilation.tap('compilation', compilation => { + HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync('html-webpack-plugin-after-emit', (data, cb) => { + hotMiddlewareRendererTaskbarLyric.publish({ action: 'reload' }) + cb() + }) + }) + + const server = new WebpackDevServer({ + port: 9082, + hot: true, + historyApiFallback: true, + client: { + logging: 'warn', + overlay: true, + }, + setupMiddlewares(middlewares, devServer) { + devServer.app.use(hotMiddlewareRendererTaskbarLyric) + setImmediate(() => { + devServer.middleware.waitUntilValid(resolve) + }) + return middlewares + }, + }, compiler) + + server.start() + }) +} + function startRendererScripts() { return new Promise((resolve, reject) => { // mainConfig.entry.main = [path.join(__dirname, '../src/main/index.dev.js')].concat(mainConfig.entry.main) @@ -147,6 +185,7 @@ function startMain() { compiler.hooks.watchRun.tapAsync('watch-run', (compilation, done) => { hotMiddlewareRenderer.publish({ action: 'compiling' }) hotMiddlewareRendererLyric.publish({ action: 'compiling' }) + hotMiddlewareRendererTaskbarLyric.publish({ action: 'compiling' }) done() }) @@ -222,6 +261,7 @@ function init() { spinners.add('main', { text: 'main compiling' }) spinners.add('renderer', { text: 'renderer compiling' }) spinners.add('renderer-lyric', { text: 'renderer-lyric compiling' }) + spinners.add('renderer-taskbar-lyric', { text: 'renderer-taskbar-lyric compiling' }) spinners.add('renderer-scripts', { text: 'renderer-scripts compiling' }) function handleSuccess(name) { spinners.succeed(name, { text: name + ' compile success!' }) @@ -240,6 +280,10 @@ function init() { console.error(err.message) return handleFail('renderer-lyric') }), + startRendererTaskbarLyric().then(() => handleSuccess('renderer-taskbar-lyric')).catch((err) => { + console.error(err.message) + return handleFail('renderer-taskbar-lyric') + }), startRendererScripts().then(() => handleSuccess('renderer-scripts')).catch((err) => { console.error(err.message) return handleFail('renderer-scripts') diff --git a/build-config/tests/list-context-menu.test.mjs b/build-config/tests/list-context-menu.test.mjs new file mode 100644 index 0000000000..9e425df688 --- /dev/null +++ b/build-config/tests/list-context-menu.test.mjs @@ -0,0 +1,34 @@ +import assert from 'node:assert/strict' + +import { shouldCopyListTextOnContextMenu } from '../../src/renderer/utils/listContextMenu.mjs' + +const run = (name, fn) => { + try { + fn() + console.log(`PASS ${name}`) + } catch (error) { + console.error(`FAIL ${name}`) + throw error + } +} + +run('does not hijack row menu when right-clicking selectable text without an active selection', () => { + assert.equal(shouldCopyListTextOnContextMenu({ + isSelectTextTarget: true, + selectionText: '', + }), false) +}) + +run('keeps text copy behavior when right-clicking selected text', () => { + assert.equal(shouldCopyListTextOnContextMenu({ + isSelectTextTarget: true, + selectionText: 'Song Name', + }), true) +}) + +run('ignores non-select targets', () => { + assert.equal(shouldCopyListTextOnContextMenu({ + isSelectTextTarget: false, + selectionText: 'Song Name', + }), false) +}) diff --git a/build-config/tests/player-queue.test.mjs b/build-config/tests/player-queue.test.mjs new file mode 100644 index 0000000000..f39e86428e --- /dev/null +++ b/build-config/tests/player-queue.test.mjs @@ -0,0 +1,71 @@ +import assert from 'node:assert/strict' + +import { + buildPlayQueueSections, + moveTempQueueItem, +} from '../../src/renderer/core/player/queue.mjs' + +const createMusic = (id, name) => ({ + id, + name, + singer: `${name} singer`, + source: 'kw', + interval: '03:00', + meta: { + albumName: `${name} album`, + }, +}) + +const run = (name, fn) => { + try { + fn() + console.log(`PASS ${name}`) + } catch (error) { + console.error(`FAIL ${name}`) + throw error + } +} + +run('buildPlayQueueSections creates temp and base sections with active item metadata', () => { + const tempPlayList = [ + { listId: 'list_a', musicInfo: createMusic('temp_1', 'Temp 1'), isTempPlay: true }, + { listId: 'list_b', musicInfo: createMusic('temp_2', 'Temp 2'), isTempPlay: true }, + ] + const baseList = [ + createMusic('song_1', 'Song 1'), + createMusic('song_2', 'Song 2'), + ] + + const sections = buildPlayQueueSections({ + tempPlayList, + baseList, + baseListId: 'list_a', + playMusicInfo: { + listId: 'list_b', + musicInfo: tempPlayList[1].musicInfo, + isTempPlay: true, + }, + }) + + assert.equal(sections.length, 2) + assert.deepEqual(sections.map(section => section.key), ['temp', 'base']) + assert.equal(sections[0].items[1].isActive, true) + assert.equal(sections[0].items[1].canRemove, true) + assert.equal(sections[0].items[1].canDrag, true) + assert.equal(sections[1].items[0].canRemove, false) + assert.equal(sections[1].items[0].canDrag, false) + assert.equal(sections[1].items[0].isActive, false) +}) + +run('moveTempQueueItem reorders temp queue immutably', () => { + const tempPlayList = [ + { listId: 'list_a', musicInfo: createMusic('temp_1', 'Temp 1'), isTempPlay: true }, + { listId: 'list_b', musicInfo: createMusic('temp_2', 'Temp 2'), isTempPlay: true }, + { listId: 'list_c', musicInfo: createMusic('temp_3', 'Temp 3'), isTempPlay: true }, + ] + + const movedList = moveTempQueueItem(tempPlayList, 2, 0) + + assert.deepEqual(movedList.map(item => item.musicInfo.id), ['temp_3', 'temp_1', 'temp_2']) + assert.deepEqual(tempPlayList.map(item => item.musicInfo.id), ['temp_1', 'temp_2', 'temp_3']) +}) diff --git a/build-config/tests/taskbar-lyric-layout.test.mjs b/build-config/tests/taskbar-lyric-layout.test.mjs new file mode 100644 index 0000000000..de0670a972 --- /dev/null +++ b/build-config/tests/taskbar-lyric-layout.test.mjs @@ -0,0 +1,122 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { calcTaskbarLyricBounds } from '../../src/main/modules/taskbarLyric/utils.ts' + +test('calcTaskbarLyricBounds anchors to bottom-right by default', () => { + const bounds = calcTaskbarLyricBounds({ + display: { + x: 0, + y: 0, + width: 1920, + height: 1080, + workArea: { + x: 0, + y: 0, + width: 1920, + height: 1040, + }, + }, + width: 360, + height: 56, + position: 'right', + }) + + assert.equal(bounds.x, 1560) + assert.equal(bounds.y, 1040) + assert.equal(bounds.width, 360) + assert.equal(bounds.height, 40) +}) + +test('calcTaskbarLyricBounds centers the bar on the bottom taskbar', () => { + const bounds = calcTaskbarLyricBounds({ + display: { + x: 100, + y: 50, + width: 1600, + height: 920, + workArea: { + x: 100, + y: 50, + width: 1600, + height: 860, + }, + }, + width: 400, + height: 60, + position: 'center', + }) + + assert.equal(bounds.x, 700) + assert.equal(bounds.y, 910) + assert.equal(bounds.width, 400) + assert.equal(bounds.height, 60) +}) + +test('calcTaskbarLyricBounds keeps the bar inside a top taskbar strip', () => { + const bounds = calcTaskbarLyricBounds({ + display: { + x: 0, + y: 0, + width: 1920, + height: 1080, + workArea: { + x: 0, + y: 40, + width: 1920, + height: 1040, + }, + }, + width: 360, + height: 56, + position: 'center', + }) + + assert.equal(bounds.x, 780) + assert.equal(bounds.y, 0) + assert.equal(bounds.width, 360) + assert.equal(bounds.height, 40) +}) + +test('calcTaskbarLyricBounds returns null for a vertical taskbar on the right', () => { + const bounds = calcTaskbarLyricBounds({ + display: { + x: 0, + y: 0, + width: 1920, + height: 1080, + workArea: { + x: 0, + y: 0, + width: 1860, + height: 1080, + }, + }, + width: 360, + height: 56, + position: 'right', + }) + + assert.equal(bounds, null) +}) + +test('calcTaskbarLyricBounds returns null for a vertical taskbar on the left', () => { + const bounds = calcTaskbarLyricBounds({ + display: { + x: 0, + y: 0, + width: 1920, + height: 1080, + workArea: { + x: 72, + y: 0, + width: 1848, + height: 1080, + }, + }, + width: 360, + height: 56, + position: 'right', + }) + + assert.equal(bounds, null) +}) diff --git a/build-config/tests/taskbar-lyric-window.test.mjs b/build-config/tests/taskbar-lyric-window.test.mjs new file mode 100644 index 0000000000..17a9d9da80 --- /dev/null +++ b/build-config/tests/taskbar-lyric-window.test.mjs @@ -0,0 +1,21 @@ +import test from 'node:test' +import assert from 'node:assert/strict' +import { enableTaskbarLyricIgnoreMouseEvents } from '../../src/main/modules/taskbarLyric/utils.ts' + +test('enableTaskbarLyricIgnoreMouseEvents forwards input while ignoring mouse events', () => { + const calls = [] + const fakeWindow = { + setIgnoreMouseEvents(ignore, options) { + calls.push({ ignore, options }) + }, + } + + enableTaskbarLyricIgnoreMouseEvents(fakeWindow) + + assert.deepEqual(calls, [ + { + ignore: true, + options: { forward: true }, + }, + ]) +}) diff --git a/docs/superpowers/plans/2026-05-20-current-playing-highlight.md b/docs/superpowers/plans/2026-05-20-current-playing-highlight.md new file mode 100644 index 0000000000..857343fe88 --- /dev/null +++ b/docs/superpowers/plans/2026-05-20-current-playing-highlight.md @@ -0,0 +1,60 @@ +# Current Playing Highlight Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Make the currently playing song easier to distinguish in song-style lists by adding a theme-driven background highlight. + +**Architecture:** Reuse the existing "currently playing" row state already exposed in list views, and strengthen that state in the view-local styles instead of changing shared list selection behavior. Keep the change scoped to views that already know which row is playing so theme switching continues to work automatically. + +**Tech Stack:** Vue 3, Electron renderer, Less CSS modules + +--- + +### Task 1: Strengthen current-playing row styling + +**Files:** +- Modify: `src/renderer/views/List/MusicList/index.vue` +- Modify: `src/renderer/views/Download/index.vue` + +- [ ] **Step 1: Confirm the current-playing class bindings** + +Check that the playing row already uses a dedicated module class: + +```vue +:class="[{ [$style.active]: playerInfo.isPlayList && playerInfo.playIndex === index }]" +``` + +and in downloads: + +```vue +:class="[{ [$style.active]: playTaskId == item.id }]" +``` + +- [ ] **Step 2: Update the local active style to add a stronger theme background** + +Add a local `.active` rule under each view container so the current-playing row keeps: + +```less +background-color: var(--color-primary-light-100-alpha-900); +color: var(--color-button-font); +``` + +and keep the same background on hover: + +```less +&:hover { + background-color: var(--color-primary-light-100-alpha-900); +} +``` + +- [ ] **Step 3: Verify the style does not affect selection-only rows** + +Leave the shared global list styles unchanged so: +- global `.list-item.active` still means multi-select selection +- local `$style.active` only means "currently playing" + +- [ ] **Step 4: Run lint for verification** + +Run: `npm.cmd run lint` + +Expected: exit code `0` diff --git a/docs/superpowers/plans/2026-05-20-taskbar-lyric-implementation.md b/docs/superpowers/plans/2026-05-20-taskbar-lyric-implementation.md new file mode 100644 index 0000000000..4195188da1 --- /dev/null +++ b/docs/superpowers/plans/2026-05-20-taskbar-lyric-implementation.md @@ -0,0 +1,662 @@ +# Taskbar Lyric Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a Windows-only pseudo-embedded taskbar lyric bar that works on both Windows 10 and Windows 11 with one shared implementation path. + +**Architecture:** Add a dedicated `taskbarLyric` feature slice in the main process plus a new compact renderer target for the lyric bar UI. Reuse existing player status and lyric timing data from the main renderer, but send a smaller display-only state object to the new host window and compute placement from taskbar/display geometry in the main process. + +**Tech Stack:** Electron main process, Vue 3 renderer, webpack multi-entry build, TypeScript/JavaScript, existing IPC/event system, manual Windows verification plus `eslint` and a small Node test for layout math. + +--- + +## File Structure + +### New files + +- `src/main/modules/taskbarLyric/index.ts` +- `src/main/modules/taskbarLyric/main.ts` +- `src/main/modules/taskbarLyric/utils.ts` +- `src/main/modules/taskbarLyric/types.ts` +- `src/renderer-taskbar-lyric/main.ts` +- `src/renderer-taskbar-lyric/App.vue` +- `src/renderer-taskbar-lyric/index.html` +- `src/renderer-taskbar-lyric/store/state.ts` +- `src/renderer-taskbar-lyric/utils/ipc.ts` +- `src/common/types/taskbar_lyric.d.ts` +- `build-config/renderer-taskbar-lyric/webpack.config.base.js` +- `build-config/renderer-taskbar-lyric/webpack.config.dev.js` +- `build-config/renderer-taskbar-lyric/webpack.config.prod.js` +- `build-config/tests/taskbar-lyric-layout.test.mjs` + +### Modified files + +- `package.json` +- `build-config/runner-dev.js` +- `build-config/pack.js` +- `src/main/modules/index.ts` +- `src/common/ipcNames.ts` +- `src/common/defaultSetting.ts` +- `src/common/constants.ts` +- `src/common/types/app_setting.d.ts` +- `src/renderer/core/lyric.ts` +- `src/renderer/utils/ipc.ts` +- `src/renderer/views/Setting/components/SettingDesktopLyric.vue` or adjacent settings view file if a new dedicated section is preferable +- `src/lang/zh-cn.json` +- `src/lang/zh-tw.json` +- `src/lang/en-us.json` + +### Responsibility split + +- `taskbarLyric/main.ts`: host window lifecycle and bounds updates +- `taskbarLyric/utils.ts`: pure layout and placement helpers +- `taskbarLyric/index.ts`: event wiring and public module registration +- `renderer-taskbar-lyric/*`: isolated compact UI +- `renderer/core/lyric.ts`: source of display state updates +- settings/types/lang files: persisted configuration and UI controls + +--- + +### Task 1: Add Settings, Types, And IPC Contract + +**Files:** +- Create: `src/common/types/taskbar_lyric.d.ts` +- Modify: `src/common/defaultSetting.ts` +- Modify: `src/common/types/app_setting.d.ts` +- Modify: `src/common/ipcNames.ts` +- Modify: `src/common/constants.ts` +- Modify: `src/renderer/utils/ipc.ts` +- Modify: `src/lang/zh-cn.json` +- Modify: `src/lang/zh-tw.json` +- Modify: `src/lang/en-us.json` + +- [ ] **Step 1: Write the failing type/test surface by defining the new contract in declarations** + +```ts +// src/common/types/taskbar_lyric.d.ts +declare global { + namespace LX { + namespace TaskbarLyric { + interface State { + enabled: boolean + isPlaying: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string + } + } + } +} + +export {} +``` + +- [ ] **Step 2: Add persisted settings keys and defaults** + +```ts +// src/common/defaultSetting.ts +'taskbarLyric.enable': false, +'taskbarLyric.position': 'right', +'taskbarLyric.width': 360, +'taskbarLyric.showCover': true, +'taskbarLyric.showSongInfo': true, +'taskbarLyric.showCurrentLine': true, +'taskbarLyric.followTaskbarAutoHide': true, +``` + +```ts +// src/common/types/app_setting.d.ts +'taskbarLyric.enable': boolean +'taskbarLyric.position': 'right' | 'center' +'taskbarLyric.width': number +'taskbarLyric.showCover': boolean +'taskbarLyric.showSongInfo': boolean +'taskbarLyric.showCurrentLine': boolean +'taskbarLyric.followTaskbarAutoHide': boolean +``` + +- [ ] **Step 3: Define IPC/event names for state push and host lifecycle** + +```ts +// src/common/ipcNames.ts inside modules.winMain +process_new_taskbar_lyric_client: 'process_new_taskbar_lyric_client', +taskbar_lyric_set_state: 'taskbar_lyric_set_state', +taskbar_lyric_request_refresh: 'taskbar_lyric_request_refresh', +``` + +```ts +// src/common/constants.ts +export const APP_EVENT_NAMES = { + winMainName: 'win_main', + winLyricName: 'win_lyric', + trayName: 'tray', + taskbarLyricName: 'taskbar_lyric', +} as const +``` + +- [ ] **Step 4: Add renderer-side helper wrappers for the new IPC** + +```ts +// src/renderer/utils/ipc.ts +export const sendTaskbarLyricState = (state: LX.TaskbarLyric.State) => { + rendererSend(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, state) +} +``` + +- [ ] **Step 5: Add user-visible strings before wiring the UI** + +```json +// src/lang/zh-cn.json +"setting__taskbar_lyric": "任务栏歌词", +"setting__taskbar_lyric_enable": "启用任务栏歌词", +"setting__taskbar_lyric_experimental": "Windows 专属实验性功能,视觉贴附任务栏,不是真实系统扩展", +"setting__taskbar_lyric_show_cover": "显示封面", +"setting__taskbar_lyric_show_song_info": "显示歌曲信息", +"setting__taskbar_lyric_show_current_line": "显示当前歌词", +"setting__taskbar_lyric_follow_autohide": "跟随任务栏自动隐藏", +"setting__taskbar_lyric_position": "任务栏歌词位置" +``` + +- [ ] **Step 6: Run lint to catch declaration/import mistakes early** + +Run: `npm.cmd run lint` + +Expected: `eslint` passes without unknown setting keys or unused IPC wrappers. + +- [ ] **Step 7: Commit** + +```bash +git add src/common/defaultSetting.ts src/common/types/app_setting.d.ts src/common/types/taskbar_lyric.d.ts src/common/ipcNames.ts src/common/constants.ts src/renderer/utils/ipc.ts src/lang/zh-cn.json src/lang/zh-tw.json src/lang/en-us.json +git commit -m "补充任务栏歌词配置与类型" +``` + +--- + +### Task 2: Build A Minimal Main-Process Host And Placement Utility + +**Files:** +- Create: `src/main/modules/taskbarLyric/index.ts` +- Create: `src/main/modules/taskbarLyric/main.ts` +- Create: `src/main/modules/taskbarLyric/utils.ts` +- Create: `src/main/modules/taskbarLyric/types.ts` +- Modify: `src/main/modules/index.ts` +- Test: `build-config/tests/taskbar-lyric-layout.test.mjs` + +- [ ] **Step 1: Write a failing pure test for bounds computation** + +```js +// build-config/tests/taskbar-lyric-layout.test.mjs +import test from 'node:test' +import assert from 'node:assert/strict' +import { calcTaskbarLyricBounds } from '../../dist/main/modules/taskbarLyric/utils.js' + +test('calcTaskbarLyricBounds anchors to bottom-right by default', () => { + const bounds = calcTaskbarLyricBounds({ + display: { x: 0, y: 0, width: 1920, height: 1080, workArea: { x: 0, y: 0, width: 1920, height: 1040 } }, + width: 360, + height: 56, + position: 'right', + }) + + assert.equal(bounds.y, 1040) + assert.equal(bounds.x, 1560) +}) +``` + +- [ ] **Step 2: Implement the pure utility first** + +```ts +// src/main/modules/taskbarLyric/utils.ts +export const calcTaskbarLyricBounds = ({ display, width, height, position }) => { + const taskbarAtBottom = display.workArea.y + display.workArea.height < display.y + display.height + const x = position === 'center' + ? Math.round(display.workArea.x + (display.workArea.width - width) / 2) + : display.workArea.x + display.workArea.width - width + const y = taskbarAtBottom + ? display.workArea.y + display.workArea.height + : display.workArea.y - height + return { x, y, width, height } +} +``` + +- [ ] **Step 3: Create the minimal host window wrapper** + +```ts +// src/main/modules/taskbarLyric/main.ts +import path from 'node:path' +import { BrowserWindow, screen } from 'electron' +import { calcTaskbarLyricBounds } from './utils' + +let browserWindow: Electron.BrowserWindow | null = null + +export const createWindow = () => { + const display = screen.getPrimaryDisplay().bounds + const workArea = screen.getPrimaryDisplay().workArea + const bounds = calcTaskbarLyricBounds({ + display: { ...display, workArea }, + width: global.lx.appSetting['taskbarLyric.width'], + height: 56, + position: global.lx.appSetting['taskbarLyric.position'], + }) + + browserWindow = new BrowserWindow({ + ...bounds, + frame: false, + show: false, + transparent: true, + resizable: false, + skipTaskbar: true, + alwaysOnTop: true, + focusable: false, + webPreferences: { + contextIsolation: false, + nodeIntegration: true, + sandbox: false, + }, + }) + + const winURL = process.env.NODE_ENV !== 'production' + ? 'http://localhost:9082/taskbar-lyric.html' + : `file://${path.join(__dirname, 'taskbar-lyric.html')}` + + void browserWindow.loadURL(winURL) +} +``` + +- [ ] **Step 4: Register the module with no-op safety** + +```ts +// src/main/modules/taskbarLyric/index.ts +import { isWin } from '@common/utils' +import { closeWindow, createWindow, updateWindowState } from './main' + +export default () => { + global.lx.event_app.on('updated_config', (keys) => { + if (!isWin || !keys.some(key => key.startsWith('taskbarLyric.'))) return + if (global.lx.appSetting['taskbarLyric.enable']) createWindow() + else closeWindow() + }) + + global.lx.event_app.on('app_inited', () => { + if (isWin && global.lx.appSetting['taskbarLyric.enable']) createWindow() + updateWindowState() + }) +} +``` + +```ts +// src/main/modules/index.ts +import registerTaskbarLyric from './taskbarLyric' +// ... +registerTaskbarLyric() +``` + +- [ ] **Step 5: Run the focused test and then lint** + +Run: `npm.cmd run build:main` + +Expected: main bundle compiles with the new module exported to `dist`. + +Run: `node --test build-config/tests/taskbar-lyric-layout.test.mjs` + +Expected: the layout test passes. + +Run: `npm.cmd run lint` + +Expected: no new lint failures. + +- [ ] **Step 6: Commit** + +```bash +git add src/main/modules/taskbarLyric src/main/modules/index.ts build-config/tests/taskbar-lyric-layout.test.mjs +git commit -m "新增任务栏歌词主进程宿主" +``` + +--- + +### Task 3: Add The Dedicated Renderer Target And Minimal UI + +**Files:** +- Create: `src/renderer-taskbar-lyric/index.html` +- Create: `src/renderer-taskbar-lyric/main.ts` +- Create: `src/renderer-taskbar-lyric/App.vue` +- Create: `src/renderer-taskbar-lyric/store/state.ts` +- Create: `src/renderer-taskbar-lyric/utils/ipc.ts` +- Create: `build-config/renderer-taskbar-lyric/webpack.config.base.js` +- Create: `build-config/renderer-taskbar-lyric/webpack.config.dev.js` +- Create: `build-config/renderer-taskbar-lyric/webpack.config.prod.js` +- Modify: `build-config/runner-dev.js` +- Modify: `build-config/pack.js` +- Modify: `package.json` + +- [ ] **Step 1: Create the renderer scaffold with explicit state fallbacks** + +```ts +// src/renderer-taskbar-lyric/store/state.ts +import { reactive } from 'vue' + +export const state = reactive({ + enabled: false, + isPlaying: false, + songId: null, + title: '', + artist: '', + lyricLine: '', + albumCoverUrl: '', +}) +``` + +```ts +// src/renderer-taskbar-lyric/main.ts +import { createApp } from 'vue' +import App from './App.vue' + +createApp(App).mount('#root') +``` + +- [ ] **Step 2: Implement a compact static-first UI before live wiring** + +```vue + + +``` + +- [ ] **Step 3: Clone the lyric renderer webpack pattern with a new entry/output** + +```js +// build-config/renderer-taskbar-lyric/webpack.config.base.js +entry: { + 'renderer-taskbar-lyric': path.join(__dirname, '../../src/renderer-taskbar-lyric/main.ts'), +}, +plugins: [ + new HTMLPlugin({ + filename: 'taskbar-lyric.html', + template: path.join(__dirname, '../../src/renderer-taskbar-lyric/index.html'), + }), +] +``` + +```json +// package.json +"build:renderer-taskbar-lyric": "cross-env NODE_ENV=production webpack --config build-config/renderer-taskbar-lyric/webpack.config.prod.js --progress" +``` + +- [ ] **Step 4: Wire dev/prod build runners** + +```js +// build-config/runner-dev.js +const rendererTaskbarLyricConfig = require('./renderer-taskbar-lyric/webpack.config.dev') +// add startRendererTaskbarLyric() on port 9082 +// include spinner label: renderer-taskbar-lyric +``` + +```js +// build-config/pack.js +const rendererTaskbarLyricConfig = './renderer-taskbar-lyric/webpack.config.prod' +// include in Promise.all build fan-out +``` + +- [ ] **Step 5: Verify the renderer bundle can compile independently** + +Run: `npm.cmd run build:renderer-taskbar-lyric` + +Expected: `dist/taskbar-lyric.html` and matching renderer bundle are generated. + +Run: `npm.cmd run lint` + +Expected: new renderer files pass lint. + +- [ ] **Step 6: Commit** + +```bash +git add src/renderer-taskbar-lyric build-config/renderer-taskbar-lyric build-config/runner-dev.js build-config/pack.js package.json +git commit -m "新增任务栏歌词渲染进程" +``` + +--- + +### Task 4: Connect Live Playback State From The Main Renderer + +**Files:** +- Modify: `src/renderer/core/lyric.ts` +- Modify: `src/renderer/utils/ipc.ts` +- Modify: `src/main/modules/taskbarLyric/index.ts` +- Modify: `src/main/modules/taskbarLyric/main.ts` +- Modify: `src/renderer-taskbar-lyric/utils/ipc.ts` +- Modify: `src/renderer-taskbar-lyric/main.ts` +- Modify: `src/renderer-taskbar-lyric/store/state.ts` + +- [ ] **Step 1: Add a state derivation helper near the existing lyric pipeline** + +```ts +// src/renderer/core/lyric.ts +const getTaskbarLyricState = (): LX.TaskbarLyric.State => ({ + enabled: appSetting['taskbarLyric.enable'], + isPlaying: isPlay.value, + songId: musicInfo.id || null, + title: musicInfo.name || '', + artist: musicInfo.singer || '', + lyricLine: lyric.text || '', + albumCoverUrl: musicInfo.pic || '', +}) +``` + +- [ ] **Step 2: Push updates from every relevant playback edge** + +```ts +// src/renderer/core/lyric.ts +const syncTaskbarLyric = () => { + sendTaskbarLyricState(getTaskbarLyricState()) +} + +// call from: +// - onPlay() +// - setLyric() +// - play() +// - pause() +// - stop() +``` + +- [ ] **Step 3: Cache and forward state in the main-process module** + +```ts +// src/main/modules/taskbarLyric/index.ts +let currentState: LX.TaskbarLyric.State = { + enabled: false, + isPlaying: false, + songId: null, + title: '', + artist: '', + lyricLine: '', + albumCoverUrl: '', +} + +mainHandle(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, ({ params }) => { + currentState = params + updateWindowState(currentState) +}) +``` + +- [ ] **Step 4: Receive state in the taskbar lyric renderer and patch the reactive store** + +```ts +// src/renderer-taskbar-lyric/utils/ipc.ts +import { rendererOn } from '@common/rendererIpc' +import { WIN_MAIN_RENDERER_EVENT_NAME } from '@common/ipcNames' + +export const onTaskbarLyricState = (listener) => { + rendererOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, listener) +} +``` + +```ts +// src/renderer-taskbar-lyric/main.ts +import { state } from './store/state' +import { onTaskbarLyricState } from './utils/ipc' + +onTaskbarLyricState(({ params }) => { + Object.assign(state, params) +}) +``` + +- [ ] **Step 5: Run the app manually and confirm live updates** + +Run: `npm.cmd run dev` + +Expected: +- the new renderer server starts on `9082` +- enabling the feature creates the lyric bar +- switching songs updates title/artist/lyric without reopening the window + +Run: `npm.cmd run lint` + +Expected: still passes. + +- [ ] **Step 6: Commit** + +```bash +git add src/renderer/core/lyric.ts src/main/modules/taskbarLyric src/renderer-taskbar-lyric src/renderer/utils/ipc.ts +git commit -m "接入任务栏歌词实时状态同步" +``` + +--- + +### Task 5: Add Settings UI, Placement Refresh, And Manual Verification Pass + +**Files:** +- Modify: `src/renderer/views/Setting/components/SettingDesktopLyric.vue` or split into a new `SettingTaskbarLyric.vue` +- Modify: `src/main/modules/taskbarLyric/main.ts` +- Modify: `src/main/modules/taskbarLyric/utils.ts` +- Modify: `src/main/modules/taskbarLyric/index.ts` +- Modify: `docs/superpowers/specs/2026-05-20-taskbar-lyric-design.md` if implementation notes need reconciliation + +- [ ] **Step 1: Add the settings controls in the renderer** + +```pug +dt#taskbar_lyric {{ $t('setting__taskbar_lyric') }} +dd + .gap-top + base-checkbox( + id="setting_taskbar_lyric_enable" + :model-value="appSetting['taskbarLyric.enable']" + :label="$t('setting__taskbar_lyric_enable')" + @update:model-value="updateSetting({ 'taskbarLyric.enable': $event })" + ) + p.gap-top {{ $t('setting__taskbar_lyric_experimental') }} +``` + +```pug + .gap-top + base-checkbox.gap-left( + id="setting_taskbar_lyric_position_right" + :model-value="appSetting['taskbarLyric.position']" + need value="right" + :label="$t('setting__desktop_lyric_align_right')" + @update:model-value="updateSetting({ 'taskbarLyric.position': $event })" + ) +``` + +- [ ] **Step 2: Recompute bounds on display and Explorer-adjacent events** + +```ts +// src/main/modules/taskbarLyric/index.ts +screen.on('display-metrics-changed', () => refreshBounds()) +screen.on('display-added', () => refreshBounds()) +screen.on('display-removed', () => refreshBounds()) +global.lx.event_app.on('system_theme_change', () => refreshBounds()) +``` + +```ts +// src/main/modules/taskbarLyric/main.ts +export const refreshBounds = () => { + if (!browserWindow) return + browserWindow.setBounds(getWindowBounds()) +} +``` + +- [ ] **Step 3: Add a graceful fallback when taskbar geometry cannot be inferred** + +```ts +// src/main/modules/taskbarLyric/utils.ts +export const getFallbackBounds = ({ display, width, height }) => ({ + x: display.workArea.x + display.workArea.width - width, + y: display.workArea.y + display.workArea.height - height, + width, + height, +}) +``` + +- [ ] **Step 4: Run the full manual verification matrix** + +Run: `npm.cmd run lint` + +Expected: pass. + +Run: `npm.cmd run dev` + +Expected manual checks: +- Windows 10: bottom taskbar, 100% and 125% DPI +- Windows 11: bottom taskbar, 100% and 150% DPI +- enable/disable feature from settings +- pause/play and track switch update text +- no Alt+Tab entry and no taskbar icon +- existing desktop lyric still opens and works + +- [ ] **Step 5: Reconcile documentation if behavior diverges from the spec** + +```md +If final implementation chooses a fixed bar height, primary-display-only scope, +or omits auto-hide following in V1, update the spec document immediately so the +repo does not claim behavior we did not ship. +``` + +- [ ] **Step 6: Commit** + +```bash +git add src/renderer/views/Setting/components/SettingDesktopLyric.vue src/main/modules/taskbarLyric docs/superpowers/specs/2026-05-20-taskbar-lyric-design.md +git commit -m "完善任务栏歌词设置与窗口定位" +``` + +--- + +## Self-Review + +### Spec coverage + +- One shared Win10/Win11 pseudo-embedded path: covered by Tasks 2-5 +- Dedicated renderer target: covered by Task 3 +- Dedicated settings group: covered by Tasks 1 and 5 +- Display-only V1 scope: preserved throughout Tasks 3 and 4 +- Primary-display positioning and graceful fallback: covered by Tasks 2 and 5 + +### Placeholder scan + +- No `TODO` or `TBD` markers remain. +- Each task names exact files and commands. +- Verification steps are explicit rather than implied. + +### Type consistency + +- `LX.TaskbarLyric.State` is introduced once and reused consistently. +- Settings keys use the same `taskbarLyric.*` namespace across default settings, app setting types, renderer settings, and main-process watchers. + +## Execution Handoff + +Plan complete and saved to `docs/superpowers/plans/2026-05-20-taskbar-lyric-implementation.md`. Two execution options: + +**1. Subagent-Driven (recommended)** - I dispatch a fresh subagent per task, review between tasks, fast iteration + +**2. Inline Execution** - Execute tasks in this session using executing-plans, batch execution with checkpoints + +**Which approach?** + diff --git a/docs/superpowers/plans/2026-05-21-taskbar-lyric-color-implementation.md b/docs/superpowers/plans/2026-05-21-taskbar-lyric-color-implementation.md new file mode 100644 index 0000000000..bb68c70032 --- /dev/null +++ b/docs/superpowers/plans/2026-05-21-taskbar-lyric-color-implementation.md @@ -0,0 +1,654 @@ +# Taskbar Lyric Color Configuration Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add configurable background and text colors for the Windows taskbar lyric window, including theme/custom modes and background-only opacity. + +**Architecture:** Extend the existing taskbar lyric setting model with a small style namespace, then push the resolved style inputs through the current main-process state sync so the floating taskbar lyric window can render from one authoritative snapshot. Reuse the existing settings-page slider and Pickr color-picker patterns instead of inventing new controls. + +**Tech Stack:** Electron main process, Vue 3 renderers, TypeScript declaration files, existing app setting store, existing taskbar lyric IPC/state pipeline, existing `pickrTools`, manual verification plus targeted builds and lint. + +--- + +## File Structure + +### Modified files + +- `src/common/defaultSetting.ts` +- `src/common/types/app_setting.d.ts` +- `src/common/types/taskbar_lyric.d.ts` +- `src/main/modules/taskbarLyric/index.ts` +- `src/main/modules/taskbarLyric/main.ts` +- `src/main/modules/taskbarLyric/types.ts` +- `src/renderer/core/lyric.ts` +- `src/renderer-taskbar-lyric/App.vue` +- `src/renderer/views/Setting/components/SettingTaskbarLyric.vue` +- `src/lang/zh-cn.json` +- `src/lang/zh-tw.json` +- `src/lang/en-us.json` + +### New files + +- None required. Keep the change set small by reusing existing files and patterns. + +### Responsibility split + +- `src/common/defaultSetting.ts`: define default taskbar lyric color settings +- `src/common/types/app_setting.d.ts`: extend persistent app-setting typing +- `src/common/types/taskbar_lyric.d.ts`: extend synced taskbar lyric state typing +- `src/main/modules/taskbarLyric/types.ts`: extend internal main-process state shape +- `src/main/modules/taskbarLyric/main.ts`: include style fields in the taskbar lyric state sent to the floating window +- `src/main/modules/taskbarLyric/index.ts`: refresh the taskbar lyric window when new style-related settings change +- `src/renderer/core/lyric.ts`: include color-style settings in the taskbar lyric snapshot sent from the main renderer +- `src/renderer/views/Setting/components/SettingTaskbarLyric.vue`: add radio controls, color pickers, and opacity slider +- `src/renderer-taskbar-lyric/App.vue`: resolve theme/custom colors into final CSS and render them +- `src/lang/*.json`: localized labels for the new settings + +--- + +### Task 1: Extend Persistent Settings And Synced State + +**Files:** +- Modify: `src/common/defaultSetting.ts` +- Modify: `src/common/types/app_setting.d.ts` +- Modify: `src/common/types/taskbar_lyric.d.ts` +- Modify: `src/main/modules/taskbarLyric/types.ts` + +- [ ] **Step 1: Add default taskbar lyric style settings** + +```ts +// src/common/defaultSetting.ts +'taskbarLyric.style.backgroundColorMode': 'theme', +'taskbarLyric.style.backgroundColor': 'rgba(15, 23, 42, 1)', +'taskbarLyric.style.backgroundOpacity': 72, +'taskbarLyric.style.fontColorMode': 'theme', +'taskbarLyric.style.fontColor': 'rgba(248, 250, 252, 1)', +``` + +Place these directly after the existing taskbar lyric content settings so all taskbar lyric defaults stay grouped. + +- [ ] **Step 2: Add app-setting type declarations for the new fields** + +```ts +// src/common/types/app_setting.d.ts +'taskbarLyric.style.backgroundColorMode': 'theme' | 'custom' +'taskbarLyric.style.backgroundColor': string +'taskbarLyric.style.backgroundOpacity': number +'taskbarLyric.style.fontColorMode': 'theme' | 'custom' +'taskbarLyric.style.fontColor': string +``` + +Use the same documentation-comment style already present in the taskbar lyric section. + +- [ ] **Step 3: Extend the shared taskbar lyric state with style fields** + +```ts +// src/common/types/taskbar_lyric.d.ts +backgroundColorMode: 'theme' | 'custom' +backgroundColor: string +backgroundOpacity: number +fontColorMode: 'theme' | 'custom' +fontColor: string +``` + +Append these to `LX.TaskbarLyric.State` so the floating renderer gets style inputs through the existing sync pipeline. + +- [ ] **Step 4: Mirror the same fields in the main-process internal taskbar lyric state** + +```ts +// src/main/modules/taskbarLyric/types.ts +backgroundColorMode: LX.AppSetting['taskbarLyric.style.backgroundColorMode'] +backgroundColor: LX.AppSetting['taskbarLyric.style.backgroundColor'] +backgroundOpacity: LX.AppSetting['taskbarLyric.style.backgroundOpacity'] +fontColorMode: LX.AppSetting['taskbarLyric.style.fontColorMode'] +fontColor: LX.AppSetting['taskbarLyric.style.fontColor'] +``` + +- [ ] **Step 5: Run a main build to catch missing declarations early** + +Run: `npm.cmd run build:main` + +Expected: the main bundle compiles without “property does not exist” errors for the new taskbar lyric style keys. + +- [ ] **Step 6: Commit** + +```bash +git add src/common/defaultSetting.ts src/common/types/app_setting.d.ts src/common/types/taskbar_lyric.d.ts src/main/modules/taskbarLyric/types.ts +git commit -m "补充任务栏歌词颜色配置结构" +``` + +--- + +### Task 2: Sync Style Settings Through The Existing Taskbar Lyric State Pipeline + +**Files:** +- Modify: `src/renderer/core/lyric.ts` +- Modify: `src/main/modules/taskbarLyric/main.ts` +- Modify: `src/main/modules/taskbarLyric/index.ts` + +- [ ] **Step 1: Include the new style fields in the renderer-side taskbar lyric snapshot** + +```ts +// src/renderer/core/lyric.ts inside getTaskbarLyricState() +backgroundColorMode: appSetting['taskbarLyric.style.backgroundColorMode'], +backgroundColor: appSetting['taskbarLyric.style.backgroundColor'], +backgroundOpacity: appSetting['taskbarLyric.style.backgroundOpacity'], +fontColorMode: appSetting['taskbarLyric.style.fontColorMode'], +fontColor: appSetting['taskbarLyric.style.fontColor'], +``` + +Keep this data in the same `getTaskbarLyricState()` helper used by the current taskbar lyric sync flow so all existing sync call sites continue to work unchanged. + +- [ ] **Step 2: Extend the main-process default/current taskbar lyric state** + +```ts +// src/main/modules/taskbarLyric/main.ts inside currentState +backgroundColorMode: global.lx.appSetting['taskbarLyric.style.backgroundColorMode'], +backgroundColor: global.lx.appSetting['taskbarLyric.style.backgroundColor'], +backgroundOpacity: global.lx.appSetting['taskbarLyric.style.backgroundOpacity'], +fontColorMode: global.lx.appSetting['taskbarLyric.style.fontColorMode'], +fontColor: global.lx.appSetting['taskbarLyric.style.fontColor'], +``` + +Add the same fields anywhere `currentState` is rehydrated from settings, including the helper that refreshes taskbar lyric state from config. + +- [ ] **Step 3: Refresh the open taskbar lyric window when any color setting changes** + +```ts +// src/main/modules/taskbarLyric/index.ts inside the config-change listener +if (global.lx.appSetting['taskbarLyric.enable'] && ( + keys.includes('taskbarLyric.style.backgroundColorMode') || + keys.includes('taskbarLyric.style.backgroundColor') || + keys.includes('taskbarLyric.style.backgroundOpacity') || + keys.includes('taskbarLyric.style.fontColorMode') || + keys.includes('taskbarLyric.style.fontColor') +)) { + refreshWindowStateFromConfig() +} +``` + +Reuse the existing `refreshWindowStateFromConfig()` pathway rather than introducing a second style-only sync path. + +- [ ] **Step 4: Run targeted builds for renderer and main** + +Run: `npm.cmd run build:renderer` + +Expected: renderer build succeeds without taskbar lyric state-shape errors. + +Run: `npm.cmd run build:main` + +Expected: main build succeeds without missing setting-key or state-field errors. + +- [ ] **Step 5: Commit** + +```bash +git add src/renderer/core/lyric.ts src/main/modules/taskbarLyric/main.ts src/main/modules/taskbarLyric/index.ts +git commit -m "同步任务栏歌词颜色状态" +``` + +--- + +### Task 3: Add Settings UI For Background And Text Colors + +**Files:** +- Modify: `src/renderer/views/Setting/components/SettingTaskbarLyric.vue` +- Modify: `src/lang/zh-cn.json` +- Modify: `src/lang/zh-tw.json` +- Modify: `src/lang/en-us.json` + +- [ ] **Step 1: Reuse Pickr patterns to add two color-picker refs and lifecycle wiring** + +```js +// src/renderer/views/Setting/components/SettingTaskbarLyric.vue +import { onMounted, onBeforeUnmount, ref } from '@common/utils/vueTools' +import { pickrTools } from '@renderer/utils/pickrTools' +``` + +```js +// src/renderer/views/Setting/components/SettingTaskbarLyric.vue +const backgroundColorRef = ref(null) +const fontColorRef = ref(null) +let backgroundColorTools = null +let fontColorTools = null +``` + +```js +// src/renderer/views/Setting/components/SettingTaskbarLyric.vue +const initColorPickers = () => { + if (backgroundColorRef.value) { + backgroundColorTools = pickrTools.create(backgroundColorRef.value, appSetting['taskbarLyric.style.backgroundColor'], [ + 'rgba(15, 23, 42, 1)', + 'rgba(30, 41, 59, 1)', + 'rgba(17, 24, 39, 1)', + 'rgba(255, 255, 255, 1)', + 'rgba(59, 130, 246, 1)', + ], color => { + updateSetting({ 'taskbarLyric.style.backgroundColor': color }) + }) + } + if (fontColorRef.value) { + fontColorTools = pickrTools.create(fontColorRef.value, appSetting['taskbarLyric.style.fontColor'], [ + 'rgba(248, 250, 252, 1)', + 'rgba(255, 255, 255, 1)', + 'rgba(226, 232, 240, 1)', + 'rgba(15, 23, 42, 1)', + 'rgba(17, 24, 39, 1)', + ], color => { + updateSetting({ 'taskbarLyric.style.fontColor': color }) + }) + } +} +``` + +Destroy both Pickr instances in `onBeforeUnmount()`. + +- [ ] **Step 2: Add background mode, custom color, and opacity controls** + +```pug +dd + h3#taskbar_lyric_background {{ $t('setting__taskbar_lyric_background') }} + div + base-checkbox.gap-left( + id="setting_taskbar_lyric_background_theme" + name="setting_taskbar_lyric_background_mode" + need + :model-value="appSetting['taskbarLyric.style.backgroundColorMode']" + value="theme" + :label="$t('setting__taskbar_lyric_theme_color')" + :disabled="!isWin" + @update:model-value="updateSetting({ 'taskbarLyric.style.backgroundColorMode': $event })" + ) + base-checkbox.gap-left( + id="setting_taskbar_lyric_background_custom" + name="setting_taskbar_lyric_background_mode" + need + :model-value="appSetting['taskbarLyric.style.backgroundColorMode']" + value="custom" + :label="$t('setting__taskbar_lyric_custom_color')" + :disabled="!isWin" + @update:model-value="updateSetting({ 'taskbarLyric.style.backgroundColorMode': $event })" + ) + .gap-top(:class="$style.colorLine") + div( + ref="backgroundColorRef" + :class="[$style.colorSwatch, appSetting['taskbarLyric.style.backgroundColorMode'] != 'custom' ? $style.colorSwatchDisabled : '']" + ) + span(:class="$style.colorLabel") {{ appSetting['taskbarLyric.style.backgroundColor'] }} + .gap-top(:class="$style.sliderLine") + base-slider-bar( + :class-name="$style.slider" + :value="appSetting['taskbarLyric.style.backgroundOpacity']" + :min="0" + :max="100" + :step="1" + :disabled="!isWin" + @change="updateSetting({ 'taskbarLyric.style.backgroundOpacity': $event })" + ) + span(:class="$style.sliderValue") {{ appSetting['taskbarLyric.style.backgroundOpacity'] }}% +``` + +- [ ] **Step 3: Add text color mode and custom color controls** + +```pug +dd + h3#taskbar_lyric_font_color {{ $t('setting__taskbar_lyric_font_color') }} + div + base-checkbox.gap-left( + id="setting_taskbar_lyric_font_theme" + name="setting_taskbar_lyric_font_mode" + need + :model-value="appSetting['taskbarLyric.style.fontColorMode']" + value="theme" + :label="$t('setting__taskbar_lyric_theme_color')" + :disabled="!isWin" + @update:model-value="updateSetting({ 'taskbarLyric.style.fontColorMode': $event })" + ) + base-checkbox.gap-left( + id="setting_taskbar_lyric_font_custom" + name="setting_taskbar_lyric_font_mode" + need + :model-value="appSetting['taskbarLyric.style.fontColorMode']" + value="custom" + :label="$t('setting__taskbar_lyric_custom_color')" + :disabled="!isWin" + @update:model-value="updateSetting({ 'taskbarLyric.style.fontColorMode': $event })" + ) + .gap-top(:class="$style.colorLine") + div( + ref="fontColorRef" + :class="[$style.colorSwatch, appSetting['taskbarLyric.style.fontColorMode'] != 'custom' ? $style.colorSwatchDisabled : '']" + ) + span(:class="$style.colorLabel") {{ appSetting['taskbarLyric.style.fontColor'] }} +``` + +- [ ] **Step 4: Add matching localized labels** + +```json +// src/lang/zh-cn.json +"setting__taskbar_lyric_background": "背景颜色", +"setting__taskbar_lyric_font_color": "文字颜色", +"setting__taskbar_lyric_theme_color": "主题色", +"setting__taskbar_lyric_custom_color": "自定义", +``` + +```json +// src/lang/en-us.json +"setting__taskbar_lyric_background": "Background Color", +"setting__taskbar_lyric_font_color": "Text Color", +"setting__taskbar_lyric_theme_color": "Theme", +"setting__taskbar_lyric_custom_color": "Custom", +``` + +Add corresponding Traditional Chinese strings in `src/lang/zh-tw.json`. + +- [ ] **Step 5: Add minimal styles for the color rows** + +```less +// src/renderer/views/Setting/components/SettingTaskbarLyric.vue +.colorLine { + display: flex; + align-items: center; + gap: 12px; +} + +.colorSwatch { + width: 28px; + height: 28px; + border-radius: 8px; + background-color: var(--pcr-color); + box-shadow: 0 0 3px var(--color-primary-light-100-alpha-300); + transition: opacity .2s ease; +} + +.colorSwatchDisabled { + opacity: .45; +} + +.colorLabel { + font-size: 12px; + opacity: .8; +} +``` + +- [ ] **Step 6: Run the renderer build and lint** + +Run: `npm.cmd run build:renderer` + +Expected: settings renderer compiles and Pickr refs/hooks are typed correctly. + +Run: `npm.cmd run lint` + +Expected: no unused imports, duplicate IDs, or Vue template binding issues. + +- [ ] **Step 7: Commit** + +```bash +git add src/renderer/views/Setting/components/SettingTaskbarLyric.vue src/lang/zh-cn.json src/lang/zh-tw.json src/lang/en-us.json +git commit -m "新增任务栏歌词颜色设置界面" +``` + +--- + +### Task 4: Render Resolved Background And Text Colors In The Floating Taskbar Lyric Window + +**Files:** +- Modify: `src/renderer-taskbar-lyric/App.vue` + +- [ ] **Step 1: Add small color helpers for alpha replacement, luminance checks, and theme-derived colors** + +```ts +// src/renderer-taskbar-lyric/App.vue +const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max) + +const parseRgb = (color: string) => { + const match = color.match(/rgba?\(([^)]+)\)/i) + if (!match) return null + const [r, g, b] = match[1].split(',').slice(0, 3).map(part => Number.parseFloat(part.trim())) + if ([r, g, b].some(num => Number.isNaN(num))) return null + return { r, g, b } +} + +const withAlpha = (color: string, alpha: number) => { + const rgb = parseRgb(color) + if (!rgb) return `rgba(15, 23, 42, ${alpha})` + return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})` +} + +const getLuminance = ({ r, g, b }: { r: number, g: number, b: number }) => { + return (0.299 * r + 0.587 * g + 0.114 * b) / 255 +} + +const mix = (from: { r: number, g: number, b: number }, to: { r: number, g: number, b: number }, amount: number) => { + return { + r: Math.round(from.r + (to.r - from.r) * amount), + g: Math.round(from.g + (to.g - from.g) * amount), + b: Math.round(from.b + (to.b - from.b) * amount), + } +} +``` + +- [ ] **Step 2: Read theme variables and derive stable panel/text colors** + +```ts +// src/renderer-taskbar-lyric/App.vue +const getThemePrimaryColor = () => { + const color = getComputedStyle(document.documentElement).getPropertyValue('--color-primary').trim() + return parseRgb(color) ?? { r: 59, g: 130, b: 246 } +} + +const getThemeBackgroundColor = () => { + const primary = getThemePrimaryColor() + const target = getLuminance(primary) > 0.62 ? { r: 15, g: 23, b: 42 } : { r: 30, g: 41, b: 59 } + const mixed = mix(primary, target, 0.72) + return `rgb(${mixed.r}, ${mixed.g}, ${mixed.b})` +} + +const getThemeFontColor = () => { + const primary = getThemePrimaryColor() + const target = getLuminance(primary) > 0.52 ? { r: 15, g: 23, b: 42 } : { r: 248, g: 250, b: 252 } + const mixed = mix(primary, target, 0.88) + return `rgb(${mixed.r}, ${mixed.g}, ${mixed.b})` +} +``` + +- [ ] **Step 3: Build computed shell styles from the synced state** + +```ts +// src/renderer-taskbar-lyric/App.vue +import { computed } from 'vue' +``` + +```ts +// src/renderer-taskbar-lyric/App.vue +const shellStyle = computed(() => { + const opacity = clamp(state.backgroundOpacity, 0, 100) / 100 + const baseBackground = state.backgroundColorMode === 'custom' + ? state.backgroundColor + : getThemeBackgroundColor() + const fontColor = state.fontColorMode === 'custom' + ? state.fontColor + : getThemeFontColor() + const secondaryFontColor = withAlpha(fontColor, 0.72) + + return { + '--taskbar-lyric-bg': withAlpha(baseBackground, opacity), + '--taskbar-lyric-border': withAlpha(fontColor, 0.14), + '--taskbar-lyric-font': withAlpha(fontColor, 1), + '--taskbar-lyric-font-secondary': secondaryFontColor, + } +}) +``` + +Apply it to the shell: + +```vue +
+``` + +- [ ] **Step 4: Replace hard-coded colors with CSS variables** + +```less +// src/renderer-taskbar-lyric/App.vue +.taskbar-lyric-shell { + background: var(--taskbar-lyric-bg); + border: 1px solid var(--taskbar-lyric-border); +} + +.title { + color: var(--taskbar-lyric-font); +} + +.separator, +.artist, +.lyric-line { + color: var(--taskbar-lyric-font-secondary); +} +``` + +Remove the current fixed dark gradient background and fixed text colors so the new state-driven style is the only source of truth. + +- [ ] **Step 5: Verify the taskbar lyric renderer build** + +Run: `npm.cmd run build:renderer-taskbar-lyric` + +Expected: the floating renderer builds without TypeScript errors around `computed`, helper return types, or style bindings. + +- [ ] **Step 6: Commit** + +```bash +git add src/renderer-taskbar-lyric/App.vue +git commit -m "支持任务栏歌词颜色渲染" +``` + +--- + +### Task 5: Run End-To-End Verification In Development Mode + +**Files:** +- Modify: none required unless bugs are found during verification + +- [ ] **Step 1: Run lint and all relevant targeted builds one more time** + +Run: `npm.cmd run build:renderer` + +Expected: PASS + +Run: `npm.cmd run build:renderer-taskbar-lyric` + +Expected: PASS + +Run: `npm.cmd run build:main` + +Expected: PASS + +Run: `npm.cmd run lint` + +Expected: PASS + +- [ ] **Step 2: Start the app in development mode** + +Run: `npm.cmd run dev` + +Expected: the main window and taskbar lyric window compile and open without new build errors. + +- [ ] **Step 3: Verify default theme mode behavior** + +Manual steps: + +1. Enable taskbar lyric. +2. Leave background mode as `主题色`. +3. Leave text mode as `主题色`. +4. Play a song with lyrics. + +Expected: + +- taskbar lyric renders with theme-following colors +- text remains fully opaque +- width, drag, and right-click menu still work + +- [ ] **Step 4: Verify custom background color and opacity behavior** + +Manual steps: + +1. Switch background mode to `自定义`. +2. Pick a visible custom background color. +3. Move the background opacity slider to `20%`, `72%`, and `100%`. + +Expected: + +- background color changes immediately +- only the panel background changes transparency +- text remains fully opaque at every opacity value + +- [ ] **Step 5: Verify custom text color behavior** + +Manual steps: + +1. Switch text mode to `自定义`. +2. Pick a bright text color, then a dark text color. + +Expected: + +- taskbar lyric text updates immediately +- title and secondary text remain readable +- no unintended transparency appears on text + +- [ ] **Step 6: Verify persistence and theme switching** + +Manual steps: + +1. Close and reopen the app. +2. Confirm the last-selected taskbar lyric colors persist. +3. Switch the app theme while both background and text are in `主题色` mode. + +Expected: + +- saved custom values persist after restart +- theme-mode background and text update with the new theme + +- [ ] **Step 7: Leave the tree clean or commit only follow-up fixes** + +Run: `git status --short` + +Expected: no uncommitted changes if verification required no extra fixes. + +--- + +## Self-Review + +### Spec coverage + +- Background theme/custom mode: covered by Tasks 1, 2, and 3 +- Background-only opacity: covered by Tasks 1, 3, and 4 +- Text theme/custom mode: covered by Tasks 1, 2, 3, and 4 +- Text stays opaque: covered explicitly in Task 4 and verified in Task 5 +- Theme-derived readable colors: covered by Task 4 +- Live refresh for open taskbar lyric window: covered by Task 2 and verified in Task 5 + +### Placeholder scan + +- No `TODO`, `TBD`, or “implement later” placeholders remain. +- Every modified file is named explicitly. +- Every verification step includes exact commands or explicit manual steps. + +### Type consistency + +- Setting keys use one naming scheme: `taskbarLyric.style.*` +- Shared state and main-process state use the same five style fields +- Renderer UI and floating renderer both reference the same setting/state property names + +## Execution Handoff + +Plan complete and saved to `docs/superpowers/plans/2026-05-21-taskbar-lyric-color-implementation.md`. Two execution options: + +**1. Subagent-Driven (recommended)** - I dispatch a fresh subagent per task, review between tasks, fast iteration + +**2. Inline Execution** - Execute tasks in this session using executing-plans, batch execution with checkpoints + +**Which approach?** diff --git a/docs/superpowers/plans/2026-05-21-taskbar-lyric-context-menu-implementation.md b/docs/superpowers/plans/2026-05-21-taskbar-lyric-context-menu-implementation.md new file mode 100644 index 0000000000..0c70708439 --- /dev/null +++ b/docs/superpowers/plans/2026-05-21-taskbar-lyric-context-menu-implementation.md @@ -0,0 +1,504 @@ +# Taskbar Lyric Context Menu Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add a native right-click menu to the Windows taskbar lyric window with previous, play/pause, next, collect/uncollect, and close actions. + +**Architecture:** Extend the existing taskbar lyric state pipeline so the main process always has enough player state to build a native Electron menu on demand. The taskbar lyric renderer only reports `contextmenu`; the main process owns menu construction, action dispatch, and enable/disable rules. + +**Tech Stack:** Electron main process, Vue 3 renderer, existing IPC/event system, TypeScript, existing player control wiring, manual verification plus `build` and `lint`. + +--- + +## File Structure + +### Modified files + +- `src/common/ipcNames.ts` +- `src/common/types/taskbar_lyric.d.ts` +- `src/renderer/core/lyric.ts` +- `src/renderer/utils/ipc.ts` +- `src/renderer-taskbar-lyric/App.vue` +- `src/renderer-taskbar-lyric/utils/ipc.ts` +- `src/main/modules/taskbarLyric/index.ts` +- `src/main/modules/taskbarLyric/main.ts` +- `src/main/modules/taskbarLyric/types.ts` +- `src/main/modules/winMain/rendererEvent/taskbarLyric.ts` + +### Responsibility split + +- `src/common/ipcNames.ts`: taskbar lyric menu IPC channel names +- `src/common/types/taskbar_lyric.d.ts`: menu-required state fields shared across processes +- `src/renderer/core/lyric.ts`: source of synchronized play/collect state +- `src/renderer/utils/ipc.ts`: main-renderer IPC helpers for taskbar lyric sync +- `src/renderer-taskbar-lyric/App.vue`: emit right-click requests from the floating lyric UI +- `src/renderer-taskbar-lyric/utils/ipc.ts`: taskbar lyric renderer IPC helpers +- `src/main/modules/taskbarLyric/main.ts`: menu creation, action dispatch, and close behavior +- `src/main/modules/taskbarLyric/index.ts`: wire state updates and right-click requests +- `src/main/modules/taskbarLyric/types.ts`: internal menu state typing +- `src/main/modules/winMain/rendererEvent/taskbarLyric.ts`: renderer event registration + +--- + +### Task 1: Extend Shared State And IPC Contract + +**Files:** +- Modify: `src/common/ipcNames.ts` +- Modify: `src/common/types/taskbar_lyric.d.ts` +- Modify: `src/renderer/utils/ipc.ts` +- Modify: `src/renderer-taskbar-lyric/utils/ipc.ts` + +- [ ] **Step 1: Extend the shared taskbar lyric state type with collect status** + +```ts +// src/common/types/taskbar_lyric.d.ts +declare namespace LX { + namespace TaskbarLyric { + interface State { + enabled: boolean + isPlaying: boolean + isCollected: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string | null + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean + } + } +} +``` + +- [ ] **Step 2: Add a dedicated right-click menu request IPC name** + +```ts +// src/common/ipcNames.ts inside WIN_MAIN_RENDERER_EVENT_NAME +taskbar_lyric_show_menu: 'taskbar_lyric_show_menu', +``` + +- [ ] **Step 3: Add a main-renderer helper for pushing the enriched state** + +```ts +// src/renderer/utils/ipc.ts +export const sendTaskbarLyricState = (state: LX.TaskbarLyric.State) => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, state) +} +``` + +- [ ] **Step 4: Add a taskbar lyric renderer helper for requesting the menu** + +```ts +// src/renderer-taskbar-lyric/utils/ipc.ts +export const requestTaskbarLyricMenu = () => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_menu) +} +``` + +- [ ] **Step 5: Run lint to catch typing or duplicate IPC key errors** + +Run: `npm.cmd run lint` + +Expected: `eslint` passes and there are no duplicate object key or unused export errors. + +- [ ] **Step 6: Commit** + +```bash +git add src/common/ipcNames.ts src/common/types/taskbar_lyric.d.ts src/renderer/utils/ipc.ts src/renderer-taskbar-lyric/utils/ipc.ts +git commit -m "补充任务栏歌词菜单状态与IPC" +``` + +--- + +### Task 2: Synchronize Collect State From The Main Renderer + +**Files:** +- Modify: `src/renderer/core/lyric.ts` + +- [ ] **Step 1: Inspect existing player state source and add collect status into the taskbar lyric snapshot** + +```ts +// src/renderer/core/lyric.ts +const getTaskbarLyricState = (): LX.TaskbarLyric.State => { + return { + enabled: appSetting['taskbarLyric.enable'], + isPlaying: isPlay.value, + isCollected: !!musicInfo.isCollect, + songId: musicInfo.id, + title: musicInfo.name, + artist: musicInfo.singer, + lyricLine: lyric.text, + albumCoverUrl: musicInfo.pic, + offsetX: appSetting['taskbarLyric.offsetX'], + showCover: appSetting['taskbarLyric.showCover'], + showSongInfo: appSetting['taskbarLyric.showSongInfo'], + showCurrentLine: appSetting['taskbarLyric.showCurrentLine'], + } +} +``` + +- [ ] **Step 2: Verify every existing sync path continues using `getTaskbarLyricState()`** + +```ts +// src/renderer/core/lyric.ts +const syncTaskbarLyricState = () => { + sendTaskbarLyricState(getTaskbarLyricState()) +} +``` + +This step is complete only if the same helper is still called from: + +```ts +// src/renderer/core/lyric.ts +// onPlay(...) +// onSetLyric(...) +// onUpdateLyric(...) +// setLyric() +// play() +// pause() +// stop() +// sendInfo() +``` + +- [ ] **Step 3: Run a renderer build to catch state-shape mismatches** + +Run: `npm.cmd run build:renderer` + +Expected: renderer build succeeds without `TS2353` or taskbar lyric state property errors. + +- [ ] **Step 4: Commit** + +```bash +git add src/renderer/core/lyric.ts +git commit -m "同步任务栏歌词收藏状态" +``` + +--- + +### Task 3: Emit Native Menu Requests From The Taskbar Lyric Window + +**Files:** +- Modify: `src/renderer-taskbar-lyric/App.vue` +- Modify: `src/renderer-taskbar-lyric/utils/ipc.ts` + +- [ ] **Step 1: Add a dedicated `contextmenu` handler that does not interfere with left-button drag** + +```vue + +
+``` + +```ts +// src/renderer-taskbar-lyric/App.vue +import { sendTaskbarLyricDragEnd, sendTaskbarLyricDragMove, requestTaskbarLyricMenu } from './utils/ipc' + +const handleContextMenu = () => { + stopDragging() + requestTaskbarLyricMenu() +} +``` + +- [ ] **Step 2: Keep left-button drag behavior unchanged** + +```ts +// src/renderer-taskbar-lyric/App.vue +const handlePointerDown = (event: PointerEvent) => { + if (event.button !== 0) return + isDragging.value = true + pointerId = event.pointerId + startScreenX = event.screenX + startOffsetX = state.offsetX + window.addEventListener('pointermove', handlePointerMove) + window.addEventListener('pointerup', stopDragging) + window.addEventListener('pointercancel', stopDragging) +} +``` + +- [ ] **Step 3: Verify the taskbar lyric renderer still builds** + +Run: `npm.cmd run build:renderer-taskbar-lyric` + +Expected: build passes and template/event bindings compile without duplicate handler or missing import errors. + +- [ ] **Step 4: Commit** + +```bash +git add src/renderer-taskbar-lyric/App.vue src/renderer-taskbar-lyric/utils/ipc.ts +git commit -m "增加任务栏歌词右键菜单请求" +``` + +--- + +### Task 4: Build The Native Menu In The Main Process + +**Files:** +- Modify: `src/main/modules/taskbarLyric/types.ts` +- Modify: `src/main/modules/taskbarLyric/main.ts` +- Modify: `src/main/modules/taskbarLyric/index.ts` +- Modify: `src/main/modules/winMain/rendererEvent/taskbarLyric.ts` + +- [ ] **Step 1: Extend internal taskbar lyric state typing for menu generation** + +```ts +// src/main/modules/taskbarLyric/types.ts +export interface TaskbarLyricState { + enabled: boolean + isPlaying: boolean + isCollected: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string | null + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean +} +``` + +- [ ] **Step 2: Add a helper that derives the menu labels and enable state** + +```ts +// src/main/modules/taskbarLyric/main.ts +const hasActiveSong = (state?: TaskbarLyricState | null) => { + return !!state?.songId +} +``` + +```ts +// src/main/modules/taskbarLyric/main.ts +const createTaskbarLyricMenuTemplate = (state?: TaskbarLyricState | null): Electron.MenuItemConstructorOptions[] => { + const enabled = hasActiveSong(state) + + return [ + { + label: '上一首', + enabled, + click: () => sendTaskbarButtonClick('prev'), + }, + { + label: state?.isPlaying ? '暂停' : '播放', + enabled, + click: () => sendTaskbarButtonClick('pause'), + }, + { + label: '下一首', + enabled, + click: () => sendTaskbarButtonClick('next'), + }, + { + label: state?.isCollected ? '取消收藏' : '收藏', + enabled, + click: () => sendTaskbarButtonClick(state?.isCollected ? 'uncollect' : 'collect'), + }, + { type: 'separator' }, + { + label: '关闭任务栏歌词', + click: () => { + global.lx.event_app.settingUpdated({ + 'taskbarLyric.enable': false, + }) + }, + }, + ] +} +``` + +- [ ] **Step 3: Use the same player-control dispatch path as tray/openAPI** + +```ts +// src/main/modules/taskbarLyric/main.ts +import { Menu } from 'electron' +import { sendTaskbarButtonClick } from '@main/modules/tray' +``` + +If `sendTaskbarButtonClick` is not exported today, make the smallest change necessary in the existing module so the taskbar lyric menu can reuse it instead of duplicating player-control dispatch logic. + +- [ ] **Step 4: Add a public function that pops the native menu on the taskbar lyric window** + +```ts +// src/main/modules/taskbarLyric/main.ts +export const showTaskbarLyricMenu = () => { + if (!win) return + const menu = Menu.buildFromTemplate(createTaskbarLyricMenuTemplate(currentState)) + menu.popup({ + window: win, + }) +} +``` + +- [ ] **Step 5: Wire IPC events to cached state and menu popup** + +```ts +// src/main/modules/winMain/rendererEvent/taskbarLyric.ts +mainWindow.webContents.on(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, (_event, state) => { + setTaskbarLyricState(state) +}) +``` + +```ts +// src/main/modules/winMain/rendererEvent/taskbarLyric.ts +ipcMain.on(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_menu, () => { + showTaskbarLyricMenu() +}) +``` + +```ts +// src/main/modules/taskbarLyric/index.ts +export const setTaskbarLyricState = (state: TaskbarLyricState) => { + currentState = state + sendStateToWindow() +} +``` + +- [ ] **Step 6: Implement close behavior through settings, not direct window destruction** + +```ts +// src/main/modules/taskbarLyric/main.ts +const closeTaskbarLyricBySetting = () => { + global.lx.event_app.settingUpdated({ + 'taskbarLyric.enable': false, + }) +} +``` + +If this repository updates settings through a different helper than `settingUpdated`, substitute the real repository function, but keep the behavior: update persisted app setting first and let the existing config listener close the window. + +- [ ] **Step 7: Run main build and lint** + +Run: `npm.cmd run build:main` + +Expected: main bundle compiles, including new menu code and imported player-control helper. + +Run: `npm.cmd run lint` + +Expected: no unused imports, no invalid click handler typings, no duplicate state definitions. + +- [ ] **Step 8: Commit** + +```bash +git add src/main/modules/taskbarLyric/types.ts src/main/modules/taskbarLyric/main.ts src/main/modules/taskbarLyric/index.ts src/main/modules/winMain/rendererEvent/taskbarLyric.ts +git commit -m "实现任务栏歌词原生右键菜单" +``` + +--- + +### Task 5: Run Manual Verification In `npm run dev` + +**Files:** +- Modify: none required unless bugs are found during verification + +- [ ] **Step 1: Start the app in development mode** + +Run: `npm.cmd run dev` + +Expected: the main window and taskbar lyric renderer start normally without compile errors. + +- [ ] **Step 2: Verify empty-state menu behavior** + +Manual steps: + +1. Enable taskbar lyric. +2. Ensure no track is actively loaded or switch to a state with no current song if supported. +3. Right-click the taskbar lyric window. + +Expected: + +- `上一首` disabled +- `播放` or `暂停` disabled +- `下一首` disabled +- `收藏` disabled +- `关闭任务栏歌词` enabled + +- [ ] **Step 3: Verify playback-state menu behavior** + +Manual steps: + +1. Play a song. +2. Right-click the taskbar lyric window while playing. +3. Click `暂停`. +4. Right-click again. +5. Click `播放`. + +Expected: + +- playing state shows `暂停` +- paused state shows `播放` +- action toggles real playback state + +- [ ] **Step 4: Verify collect/uncollect menu behavior** + +Manual steps: + +1. Play an uncollected song. +2. Right-click and click `收藏`. +3. Right-click again. +4. Click `取消收藏`. + +Expected: + +- uncollected song shows `收藏` +- after collect, reopening the menu shows `取消收藏` +- after uncollect, reopening the menu returns to `收藏` + +- [ ] **Step 5: Verify previous/next and close behavior** + +Manual steps: + +1. Right-click and click `下一首`. +2. Right-click and click `上一首`. +3. Right-click and click `关闭任务栏歌词`. +4. Check the settings page. + +Expected: + +- track changes correctly on prev/next +- taskbar lyric disappears after close +- settings page shows `taskbarLyric.enable` turned off + +- [ ] **Step 6: If no fixes are needed, create the verification commit or leave the tree clean** + +Run: `git status --short` + +Expected: no changes if verification required no follow-up fixes. + +--- + +## Self-Review + +### Spec coverage + +- Native menu on right-click: covered by Tasks 3 and 4 +- Dynamic play/pause label: covered by Task 4 +- Dynamic collect/uncollect label: covered by Tasks 2 and 4 +- Disabled player actions when no song exists: covered by Task 4 and verified in Task 5 +- Close through settings sync: covered by Task 4 and verified in Task 5 + +### Placeholder scan + +- No `TODO` or `TBD` markers remain. +- All touched files are named explicitly. +- All verification commands are concrete. + +### Type consistency + +- Shared state uses `isCollected` consistently across common types, renderer sync, and main-process menu logic. +- Right-click menu request uses one IPC name: `taskbar_lyric_show_menu`. + +## Execution Handoff + +Plan complete and saved to `docs/superpowers/plans/2026-05-21-taskbar-lyric-context-menu-implementation.md`. Two execution options: + +**1. Subagent-Driven (recommended)** - I dispatch a fresh subagent per task, review between tasks, fast iteration + +**2. Inline Execution** - Execute tasks in this session using executing-plans, batch execution with checkpoints + +**Which approach?** diff --git a/docs/superpowers/plans/2026-05-22-lyric-service-refactor.md b/docs/superpowers/plans/2026-05-22-lyric-service-refactor.md new file mode 100644 index 0000000000..278ac0ecd6 --- /dev/null +++ b/docs/superpowers/plans/2026-05-22-lyric-service-refactor.md @@ -0,0 +1,370 @@ +# Lyric Service Refactor Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use `superpowers:subagent-driven-development` or `superpowers:executing-plans` to carry out this plan in bounded steps. + +**Goal:** Make taskbar lyric and desktop lyric continue working without relying on the main renderer window being visible, minimized, or even running the lyric sync loop. + +**Core idea:** Move lyric-state production out of `src/renderer/core/lyric.ts` and into a shared lyric service owned outside the main renderer view layer. The main UI, desktop lyric window, and taskbar lyric window should all become consumers of the same state source instead of having the main renderer act as the only producer. + +**Why now:** The current “fix” (`backgroundThrottling: false` on the main window) keeps the existing pipeline alive, but it is still a coupling workaround rather than the intended architecture. + +--- + +## Current State + +### Today’s dependency chain + +1. Playback and lyric parsing run in the main renderer layer. +2. `src/renderer/core/lyric.ts` computes current lyric text and playback-derived state. +3. That renderer code: + - pushes desktop lyric updates through a `MessagePort` + - pushes taskbar lyric state through IPC snapshots +4. If the main renderer slows down, both external lyric surfaces are affected. + +### Why desktop lyric “looks independent” + +Desktop lyric already has its own window and its own always-on-top behavior, but its data source is still the main renderer. It is not yet a truly independent lyric producer. + +### Main architectural pain points + +- lyric progression is coupled to renderer lifecycle +- external lyric windows depend on a UI window instead of a domain service +- taskbar lyric and desktop lyric use different transport styles for similar data +- future lyric surfaces would repeat the same coupling + +--- + +## Target Architecture + +### Desired ownership + +Introduce a shared `LyricService` outside the main renderer view layer. + +Responsibilities: + +- track current playback timing state needed by lyric displays +- parse and maintain current lyric lines +- maintain a canonical “current lyric display state” +- expose updates to multiple consumers + +### Consumers + +After refactor, these modules should all consume the same lyric state: + +- main renderer +- desktop lyric renderer +- taskbar lyric renderer + +### Non-goals for the first refactor + +- rewriting the audio player stack +- redesigning desktop lyric UI or taskbar lyric UI +- changing lyric file format support +- merging every window onto one transport immediately if it increases risk too much + +--- + +## Recommended Service Placement + +### Preferred direction + +Use a main-process-owned lyric coordination service, with data fed from the actual playback source through a narrow bridge. + +### Why this is the best balance + +- main process survives window visibility changes naturally +- both desktop lyric and taskbar lyric are already window features controlled from main process +- subscription and fan-out logic belongs naturally in main process +- later adding more surfaces is straightforward + +### Practical constraint + +If the real playback clock or parsed lyric source can only be obtained reliably from renderer/player-side code today, phase 1 can use a hybrid bridge: + +- renderer/player layer sends only raw playback + lyric source events to the main-process lyric service +- main-process lyric service becomes the only place that computes consumer-facing lyric display state + +This still removes view-layer coupling even if a low-level playback bridge remains temporarily. + +--- + +## Proposed Modules + +### New or expanded modules + +- `src/main/modules/lyricService/index.ts` + - central service lifecycle +- `src/main/modules/lyricService/state.ts` + - canonical lyric state +- `src/main/modules/lyricService/channel.ts` + - subscription / broadcast helpers +- `src/main/modules/lyricService/types.ts` + - shared service-level types + +### Existing modules to integrate + +- `src/main/modules/taskbarLyric/*` +- `src/main/modules/winLyric/*` +- `src/main/modules/winMain/rendererEvent/process.ts` +- `src/renderer/core/lyric.ts` +- `src/common/types/taskbar_lyric.d.ts` +- desktop lyric shared type definitions + +--- + +## Refactor Strategy + +### Phase 1: Extract a canonical lyric display state + +**Objective:** Stop having taskbar lyric own an ad hoc renderer snapshot format. + +- [ ] Define a shared lyric-display state type used by both desktop lyric and taskbar lyric consumers. +- [ ] Split fields into: + - playback-derived fields + - song metadata + - display-style fields + - consumer-local UI fields +- [ ] Keep taskbar-specific style settings separate from the core lyric playback state. + +**Deliverable:** One canonical state model for “what lyric surfaces need to know.” + +### Phase 2: Introduce main-process lyric service + +**Objective:** Create a single service that owns current lyric display state. + +- [ ] Add `lyricService` module in main process. +- [ ] Let the service hold: + - current song identity + - parsed lyric payload references or normalized lyric lines + - current play/pause status + - current time / current line + - current collector status if needed by taskbar menu +- [ ] Add broadcast hooks for: + - desktop lyric window + - taskbar lyric window + - optional main renderer listeners + +**Deliverable:** Main process becomes the source of truth for external lyric surfaces. + +### Phase 3: Narrow the renderer bridge + +**Objective:** Reduce the main renderer from “full lyric producer” to “event bridge” or remove that dependency where possible. + +- [ ] Audit what `src/renderer/core/lyric.ts` currently computes that truly must remain renderer-side. +- [ ] Replace direct taskbar snapshot pushes with service update calls. +- [ ] Replace desktop lyric producer logic with service-fed updates. +- [ ] If the low-level player timing still lives in renderer: + - send compact timing / song / lyric-source events into `lyricService` + - do not send fully assembled consumer snapshots anymore + +**Deliverable:** Main renderer no longer directly feeds taskbar lyric or desktop lyric UI state. + +### Phase 4: Unify desktop lyric and taskbar lyric subscriptions + +**Objective:** External lyric windows subscribe to the same service semantics. + +- [ ] Keep separate render payloads only where UI needs differ. +- [ ] Share common state emission helpers. +- [ ] Remove duplicated “current lyric line” calculation paths. +- [ ] Ensure both windows can reconnect and request latest state after recreation. + +**Deliverable:** Desktop lyric and taskbar lyric become parallel consumers of one service. + +### Phase 5: Remove workaround dependencies + +**Objective:** Make the current main-window throttling fix non-essential. + +- [ ] Verify taskbar lyric still updates when main window is: + - minimized + - hidden to tray + - not focused for long periods +- [ ] Verify desktop lyric also remains correct under the same conditions. +- [ ] Confirm external lyric updates still work after recreating the main window. +- [ ] Re-evaluate whether `backgroundThrottling: false` on the main window is still needed for lyric correctness. + +**Deliverable:** External lyric surfaces no longer rely on main renderer staying “awake.” + +--- + +## Data Model Proposal + +### Core service state + +```ts +interface LyricServiceState { + songId: string | null + title: string + artist: string + album: string + albumCoverUrl: string | null + isPlaying: boolean + currentTime: number + currentLine: number + lyricLine: string + lyricLines: string[] + isCollected: boolean +} +``` + +### Taskbar view state + +Keep taskbar-only settings outside the core service: + +```ts +interface TaskbarLyricViewState { + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean + themeColor: string + backgroundColorMode: 'theme' | 'custom' + backgroundColor: string + backgroundOpacity: number + fontColorMode: 'theme' | 'custom' + fontColor: string +} +``` + +### Merge rule + +Taskbar renderer should receive: + +- core lyric service state +- taskbar view settings from config + +Desktop lyric should receive: + +- core lyric service state +- desktop lyric config/settings + +--- + +## Transport Plan + +### Short-term + +Keep existing transports but change their producer: + +- desktop lyric can continue using `MessagePort` +- taskbar lyric can continue using its current IPC state push + +### Mid-term + +Hide transport differences behind main-process adapters: + +- `broadcastToDesktopLyric(state)` +- `broadcastToTaskbarLyric(state)` + +This lets the service stay transport-agnostic. + +--- + +## Migration Notes + +### What should stay in `src/renderer/core/lyric.ts` + +Only code that must remain bound to renderer/player APIs, such as: + +- access to player-side timing APIs if they are not available elsewhere +- temporary bridge logic during migration + +### What should move out + +- taskbar lyric snapshot assembly +- external lyric consumer sync ownership +- shared lyric display state ownership + +### Compatibility approach + +Do not rewrite desktop lyric and taskbar lyric rendering together in one step. Prefer this order: + +1. introduce service and duplicate-feed it +2. switch taskbar lyric to service output +3. switch desktop lyric to service output +4. remove old direct producer paths + +This reduces regression risk. + +--- + +## Risks + +### Risk 1: Playback timing source is still renderer-only + +**Impact:** Full independence may need a bridge instead of a pure main-process implementation. + +**Mitigation:** Treat renderer timing as an input source, not as the owner of final lyric UI state. + +### Risk 2: Desktop lyric regressions during migration + +**Impact:** Desktop lyric is mature and easier to break than taskbar lyric. + +**Mitigation:** Migrate taskbar lyric first, keep desktop lyric on existing transport until service output is verified. + +### Risk 3: Duplicate state during transition + +**Impact:** Old and new producers may drift briefly. + +**Mitigation:** Mark one source authoritative per consumer at each migration step, and delete old sync paths quickly after cutover. + +### Risk 4: Theme / collect status ownership becomes unclear + +**Impact:** UI metadata may still leak back into the lyric service. + +**Mitigation:** Keep domain state and view-state separate from the beginning. + +--- + +## Verification Plan + +### Functional checks + +- [ ] Taskbar lyric updates while main interface is visible +- [ ] Taskbar lyric updates while main interface is minimized +- [ ] Taskbar lyric updates while main interface is hidden to tray +- [ ] Desktop lyric updates under the same three states +- [ ] Theme switching still updates taskbar lyric colors +- [ ] Collect status still updates taskbar right-click menu +- [ ] Recreating either lyric window restores the latest state correctly + +### Build checks + +- [ ] `npm.cmd run build:main` +- [ ] `npm.cmd run build:renderer` +- [ ] `npm.cmd run build:renderer-lyric` +- [ ] `npm.cmd run build:renderer-taskbar-lyric` +- [ ] `npm.cmd run lint` + +--- + +## Recommended Execution Order + +### Milestone 1 + +Create shared lyric service types and main-process service shell. + +### Milestone 2 + +Feed the service from the existing renderer lyric pipeline without changing consumers yet. + +### Milestone 3 + +Switch taskbar lyric to service-owned state. + +### Milestone 4 + +Switch desktop lyric to service-owned state. + +### Milestone 5 + +Delete legacy direct producer logic and re-verify hidden/minimized behavior. + +--- + +## Decision Summary + +This refactor should not be treated as “make taskbar lyric special.” It should be treated as: + +**“Introduce one shared lyric service so every lyric surface stops depending on the main interface renderer lifecycle.”** + +That is the cleanest path, the most extensible path, and the one least likely to create another round of coupling bugs later. diff --git a/docs/superpowers/specs/2026-05-20-taskbar-lyric-design.md b/docs/superpowers/specs/2026-05-20-taskbar-lyric-design.md new file mode 100644 index 0000000000..a4f4aeae13 --- /dev/null +++ b/docs/superpowers/specs/2026-05-20-taskbar-lyric-design.md @@ -0,0 +1,424 @@ +# Taskbar Lyric Design + +**Date:** 2026-05-20 + +**Status:** Proposed + +**Goal:** Add a Windows-only taskbar-style lyric bar that visually attaches to the system taskbar on both Windows 10 and Windows 11, using one shared pseudo-embedded implementation instead of separate native and overlay paths. + +--- + +## 1. Decision Summary + +This feature will **not** use true Windows taskbar embedding. + +Instead, both Windows 10 and Windows 11 will use the same approach: + +- create a dedicated lightweight lyric bar window +- keep it visually aligned with the system taskbar +- make it behave like a taskbar-resident strip rather than a normal app window +- reuse existing player and lyric synchronization logic already used by desktop lyric + +The product positioning becomes: + +> "Taskbar-style lyric bar" rather than "true taskbar plugin." + +This trade-off is intentional. It removes the need for Win32 shell extensions, COM integration, native Node modules, and dual maintenance paths while preserving most of the intended user experience. + +--- + +## 2. Why This Approach + +### Rejected approach: true taskbar embedding on Windows 10 + +Windows 10 historically had shell-extension-style paths such as DeskBand/taskbar toolbar integration, but that route is old, poorly aligned with the current Electron architecture, and would introduce: + +- native C++/COM code +- packaging and signing complexity +- higher crash/debug risk +- a second platform path to maintain + +### Rejected approach: split implementation + +The earlier split plan was: + +- Windows 10: true embedding +- Windows 11: pseudo embedding + +This was rejected because it would force two independent host implementations, two test matrices, and different failure modes for what should be one user-facing feature. + +### Selected approach: one pseudo-embedded host for both Windows 10 and 11 + +This approach gives us: + +- one code path +- one UI implementation +- one settings model +- one verification strategy +- easier iteration for future controls, layout improvements, and theming + +--- + +## 3. User Experience + +### First version scope + +Version 1 only needs to display: + +- album cover +- song title +- singer name +- current lyric line + +Version 1 does **not** include: + +- play/pause/previous/next buttons +- in-bar interaction beyond optional hover behavior +- drag repositioning by the user +- true taskbar injection + +### Expected appearance + +The lyric bar should look like a compact taskbar widget: + +- horizontally arranged +- anchored near the taskbar edge +- visually sized to feel native beside taskbar elements +- hidden from Alt+Tab +- non-focus-stealing during normal playback updates + +Suggested default layout: + +- left: album cover thumbnail +- center: two text rows +- first row: song title +- second row: current lyric line + +Fallback when lyric is unavailable: + +- first row: song title +- second row: singer name + +### Interaction expectations + +- The lyric bar appears when enabled. +- It updates with song and lyric changes in real time. +- It should survive track changes without flicker. +- It should follow taskbar visibility and screen position rules closely enough to feel attached. +- It should never block the main player workflow. + +--- + +## 4. Architecture + +The feature should be implemented as a new display layer, not as a modification of the current desktop lyric window. + +### 4.1 Main units + +#### A. Taskbar lyric service + +New main-process module: + +- `src/main/modules/taskbarLyric/` + +Responsibilities: + +- feature lifecycle +- platform gating +- host window creation/destruction +- taskbar position/work-area tracking +- cached lyric-bar state +- synchronization with renderer/player events + +#### B. Taskbar lyric renderer + +New dedicated renderer target: + +- recommended path: `src/renderer-taskbar-lyric/` + +Responsibilities: + +- render the compact taskbar-style UI +- receive structured playback state from main/renderer bridge +- apply Windows-oriented layout and visual styling +- remain isolated from the existing desktop lyric renderer + +This should be separate from `src/renderer-lyric/` because the desktop lyric renderer is optimized for floating lyric presentation, scrolling, and rich lyric styling, not compact taskbar-density presentation. + +#### C. Player-to-host bridge + +Existing player lyric pipeline already lives in: + +- [src/renderer/core/lyric.ts](/d:/src/lx-music-desktop/src/renderer/core/lyric.ts) + +The new feature should reuse the existing player state source, but send a smaller, dedicated payload tailored for the taskbar lyric bar. + +#### D. Settings and configuration + +Configuration changes will live in existing settings/type locations: + +- [src/common/defaultSetting.ts](/d:/src/lx-music-desktop/src/common/defaultSetting.ts) +- `src/common/types/app_setting.d.ts` +- taskbar lyric settings UI under renderer settings views +- language files under `src/lang/` + +--- + +## 5. Data Model + +The taskbar lyric host should consume a minimal display-oriented state object. + +```ts +interface TaskbarLyricState { + enabled: boolean + isPlaying: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string +} +``` + +Notes: + +- `songId` is used to detect song changes and avoid unnecessary redraw work. +- `lyricLine` is the current active line only, not the full lyric document. +- `albumCoverUrl` can be empty when unavailable. +- The renderer should tolerate incomplete data and show graceful fallbacks. + +### Update model + +Use one-way state updates: + +1. player state changes in renderer +2. taskbar lyric payload is derived from the current playback state +3. payload is sent to main +4. main caches the latest state +5. host window receives push updates + +This keeps the host display-only in V1. + +--- + +## 6. Window Behavior + +The pseudo-embedded bar should behave like a highly constrained utility window. + +### Required characteristics + +- frameless +- non-resizable in normal mode +- hidden from Alt+Tab +- skip taskbar entry +- transparent or translucency-capable background as needed +- does not steal focus when updating +- always on top relative to normal windows when enabled + +### Positioning strategy + +The main process should derive the bar position from taskbar/work-area information rather than storing freeform drag coordinates. + +The window should anchor based on: + +- detected taskbar edge +- current display +- configured alignment (`right` or `center`) +- configured width + +Expected behavior: + +- if taskbar is at bottom, the bar hugs the bottom edge +- if taskbar is at top, the bar hugs the top edge +- V1 supports primary-display horizontal taskbars only; left/right vertical taskbars are not supported +- if monitor scaling changes, the bar recomputes bounds +- if Explorer or display topology changes, the bar repositions + +### Multi-display behavior + +V1 should target the primary display only. + +This keeps the problem bounded and avoids ambiguous placement across secondary taskbars. + +--- + +## 7. Visual Design Rules + +The bar should feel intentional and Windows-friendly, but it does not need to mimic every system metric perfectly. + +### Design direction + +- compact, low-noise layout +- subtle background separation +- readable text at small sizes +- graceful clipping for long song names and lyric lines +- cover art optional but enabled by default + +### Suggested style rules + +- rounded corners on Windows 11 style path +- slightly tighter geometry on Windows 10 if needed +- semi-opaque dark neutral background by default +- strong contrast for title text +- softer contrast for secondary line when not showing lyric + +### Theme relationship + +This feature should **not** directly inherit the app theme colors in V1. + +Reason: + +- taskbar-like presentation is closer to OS chrome than app content +- user theme colors may reduce legibility against desktop/taskbar backgrounds + +Instead, V1 should use a constrained visual preset tuned for readability. Future versions can add appearance presets or "follow app theme" as an opt-in. + +--- + +## 8. Settings Design + +Add a dedicated settings group rather than reusing `desktopLyric.*`. + +Recommended keys: + +```ts +'taskbarLyric.enable': boolean +'taskbarLyric.position': 'right' | 'center' +'taskbarLyric.width': number +'taskbarLyric.showCover': boolean +'taskbarLyric.showSongInfo': boolean +'taskbarLyric.showCurrentLine': boolean +``` + +### Defaults + +- disabled by default +- position: `right` +- width: medium preset or fixed default +- show cover: `true` +- show song info: `true` +- show current line: `true` + +### Settings UI copy + +This should be labeled as Windows-only and experimental. + +The settings description should clearly state: + +- this feature visually attaches to the taskbar +- it is not a true system taskbar extension +- behavior may vary slightly with taskbar auto-hide, DPI, or multiple monitors + +--- + +## 9. Reuse vs New Code + +### Reuse + +- playback state source +- lyric line tracking +- album/song metadata source +- app settings persistence +- existing IPC/event patterns + +### New code + +- taskbar lyric main-process module +- dedicated taskbar lyric renderer +- taskbar position detection and window bounds policy +- taskbar lyric settings group +- taskbar lyric state bridge + +### Explicit non-goal + +Do not retrofit the existing desktop lyric window to impersonate the taskbar lyric bar. + +Reason: + +- desktop lyric and taskbar lyric solve different layout problems +- sharing one renderer would add conditionals and reduce maintainability +- taskbar bar should stay simple and bounded + +--- + +## 10. Failure Handling + +The app must degrade safely. + +If taskbar lyric creation fails: + +- the main app must continue running +- desktop lyric must remain unaffected +- the setting should either auto-disable or surface a clear failure state + +If taskbar position cannot be determined: + +- fall back to bottom-right placement on the primary display + +If album cover is unavailable: + +- hide the image region or show a generic placeholder + +If lyric is unavailable: + +- show singer name in the secondary row + +--- + +## 11. Testing Strategy + +There is no dedicated automated test suite today, so V1 verification will be mostly manual plus lint. + +### Functional checks + +- enable/disable taskbar lyric +- switch songs +- pause/resume playback +- update lyric line during playback +- no visible focus stealing +- no taskbar icon or Alt+Tab entry + +### Environment checks + +- Windows 10 +- Windows 11 +- 100%, 125%, 150% display scaling +- bottom taskbar +- top taskbar +- left/right vertical taskbars do not show the overlay in V1 +- taskbar auto-hide on/off +- Explorer restart recovery + +### Regression checks + +- existing desktop lyric still works +- tray behavior still works +- normal player operation unaffected + +--- + +## 12. Open Follow-Ups For Later Versions + +Not in V1: + +- playback control buttons +- progress display +- user drag repositioning +- secondary monitor taskbar targeting +- appearance presets +- "follow app theme" mode + +These should remain out of scope until the base windowing behavior is stable. + +--- + +## 13. Implementation Readiness + +This design is now narrow enough for one implementation plan. + +The next step should be: + +1. add the written spec to the repo +2. review and approve the spec +3. write a concrete implementation plan with file-level tasks + diff --git a/docs/superpowers/specs/2026-05-21-taskbar-lyric-color-design.md b/docs/superpowers/specs/2026-05-21-taskbar-lyric-color-design.md new file mode 100644 index 0000000000..479b003674 --- /dev/null +++ b/docs/superpowers/specs/2026-05-21-taskbar-lyric-color-design.md @@ -0,0 +1,216 @@ +# 任务栏歌词颜色配置设计 + +## 背景 + +当前任务栏歌词已经支持基础展示、拖拽、宽度调整与右键菜单,但视觉样式仍然是写死的渐变深色背景与固定浅色文字。用户希望它能更自然地融入主题体系,同时保留足够的可读性,因此需要为任务栏歌词增加背景颜色和文字颜色的可配置能力。 + +本次设计聚焦于“颜色模式”和“透明度”两件事,不扩展到圆角、阴影、字体大小、分区颜色等更多样式维度。 + +## 目标 + +1. 背景支持两种颜色来源:`主题色` 与 `自定义颜色` +2. 背景支持独立透明度调节,且透明度只作用于背景层,不作用于文字 +3. 文字支持两种颜色来源:`主题色` 与 `自定义颜色` +4. 文字始终保持完全不透明,避免透明文字影响阅读 +5. 当选择 `主题色` 时,不直接生搬主题主色,而是生成适合任务栏歌词场景的可读性衍生色 +6. 配置修改后,已开启的任务栏歌词窗口应立即刷新样式 + +## 非目标 + +1. 不新增歌名、歌手、歌词三套独立文字颜色 +2. 不新增背景渐变方向、边框颜色、阴影强度等高级样式项 +3. 不修改现有封面显示逻辑、窗口尺寸逻辑、拖拽逻辑、右键菜单逻辑 +4. 不为文字增加透明度配置 + +## 方案对比 + +### 方案 A:背景和文字都支持主题/自定义,主题模式使用任务栏歌词专用衍生色 + +优点: +- 能跟随主题变化 +- 比直接使用主题主色更稳,兼顾阅读性 +- 满足用户对背景和文字都可切换主题/自定义的诉求 + +缺点: +- 需要增加一层颜色映射逻辑 + +### 方案 B:背景和文字都直接使用主题主色 + +优点: +- 实现最简单 + +缺点: +- 某些浅色、高饱和主题下对比度不稳定 +- 在半透明背景场景下容易出现“好看但不清楚” + +### 方案 C:背景支持主题/自定义,文字固定白色或自定义 + +优点: +- 可读性最好控制 + +缺点: +- 与用户希望“文字也支持主题色”的目标不一致 + +### 结论 + +采用方案 A。 + +## 配置设计 + +新增以下设置项: + +### 背景 + +1. `taskbarLyric.style.backgroundColorMode` + - 类型:`'theme' | 'custom'` + - 默认值:`'theme'` + +2. `taskbarLyric.style.backgroundColor` + - 类型:`string` + - 默认值:提供一个兜底 RGBA 值 + - 仅在 `custom` 模式下作为实际背景基色使用 + +3. `taskbarLyric.style.backgroundOpacity` + - 类型:`number` + - 范围:`0 - 100` + - 默认值:`72` + - 含义:背景层透明度百分比 + +### 文字 + +1. `taskbarLyric.style.fontColorMode` + - 类型:`'theme' | 'custom'` + - 默认值:`'theme'` + +2. `taskbarLyric.style.fontColor` + - 类型:`string` + - 默认值:提供一个兜底纯色值 + - 仅在 `custom` 模式下作为实际文字颜色使用 + +## 设置页设计 + +在“任务栏歌词”设置区中新增两组配置: + +### 背景颜色 + +包含: + +1. 模式单选 + - `主题色` + - `自定义` + +2. 自定义颜色选择器 + - 复用现有 `pickrTools` + - 在非自定义模式下禁用或弱化显示 + +3. 透明度滑块 + - 范围:`0 - 100` + - 步进:`1` + - 旁边实时显示百分比,如 `72%` + +### 文字颜色 + +包含: + +1. 模式单选 + - `主题色` + - `自定义` + +2. 自定义颜色选择器 + - 复用现有 `pickrTools` + - 在非自定义模式下禁用或弱化显示 + +第一版统一控制整块文字颜色,不拆分歌名、歌手、歌词颜色。 + +## 渲染设计 + +任务栏歌词渲染层不再写死背景渐变和固定文字颜色,而是改为使用 CSS 变量或内联样式驱动: + +1. 背景色 + - `theme` 模式:根据当前主题主色生成任务栏歌词背景色 + - `custom` 模式:使用用户自定义颜色 + - 最终再叠加 `backgroundOpacity` 作为 alpha + +2. 文字色 + - `theme` 模式:根据当前主题主色生成高对比文字色 + - `custom` 模式:使用用户自定义颜色 + - 始终输出不透明颜色 + +3. 辅助文字色 + - 歌手、分隔符、歌词副文本可以基于主文字色派生稍弱的颜色 + - 派生方式由渲染层统一控制,不单独暴露配置 + +4. 封面 + - 不受背景透明度影响 + - 保持现有显示逻辑 + +## 主题色映射策略 + +为避免直接使用主题主色导致可读性不稳定,主题模式使用“任务栏歌词专用映射规则”: + +1. 背景主题色 + - 读取主题主色 + - 适度向深色或中性色收敛,保留主题倾向但降低刺眼程度 + - 再结合 `backgroundOpacity` 输出实际背景色 + +2. 文字主题色 + - 读取主题主色 + - 自动生成更高对比度的前景色 + - 保证最终文字为完全不透明 + +这套映射优先保证可读性,其次才是色相忠实度。 + +## 数据流 + +1. 设置页更新 `appSetting` +2. 主进程任务栏歌词模块监听新增配置项变化 +3. 当任务栏歌词已开启时,将最新样式状态同步给任务栏歌词窗口 +4. 任务栏歌词渲染层收到状态后立即更新样式 + +本次样式状态可以: + +1. 直接扩展现有 `LX.TaskbarLyric.State` +2. 或在任务栏歌词渲染层通过共享设置自行计算 + +优先推荐扩展现有状态同步链路,这样任务栏歌词窗口不需要直接依赖完整设置仓库,边界更清晰。 + +## 兼容性与回退 + +1. 对已有用户配置保持兼容 + - 新增项都有默认值 + - 老配置缺失时自动回落到默认样式 + +2. 当主题色解析失败时: + - 背景回退到默认深色半透明背景 + - 文字回退到默认浅色文字 + +3. 当自定义颜色值非法时: + - 回退到对应默认值 + +## 测试与验证 + +需要覆盖以下场景: + +1. 默认配置下,任务栏歌词显示正常 +2. 背景切换到主题色时,窗口立即更新 +3. 背景切换到自定义色时,窗口立即更新 +4. 调整背景透明度时,仅背景变化,文字不透明 +5. 文字切换到主题色时,浅色与深色主题下都具备可读性 +6. 文字切换到自定义色时,窗口立即更新 +7. 任务栏歌词关闭后修改配置,再次开启时样式正确恢复 +8. 现有宽度、拖拽、右键菜单功能不受影响 + +## 实施边界 + +本次实现仅包含: + +1. 新增设置项和默认值 +2. 设置页新增背景/文字颜色配置 UI +3. 主进程同步样式状态 +4. 任务栏歌词窗口按配置渲染背景与文字 + +不包含: + +1. 多段文字分别配置颜色 +2. 更多视觉特效配置 +3. 非 Windows 平台的任务栏歌词支持扩展 diff --git a/docs/superpowers/specs/2026-05-21-taskbar-lyric-context-menu-design.md b/docs/superpowers/specs/2026-05-21-taskbar-lyric-context-menu-design.md new file mode 100644 index 0000000000..b0553e0573 --- /dev/null +++ b/docs/superpowers/specs/2026-05-21-taskbar-lyric-context-menu-design.md @@ -0,0 +1,271 @@ +# 任务栏歌词右键菜单设计 + +## 背景 + +当前任务栏歌词采用 Windows 上的“伪嵌入”悬浮窗口方案,已经支持显示当前歌曲信息、歌词、置顶维护与水平拖拽。 + +下一步需要为该悬浮窗口增加右键菜单,提供基础播放器控制能力,避免用户为了切歌、暂停、收藏、关闭功能必须切回主窗口或托盘。 + +## 目标 + +在任务栏歌词窗口上右键时弹出原生菜单,提供以下能力: + +- 上一首 +- 播放 / 暂停 +- 下一首 +- 收藏 / 取消收藏 +- 关闭任务栏歌词 + +菜单行为需要根据当前播放器状态动态更新,尤其是: + +- 播放状态决定显示“播放”还是“暂停” +- 收藏状态决定显示“收藏”还是“取消收藏” +- 没有当前歌曲时,播放器相关菜单置灰 + +## 非目标 + +本次不包含以下内容: + +- 菜单样式自定义 +- 左键交互扩展 +- 菜单项排序自定义 +- 子菜单 +- 多窗口共享统一菜单对象缓存 +- 任务栏歌词区域的其他快捷操作 + +## 方案选型 + +### 方案 1:主进程原生菜单 + +由任务栏歌词渲染层上报右键事件,主进程基于当前播放器状态构建 Electron 原生菜单并弹出。 + +优点: + +- 与 Windows 交互方式一致 +- 与托盘菜单思路一致,稳定性高 +- 菜单点击后直接在主进程执行控制动作,链路清晰 +- 更适合 `focusable: false` 的悬浮窗口 + +缺点: + +- 需要补一条任务栏歌词窗口到主进程的右键菜单 IPC +- 需要在主进程维护一份菜单所需的轻量播放器状态 + +### 方案 2:渲染层自绘菜单 + +在任务栏歌词窗口内部自行渲染右键菜单。 + +优点: + +- 样式自由 + +缺点: + +- 焦点、关闭时机、层级处理更脆弱 +- 与现有非聚焦悬浮窗口的交互模型冲突更大 +- 相比原生菜单没有明显收益 + +### 结论 + +采用方案 1:主进程原生菜单。 + +## 交互设计 + +### 触发 + +- 用户在任务栏歌词窗口任意可见区域点击鼠标右键 +- 渲染层阻止默认行为并发送“请求弹出菜单”消息到主进程 + +### 菜单结构 + +固定顺序如下: + +1. 上一首 +2. 播放 / 暂停 +3. 下一首 +4. 收藏 / 取消收藏 +5. 分隔线 +6. 关闭任务栏歌词 + +### 动态状态 + +- 当前存在歌曲时: + - 上一首、播放/暂停、下一首、收藏/取消收藏可点击 +- 当前不存在歌曲时: + - 上一首、播放/暂停、下一首、收藏/取消收藏置灰 +- 当前正在播放时: + - 第二项显示“暂停” +- 当前已暂停时: + - 第二项显示“播放” +- 当前歌曲已收藏时: + - 第四项显示“取消收藏” +- 当前歌曲未收藏时: + - 第四项显示“收藏” +- “关闭任务栏歌词”始终可点击 + +## 状态模型 + +当前任务栏歌词展示状态已经包含: + +- 是否启用 +- 是否播放中 +- 当前歌曲 ID +- 标题、歌手、歌词行、封面 + +菜单还需要补充一项: + +- 当前歌曲是否已收藏 + +建议扩展任务栏歌词状态定义,增加: + +- `isCollected: boolean` + +这样做的原因: + +- 右键菜单生成时不必临时回查多个模块 +- 展示状态与交互状态在同一条同步链路内,容易维护 +- 后续如果要扩展更多歌曲相关菜单项,也能继续复用 + +## 架构设计 + +### 渲染层职责 + +任务栏歌词渲染层只负责: + +- 监听 `contextmenu` +- 阻止默认右键菜单 +- 通知主进程弹出任务栏歌词菜单 + +不在渲染层负责: + +- 计算菜单文案 +- 判断菜单是否可用 +- 执行播放器动作 + +### 主进程职责 + +主进程负责: + +- 接收任务栏歌词右键请求 +- 读取最新任务栏歌词状态 +- 动态构建 Electron `Menu` +- 将菜单锚定到任务栏歌词窗口弹出 +- 处理菜单点击动作 + +### 播放控制复用 + +播放器控制动作复用现有能力,不新造控制链路: + +- 上一首:复用现有 `prev` +- 播放 / 暂停:复用现有 `toggle_play` +- 下一首:复用现有 `next` +- 收藏 / 取消收藏:复用现有 `collect` / `uncollect` + +如果现有主进程只有 `collect` 且内部可自动切换,则直接复用切换语义。 +如果现有主进程明确区分 `collect` 与 `uncollect`,则根据状态选择发送对应动作。 + +### 关闭任务栏歌词 + +“关闭任务栏歌词”不直接关闭窗口实例,而是更新设置项: + +- `taskbarLyric.enable = false` + +原因: + +- 与设置页状态保持一致 +- 避免“窗口关了但设置还是开着”的状态漂移 +- 后续重新开启仍走统一初始化流程 + +## 数据流 + +### 状态同步 + +主渲染进程在以下场景继续同步任务栏歌词状态到主进程: + +- 切歌 +- 播放 / 暂停变化 +- 歌词变化 +- 收藏状态变化 +- 设置变化 + +同步后的状态保存在主进程任务栏歌词模块内,作为菜单生成依据。 + +### 右键流程 + +1. 用户在任务栏歌词窗口右键 +2. 任务栏歌词渲染层发送“弹出右键菜单” IPC +3. 主进程读取当前最新状态 +4. 主进程生成菜单模板 +5. 主进程调用原生菜单弹出 +6. 用户点击菜单项 +7. 主进程执行对应播放器动作或关闭任务栏歌词 +8. 播放器状态变化后,主渲染进程再次同步任务栏歌词状态 + +## 错误处理 + +### 状态缺失 + +如果主进程尚未收到任何任务栏歌词状态: + +- 菜单仍然可以弹出 +- 播放器相关菜单全部置灰 +- 关闭任务栏歌词保持可用 + +### 窗口不存在 + +如果右键请求到达时任务栏歌词窗口已销毁: + +- 主进程忽略请求 +- 不抛出未捕获异常 + +### 播放控制失败 + +如果底层播放器动作未成功执行: + +- 本次不额外弹错误提示 +- 保持现有播放器动作处理策略 +- 后续状态同步会反映真实状态 + +## 测试设计 + +### 手动验证 + +1. 任务栏歌词开启后,右键可以弹出原生菜单 +2. 正在播放时菜单显示“暂停” +3. 暂停时菜单显示“播放” +4. 未收藏歌曲时菜单显示“收藏” +5. 已收藏歌曲时菜单显示“取消收藏” +6. 点击上一首、下一首可以正确切歌 +7. 点击播放/暂停可以正确切换状态 +8. 点击收藏/取消收藏后,菜单下一次打开时状态正确更新 +9. 点击关闭任务栏歌词后: + - 任务栏歌词消失 + - 设置页中的开关同步为关闭 +10. 没有当前歌曲时,前四项置灰 + +### 构建验证 + +至少验证: + +- `npm.cmd run build:main` +- `npm.cmd run build:renderer` +- `npm.cmd run build:renderer-taskbar-lyric` +- `npm.cmd run lint` + +## 影响范围 + +预计会涉及以下区域: + +- `src/common/ipcNames.ts` +- 任务栏歌词公共类型定义 +- 主渲染进程任务栏歌词状态同步逻辑 +- 主进程任务栏歌词模块 +- 任务栏歌词渲染层 IPC 工具 +- 任务栏歌词渲染层组件事件处理 + +## 实施原则 + +- 优先复用现有播放器控制通道 +- 不引入自绘菜单 +- 不在任务栏歌词渲染层堆积业务判断 +- 关闭功能统一走设置更新,而非局部窗口关闭 diff --git a/package-lock.json b/package-lock.json index 1beb8ee6c8..bd8a01d7ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "lx-music-desktop", - "version": "2.12.2", + "version": "2.12.3-sunny.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "lx-music-desktop", - "version": "2.12.2", + "version": "2.12.3-sunny.5", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -40,7 +40,7 @@ "@types/node": "^20.19.39", "@types/tunnel": "^0.0.7", "@types/ws": "8.5.4", - "@vue/language-plugin-pug": "^3.2.7", + "@vue/language-plugin-pug": "^3.2.8", "browserslist": "^4.28.2", "chalk": "^4.1.2", "changelog-parser": "^3.0.1", @@ -50,11 +50,11 @@ "css-loader": "^7.1.4", "css-minimizer-webpack-plugin": "^8.0.0", "del": "^6.1.1", - "electron": "40.9.2", + "electron": "40.9.3", "electron-builder": "^26.9.0", "electron-debug": "^3.2.0", "electron-devtools-installer": "github:lyswhut/electron-devtools-installer#64596d615c1fc891eefd8aef1dfcb2c87aaadf03", - "electron-to-chromium": "^1.5.345", + "electron-to-chromium": "^1.5.349", "electron-updater": "6.8.4", "eslint": "^8.57.1", "eslint-config-standard": "^17.1.0", @@ -69,7 +69,7 @@ "less-loader": "^12.3.2", "mini-css-extract-plugin": "^2.10.2", "node-loader": "^2.1.0", - "postcss": "^8.5.12", + "postcss": "^8.5.14", "postcss-loader": "^8.2.1", "postcss-pxtorem": "^6.1.0", "pug": "^3.0.4", @@ -99,8 +99,6 @@ }, "node_modules/@babel/code-frame": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { @@ -114,15 +112,11 @@ }, "node_modules/@babel/code-frame/node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -130,8 +124,6 @@ }, "node_modules/@babel/helper-validator-identifier": { "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -139,8 +131,6 @@ }, "node_modules/@babel/parser": { "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -154,8 +144,6 @@ }, "node_modules/@babel/types": { "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -167,8 +155,6 @@ }, "node_modules/@borewit/text-codec": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz", - "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==", "license": "MIT", "funding": { "type": "github", @@ -177,15 +163,11 @@ }, "node_modules/@colordx/core": { "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@colordx/core/-/core-5.4.3.tgz", - "integrity": "sha512-kIxYSfA5T8HXjav55UaaH/o/cKivF6jCCGIb8eqtcsfI46wsvlSiT8jMDyrl779qLec3c2c2oHBZo4oAhvbjrQ==", "dev": true, "license": "MIT" }, "node_modules/@develar/schema-utils": { "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", "dev": true, "license": "MIT", "dependencies": { @@ -201,9 +183,7 @@ } }, "node_modules/@discoveryjs/json-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.0.0.tgz", - "integrity": "sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==", + "version": "1.1.0", "dev": true, "license": "MIT", "engines": { @@ -212,8 +192,6 @@ }, "node_modules/@electron/asar": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", - "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", "dev": true, "license": "MIT", "dependencies": { @@ -230,8 +208,6 @@ }, "node_modules/@electron/fuses": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", - "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", "dev": true, "license": "MIT", "dependencies": { @@ -245,8 +221,6 @@ }, "node_modules/@electron/fuses/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -261,8 +235,6 @@ }, "node_modules/@electron/fuses/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -274,8 +246,6 @@ }, "node_modules/@electron/fuses/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -284,8 +254,6 @@ }, "node_modules/@electron/get": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -306,8 +274,6 @@ }, "node_modules/@electron/notarize": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "license": "MIT", "dependencies": { @@ -321,8 +287,6 @@ }, "node_modules/@electron/notarize/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -337,8 +301,6 @@ }, "node_modules/@electron/notarize/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -350,8 +312,6 @@ }, "node_modules/@electron/notarize/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -360,8 +320,6 @@ }, "node_modules/@electron/osx-sign": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", - "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -382,8 +340,6 @@ }, "node_modules/@electron/osx-sign/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -397,8 +353,6 @@ }, "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "license": "MIT", "engines": { @@ -410,8 +364,6 @@ }, "node_modules/@electron/osx-sign/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -423,8 +375,6 @@ }, "node_modules/@electron/osx-sign/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -432,18 +382,23 @@ } }, "node_modules/@electron/rebuild": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz", - "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==", + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "got": "^11.7.0", + "graceful-fs": "^4.2.11", "node-abi": "^4.2.0", "node-api-version": "^0.2.1", - "node-gyp": "^12.2.0", - "read-binary-file-arch": "^1.0.6" + "node-gyp": "^11.2.0", + "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", + "semver": "^7.3.5", + "tar": "^7.5.6", + "yargs": "^17.0.1" }, "bin": { "electron-rebuild": "lib/cli.js" @@ -454,8 +409,6 @@ }, "node_modules/@electron/universal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", - "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", "dev": true, "license": "MIT", "dependencies": { @@ -472,9 +425,7 @@ } }, "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", "dev": true, "license": "MIT", "dependencies": { @@ -488,8 +439,6 @@ }, "node_modules/@electron/universal/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -501,8 +450,6 @@ }, "node_modules/@electron/universal/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -511,8 +458,6 @@ }, "node_modules/@electron/windows-sign": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", - "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -532,9 +477,7 @@ } }, "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.3.4", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz", - "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "version": "11.3.5", "dev": true, "license": "MIT", "optional": true, @@ -550,8 +493,6 @@ }, "node_modules/@electron/windows-sign/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "optional": true, @@ -565,8 +506,6 @@ }, "node_modules/@electron/windows-sign/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "optional": true, @@ -577,15 +516,11 @@ }, "node_modules/@epic-web/invariant": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", "dev": true, "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -603,8 +538,6 @@ }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -613,8 +546,6 @@ }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -637,8 +568,6 @@ }, "node_modules/@eslint/js": { "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", "engines": { @@ -647,9 +576,6 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -663,8 +589,6 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -677,16 +601,100 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", "dependencies": { @@ -697,23 +705,19 @@ } }, "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "version": "30.4.0", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "jest-regex-util": "30.0.1" + "jest-regex-util": "30.4.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { @@ -724,14 +728,12 @@ } }, "node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", + "@jest/pattern": "30.4.0", + "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", @@ -744,8 +746,6 @@ }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -755,8 +755,6 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -765,8 +763,6 @@ }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { @@ -776,14 +772,10 @@ }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -793,8 +785,6 @@ }, "node_modules/@jsonjoy.com/base64": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -810,8 +800,6 @@ }, "node_modules/@jsonjoy.com/buffers": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -827,8 +815,6 @@ }, "node_modules/@jsonjoy.com/codegen": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "dev": true, "license": "Apache-2.0", "engines": { @@ -844,8 +830,6 @@ }, "node_modules/@jsonjoy.com/fs-core": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.2.tgz", - "integrity": "sha512-SVjwklkpIV5wrynpYtuYnfYH1QF4/nDuLBX7VXdb+3miglcAgBVZb/5y0cOsehRV/9Vb+3UqhkMq3/NR3ztdkQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -866,8 +850,6 @@ }, "node_modules/@jsonjoy.com/fs-fsa": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.2.tgz", - "integrity": "sha512-fhO8+iR2I+OCw668ISDJdn1aArc9zx033sWejIyzQ8RBeXa9bDSaUeA3ix0poYOfrj1KdOzytmYNv2/uLDfV6g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -889,8 +871,6 @@ }, "node_modules/@jsonjoy.com/fs-node": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.2.tgz", - "integrity": "sha512-nX2AdL6cOFwLdju9G4/nbRnYevmCJbh7N7hvR3gGm97Cs60uEjyd0rpR+YBS7cTg175zzl22pGKXR5USaQMvKg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -915,8 +895,6 @@ }, "node_modules/@jsonjoy.com/fs-node-builtins": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.2.tgz", - "integrity": "sha512-xhiegylRmhw43Ki2HO1ZBL7DQ5ja/qpRsL29VtQ2xuUHiuDGbgf2uD4p9Qd8hJI5P6RCtGYD50IXHXVq/Ocjcg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -932,8 +910,6 @@ }, "node_modules/@jsonjoy.com/fs-node-to-fsa": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.2.tgz", - "integrity": "sha512-18LmWTSONhoAPW+IWRuf8w/+zRolPFGPeGwMxlAhhfY11EKzX+5XHDBPAw67dBF5dxDErHJbl40U+3IXSDRXSQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -954,8 +930,6 @@ }, "node_modules/@jsonjoy.com/fs-node-utils": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.2.tgz", - "integrity": "sha512-rsPSJgekz43IlNbLyAM/Ab+ouYLWGp5DDBfYBNNEqDaSpsbXfthBn29Q4muFA9L0F+Z3mKo+CWlgSCXrf+mOyQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -974,8 +948,6 @@ }, "node_modules/@jsonjoy.com/fs-print": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.2.tgz", - "integrity": "sha512-wK9NSow48i4DbDl9F1CQE5TqnyZOJ04elU3WFG5aJ76p+YxO/ulyBBQvKsessPxdo381Bc2pcEoyPujMOhcRqQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -995,8 +967,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.2.tgz", - "integrity": "sha512-GdduDZuoP5V/QCgJkx9+BZ6SC0EZ/smXAdTS7PfMqgMTGXLlt/bH/FqMYaqB9JmLf05sJPtO0XRbAwwkEEPbVw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1018,8 +988,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1035,8 +1003,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1052,8 +1018,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1079,8 +1043,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1099,8 +1061,6 @@ }, "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1120,8 +1080,6 @@ }, "node_modules/@jsonjoy.com/json-pack": { "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1147,8 +1105,6 @@ }, "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1164,8 +1120,6 @@ }, "node_modules/@jsonjoy.com/json-pointer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1185,8 +1139,6 @@ }, "node_modules/@jsonjoy.com/util": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1206,8 +1158,6 @@ }, "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1223,15 +1173,11 @@ }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true, "license": "MIT" }, "node_modules/@malept/cross-spawn-promise": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "funding": [ { @@ -1253,8 +1199,6 @@ }, "node_modules/@malept/flatpak-bundler": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1269,8 +1213,6 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1285,8 +1227,6 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1298,8 +1238,6 @@ }, "node_modules/@malept/flatpak-bundler/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -1308,8 +1246,6 @@ }, "node_modules/@noble/hashes": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", "engines": { @@ -1321,8 +1257,6 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1335,8 +1269,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1345,8 +1277,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1357,146 +1287,163 @@ "node": ">= 8" } }, + "node_modules/@npmcli/agent": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/@peculiar/asn1-cms": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.6.1.tgz", - "integrity": "sha512-vdG4fBF6Lkirkcl53q6eOdn3XYKt+kJTG59edgRZORlg/3atWWEReRCx5rYE1ZzTTX6vLK5zDMjHh7vbrcXGtw==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-csr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.6.1.tgz", - "integrity": "sha512-WRWnKfIocHyzFYQTka8O/tXCiBquAPSrRjXbOkHbO4qdmS6loffCEGs+rby6WxxGdJCuunnhS2duHURhjyio6w==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-ecc": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.6.1.tgz", - "integrity": "sha512-+Vqw8WFxrtDIN5ehUdvlN2m73exS2JVG0UAyfVB31gIfor3zWEAQPD+K9ydCxaj3MLen9k0JhKpu9LqviuCE1g==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pfx": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.6.1.tgz", - "integrity": "sha512-nB5jVQy3MAAWvq0KY0R2JUZG8bO/bTLpnwyOzXyEh/e54ynGTatAR+csOnXkkVD9AFZ2uL8Z7EV918+qB1qDvw==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-rsa": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-rsa": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.6.1.tgz", - "integrity": "sha512-JB5iQ9Izn5yGMw3ZG4Nw3Xn/hb/G38GYF3lf7WmJb8JZUydhVGEjK/ZlFSWhnlB7K/4oqEs8HnfFIKklhR58Tw==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.6.1.tgz", - "integrity": "sha512-5EV8nZoMSxeWmcxWmmcolg22ojZRgJg+Y9MX2fnE2bGRo5KQLqV5IL9kdSQDZxlHz95tHvIq9F//bvL1OeNILw==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-cms": "^2.6.1", - "@peculiar/asn1-pfx": "^2.6.1", - "@peculiar/asn1-pkcs8": "^2.6.1", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", - "@peculiar/asn1-x509-attr": "^2.6.1", + "@peculiar/asn1-cms": "^2.7.0", + "@peculiar/asn1-pfx": "^2.7.0", + "@peculiar/asn1-pkcs8": "^2.7.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", + "@peculiar/asn1-x509-attr": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-rsa": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.6.1.tgz", - "integrity": "sha512-1nVMEh46SElUt5CB3RUTV4EG/z7iYc7EoaDY5ECwganibQPkZ/Y2eMsTKB/LeyrUJ+W/tKoD9WUqIy8vB+CEdA==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { + "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-x509": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.6.1.tgz", - "integrity": "sha512-O9jT5F1A2+t3r7C4VT7LYGXqkGLK7Kj1xFpz7U0isPrubwU5PbDoyYtx6MiGst29yq7pXN5vZbQFKRCP+lLZlA==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/utils": "^2.0.2", "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.6.1.tgz", - "integrity": "sha512-tlW6cxoHwgcQghnJwv3YS+9OO1737zgPogZ+CgWRUK4roEwIPzRH4JEiG770xe5HX2ATfCpmX60gurfWIF9dcQ==", + "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.1", + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/asn1-x509": "^2.7.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, "node_modules/@peculiar/x509": { "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", "dev": true, "license": "MIT", "dependencies": { @@ -1516,18 +1463,23 @@ "node": ">=20.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@simonwep/pickr": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.9.1.tgz", - "integrity": "sha512-fR3qmfAcPf/HSFS7GEnTmZLM3+xERv1+jyMBbzT63ilRRM8veYjI7ELvkHHKk0/du3lHp7uh/FqatjM3646X1g==", "license": "MIT", "dependencies": { "core-js": "3.37.0", @@ -1536,8 +1488,6 @@ }, "node_modules/@simonwep/pickr/node_modules/core-js": { "version": "3.37.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.37.0.tgz", - "integrity": "sha512-fu5vHevQ8ZG4og+LXug8ulUtVxjOcEYvifJr7L5Bfq9GOztVqsKd9/59hUk2ZSbCrS3BqUr3EpaYGIYzq7g3Ug==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -1547,15 +1497,11 @@ }, "node_modules/@sinclair/typebox": { "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", "dev": true, "license": "MIT" }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, "license": "MIT", "engines": { @@ -1567,8 +1513,6 @@ }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dev": true, "license": "MIT", "dependencies": { @@ -1580,8 +1524,6 @@ }, "node_modules/@tokenizer/inflate": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", "dependencies": { "debug": "^4.4.3", @@ -1597,21 +1539,15 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, "node_modules/@tsconfig/recommended": { "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@tsconfig/recommended/-/recommended-1.0.13.tgz", - "integrity": "sha512-sySRuBfMKyKO/j2ZAhR8kSembhjuPEV4Ra3AHtmWLq51+iGaudr45crPSzNC5b7/Ctrh9dfUpBuTlYrH6rM58Q==", "dev": true, "license": "MIT" }, "node_modules/@types/better-sqlite3": { "version": "7.6.13", - "resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz", - "integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==", "dev": true, "license": "MIT", "dependencies": { @@ -1620,8 +1556,6 @@ }, "node_modules/@types/body-parser": { "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { @@ -1631,8 +1565,6 @@ }, "node_modules/@types/bonjour": { "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1641,8 +1573,6 @@ }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dev": true, "license": "MIT", "dependencies": { @@ -1654,8 +1584,6 @@ }, "node_modules/@types/connect": { "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -1664,8 +1592,6 @@ }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1675,8 +1601,6 @@ }, "node_modules/@types/debug": { "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { @@ -1685,8 +1609,6 @@ }, "node_modules/@types/eslint": { "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", "dev": true, "license": "MIT", "dependencies": { @@ -1694,28 +1616,13 @@ "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { @@ -1727,8 +1634,6 @@ }, "node_modules/@types/express-serve-static-core": { "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, "license": "MIT", "dependencies": { @@ -1740,8 +1645,6 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, "license": "MIT", "dependencies": { @@ -1750,29 +1653,21 @@ }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true, "license": "MIT" }, "node_modules/@types/http-cache-semantics": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, "license": "MIT", "dependencies": { @@ -1781,15 +1676,11 @@ }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -1798,8 +1689,6 @@ }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1808,23 +1697,17 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@types/keyv": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dev": true, "license": "MIT", "dependencies": { @@ -1833,22 +1716,16 @@ }, "node_modules/@types/mime": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, "node_modules/@types/needle": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@types/needle/-/needle-3.3.0.tgz", - "integrity": "sha512-UFIuc1gdyzAqeVUYpSL+cliw2MmU/ZUhVZKE7Zo4wPbgc8hbljeKSnn6ls6iG8r5jpegPXLUIhJ+Wb2kLVs8cg==", "dev": true, "license": "MIT", "dependencies": { @@ -1856,9 +1733,7 @@ } }, "node_modules/@types/node": { - "version": "20.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", - "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", + "version": "20.19.41", "dev": true, "license": "MIT", "dependencies": { @@ -1878,23 +1753,17 @@ } }, "node_modules/@types/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "version": "6.15.1", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/responselike": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dev": true, "license": "MIT", "dependencies": { @@ -1903,23 +1772,17 @@ }, "node_modules/@types/retry": { "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, "license": "MIT", "peer": true }, "node_modules/@types/send": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1928,8 +1791,6 @@ }, "node_modules/@types/serve-index": { "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "license": "MIT", "dependencies": { @@ -1938,8 +1799,6 @@ }, "node_modules/@types/serve-static": { "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { @@ -1950,8 +1809,6 @@ }, "node_modules/@types/serve-static/node_modules/@types/send": { "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", "dependencies": { @@ -1961,8 +1818,6 @@ }, "node_modules/@types/sockjs": { "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1971,8 +1826,6 @@ }, "node_modules/@types/tunnel": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.7.tgz", - "integrity": "sha512-VYKjZSmb2PvUwXoux4Gy4LAk7kzOB1ktkjyL4lxvpkqL2adgR+Qrh/yFyWluvJgIXWFicqs7XuzPI2NbTO/r3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1989,8 +1842,6 @@ }, "node_modules/@types/ws": { "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dev": true, "license": "MIT", "dependencies": { @@ -1999,8 +1850,6 @@ }, "node_modules/@types/yargs": { "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", "dev": true, "license": "MIT", "dependencies": { @@ -2009,15 +1858,11 @@ }, "node_modules/@types/yargs-parser": { "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, "node_modules/@types/yauzl": { "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, "license": "MIT", "optional": true, @@ -2027,8 +1872,6 @@ }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, "license": "MIT", "peer": true, @@ -2064,8 +1907,6 @@ }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2093,8 +1934,6 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2111,8 +1950,6 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, "license": "MIT", "peer": true, @@ -2140,8 +1977,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, "license": "MIT", "engines": { @@ -2154,8 +1989,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2183,8 +2016,6 @@ }, "node_modules/@typescript-eslint/utils": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, "license": "MIT", "peer": true, @@ -2210,8 +2041,6 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, "license": "MIT", "dependencies": { @@ -2227,23 +2056,17 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "version": "1.3.1", "dev": true, "license": "ISC" }, "node_modules/@volar/source-map": { "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", - "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", "dev": true, "license": "MIT" }, "node_modules/@vue/compiler-core": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.13.tgz", - "integrity": "sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==", "license": "MIT", "dependencies": { "@babel/parser": "^7.23.5", @@ -2254,8 +2077,6 @@ }, "node_modules/@vue/compiler-dom": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.13.tgz", - "integrity": "sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==", "license": "MIT", "dependencies": { "@vue/compiler-core": "3.3.13", @@ -2264,8 +2085,6 @@ }, "node_modules/@vue/compiler-sfc": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.13.tgz", - "integrity": "sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.23.5", @@ -2282,8 +2101,6 @@ }, "node_modules/@vue/compiler-ssr": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.13.tgz", - "integrity": "sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==", "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.3.13", @@ -2292,14 +2109,10 @@ }, "node_modules/@vue/devtools-api": { "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, "node_modules/@vue/language-plugin-pug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@vue/language-plugin-pug/-/language-plugin-pug-3.2.7.tgz", - "integrity": "sha512-5D01iE73WYNZX38wGeU7qo0srDc1ATX6K+CAahJdDpxUIHPLE4AbUHP1lS790oT+ZLmlTqSBOFbTYDNtuKqA3A==", + "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -2312,8 +2125,6 @@ }, "node_modules/@vue/reactivity": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.13.tgz", - "integrity": "sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==", "license": "MIT", "dependencies": { "@vue/shared": "3.3.13" @@ -2321,8 +2132,6 @@ }, "node_modules/@vue/reactivity-transform": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.13.tgz", - "integrity": "sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==", "license": "MIT", "dependencies": { "@babel/parser": "^7.23.5", @@ -2334,8 +2143,6 @@ }, "node_modules/@vue/runtime-core": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.13.tgz", - "integrity": "sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==", "license": "MIT", "dependencies": { "@vue/reactivity": "3.3.13", @@ -2344,8 +2151,6 @@ }, "node_modules/@vue/runtime-dom": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.13.tgz", - "integrity": "sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==", "license": "MIT", "dependencies": { "@vue/runtime-core": "3.3.13", @@ -2355,8 +2160,6 @@ }, "node_modules/@vue/server-renderer": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.13.tgz", - "integrity": "sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==", "license": "MIT", "dependencies": { "@vue/compiler-ssr": "3.3.13", @@ -2368,14 +2171,10 @@ }, "node_modules/@vue/shared": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.13.tgz", - "integrity": "sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==", "license": "MIT" }, "node_modules/@webassemblyjs/ast": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2385,29 +2184,21 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { @@ -2418,15 +2209,11 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -2438,8 +2225,6 @@ }, "node_modules/@webassemblyjs/ieee754": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { @@ -2448,8 +2233,6 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2458,15 +2241,11 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2482,8 +2261,6 @@ }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { @@ -2496,8 +2273,6 @@ }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -2509,8 +2284,6 @@ }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2524,8 +2297,6 @@ }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { @@ -2535,8 +2306,6 @@ }, "node_modules/@xmldom/xmldom": { "version": "0.8.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz", - "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==", "dev": true, "license": "MIT", "engines": { @@ -2545,39 +2314,29 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/7zip-bin": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", "dev": true, "license": "MIT" }, "node_modules/abbrev": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", - "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "version": "3.0.1", "dev": true, "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { @@ -2590,8 +2349,6 @@ }, "node_modules/accepts/node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", "engines": { @@ -2600,8 +2357,6 @@ }, "node_modules/acorn": { "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2613,8 +2368,6 @@ }, "node_modules/acorn-import-phases": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", "engines": { @@ -2626,8 +2379,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2636,8 +2387,6 @@ }, "node_modules/agent-base": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", "engines": { @@ -2646,8 +2395,6 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2660,8 +2407,6 @@ }, "node_modules/ajv": { "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -2677,8 +2422,6 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -2695,8 +2438,6 @@ }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -2712,15 +2453,11 @@ }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2729,8 +2466,6 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -2742,8 +2477,6 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -2752,8 +2485,6 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2768,8 +2499,6 @@ }, "node_modules/anymatch": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "license": "ISC", "dependencies": { @@ -2779,8 +2508,6 @@ }, "node_modules/anymatch/node_modules/normalize-path": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -2792,15 +2519,11 @@ }, "node_modules/app-builder-bin": { "version": "5.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", "dev": true, "license": "MIT" }, "node_modules/app-builder-lib": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.9.0.tgz", - "integrity": "sha512-f/1GhVrDfBH7sSzhAwiXa1rpR/7pB7Av5woUjmt+QYE0QyNvrOAiY05rngtR/PK4/1BzS6/zVoYobIwDAsrtBA==", + "version": "26.11.1", "dev": true, "license": "MIT", "dependencies": { @@ -2810,20 +2533,20 @@ "@electron/get": "^3.0.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", - "@electron/rebuild": "^4.0.3", + "@electron/rebuild": "4.0.3", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", - "builder-util": "26.9.0", - "builder-util-runtime": "9.6.0", + "builder-util": "26.11.1", + "builder-util-runtime": "9.6.1", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "26.9.0", + "electron-publish": "26.11.1", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", @@ -2839,20 +2562,19 @@ "tar": "^7.5.7", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "26.9.0", - "electron-builder-squirrel-windows": "26.9.0" + "dmg-builder": "26.11.1", + "electron-builder-squirrel-windows": "26.11.1" } }, "node_modules/app-builder-lib/node_modules/@electron/get": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", - "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2873,8 +2595,6 @@ }, "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -2888,8 +2608,6 @@ }, "node_modules/app-builder-lib/node_modules/ci-info": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -2904,8 +2622,6 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2919,8 +2635,6 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2932,8 +2646,6 @@ }, "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -2942,8 +2654,6 @@ }, "node_modules/app-builder-lib/node_modules/isexe": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -2952,8 +2662,6 @@ }, "node_modules/app-builder-lib/node_modules/which": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "license": "ISC", "dependencies": { @@ -2968,15 +2676,11 @@ }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { @@ -2992,15 +2696,11 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "peer": true, @@ -3023,8 +2723,6 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -3033,8 +2731,6 @@ }, "node_modules/array.prototype.findlastindex": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "peer": true, @@ -3056,8 +2752,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "peer": true, @@ -3076,8 +2770,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "peer": true, @@ -3096,8 +2788,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3118,15 +2808,11 @@ }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, "node_modules/asn1js": { "version": "3.0.10", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3140,8 +2826,6 @@ }, "node_modules/assert-never": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.4.0.tgz", - "integrity": "sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==", "dev": true, "license": "MIT" }, @@ -3169,15 +2853,11 @@ }, "node_modules/async": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/async-exit-hook": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", "dev": true, "license": "MIT", "engines": { @@ -3186,8 +2866,6 @@ }, "node_modules/async-function": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { @@ -3196,15 +2874,11 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, "license": "ISC", "engines": { @@ -3213,8 +2887,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3229,8 +2901,6 @@ }, "node_modules/babel-code-frame": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", "dev": true, "license": "MIT", "dependencies": { @@ -3241,8 +2911,6 @@ }, "node_modules/babel-code-frame/node_modules/ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -3251,8 +2919,6 @@ }, "node_modules/babel-code-frame/node_modules/ansi-styles": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true, "license": "MIT", "engines": { @@ -3261,8 +2927,6 @@ }, "node_modules/babel-code-frame/node_modules/chalk": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "license": "MIT", "dependencies": { @@ -3278,8 +2942,6 @@ }, "node_modules/babel-code-frame/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -3288,8 +2950,6 @@ }, "node_modules/babel-code-frame/node_modules/strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", "dependencies": { @@ -3301,8 +2961,6 @@ }, "node_modules/babel-code-frame/node_modules/supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true, "license": "MIT", "engines": { @@ -3311,8 +2969,6 @@ }, "node_modules/babel-walk": { "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, "license": "MIT", "dependencies": { @@ -3324,8 +2980,6 @@ }, "node_modules/balanced-match": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { @@ -3334,8 +2988,6 @@ }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -3353,9 +3005,7 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.24", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", - "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", + "version": "2.10.31", "dev": true, "license": "Apache-2.0", "bin": { @@ -3367,15 +3017,11 @@ }, "node_modules/batch": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true, "license": "MIT" }, "node_modules/better-sqlite3": { - "version": "12.9.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.9.0.tgz", - "integrity": "sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==", + "version": "12.10.0", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -3383,13 +3029,11 @@ "prebuild-install": "^7.1.1" }, "engines": { - "node": "20.x || 22.x || 23.x || 24.x || 25.x" + "node": "20.x || 22.x || 23.x || 24.x || 25.x || 26.x" } }, "node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { @@ -3398,8 +3042,6 @@ }, "node_modules/binary-extensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { @@ -3411,8 +3053,6 @@ }, "node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" @@ -3420,8 +3060,6 @@ }, "node_modules/bl": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "dependencies": { "buffer": "^5.5.0", @@ -3429,31 +3067,13 @@ "readable-stream": "^3.4.0" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bluebird": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true, "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.5", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", - "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, "license": "MIT", "dependencies": { @@ -3477,8 +3097,6 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -3487,8 +3105,6 @@ }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { @@ -3500,31 +3116,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + "version": "1.4.0", "dev": true, "license": "MIT", "dependencies": { @@ -3534,24 +3130,17 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, "node_modules/boolean": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "license": "MIT", "optional": true }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", "dev": true, "license": "MIT", "dependencies": { @@ -3576,8 +3165,6 @@ }, "node_modules/browserslist": { "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, "funding": [ { @@ -3610,8 +3197,6 @@ }, "node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -3634,8 +3219,6 @@ }, "node_modules/buffer-crc32": { "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "license": "MIT", "engines": { @@ -3644,15 +3227,11 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/bufferutil": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz", - "integrity": "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -3663,16 +3242,14 @@ } }, "node_modules/builder-util": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.9.0.tgz", - "integrity": "sha512-+eocmbdisnyb40B9nAp/KREfYLXvGagxV50KZv/Zh4aflsr1fdY9Qxs6QG1Jtx1vH5d5NQ3hIcemUi4RSlFK/Q==", + "version": "26.11.1", "dev": true, "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", "7zip-bin": "~5.2.0", "app-builder-bin": "5.0.0-alpha.12", - "builder-util-runtime": "9.6.0", + "builder-util-runtime": "9.6.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", @@ -3685,12 +3262,13 @@ "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/builder-util-runtime": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.6.0.tgz", - "integrity": "sha512-k9V5I18PXLepLZ8jVmPzsH+gVCVZ+9aMVLyCZ0ZLOkT2KSyiBblDCCN8WxDbjOpfLGNHZqqJPBmW0HYeqxlgkQ==", + "version": "9.6.1", "dev": true, "license": "MIT", "dependencies": { @@ -3703,8 +3281,6 @@ }, "node_modules/builder-util/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3718,8 +3294,6 @@ }, "node_modules/builder-util/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3731,8 +3305,6 @@ }, "node_modules/builder-util/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -3741,8 +3313,6 @@ }, "node_modules/builtin-modules": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", "peer": true, @@ -3755,8 +3325,6 @@ }, "node_modules/builtins": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "peer": true, @@ -3766,8 +3334,6 @@ }, "node_modules/bundle-name": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3782,8 +3348,6 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -3792,18 +3356,71 @@ }, "node_modules/bytestreamjs": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=6.0.0" } }, + "node_modules/cacache": { + "version": "19.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/p-map": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "dev": true, "license": "MIT", "engines": { @@ -3812,8 +3429,6 @@ }, "node_modules/cacheable-request": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dev": true, "license": "MIT", "dependencies": { @@ -3831,8 +3446,6 @@ }, "node_modules/call-bind": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3850,8 +3463,6 @@ }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3864,8 +3475,6 @@ }, "node_modules/call-bound": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { @@ -3881,8 +3490,6 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -3891,8 +3498,6 @@ }, "node_modules/camel-case": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3902,8 +3507,6 @@ }, "node_modules/caniuse-api": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "license": "MIT", "dependencies": { @@ -3914,9 +3517,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001791", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", - "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "version": "1.0.30001793", "dev": true, "funding": [ { @@ -3936,8 +3537,6 @@ }, "node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -3953,8 +3552,6 @@ }, "node_modules/changelog-parser": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/changelog-parser/-/changelog-parser-3.0.1.tgz", - "integrity": "sha512-1AEVJgnFEO4v5ukfEH/j9cr2Z39Y/GCieNi605azhufAolXF4vQAwZBY8BrUVRkvlI3gwe3i621/PIAW0zmmEQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3970,8 +3567,6 @@ }, "node_modules/character-parser": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", "dev": true, "license": "MIT", "dependencies": { @@ -3980,8 +3575,6 @@ }, "node_modules/chokidar": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -4005,8 +3598,6 @@ }, "node_modules/chokidar/node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -4019,8 +3610,6 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4032,8 +3621,6 @@ }, "node_modules/chokidar/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4045,8 +3632,6 @@ }, "node_modules/chownr": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -4055,8 +3640,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -4065,15 +3648,11 @@ }, "node_modules/chromium-pickle-js": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true, "license": "MIT" }, "node_modules/ci-info": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -4088,8 +3667,6 @@ }, "node_modules/clean-css": { "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "license": "MIT", "dependencies": { @@ -4101,8 +3678,6 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -4111,8 +3686,6 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { @@ -4122,6 +3695,17 @@ "node": ">=8" } }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -4142,8 +3726,6 @@ }, "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4157,8 +3739,6 @@ }, "node_modules/clone": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, "license": "MIT", "engines": { @@ -4167,8 +3747,6 @@ }, "node_modules/clone-deep": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4182,8 +3760,6 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dev": true, "license": "MIT", "dependencies": { @@ -4195,15 +3771,11 @@ }, "node_modules/coalescy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", - "integrity": "sha512-OmRR46eVfyaXZYI7Ai5/vnLHjWhhh99sugx+UTsmVhwaYzARb+Tcdit59/HkVxF8KdqJG5NN8ClUhzQXS3Hh+w==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4215,15 +3787,11 @@ }, "node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/color-parse": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz", - "integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==", "dev": true, "license": "MIT", "dependencies": { @@ -4232,15 +3800,11 @@ }, "node_modules/colorette": { "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -4252,14 +3816,10 @@ }, "node_modules/comlink": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.3.1.tgz", - "integrity": "sha512-+YbhUdNrpBZggBAHWcgQMLPLH1KDF3wJpeqrCKieWQ8RL7atmgsgTQko1XEBK6PsecfopWNntopJ+ByYG1lRaA==", "license": "Apache-2.0" }, "node_modules/commander": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, "license": "MIT", "engines": { @@ -4268,8 +3828,6 @@ }, "node_modules/compare-version": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", "dev": true, "license": "MIT", "engines": { @@ -4278,8 +3836,6 @@ }, "node_modules/compressible": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "license": "MIT", "dependencies": { @@ -4291,8 +3847,6 @@ }, "node_modules/compression": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "dev": true, "license": "MIT", "dependencies": { @@ -4310,8 +3864,6 @@ }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -4320,36 +3872,19 @@ }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, "license": "MIT", "engines": { @@ -4358,8 +3893,6 @@ }, "node_modules/constantinople": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", "dev": true, "license": "MIT", "dependencies": { @@ -4369,8 +3902,6 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4380,31 +3911,8 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -4412,8 +3920,6 @@ }, "node_modules/cookie": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { @@ -4422,15 +3928,11 @@ }, "node_modules/cookie-signature": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "dev": true, "license": "MIT" }, "node_modules/copy-anything": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, "license": "MIT", "dependencies": { @@ -4445,8 +3947,6 @@ }, "node_modules/copy-webpack-plugin": { "version": "14.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-14.0.0.tgz", - "integrity": "sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==", "dev": true, "license": "MIT", "dependencies": { @@ -4469,8 +3969,6 @@ }, "node_modules/core-js": { "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", - "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4480,16 +3978,12 @@ } }, "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "version": "1.0.2", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", - "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4526,8 +4020,6 @@ }, "node_modules/cross-dirname": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, "license": "MIT", "optional": true, @@ -4535,8 +4027,6 @@ }, "node_modules/cross-env": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", "dev": true, "license": "MIT", "dependencies": { @@ -4553,8 +4043,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4568,14 +4056,10 @@ }, "node_modules/crypto-js": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", "license": "MIT" }, "node_modules/css-declaration-sorter": { "version": "7.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz", - "integrity": "sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw==", "dev": true, "license": "ISC", "engines": { @@ -4587,8 +4071,6 @@ }, "node_modules/css-loader": { "version": "7.1.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", - "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", "dev": true, "license": "MIT", "dependencies": { @@ -4623,8 +4105,6 @@ }, "node_modules/css-minimizer-webpack-plugin": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-8.0.0.tgz", - "integrity": "sha512-9bEpzHs8gEq6/cbEj418jXL/YWjBUD2YTLLk905Npt2JODqnRITin0+So5Vx4Dp5vyi2Lpt9pp2QHzQ7fdxNrw==", "dev": true, "license": "MIT", "dependencies": { @@ -4668,8 +4148,6 @@ }, "node_modules/css-select": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4685,8 +4163,6 @@ }, "node_modules/css-select/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "license": "MIT", "dependencies": { @@ -4700,8 +4176,6 @@ }, "node_modules/css-select/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4716,8 +4190,6 @@ }, "node_modules/css-select/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4731,8 +4203,6 @@ }, "node_modules/css-select/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", "funding": { @@ -4741,8 +4211,6 @@ }, "node_modules/css-tree": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { @@ -4755,8 +4223,6 @@ }, "node_modules/css-what": { "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4768,8 +4234,6 @@ }, "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -4780,13 +4244,11 @@ } }, "node_modules/cssnano": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.1.7.tgz", - "integrity": "sha512-N5LGn/OlhMxDTvKACwUPMzT34SSj1b022pvUAE/Vh6r2WD1aUCbc+QNIP/JjX9VVxebdJWZQ3352Lt4oF7dQ/g==", + "version": "7.1.9", "dev": true, "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.15", + "cssnano-preset-default": "^7.0.17", "lilconfig": "^3.1.3" }, "engines": { @@ -4797,71 +4259,65 @@ "url": "https://opencollective.com/cssnano" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/cssnano-preset-default": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.15.tgz", - "integrity": "sha512-60kx7lJ40//HA85cIfQXSOJFby2D2V1pOMNHVCxue3KFWCjRzmiQyL9OvI+NAhwUlaojOfF9eK3nGvrJLCBUfQ==", + "version": "7.0.17", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.28.2", "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.2", + "cssnano-utils": "^5.0.3", "postcss-calc": "^10.1.1", - "postcss-colormin": "^7.0.9", - "postcss-convert-values": "^7.0.11", - "postcss-discard-comments": "^7.0.7", - "postcss-discard-duplicates": "^7.0.3", - "postcss-discard-empty": "^7.0.2", - "postcss-discard-overridden": "^7.0.2", - "postcss-merge-longhand": "^7.0.6", - "postcss-merge-rules": "^7.0.10", - "postcss-minify-font-values": "^7.0.2", - "postcss-minify-gradients": "^7.0.4", - "postcss-minify-params": "^7.0.8", - "postcss-minify-selectors": "^7.1.0", - "postcss-normalize-charset": "^7.0.2", - "postcss-normalize-display-values": "^7.0.2", - "postcss-normalize-positions": "^7.0.3", - "postcss-normalize-repeat-style": "^7.0.3", - "postcss-normalize-string": "^7.0.2", - "postcss-normalize-timing-functions": "^7.0.2", - "postcss-normalize-unicode": "^7.0.8", - "postcss-normalize-url": "^7.0.2", - "postcss-normalize-whitespace": "^7.0.2", - "postcss-ordered-values": "^7.0.3", - "postcss-reduce-initial": "^7.0.8", - "postcss-reduce-transforms": "^7.0.2", - "postcss-svgo": "^7.1.2", - "postcss-unique-selectors": "^7.0.6" + "postcss-colormin": "^7.0.10", + "postcss-convert-values": "^7.0.12", + "postcss-discard-comments": "^7.0.8", + "postcss-discard-duplicates": "^7.0.4", + "postcss-discard-empty": "^7.0.3", + "postcss-discard-overridden": "^7.0.3", + "postcss-merge-longhand": "^7.0.7", + "postcss-merge-rules": "^7.0.11", + "postcss-minify-font-values": "^7.0.3", + "postcss-minify-gradients": "^7.0.5", + "postcss-minify-params": "^7.0.9", + "postcss-minify-selectors": "^7.1.2", + "postcss-normalize-charset": "^7.0.3", + "postcss-normalize-display-values": "^7.0.3", + "postcss-normalize-positions": "^7.0.4", + "postcss-normalize-repeat-style": "^7.0.4", + "postcss-normalize-string": "^7.0.3", + "postcss-normalize-timing-functions": "^7.0.3", + "postcss-normalize-unicode": "^7.0.9", + "postcss-normalize-url": "^7.0.3", + "postcss-normalize-whitespace": "^7.0.3", + "postcss-ordered-values": "^7.0.4", + "postcss-reduce-initial": "^7.0.9", + "postcss-reduce-transforms": "^7.0.3", + "postcss-svgo": "^7.1.3", + "postcss-unique-selectors": "^7.0.7" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/cssnano-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.2.tgz", - "integrity": "sha512-kt41WLK7FLKfePzPi645Y+/NtW/nNM7Su6nlNUfJyRNW3JcuU3JU7+cWJc+JexTeZ8dRBvFufefdG2XpXkIo0A==", + "version": "5.0.3", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/csso": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4874,8 +4330,6 @@ }, "node_modules/csso/node_modules/css-tree": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "license": "MIT", "dependencies": { @@ -4889,21 +4343,15 @@ }, "node_modules/csso/node_modules/mdn-data": { "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, "license": "CC0-1.0" }, "node_modules/csstype": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "license": "MIT" }, "node_modules/data-view-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4920,8 +4368,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4938,8 +4384,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4956,8 +4400,6 @@ }, "node_modules/debug": { "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4973,8 +4415,6 @@ }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "license": "MIT", "engines": { @@ -4983,8 +4423,6 @@ }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" @@ -4998,8 +4436,6 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "engines": { "node": ">=10" @@ -5010,8 +4446,6 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { "node": ">=4.0.0" @@ -5019,15 +4453,11 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.3.2.tgz", - "integrity": "sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==", "dev": true, "license": "MIT", "engines": { @@ -5036,8 +4466,6 @@ }, "node_modules/default-browser": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -5053,8 +4481,6 @@ }, "node_modules/default-browser-id": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", "engines": { @@ -5064,10 +4490,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, "license": "MIT", "engines": { @@ -5076,8 +4519,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -5094,8 +4535,6 @@ }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { @@ -5107,8 +4546,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -5125,8 +4562,6 @@ }, "node_modules/del": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "license": "MIT", "dependencies": { @@ -5148,9 +4583,6 @@ }, "node_modules/del/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -5165,8 +4597,6 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { @@ -5175,8 +4605,6 @@ }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", "engines": { @@ -5185,8 +4613,6 @@ }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", "engines": { @@ -5196,8 +4622,6 @@ }, "node_modules/detect-libc": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "license": "Apache-2.0", "engines": { "node": ">=8" @@ -5205,15 +4629,11 @@ }, "node_modules/detect-node": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, "license": "MIT" }, "node_modules/dir-compare": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5223,8 +4643,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -5235,14 +4653,12 @@ } }, "node_modules/dmg-builder": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.9.0.tgz", - "integrity": "sha512-5uSyg0yY+JRMMGwFjIweaukYkCGcZSZwvH5VPlBHiKkTEP1a1/uV+bs4y+VAxPMgzg67YB4CF1vD4U/2d3chfg==", + "version": "26.11.1", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.9.0", - "builder-util": "26.9.0", + "app-builder-lib": "26.11.1", + "builder-util": "26.11.1", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -5253,8 +4669,6 @@ }, "node_modules/dmg-builder/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5268,8 +4682,6 @@ }, "node_modules/dmg-builder/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "dependencies": { @@ -5281,8 +4693,6 @@ }, "node_modules/dmg-builder/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5294,8 +4704,6 @@ }, "node_modules/dmg-builder/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -5331,8 +4739,6 @@ }, "node_modules/dns-packet": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "license": "MIT", "dependencies": { @@ -5344,8 +4750,6 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5357,15 +4761,11 @@ }, "node_modules/doctypes": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "dev": true, "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "license": "MIT", "dependencies": { @@ -5374,8 +4774,6 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", "dependencies": { @@ -5389,8 +4787,6 @@ }, "node_modules/dom-serializer/node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5402,8 +4798,6 @@ }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -5415,8 +4809,6 @@ }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5431,14 +4823,10 @@ }, "node_modules/domready": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/domready/-/domready-1.0.8.tgz", - "integrity": "sha512-uIzsOJUNk+AdGE9a6VDeessoMCzF8RrZvJCX/W8QtyfgdR6Uofn/MvRonih3OtCO79b2VDzDOymuiABrQ4z3XA==", "dev": true }, "node_modules/domutils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5452,8 +4840,6 @@ }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "license": "MIT", "dependencies": { @@ -5463,8 +4849,6 @@ }, "node_modules/dotenv": { "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5476,8 +4860,6 @@ }, "node_modules/dotenv-expand": { "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5492,8 +4874,6 @@ }, "node_modules/dunder-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { @@ -5505,17 +4885,58 @@ "node": ">= 0.4" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5529,9 +4950,7 @@ } }, "node_modules/electron": { - "version": "40.9.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-40.9.2.tgz", - "integrity": "sha512-gTLLTlfMyORZDj+03tkxsstQOQlmu6dYl0X8cwlmFb+gMmCM9Gc+rmBGSaCb5KI11IMUWHu4hvKA/spP8oJe+w==", + "version": "40.9.3", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5548,18 +4967,16 @@ } }, "node_modules/electron-builder": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.9.0.tgz", - "integrity": "sha512-7BEeGz8Xlk7Qvitj70nGAQaq7WQIZ2amsDvsyKSZbxgtL2pM9fm/woZrtn0hoID6Fl7wkn456dK3OmtFNzgiOA==", + "version": "26.11.1", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "26.9.0", - "builder-util": "26.9.0", - "builder-util-runtime": "9.6.0", + "app-builder-lib": "26.11.1", + "builder-util": "26.11.1", + "builder-util-runtime": "9.6.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", - "dmg-builder": "26.9.0", + "dmg-builder": "26.11.1", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", @@ -5574,22 +4991,18 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.9.0.tgz", - "integrity": "sha512-Jzsxa3Kjv94ZRZDK7pc8bzu5iglwGsDOBMWTqLpWx2sCEvb3TLW9PMWqOjpDwizqkMBp8GjP6rceLzQYLFIVow==", + "version": "26.11.1", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "app-builder-lib": "26.9.0", - "builder-util": "26.9.0", + "app-builder-lib": "26.11.1", + "builder-util": "26.11.1", "electron-winstaller": "5.4.0" } }, "node_modules/electron-builder/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5603,8 +5016,6 @@ }, "node_modules/electron-builder/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5616,8 +5027,6 @@ }, "node_modules/electron-builder/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -5626,8 +5035,6 @@ }, "node_modules/electron-debug": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz", - "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==", "dev": true, "license": "MIT", "dependencies": { @@ -5653,9 +5060,6 @@ }, "node_modules/electron-devtools-installer/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -5670,22 +5074,16 @@ }, "node_modules/electron-is-accelerator": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", - "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==", "dev": true, "license": "MIT" }, "node_modules/electron-is-dev": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz", - "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==", "dev": true, "license": "MIT" }, "node_modules/electron-localshortcut": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz", - "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5696,24 +5094,20 @@ } }, "node_modules/electron-log": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.4.3.tgz", - "integrity": "sha512-sOUsM3LjZdugatazSQ/XTyNcw8dfvH1SYhXWiJyfYodAAKOZdHs0txPiLDXFzOZbhXgAgshQkshH2ccq0feyLQ==", + "version": "5.4.4", "license": "MIT", "engines": { "node": ">= 14" } }, "node_modules/electron-publish": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.9.0.tgz", - "integrity": "sha512-gsy+U7JfDuD1lPOrCXeECDQoUsWjFah3s1Fv3pqKnjdJuKYDDvGdvC74kLHVG6nl5G0uQ7YN0eftCQ4rUmhvVw==", + "version": "26.11.1", "dev": true, "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "26.9.0", - "builder-util-runtime": "9.6.0", + "builder-util": "26.11.1", + "builder-util-runtime": "9.6.1", "chalk": "^4.1.2", "form-data": "^4.0.5", "fs-extra": "^10.1.0", @@ -5723,8 +5117,6 @@ }, "node_modules/electron-publish/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5738,8 +5130,6 @@ }, "node_modules/electron-publish/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5751,8 +5141,6 @@ }, "node_modules/electron-publish/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -5760,16 +5148,12 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.347", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.347.tgz", - "integrity": "sha512-BqbKWR67PjxFypgOFcDevD6j8N8GCPkSnQQRuqQIBh3GYCwr0xsLqw2EtSn83oq5iTqJ/wabM/YHV7KgvWGz7Q==", + "version": "1.5.361", "dev": true, "license": "ISC" }, "node_modules/electron-updater": { "version": "6.8.4", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.8.4.tgz", - "integrity": "sha512-LsJnXXpS3zhDPUv+YNBRf+OeX8D5h0DRZZa93ajCR43ncSZHYRs7m+4KlEN1Xhl7lQvB9snq95ELoGqdGJdytA==", "dev": true, "license": "MIT", "dependencies": { @@ -5783,10 +5167,20 @@ "tiny-typed-emitter": "^2.1.0" } }, + "node_modules/electron-updater/node_modules/builder-util-runtime": { + "version": "9.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/electron-updater/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5800,8 +5194,6 @@ }, "node_modules/electron-updater/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5813,8 +5205,6 @@ }, "node_modules/electron-updater/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -5823,8 +5213,6 @@ }, "node_modules/electron-winstaller": { "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5845,8 +5233,6 @@ }, "node_modules/electron-winstaller/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", "peer": true, @@ -5860,9 +5246,7 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "24.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", - "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "version": "24.12.4", "dev": true, "license": "MIT", "dependencies": { @@ -5871,22 +5255,16 @@ }, "node_modules/electron/node_modules/undici-types": { "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", "engines": { @@ -5895,27 +5273,42 @@ }, "node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", - "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "version": "5.21.6", "dev": true, "license": "MIT", "dependencies": { @@ -5928,8 +5321,6 @@ }, "node_modules/entities": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5941,8 +5332,6 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "license": "MIT", "engines": { @@ -5951,8 +5340,6 @@ }, "node_modules/envinfo": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", - "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, "license": "MIT", "bin": { @@ -5964,15 +5351,11 @@ }, "node_modules/err-code": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, "license": "MIT" }, "node_modules/errno": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "license": "MIT", "dependencies": { @@ -5984,8 +5367,6 @@ }, "node_modules/error-ex": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5994,8 +5375,6 @@ }, "node_modules/es-abstract": { "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6063,8 +5442,6 @@ }, "node_modules/es-define-property": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { @@ -6073,8 +5450,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -6083,15 +5458,11 @@ }, "node_modules/es-module-lexer": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { @@ -6103,8 +5474,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { @@ -6119,8 +5488,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "peer": true, @@ -6133,8 +5500,6 @@ }, "node_modules/es-to-primitive": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { @@ -6151,16 +5516,12 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true, "license": "MIT", "optional": true }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -6169,15 +5530,11 @@ }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -6189,9 +5546,6 @@ }, "node_modules/eslint": { "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -6246,8 +5600,6 @@ }, "node_modules/eslint-compat-utils": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", "peer": true, @@ -6263,8 +5615,6 @@ }, "node_modules/eslint-config-standard": { "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -6293,9 +5643,6 @@ }, "node_modules/eslint-config-standard-with-typescript": { "version": "43.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-43.0.1.tgz", - "integrity": "sha512-WfZ986+qzIzX6dcr4yGUyVb/l9N3Z8wPXCc5z/70fljs3UbWhhV+WxrfgsqMToRzuuyX9MqZ974pq2UPhDTOcA==", - "deprecated": "Please use eslint-config-love, instead.", "dev": true, "license": "MIT", "dependencies": { @@ -6332,8 +5679,6 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "peer": true, @@ -6345,8 +5690,6 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "peer": true, @@ -6356,8 +5699,6 @@ }, "node_modules/eslint-module-utils": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "peer": true, @@ -6375,8 +5716,6 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "peer": true, @@ -6386,8 +5725,6 @@ }, "node_modules/eslint-plugin-es-x": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, "funding": [ "https://github.com/sponsors/ota-meshi", @@ -6409,8 +5746,6 @@ }, "node_modules/eslint-plugin-html": { "version": "8.1.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.4.tgz", - "integrity": "sha512-Eno3oPEj3s6AhvDJ5zHhnHPDvXp6LNFXuy3w51fNebOKYuTrfjOHUGwP+mOrGFpR6eOJkO1xkB8ivtbfMjbMjg==", "dev": true, "license": "ISC", "dependencies": { @@ -6422,8 +5757,6 @@ }, "node_modules/eslint-plugin-import": { "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "peer": true, @@ -6457,8 +5790,6 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "peer": true, @@ -6468,8 +5799,6 @@ }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -6482,8 +5811,6 @@ }, "node_modules/eslint-plugin-n": { "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", "dev": true, "license": "MIT", "peer": true, @@ -6512,8 +5839,6 @@ }, "node_modules/eslint-plugin-n/node_modules/resolve": { "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "peer": true, @@ -6535,8 +5860,6 @@ }, "node_modules/eslint-plugin-promise": { "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", "dev": true, "license": "ISC", "peer": true, @@ -6552,8 +5875,6 @@ }, "node_modules/eslint-plugin-vue": { "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", - "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", "dev": true, "license": "MIT", "dependencies": { @@ -6575,8 +5896,6 @@ }, "node_modules/eslint-plugin-vue-pug": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue-pug/-/eslint-plugin-vue-pug-0.6.2.tgz", - "integrity": "sha512-jZt5f8FtRcNncHiWIfZDvzGlu2Y3XLj7OshpH8y2KHtCXjGBsyvUzKayHsFgTf8yN4ZOh8k5uOwMstgY2vUHsA==", "dev": true, "license": "MIT", "dependencies": { @@ -6588,8 +5907,6 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6605,8 +5922,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6618,8 +5933,6 @@ }, "node_modules/eslint-webpack-plugin": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==", "dev": true, "license": "MIT", "dependencies": { @@ -6643,8 +5956,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/@jest/schemas": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { @@ -6656,8 +5967,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/@jest/types": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "license": "MIT", "dependencies": { @@ -6674,15 +5983,11 @@ }, "node_modules/eslint-webpack-plugin/node_modules/@sinclair/typebox": { "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.10.tgz", - "integrity": "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==", "dev": true, "license": "MIT" }, "node_modules/eslint-webpack-plugin/node_modules/ci-info": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -6697,8 +6002,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/jest-util": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { @@ -6715,8 +6018,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { @@ -6731,8 +6032,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -6744,8 +6043,6 @@ }, "node_modules/eslint-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -6760,8 +6057,6 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6778,8 +6073,6 @@ }, "node_modules/esquery": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6791,8 +6084,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6804,8 +6095,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -6814,14 +6103,10 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -6830,8 +6115,6 @@ }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { @@ -6840,15 +6123,11 @@ }, "node_modules/eventemitter3": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -6857,8 +6136,6 @@ }, "node_modules/expand-template": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" @@ -6866,21 +6143,17 @@ }, "node_modules/exponential-backoff": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -6899,7 +6172,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -6920,8 +6193,6 @@ }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -6930,43 +6201,16 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, "node_modules/extract-zip": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -6997,15 +6241,11 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -7021,8 +6261,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -7034,22 +6272,16 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "version": "3.1.2", "dev": true, "funding": [ { @@ -7065,8 +6297,6 @@ }, "node_modules/fastest-levenshtein": { "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { @@ -7075,8 +6305,6 @@ }, "node_modules/fastq": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -7085,8 +6313,6 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7098,8 +6324,6 @@ }, "node_modules/fd-slicer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "license": "MIT", "dependencies": { @@ -7108,8 +6332,6 @@ }, "node_modules/fdir": { "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -7126,8 +6348,6 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -7139,8 +6359,6 @@ }, "node_modules/file-type": { "version": "21.3.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", - "integrity": "sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==", "license": "MIT", "dependencies": { "@tokenizer/inflate": "^0.4.1", @@ -7157,14 +6375,10 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "license": "MIT" }, "node_modules/filelist": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7186,8 +6400,6 @@ }, "node_modules/filter-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", "dev": true, "license": "MIT", "engines": { @@ -7196,8 +6408,6 @@ }, "node_modules/finalhandler": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "dev": true, "license": "MIT", "dependencies": { @@ -7215,8 +6425,6 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -7225,15 +6433,11 @@ }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -7249,8 +6453,6 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, "license": "BSD-3-Clause", "bin": { @@ -7259,8 +6461,6 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -7274,9 +6474,6 @@ }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -7291,23 +6488,16 @@ }, "node_modules/flatted": { "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/flatten": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", "dev": true, "license": "MIT" }, "node_modules/follow-redirects": { "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -7326,15 +6516,11 @@ } }, "node_modules/font-list": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/font-list/-/font-list-2.0.2.tgz", - "integrity": "sha512-kNG2sY5+Nh5bbWL9kgAi+k8tuXfZ3m+6fjNGF4iUITTyex2S6wITREgr9ZqY1xw2+mFM6Bi5NPEPpRB6jLLOnw==", + "version": "2.1.0", "license": "MIT" }, "node_modules/for-each": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { @@ -7347,10 +6533,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { @@ -7366,8 +6576,6 @@ }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", "engines": { @@ -7376,8 +6584,6 @@ }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", "engines": { @@ -7386,14 +6592,10 @@ }, "node_modules/fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "license": "MIT" }, "node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -7405,10 +6607,19 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, @@ -7429,8 +6640,6 @@ }, "node_modules/function-bind": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -7439,8 +6648,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7460,8 +6667,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -7470,8 +6675,6 @@ }, "node_modules/generator-function": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { @@ -7480,8 +6683,6 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -7490,8 +6691,6 @@ }, "node_modules/get-intrinsic": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7515,8 +6714,6 @@ }, "node_modules/get-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { @@ -7529,8 +6726,6 @@ }, "node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", "dependencies": { @@ -7545,8 +6740,6 @@ }, "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { @@ -7563,8 +6756,6 @@ }, "node_modules/get-tsconfig": { "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, "license": "MIT", "peer": true, @@ -7577,15 +6768,10 @@ }, "node_modules/github-from-package": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", "dev": true, "license": "ISC", "dependencies": { @@ -7605,8 +6791,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -7618,8 +6802,6 @@ }, "node_modules/glob-to-regex.js": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -7635,15 +6817,11 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/global-agent": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -7661,8 +6839,6 @@ }, "node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7677,8 +6853,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7694,8 +6868,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -7715,8 +6887,6 @@ }, "node_modules/gopd": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { @@ -7728,8 +6898,6 @@ }, "node_modules/got": { "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dev": true, "license": "MIT", "dependencies": { @@ -7754,29 +6922,21 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "node_modules/handle-thing": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true, "license": "MIT" }, "node_modules/has-ansi": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, "license": "MIT", "dependencies": { @@ -7788,8 +6948,6 @@ }, "node_modules/has-ansi/node_modules/ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -7798,8 +6956,6 @@ }, "node_modules/has-bigints": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { @@ -7811,8 +6967,6 @@ }, "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -7821,8 +6975,6 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -7834,8 +6986,6 @@ }, "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7850,8 +7000,6 @@ }, "node_modules/has-symbols": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -7863,8 +7011,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -7879,15 +7025,11 @@ }, "node_modules/hash-sum": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", - "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", "dev": true, "license": "MIT" }, "node_modules/hasown": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -7899,8 +7041,6 @@ }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { @@ -7909,8 +7049,6 @@ }, "node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { @@ -7922,8 +7060,6 @@ }, "node_modules/hpack.js": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7933,17 +7069,45 @@ "wbuf": "^1.1.0" } }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/html-entities": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true, "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "license": "MIT", "dependencies": { @@ -7964,8 +7128,6 @@ }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", "engines": { @@ -7974,8 +7136,6 @@ }, "node_modules/html-webpack-plugin": { "version": "5.6.7", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", - "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", "dev": true, "license": "MIT", "dependencies": { @@ -8007,8 +7167,6 @@ }, "node_modules/htmlparser2": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", - "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -8034,15 +7192,11 @@ }, "node_modules/http-deceiver": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8062,15 +7216,11 @@ }, "node_modules/http-parser-js": { "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8084,8 +7234,6 @@ }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -8098,8 +7246,6 @@ }, "node_modules/http-proxy-middleware": { "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8123,8 +7269,6 @@ }, "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", "engines": { @@ -8136,8 +7280,6 @@ }, "node_modules/http2-wrapper": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dev": true, "license": "MIT", "dependencies": { @@ -8150,8 +7292,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { @@ -8164,8 +7304,6 @@ }, "node_modules/hyperdyperid": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "license": "MIT", "engines": { @@ -8192,8 +7330,6 @@ }, "node_modules/iconv-lite": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -8208,8 +7344,6 @@ }, "node_modules/icss-utils": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "license": "ISC", "engines": { @@ -8221,8 +7355,6 @@ }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -8241,8 +7373,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -8251,8 +7381,6 @@ }, "node_modules/image-size": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", "license": "MIT", "dependencies": { "queue": "6.0.2" @@ -8266,15 +7394,11 @@ }, "node_modules/immediate": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8290,8 +7414,6 @@ }, "node_modules/import-local": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -8310,8 +7432,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -8320,8 +7440,6 @@ }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -8330,16 +7448,11 @@ }, "node_modules/indexes-of": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", "dev": true, "license": "MIT" }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -8349,20 +7462,14 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, "node_modules/internal-slot": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { @@ -8376,18 +7483,22 @@ }, "node_modules/interpret": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/ip-address": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz", - "integrity": "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==", + "version": "2.4.0", "dev": true, "license": "MIT", "engines": { @@ -8396,8 +7507,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { @@ -8414,15 +7523,11 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8441,8 +7546,6 @@ }, "node_modules/is-bigint": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8457,8 +7560,6 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -8470,8 +7571,6 @@ }, "node_modules/is-boolean-object": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { @@ -8487,8 +7586,6 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", "peer": true, @@ -8504,8 +7601,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -8516,13 +7611,11 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -8533,8 +7626,6 @@ }, "node_modules/is-data-view": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { @@ -8551,8 +7642,6 @@ }, "node_modules/is-date-object": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { @@ -8568,8 +7657,6 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { @@ -8584,8 +7671,6 @@ }, "node_modules/is-expression": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", "dev": true, "license": "MIT", "dependencies": { @@ -8595,8 +7680,6 @@ }, "node_modules/is-expression/node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "license": "MIT", "bin": { @@ -8608,8 +7691,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -8618,8 +7699,6 @@ }, "node_modules/is-finalizationregistry": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { @@ -8634,8 +7713,6 @@ }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { @@ -8644,8 +7721,6 @@ }, "node_modules/is-generator-function": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { @@ -8664,8 +7739,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -8677,8 +7750,6 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", "dependencies": { @@ -8694,17 +7765,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-json": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", - "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", "dev": true, "license": "ISC" }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -8716,8 +7791,6 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -8728,9 +7801,7 @@ } }, "node_modules/is-network-error": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "version": "1.3.2", "dev": true, "license": "MIT", "engines": { @@ -8752,8 +7823,6 @@ }, "node_modules/is-number-object": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { @@ -8769,8 +7838,6 @@ }, "node_modules/is-path-cwd": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true, "license": "MIT", "engines": { @@ -8779,8 +7846,6 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", "engines": { @@ -8789,8 +7854,6 @@ }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "license": "MIT", "engines": { @@ -8799,8 +7862,6 @@ }, "node_modules/is-plain-object": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { @@ -8812,8 +7873,6 @@ }, "node_modules/is-plain-object/node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", "engines": { @@ -8822,15 +7881,11 @@ }, "node_modules/is-promise": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true, "license": "MIT" }, "node_modules/is-regex": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { @@ -8848,8 +7903,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -8861,8 +7914,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { @@ -8877,8 +7928,6 @@ }, "node_modules/is-string": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { @@ -8894,8 +7943,6 @@ }, "node_modules/is-symbol": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { @@ -8912,8 +7959,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8926,10 +7971,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -8941,8 +7995,6 @@ }, "node_modules/is-weakref": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { @@ -8957,8 +8009,6 @@ }, "node_modules/is-weakset": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8974,8 +8024,6 @@ }, "node_modules/is-what": { "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, "license": "MIT", "engines": { @@ -8987,8 +8035,6 @@ }, "node_modules/is-wsl": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "dev": true, "license": "MIT", "dependencies": { @@ -9003,15 +8049,11 @@ }, "node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isbinaryfile": { "version": "5.0.7", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", - "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", "dev": true, "license": "MIT", "engines": { @@ -9023,15 +8065,11 @@ }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/isobject": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, "license": "MIT", "dependencies": { @@ -9043,15 +8081,25 @@ }, "node_modules/isobject/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, "license": "MIT" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jake": { "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9067,9 +8115,7 @@ } }, "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "version": "30.4.0", "dev": true, "license": "MIT", "engines": { @@ -9077,13 +8123,11 @@ } }, "node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", + "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", @@ -9095,15 +8139,13 @@ } }, "node_modules/jest-worker": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", - "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "version": "30.4.1", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.3.0", + "jest-util": "30.4.1", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -9113,8 +8155,6 @@ }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9128,9 +8168,7 @@ } }, "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "version": "2.7.0", "dev": true, "license": "MIT", "bin": { @@ -9139,22 +8177,16 @@ }, "node_modules/js-stringify": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", "dev": true, "license": "MIT" }, "node_modules/js-tokens": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -9166,8 +8198,6 @@ }, "node_modules/jschardet": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-3.1.4.tgz", - "integrity": "sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==", "license": "LGPL-2.1+", "engines": { "node": ">=0.1.90" @@ -9175,36 +8205,26 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC", "optional": true @@ -9224,8 +8244,6 @@ }, "node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -9234,8 +8252,6 @@ }, "node_modules/jstransformer": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", "dev": true, "license": "MIT", "dependencies": { @@ -9245,8 +8261,6 @@ }, "node_modules/jszip": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, "license": "(MIT OR GPL-3.0-or-later)", "dependencies": { @@ -9256,24 +8270,50 @@ "setimmediate": "^1.0.5" } }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/keyboardevent-from-electron-accelerator": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz", - "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==", "dev": true, "license": "MIT" }, "node_modules/keyboardevents-areequal": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz", - "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==", "dev": true, "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -9282,8 +8322,6 @@ }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { @@ -9292,8 +8330,6 @@ }, "node_modules/launch-editor": { "version": "2.13.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.13.2.tgz", - "integrity": "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg==", "dev": true, "license": "MIT", "dependencies": { @@ -9303,15 +8339,11 @@ }, "node_modules/lazy-val": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", "dev": true, "license": "MIT" }, "node_modules/less": { "version": "4.6.4", - "resolved": "https://registry.npmjs.org/less/-/less-4.6.4.tgz", - "integrity": "sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9335,9 +8367,7 @@ } }, "node_modules/less-loader": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.3.2.tgz", - "integrity": "sha512-uLV5c702ff2jBvO7qewpkLRzkh/I9QW07ur2NKkv8TVTrtX2lrKjEbEU/LLXAn7cgpCIBbkfyUm4qYXCQs5/+w==", + "version": "12.3.3", "dev": true, "license": "MIT", "engines": { @@ -9363,8 +8393,6 @@ }, "node_modules/less/node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "license": "MIT", "optional": true, @@ -9377,8 +8405,6 @@ }, "node_modules/less/node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", "optional": true, @@ -9391,8 +8417,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9405,8 +8429,6 @@ }, "node_modules/lie": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9415,8 +8437,6 @@ }, "node_modules/lilconfig": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { @@ -9428,21 +8448,15 @@ }, "node_modules/line-reader": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/line-reader/-/line-reader-0.2.4.tgz", - "integrity": "sha512-342xzyZZS9uTiKwHJcMacopVl/WjrMMCZS1Qg4Uhl/WBknWRrGFdKOIS1Kec6SaiTcZMtmuxWvvIbPXj/+FMjA==", "dev": true }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", "dev": true, "license": "MIT", "engines": { @@ -9455,8 +8469,6 @@ }, "node_modules/loader-utils": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -9470,8 +8482,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -9486,64 +8496,60 @@ }, "node_modules/lodash": { "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", "dev": true, "license": "MIT" }, "node_modules/lodash.isempty": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", - "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", "dev": true, "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", "dev": true, "license": "MIT" }, "node_modules/lodash.memoize": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/long": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "license": "MIT", "dependencies": { @@ -9552,8 +8558,6 @@ }, "node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "dev": true, "license": "MIT", "engines": { @@ -9562,8 +8566,6 @@ }, "node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "license": "ISC", "dependencies": { @@ -9575,8 +8577,6 @@ }, "node_modules/magic-string": { "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -9584,8 +8584,6 @@ }, "node_modules/make-dir": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "license": "MIT", "optional": true, @@ -9597,13 +8595,32 @@ "node": ">=6" } }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "node_modules/make-fetch-happen": { + "version": "14.0.3", "dev": true, - "license": "MIT", - "optional": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { "escape-string-regexp": "^4.0.0" }, @@ -9613,8 +8630,6 @@ }, "node_modules/math-intrinsics": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { @@ -9623,15 +8638,11 @@ }, "node_modules/mdn-data": { "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -9639,8 +8650,6 @@ }, "node_modules/memfs": { "version": "4.57.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.57.2.tgz", - "integrity": "sha512-2nWzSsJzrukurSDna4Z0WywuScK4Id3tSKejgu74u8KCdW4uNrseKRSIDg75C6Yw5ZRqBe0F0EtMNlTbUq8bAQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -9669,8 +8678,6 @@ }, "node_modules/memory-fs": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9678,10 +8685,40 @@ "readable-stream": "^2.0.1" } }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/merge-descriptors": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, "license": "MIT", "funding": { @@ -9690,8 +8727,6 @@ }, "node_modules/merge-options": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", - "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", "dev": true, "license": "MIT", "dependencies": { @@ -9703,15 +8738,11 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -9720,14 +8751,10 @@ }, "node_modules/message2call": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/message2call/-/message2call-0.1.3.tgz", - "integrity": "sha512-jOOPKWTE5LMfuxz8D1o186ex+kJl7FgRz033Z371kvyfZDyCn+qhtrsIvgf4kPUf4zYAWM2SU4GFWbA7F2U+Ag==", "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { @@ -9750,8 +8777,6 @@ }, "node_modules/micromatch/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -9763,8 +8788,6 @@ }, "node_modules/mime": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", "bin": { @@ -9776,8 +8799,6 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -9786,8 +8807,6 @@ }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -9799,8 +8818,6 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { @@ -9809,8 +8826,6 @@ }, "node_modules/mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "dev": true, "license": "MIT", "engines": { @@ -9819,8 +8834,6 @@ }, "node_modules/mini-css-extract-plugin": { "version": "2.10.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", - "integrity": "sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg==", "dev": true, "license": "MIT", "dependencies": { @@ -9840,8 +8853,6 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, "license": "ISC" }, @@ -9863,8 +8874,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9872,18 +8881,107 @@ }, "node_modules/minipass": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -9895,15 +8993,11 @@ }, "node_modules/mitt": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.1.2.tgz", - "integrity": "sha512-3btxP0O9iGADGWAkteQ8mzDtEspZqu4I32y4GZYCV5BrwtzdcRpF4dQgNdJadCrbBx7Lu6Sq9AVrerMHR0Hkmw==", "dev": true, "license": "MIT" }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", "dependencies": { @@ -9915,27 +9009,19 @@ }, "node_modules/mkdirp-classic": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT" }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/muggle-string": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true, "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, "license": "MIT", "dependencies": { @@ -9948,8 +9034,6 @@ }, "node_modules/music-metadata": { "version": "11.12.3", - "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-11.12.3.tgz", - "integrity": "sha512-n6hSTZkuD59qWgHh6IP5dtDlDZQXoxk/bcA85Jywg8Z1iFrlNgl2+GTFgjZyn52W5UgQpV42V4XqrQZZAMbZTQ==", "funding": [ { "type": "github", @@ -9979,8 +9063,6 @@ }, "node_modules/nanoid": { "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "funding": [ { "type": "github", @@ -9997,20 +9079,14 @@ }, "node_modules/nanopop": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", - "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==", "license": "MIT" }, "node_modules/napi-build-utils": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, @@ -10033,8 +9109,6 @@ }, "node_modules/needle/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "license": "MIT", "dependencies": { "ms": "^2.1.1" @@ -10042,8 +9116,6 @@ }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10053,9 +9125,7 @@ } }, "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "version": "1.0.0", "dev": true, "license": "MIT", "engines": { @@ -10064,15 +9134,11 @@ }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "license": "MIT", "dependencies": { @@ -10081,9 +9147,9 @@ } }, "node_modules/node-abi": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.28.0.tgz", - "integrity": "sha512-Qfp5XZL1cJDOabOT8H5gnqMTmM4NjvYzHp4I/Kt/Sl76OVkOBBHRFlPspGV0hYvMoqQsypFjT/Yp7Km0beXW9g==", + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz", + "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==", "license": "MIT", "dependencies": { "semver": "^7.6.3" @@ -10102,8 +9168,6 @@ }, "node_modules/node-api-version": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", - "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10112,8 +9176,6 @@ }, "node_modules/node-exports-info": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", "dev": true, "license": "MIT", "peer": true, @@ -10131,28 +9193,26 @@ } }, "node_modules/node-gyp": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.3.0.tgz", - "integrity": "sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==", + "version": "11.5.0", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", + "make-fetch-happen": "^14.0.3", + "nopt": "^8.0.0", + "proc-log": "^5.0.0", "semver": "^7.3.5", - "tar": "^7.5.4", + "tar": "^7.4.3", "tinyglobby": "^0.2.12", - "undici": "^6.25.0", - "which": "^6.0.0" + "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-gyp-build": { @@ -10167,45 +9227,29 @@ } }, "node_modules/node-gyp/node_modules/isexe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", - "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "version": "3.1.5", "dev": true, "license": "BlueOak-1.0.0", "engines": { - "node": ">=20" - } - }, - "node_modules/node-gyp/node_modules/undici": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", - "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" + "node": ">=18" } }, "node_modules/node-gyp/node_modules/which": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", - "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "version": "5.0.0", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^4.0.0" + "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/node-id3": { "version": "0.2.9", - "resolved": "https://registry.npmjs.org/node-id3/-/node-id3-0.2.9.tgz", - "integrity": "sha512-dSxhuxrkkGVRgUhDHFxdY0pilzOREcodO01HcZWfaRkCaPWGmo0dOgD8ygyL6ln4Iv4cmfRxAWn1WD9bIB9Bhw==", "license": "MIT", "dependencies": { "iconv-lite": "0.6.2" @@ -10213,8 +9257,6 @@ }, "node_modules/node-id3/node_modules/iconv-lite": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10223,10 +9265,13 @@ "node": ">=0.10.0" } }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, "node_modules/node-loader": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.1.0.tgz", - "integrity": "sha512-OwjPkyh8+7jW8DMd/iq71uU1Sspufr/C2+c3t0p08J3CrM9ApZ4U53xuisNrDXOHyGi5OYHgtfmmh+aK9zJA6g==", "dev": true, "license": "MIT", "dependencies": { @@ -10244,32 +9289,29 @@ } }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.45", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", - "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "version": "8.1.0", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^4.0.0" + "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -10278,8 +9320,6 @@ }, "node_modules/normalize-url": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "license": "MIT", "engines": { @@ -10291,8 +9331,6 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10304,8 +9342,6 @@ }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -10314,8 +9350,6 @@ }, "node_modules/object-inspect": { "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { @@ -10327,8 +9361,6 @@ }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -10337,8 +9369,6 @@ }, "node_modules/object.assign": { "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { @@ -10358,8 +9388,6 @@ }, "node_modules/object.entries": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "peer": true, @@ -10375,8 +9403,6 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "peer": true, @@ -10395,8 +9421,6 @@ }, "node_modules/object.groupby": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "peer": true, @@ -10411,8 +9435,6 @@ }, "node_modules/object.values": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "peer": true, @@ -10431,15 +9453,11 @@ }, "node_modules/obuf": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true, "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -10451,8 +9469,6 @@ }, "node_modules/on-headers": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, "license": "MIT", "engines": { @@ -10461,8 +9477,6 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "license": "ISC", "dependencies": { "wrappy": "1" @@ -10470,8 +9484,6 @@ }, "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { @@ -10486,8 +9498,6 @@ }, "node_modules/open": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", - "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", "dev": true, "license": "MIT", "dependencies": { @@ -10505,8 +9515,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -10521,10 +9529,30 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/own-keys": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { @@ -10541,8 +9569,6 @@ }, "node_modules/p-cancelable": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "dev": true, "license": "MIT", "engines": { @@ -10551,8 +9577,6 @@ }, "node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10567,8 +9591,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -10583,8 +9605,6 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10599,8 +9619,6 @@ }, "node_modules/p-retry": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", - "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10617,8 +9635,6 @@ }, "node_modules/p-retry/node_modules/retry": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "license": "MIT", "engines": { @@ -10627,8 +9643,6 @@ }, "node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -10637,22 +9651,16 @@ }, "node_modules/package-json-from-dist": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true, "license": "(MIT AND Zlib)" }, "node_modules/param-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "license": "MIT", "dependencies": { @@ -10662,8 +9670,6 @@ }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -10675,8 +9681,6 @@ }, "node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -10694,8 +9698,6 @@ }, "node_modules/parse-node-version": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, "license": "MIT", "engines": { @@ -10704,8 +9706,6 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "engines": { @@ -10714,8 +9714,6 @@ }, "node_modules/pascal-case": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "license": "MIT", "dependencies": { @@ -10725,8 +9723,6 @@ }, "node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -10735,8 +9731,6 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -10745,8 +9739,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -10755,49 +9747,36 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", - "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "version": "1.11.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "18 || 20 || >=22" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "version": "10.4.3", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } + "license": "ISC" }, "node_modules/path-to-regexp": { "version": "0.1.13", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", - "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { @@ -10806,8 +9785,6 @@ }, "node_modules/pe-library": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", "dev": true, "license": "MIT", "engines": { @@ -10821,21 +9798,15 @@ }, "node_modules/pend": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -10847,8 +9818,6 @@ }, "node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "optional": true, @@ -10858,8 +9827,6 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10871,8 +9838,6 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { @@ -10885,8 +9850,6 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { @@ -10898,8 +9861,6 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { @@ -10914,8 +9875,6 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { @@ -10927,8 +9886,6 @@ }, "node_modules/pkijs": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -10945,8 +9902,6 @@ }, "node_modules/plist": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10960,8 +9915,6 @@ }, "node_modules/possible-typed-array-names": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -10969,9 +9922,7 @@ } }, "node_modules/postcss": { - "version": "8.5.13", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz", - "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==", + "version": "8.5.15", "funding": [ { "type": "opencollective", @@ -10988,7 +9939,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -10998,8 +9949,6 @@ }, "node_modules/postcss-calc": { "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", "dev": true, "license": "MIT", "dependencies": { @@ -11015,8 +9964,6 @@ }, "node_modules/postcss-calc/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11028,13 +9975,11 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.9.tgz", - "integrity": "sha512-EZpoUlmbXQUpe+g4ZaGM2kjGlHrQ7Bjzb3xHcNrC9ysI1tGoib6DAYvxg6aB7MGxsjgLF+Qx/jwZQkJ5cKDvXA==", + "version": "7.0.10", "dev": true, "license": "MIT", "dependencies": { - "@colordx/core": "^5.2.0", + "@colordx/core": "^5.4.3", "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", "postcss-value-parser": "^4.2.0" @@ -11043,13 +9988,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-convert-values": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.11.tgz", - "integrity": "sha512-H+s7P0f9jJylSysAHs3/5MhAx7GthDO05uw1h56L2xyEqpiLTFLEqBNw3PUYzD5p/AKwWaigCXf6FGELpOw9lw==", + "version": "7.0.12", "dev": true, "license": "MIT", "dependencies": { @@ -11060,13 +10003,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-comments": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.7.tgz", - "integrity": "sha512-FJhE3fSte7HaRNL4iwD8LTG9vWqj3puxXIdig6LfrFqc1TJRUhY4kXOkeTXZZfTXYny+k+SO7fd2fymj1wduJg==", + "version": "7.0.8", "dev": true, "license": "MIT", "dependencies": { @@ -11076,13 +10017,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11094,48 +10033,40 @@ } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.3.tgz", - "integrity": "sha512-9cRxXwhEM/aNZon1qZyToX4NmjbFbxOGbww+0CnbYFDbbPRGZ8jg4IbM8UlA+CzkXxM35itxyaHKNqBBg/RTDg==", + "version": "7.0.4", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-empty": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.2.tgz", - "integrity": "sha512-NZFouOmOwtngJVgkNeI1LtkzFdYqIurxgy4wq3qNvIiXFURTZ3b/K7q3dP3QitlWQ5imHDQL0qSorItQhoxb1g==", + "version": "7.0.3", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-discard-overridden": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.2.tgz", - "integrity": "sha512-Ym01X4v6U3sY8X0P1J9P+RTar+7JyLTOzDrxKSeaArFsLmkVu4KcAKPBWDYRIyZ/q4jwpSPnOnekeSSqXSXKUw==", + "version": "7.0.3", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-helpers": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/postcss-helpers/-/postcss-helpers-0.3.3.tgz", - "integrity": "sha512-VumiUcrpbxGlTBNQj6fUOkb/HNRUk/xYz8bNlhgVOdvk3yWEy4B+0nlDUZZM9mTVZ5bJoxUy7WT6z/4E7oMTgw==", "dev": true, "license": "MIT", "dependencies": { @@ -11147,8 +10078,6 @@ }, "node_modules/postcss-loader": { "version": "8.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.2.1.tgz", - "integrity": "sha512-k98jtRzthjj3f76MYTs9JTpRqV1RaaMhEU0Lpw9OTmQZQdppg4B30VZ74BojuBHt3F4KyubHJoXCMUeM8Bqeow==", "dev": true, "license": "MIT", "dependencies": { @@ -11178,45 +10107,39 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.6.tgz", - "integrity": "sha512-lDsWeKRsssX/9vKFpingoRiuvGajtOGCJhs1kyaTJ5fzaVzs0aPPYe38UZ/ukMFEA5iuRIjQJHIkH2niYO3ubQ==", + "version": "7.0.7", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.10" + "stylehacks": "^7.0.11" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-merge-rules": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.10.tgz", - "integrity": "sha512-UXYKxkg8Cy1so/evF7AE/25PNXZb3E0SrvjdbtbGf+MW+doLenKqRLQzz6YZW469ktiXK2MVLFWtel/DftCV0Q==", + "version": "7.0.11", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.28.2", "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.2", + "cssnano-utils": "^5.0.3", "postcss-selector-parser": "^7.1.1" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11228,9 +10151,7 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.2.tgz", - "integrity": "sha512-Z82NUmnvhPrvMUaHfkaAVBmWQq9F8Dox4Dy0LiwbaTxfmDUWLQtS+0WCgKViwdWCPPajiY9YzoQftgqKdXkM5g==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11240,49 +10161,43 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-gradients": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.4.tgz", - "integrity": "sha512-g8MNeNyN+lbwKy8DCtJ6zU6awBL0InBsSOaKmgZ1MdRLVItLQUNFNAzzzBnOp4qowOcyyB6GetTlQ0/0UNXvag==", + "version": "7.0.5", "dev": true, "license": "MIT", "dependencies": { - "@colordx/core": "^5.2.0", - "cssnano-utils": "^5.0.2", + "@colordx/core": "^5.4.3", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-params": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.8.tgz", - "integrity": "sha512-DIUKM5DZGTmxN7KFKT+rxt0FdPDmRrdK/k3n3+6Po+N/QYn06juwagHcfOVBG0CfCHwcnI612GAUCZc3eT+ZEg==", + "version": "7.0.9", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.28.2", - "cssnano-utils": "^5.0.2", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-selectors": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.1.0.tgz", - "integrity": "sha512-HYl/6I0aL+UvpA10t65BSa7h+tVjBgE6oRI5N/3ylX3vtwvlDL67G3FT3vYDPnTksxr0riiyJcT0tBtyRVoloA==", + "version": "7.1.2", "dev": true, "license": "MIT", "dependencies": { @@ -11295,13 +10210,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11314,8 +10227,6 @@ }, "node_modules/postcss-modules-extract-imports": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "license": "ISC", "engines": { @@ -11327,8 +10238,6 @@ }, "node_modules/postcss-modules-local-by-default": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", "dev": true, "license": "MIT", "dependencies": { @@ -11345,8 +10254,6 @@ }, "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11359,8 +10266,6 @@ }, "node_modules/postcss-modules-scope": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "dev": true, "license": "ISC", "dependencies": { @@ -11375,8 +10280,6 @@ }, "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11389,8 +10292,6 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "license": "ISC", "dependencies": { @@ -11404,22 +10305,18 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.2.tgz", - "integrity": "sha512-YoINoiR4YKlzfB95Y93b0DSxWy7FLw+1SADIaznMHb88AKizpzfF80tolmiDEbYr1UM4r4Hw+NZq37SwT5f3uw==", + "version": "7.0.3", "dev": true, "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-display-values": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.2.tgz", - "integrity": "sha512-wu/NTSjnp8sX5TnEHVPN+eScjAtRs18ELtEduG+Ek3GxjeUDUT+VAA3PJjVIXBcVIk6fiLYFj2iKH0q99S3T2Q==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11429,13 +10326,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-positions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.3.tgz", - "integrity": "sha512-1CJI++oA3yK/fQlPUcEngUfcSWS08Pkt9fK+jVgL53mmtHDBHi0YiuB0m3D9BXwZjmfvCc2GQmFqCAF/CVcPzQ==", + "version": "7.0.4", "dev": true, "license": "MIT", "dependencies": { @@ -11445,13 +10340,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.3.tgz", - "integrity": "sha512-RvImJ2Ml4LZSx31qC2C8LDiz65IgBNATtwEr9r3Aue+D0cCGbj4rjNojb/uGpEm4QxnOTzFqMvaDYuKiT1Cmpg==", + "version": "7.0.4", "dev": true, "license": "MIT", "dependencies": { @@ -11461,13 +10354,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-string": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.2.tgz", - "integrity": "sha512-FqtrUh2BU2MnVeLeWBbJ2rwOjuDnA91XvoImc1BbgMWIxdxiPTaquflBHsmFBA3xh3pC3wPZO9W5MaIc7wU/Xw==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11477,13 +10368,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.2.tgz", - "integrity": "sha512-5H5fpXBnMACEXzn7k9RP7qWZ1eWg8cuZkUuFygStY7icOj+UucwMWXeMmdkF/iITvTVa7fP85tdRCJeznpdFfQ==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11493,13 +10382,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.8.tgz", - "integrity": "sha512-imCM3cwK3hvlAG4z1AzYM24m8BPA3/Jk/S71wfbn2I6+E2b+UwFaGvlNqydihXTSl3OFPeQXztqCzg+NGeSibQ==", + "version": "7.0.9", "dev": true, "license": "MIT", "dependencies": { @@ -11510,13 +10397,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.2.tgz", - "integrity": "sha512-bLnNY7t76NLRb9QQyCVmCN4qwoHxiq6vABH/CXav9wTuR6dNGHGQ72AyO/+h2quWxZk3l7BqxNL1vtDi9H6y1g==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11526,13 +10411,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-normalize-whitespace": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.2.tgz", - "integrity": "sha512-TNSVkuhkeOhl36WruQlflxOb7HweoeZowSusNpfsM1+ZvqJ24Mc+xksu05ecMQxlu+0zgI8pyznO2EWqDCQbLA==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11542,30 +10425,26 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-ordered-values": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.3.tgz", - "integrity": "sha512-FTt6R9RF7NAYfpOHa2XFPm89FVuo5GiIbcfwOXFy1MYF38BeiNW9ke8ybw9Pk62eEsUlRVVbxHWA3B7ERYqOOA==", + "version": "7.0.4", "dev": true, "license": "MIT", "dependencies": { - "cssnano-utils": "^5.0.2", + "cssnano-utils": "^5.0.3", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-prefix-selector": { "version": "1.16.1", - "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz", - "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11574,8 +10453,6 @@ }, "node_modules/postcss-pxtorem": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-pxtorem/-/postcss-pxtorem-6.1.0.tgz", - "integrity": "sha512-ROODSNci9ADal3zUcPHOF/K83TiCgNSPXQFSbwyPHNV8ioHIE4SaC+FPOufd8jsr5jV2uIz29v1Uqy1c4ov42g==", "dev": true, "license": "MIT", "peerDependencies": { @@ -11583,9 +10460,7 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.8.tgz", - "integrity": "sha512-VeVRmbgpgTZuRcDQdqnsB4iYTeS2dBRV07UdwK6V3x61F1xTQ2pgIzHBIR4rQYRlXRNKBTGYYhEL1eNA7w9vaQ==", + "version": "7.0.9", "dev": true, "license": "MIT", "dependencies": { @@ -11596,13 +10471,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-reduce-transforms": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.2.tgz", - "integrity": "sha512-OV5P9hMnf7kEkeXVXyS5ESqxbIls7a3TqFymUAV5JICO/9YCBEU+QQhQjZiDHaLwFdV7/CL481kVeBUk5FdY3w==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -11612,13 +10485,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-selector-parser": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -11630,9 +10501,7 @@ } }, "node_modules/postcss-svgo": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.1.2.tgz", - "integrity": "sha512-ixExc8m+/68yuSYQzV/1DgtTup/7nI2dN9eiDS5GMRUzeCH4q9UcqeZPwcSVhdf8ay9fRwXDUHwcY5/XzQSszQ==", + "version": "7.1.3", "dev": true, "license": "MIT", "dependencies": { @@ -11643,13 +10512,11 @@ "node": "^18.12.0 || ^20.9.0 || >= 18" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-unique-selectors": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.6.tgz", - "integrity": "sha512-cDxnYw1QuBMW5w3svZ0BlYF0IA4Amr+1JoTLXzu6vDFPNwohN2QU+sPZNx15b930LR7ce+/600h28/cYoxO9vw==", + "version": "7.0.7", "dev": true, "license": "MIT", "dependencies": { @@ -11659,13 +10526,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -11678,15 +10543,11 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, "node_modules/postcss-values-parser": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz", - "integrity": "sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11714,8 +10575,6 @@ }, "node_modules/posthtml-match-helper": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-1.0.4.tgz", - "integrity": "sha512-Tj9orTIBxHdnraCxoEGjoizsFsTGvukzwcuhOjYQGmDG6gTlaRbMrGgi1J+FwKTN8hsCQENHYY0Deqs9a89BVg==", "dev": true, "license": "ISC", "peerDependencies": { @@ -11724,8 +10583,6 @@ }, "node_modules/posthtml-parser": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", - "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", "dev": true, "license": "MIT", "dependencies": { @@ -11735,8 +10592,6 @@ }, "node_modules/posthtml-parser/node_modules/dom-serializer": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "license": "MIT", "dependencies": { @@ -11746,8 +10601,6 @@ }, "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -11759,8 +10612,6 @@ }, "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", "funding": { @@ -11769,15 +10620,11 @@ }, "node_modules/posthtml-parser/node_modules/domelementtype": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/posthtml-parser/node_modules/domhandler": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11786,8 +10633,6 @@ }, "node_modules/posthtml-parser/node_modules/domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11797,15 +10642,11 @@ }, "node_modules/posthtml-parser/node_modules/entities": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/posthtml-parser/node_modules/htmlparser2": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11817,25 +10658,8 @@ "readable-stream": "^3.1.1" } }, - "node_modules/posthtml-parser/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/posthtml-rename-id": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", - "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", "dev": true, "license": "MIT", "dependencies": { @@ -11844,8 +10668,6 @@ }, "node_modules/posthtml-rename-id/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -11854,8 +10676,6 @@ }, "node_modules/posthtml-render": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", - "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", "dev": true, "license": "MIT", "engines": { @@ -11864,8 +10684,6 @@ }, "node_modules/posthtml-svg-mode": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", - "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11877,8 +10695,6 @@ }, "node_modules/posthtml-transform": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/posthtml-transform/-/posthtml-transform-1.0.10.tgz", - "integrity": "sha512-z45ehCxEh+kd9Ass6iULR42xklSTfhvrGaV0wJTi1QfAonWyMFTRAI9I/XNTuJsY8ljAFBYhCDzxEqqMevlyuw==", "dev": true, "license": "MIT", "dependencies": { @@ -11894,8 +10710,6 @@ }, "node_modules/posthtml-transform/node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -11909,8 +10723,6 @@ }, "node_modules/posthtml/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "license": "MIT", "dependencies": { @@ -11924,8 +10736,6 @@ }, "node_modules/posthtml/node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", "funding": { @@ -11934,8 +10744,6 @@ }, "node_modules/posthtml/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11950,8 +10758,6 @@ }, "node_modules/posthtml/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -11965,8 +10771,6 @@ }, "node_modules/posthtml/node_modules/entities": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11978,8 +10782,6 @@ }, "node_modules/posthtml/node_modules/htmlparser2": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -11998,8 +10800,6 @@ }, "node_modules/posthtml/node_modules/posthtml-parser": { "version": "0.11.0", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", - "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", "dev": true, "license": "MIT", "dependencies": { @@ -12011,8 +10811,6 @@ }, "node_modules/posthtml/node_modules/posthtml-render": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", - "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", "dev": true, "license": "MIT", "dependencies": { @@ -12024,8 +10822,6 @@ }, "node_modules/postject": { "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", "dev": true, "license": "MIT", "optional": true, @@ -12042,8 +10838,6 @@ }, "node_modules/postject/node_modules/commander": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, "license": "MIT", "optional": true, @@ -12054,8 +10848,6 @@ }, "node_modules/postsvg": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/postsvg/-/postsvg-2.2.7.tgz", - "integrity": "sha512-TyRnoyEvszrEGOzxaTycnUgJZ0W2Xnd9fOmgfuy61Qjo6JhDPhAIBQ1dspQCvdVpK9KkIlZkSETSjmbO0gVIag==", "dev": true, "license": "MIT", "dependencies": { @@ -12069,8 +10861,6 @@ }, "node_modules/postsvg/node_modules/clone": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", "engines": { @@ -12079,8 +10869,6 @@ }, "node_modules/postsvg/node_modules/deepmerge": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", "dev": true, "license": "MIT", "engines": { @@ -12089,8 +10877,6 @@ }, "node_modules/postsvg/node_modules/dom-serializer": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "license": "MIT", "dependencies": { @@ -12100,8 +10886,6 @@ }, "node_modules/postsvg/node_modules/dom-serializer/node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -12113,8 +10897,6 @@ }, "node_modules/postsvg/node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", "funding": { @@ -12123,15 +10905,11 @@ }, "node_modules/postsvg/node_modules/domelementtype": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/postsvg/node_modules/domhandler": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12140,8 +10918,6 @@ }, "node_modules/postsvg/node_modules/domutils": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12151,15 +10927,11 @@ }, "node_modules/postsvg/node_modules/entities": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true, "license": "BSD-2-Clause" }, "node_modules/postsvg/node_modules/htmlparser2": { "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12173,34 +10945,14 @@ }, "node_modules/postsvg/node_modules/posthtml-parser": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz", - "integrity": "sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==", "dev": true, "license": "MIT", "dependencies": { "htmlparser2": "^3.9.2" } }, - "node_modules/postsvg/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/prebuild-install": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", @@ -12225,8 +10977,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -12235,8 +10985,6 @@ }, "node_modules/pretty-error": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "license": "MIT", "dependencies": { @@ -12245,26 +10993,20 @@ } }, "node_modules/proc-log": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", - "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "version": "5.0.0", "dev": true, "license": "ISC", "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", "engines": { @@ -12273,8 +11015,6 @@ }, "node_modules/promise": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "license": "MIT", "dependencies": { @@ -12283,8 +11023,6 @@ }, "node_modules/promise-retry": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -12297,8 +11035,6 @@ }, "node_modules/proper-lockfile": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, "license": "MIT", "dependencies": { @@ -12309,8 +11045,6 @@ }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", "dependencies": { @@ -12323,8 +11057,6 @@ }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { @@ -12333,15 +11065,11 @@ }, "node_modules/prr": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT" }, "node_modules/pug": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.4.tgz", - "integrity": "sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==", "dev": true, "license": "MIT", "dependencies": { @@ -12357,8 +11085,6 @@ }, "node_modules/pug-attrs": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "dev": true, "license": "MIT", "dependencies": { @@ -12369,8 +11095,6 @@ }, "node_modules/pug-code-gen": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.4.tgz", - "integrity": "sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==", "dev": true, "license": "MIT", "dependencies": { @@ -12386,15 +11110,11 @@ }, "node_modules/pug-error": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", "dev": true, "license": "MIT" }, "node_modules/pug-filters": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", "dev": true, "license": "MIT", "dependencies": { @@ -12407,8 +11127,6 @@ }, "node_modules/pug-filters/node_modules/resolve": { "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { @@ -12429,8 +11147,6 @@ }, "node_modules/pug-lexer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", "dev": true, "license": "MIT", "dependencies": { @@ -12441,8 +11157,6 @@ }, "node_modules/pug-linker": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", "dev": true, "license": "MIT", "dependencies": { @@ -12452,8 +11166,6 @@ }, "node_modules/pug-load": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12463,8 +11175,6 @@ }, "node_modules/pug-parser": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", "dev": true, "license": "MIT", "dependencies": { @@ -12474,8 +11184,6 @@ }, "node_modules/pug-plain-loader": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pug-plain-loader/-/pug-plain-loader-1.1.0.tgz", - "integrity": "sha512-1nYgIJLaahRuHJHhzSPODV44aZfb00bO7kiJiMkke6Hj4SVZftuvx6shZ4BOokk50dJc2RSFqNUBOlus0dniFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12487,8 +11195,6 @@ }, "node_modules/pug-plain-loader/node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -12502,15 +11208,11 @@ }, "node_modules/pug-runtime": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", "dev": true, "license": "MIT" }, "node_modules/pug-strip-comments": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12519,15 +11221,11 @@ }, "node_modules/pug-walk": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", "dev": true, "license": "MIT" }, "node_modules/pump": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", - "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -12536,8 +11234,6 @@ }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -12546,8 +11242,6 @@ }, "node_modules/pvtsutils": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", "dev": true, "license": "MIT", "dependencies": { @@ -12556,8 +11250,6 @@ }, "node_modules/pvutils": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", "dev": true, "license": "MIT", "engines": { @@ -12565,9 +11257,7 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.2", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -12582,8 +11272,6 @@ }, "node_modules/query-string": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12596,9 +11284,6 @@ }, "node_modules/querystring": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.1.tgz", - "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "dev": true, "license": "MIT", "engines": { @@ -12607,8 +11292,6 @@ }, "node_modules/queue": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", "license": "MIT", "dependencies": { "inherits": "~2.0.3" @@ -12616,8 +11299,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -12637,8 +11318,6 @@ }, "node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, "license": "MIT", "engines": { @@ -12650,8 +11329,6 @@ }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", "engines": { @@ -12660,8 +11337,6 @@ }, "node_modules/raw-body": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, "license": "MIT", "dependencies": { @@ -12676,8 +11351,6 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { @@ -12689,8 +11362,6 @@ }, "node_modules/rc": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", @@ -12704,8 +11375,6 @@ }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12713,8 +11382,6 @@ }, "node_modules/read-binary-file-arch": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "license": "MIT", "dependencies": { @@ -12725,32 +11392,19 @@ } }, "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "version": "3.6.2", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -12762,8 +11416,6 @@ }, "node_modules/readdirp/node_modules/picomatch": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -12775,8 +11427,6 @@ }, "node_modules/rechoir": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12788,8 +11438,6 @@ }, "node_modules/rechoir/node_modules/resolve": { "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { @@ -12810,15 +11458,11 @@ }, "node_modules/reflect-metadata": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true, "license": "Apache-2.0" }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { @@ -12840,8 +11484,6 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { @@ -12861,8 +11503,6 @@ }, "node_modules/relateurl": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, "license": "MIT", "engines": { @@ -12871,22 +11511,16 @@ }, "node_modules/remove-markdown": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.5.5.tgz", - "integrity": "sha512-lMR8tOtDqazFT6W2bZidoXwkptMdF3pCxpri0AEokHg0sZlC2GdoLqnoaxsEj1o7/BtXV1MKtT3YviA1t7rW7g==", "dev": true, "license": "MIT" }, "node_modules/remove-trailing-separator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true, "license": "ISC" }, "node_modules/renderkid": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "license": "MIT", "dependencies": { @@ -12899,8 +11533,6 @@ }, "node_modules/renderkid/node_modules/dom-serializer": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "license": "MIT", "dependencies": { @@ -12914,8 +11546,6 @@ }, "node_modules/renderkid/node_modules/domhandler": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12930,8 +11560,6 @@ }, "node_modules/renderkid/node_modules/domutils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -12945,8 +11573,6 @@ }, "node_modules/renderkid/node_modules/entities": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", "dev": true, "license": "BSD-2-Clause", "funding": { @@ -12955,8 +11581,6 @@ }, "node_modules/renderkid/node_modules/htmlparser2": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -12975,8 +11599,6 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -12985,8 +11607,6 @@ }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { @@ -12995,15 +11615,11 @@ }, "node_modules/requires-port": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, "license": "MIT" }, "node_modules/resedit": { "version": "1.7.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", - "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", "dev": true, "license": "MIT", "dependencies": { @@ -13019,15 +11635,13 @@ } }, "node_modules/resolve": { - "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", + "version": "2.0.0-next.7", "dev": true, "license": "MIT", "peer": true, "dependencies": { "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", + "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", @@ -13045,15 +11659,11 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", "dev": true, "license": "MIT" }, "node_modules/resolve-cwd": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -13065,8 +11675,6 @@ }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -13075,8 +11683,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -13085,8 +11691,6 @@ }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "peer": true, @@ -13096,8 +11700,6 @@ }, "node_modules/responselike": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dev": true, "license": "MIT", "dependencies": { @@ -13109,8 +11711,6 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", "dependencies": { @@ -13123,8 +11723,6 @@ }, "node_modules/retry": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -13133,8 +11731,6 @@ }, "node_modules/reusify": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -13144,8 +11740,6 @@ }, "node_modules/rimraf": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", - "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13164,8 +11758,6 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "13.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", - "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -13180,10 +11772,31 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "11.5.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "2.0.2", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/roarr": { "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -13201,8 +11814,6 @@ }, "node_modules/run-applescript": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "dev": true, "license": "MIT", "engines": { @@ -13214,8 +11825,6 @@ }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -13238,8 +11847,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { @@ -13257,15 +11864,25 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/safe-push-apply": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { @@ -13281,8 +11898,6 @@ }, "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { @@ -13299,14 +11914,10 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, "node_modules/sanitize-filename": { "version": "1.6.4", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", - "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", "dev": true, "license": "WTFPL OR ISC", "dependencies": { @@ -13315,8 +11926,6 @@ }, "node_modules/sax": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -13324,8 +11933,6 @@ }, "node_modules/schema-utils": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { @@ -13344,8 +11951,6 @@ }, "node_modules/schema-utils/node_modules/ajv": { "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -13361,8 +11966,6 @@ }, "node_modules/schema-utils/node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", "dependencies": { @@ -13374,22 +11977,16 @@ }, "node_modules/schema-utils/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true, "license": "MIT" }, "node_modules/selfsigned": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -13401,9 +11998,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -13414,16 +12011,12 @@ }, "node_modules/semver-compare": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true, "license": "MIT", "optional": true }, "node_modules/send": { "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "dev": true, "license": "MIT", "dependencies": { @@ -13447,8 +12040,6 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -13457,15 +12048,11 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/send/node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", "bin": { @@ -13477,8 +12064,6 @@ }, "node_modules/serialize-error": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "dev": true, "license": "MIT", "optional": true, @@ -13494,8 +12079,6 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true, "license": "(MIT OR CC0-1.0)", "optional": true, @@ -13508,8 +12091,6 @@ }, "node_modules/serialize-javascript": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", - "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13518,8 +12099,6 @@ }, "node_modules/serve-index": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13541,8 +12120,6 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -13551,8 +12128,6 @@ }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true, "license": "MIT", "engines": { @@ -13561,8 +12136,6 @@ }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "license": "MIT", "dependencies": { @@ -13578,15 +12151,11 @@ }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", "engines": { @@ -13595,8 +12164,6 @@ }, "node_modules/serve-static": { "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "dev": true, "license": "MIT", "dependencies": { @@ -13611,8 +12178,6 @@ }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -13629,8 +12194,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13645,8 +12208,6 @@ }, "node_modules/set-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { @@ -13660,22 +12221,16 @@ }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "dev": true, "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "license": "MIT", "dependencies": { @@ -13687,8 +12242,6 @@ }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -13700,8 +12253,6 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -13710,8 +12261,6 @@ }, "node_modules/shell-quote": { "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, "license": "MIT", "engines": { @@ -13723,8 +12272,6 @@ }, "node_modules/side-channel": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { @@ -13743,8 +12290,6 @@ }, "node_modules/side-channel-list": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { @@ -13760,8 +12305,6 @@ }, "node_modules/side-channel-map": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { @@ -13779,8 +12322,6 @@ }, "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { @@ -13799,15 +12340,11 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -13826,8 +12363,6 @@ }, "node_modules/simple-get": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "funding": [ { "type": "github", @@ -13851,8 +12386,6 @@ }, "node_modules/simple-update-notifier": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", "dev": true, "license": "MIT", "dependencies": { @@ -13864,8 +12397,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -13874,8 +12405,6 @@ }, "node_modules/slashes": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-1.0.5.tgz", - "integrity": "sha512-y2oEt0NOcjNZC6r7gbOuFh/HeOpFdXrS0+MtkyVU5aaTSN/lCZVqvEfj524gcgVrzx/XwLdJTS0B+yzif3/4wQ==", "dev": true, "license": "MIT" }, @@ -13897,11 +12426,8 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", - "optional": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -13909,8 +12435,6 @@ }, "node_modules/sockjs": { "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13919,16 +12443,38 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/socks": { + "version": "2.8.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/sortablejs": { "version": "1.15.7", - "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.7.tgz", - "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==", "license": "MIT" }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13937,8 +12483,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -13946,8 +12490,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -13957,8 +12499,6 @@ }, "node_modules/spdy": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "license": "MIT", "dependencies": { @@ -13974,8 +12514,6 @@ }, "node_modules/spdy-transport": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "license": "MIT", "dependencies": { @@ -13987,21 +12525,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/spinnies": { "version": "0.5.1", "resolved": "git+ssh://git@github.com/lyswhut/spinnies.git#233305c58694aa3b053e3ab9af9049993f918b9d", @@ -14016,8 +12539,6 @@ }, "node_modules/split-on-first": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "dev": true, "license": "MIT", "engines": { @@ -14026,16 +12547,23 @@ }, "node_modules/sprintf-js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause", "optional": true }, + "node_modules/ssri": { + "version": "12.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/stat-mode": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", "dev": true, "license": "MIT", "engines": { @@ -14044,8 +12572,6 @@ }, "node_modules/statuses": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", "engines": { @@ -14054,8 +12580,6 @@ }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14068,8 +12592,6 @@ }, "node_modules/strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "dev": true, "license": "MIT", "engines": { @@ -14077,18 +12599,28 @@ } }, "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.3.0", "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { @@ -14102,8 +12634,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { @@ -14124,8 +12654,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14143,8 +12671,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -14161,8 +12687,18 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { @@ -14174,8 +12710,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "peer": true, @@ -14185,8 +12719,6 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -14198,8 +12730,6 @@ }, "node_modules/strtok3": { "version": "10.3.5", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz", - "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==", "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0" @@ -14213,9 +12743,7 @@ } }, "node_modules/stylehacks": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.10.tgz", - "integrity": "sha512-sRJ7klmhe/Fl5woJcbJUa2qP1Ueffsl1CQI4ePvqXLkZmcIuAt09aP9uT/FOFPqXh9Rh8M5UkgEnwTdTKn/Aag==", + "version": "7.0.11", "dev": true, "license": "MIT", "dependencies": { @@ -14226,13 +12754,11 @@ "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "postcss": "^8.5.10" + "postcss": "^8.5.13" } }, "node_modules/stylehacks/node_modules/postcss-selector-parser": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", - "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -14245,8 +12771,6 @@ }, "node_modules/sumchecker": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14258,8 +12782,6 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -14271,8 +12793,6 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -14284,8 +12804,6 @@ }, "node_modules/svg-baker": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", - "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", "dev": true, "license": "MIT", "dependencies": { @@ -14306,8 +12824,6 @@ }, "node_modules/svg-baker-runtime": { "version": "1.4.7", - "resolved": "https://registry.npmjs.org/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz", - "integrity": "sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==", "dev": true, "license": "MIT", "dependencies": { @@ -14318,8 +12834,6 @@ }, "node_modules/svg-baker/node_modules/image-size": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "license": "MIT", "bin": { @@ -14331,8 +12845,6 @@ }, "node_modules/svg-baker/node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -14346,8 +12858,6 @@ }, "node_modules/svg-mixer-utils": { "version": "0.3.4", - "resolved": "https://registry.npmjs.org/svg-mixer-utils/-/svg-mixer-utils-0.3.4.tgz", - "integrity": "sha512-szkeG+Jn6DRo7QlnUOYKslm4J6dg37I8E+tLG1PB13U6UhSlkC8teCisyT7ZRGRwTcTxmNizvu+/oe8uJUf5EA==", "dev": true, "license": "MIT", "dependencies": { @@ -14360,8 +12870,6 @@ }, "node_modules/svg-sprite-loader": { "version": "6.0.11", - "resolved": "https://registry.npmjs.org/svg-sprite-loader/-/svg-sprite-loader-6.0.11.tgz", - "integrity": "sha512-TedsTf8wsHH6HgdwKjUveDZRC6q5gPloYV8A8/zZaRWP929J7x6TzQ6MvZFl+YYDJuJ0Akyuu/vNVJ+fbPuYXg==", "dev": true, "license": "MIT", "dependencies": { @@ -14380,8 +12888,6 @@ }, "node_modules/svg-sprite-loader/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -14390,8 +12896,6 @@ }, "node_modules/svg-sprite-loader/node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -14405,8 +12909,6 @@ }, "node_modules/svg-transform-loader": { "version": "2.0.13", - "resolved": "https://registry.npmjs.org/svg-transform-loader/-/svg-transform-loader-2.0.13.tgz", - "integrity": "sha512-x3KeCei7aD5BClANdDsO3+yVjWNgb87Hv7tW0TLyuv1Tp6HkOEBesJwI8gBf6aFjpmQFMqgfwUcIFoziEdWnDw==", "dev": true, "license": "MIT", "dependencies": { @@ -14422,8 +12924,6 @@ }, "node_modules/svg-transform-loader/node_modules/loader-utils": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", "dev": true, "license": "MIT", "dependencies": { @@ -14437,8 +12937,6 @@ }, "node_modules/svg-transform-loader/node_modules/query-string": { "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", "dev": true, "license": "MIT", "dependencies": { @@ -14456,8 +12954,6 @@ }, "node_modules/svg-transform-loader/node_modules/strict-uri-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", "dev": true, "license": "MIT", "engines": { @@ -14466,8 +12962,6 @@ }, "node_modules/svgo": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz", - "integrity": "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==", "dev": true, "license": "MIT", "dependencies": { @@ -14492,8 +12986,6 @@ }, "node_modules/svgo-loader": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-5.0.0.tgz", - "integrity": "sha512-GBM8PCIHEMBciHi+ZQcNcdeFPacvnboougYPTuKAHSLtOtcqHOJmXNu/lITJl8CtU8PmORUCSK5hKW844GO4dQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14502,8 +12994,6 @@ }, "node_modules/svgo/node_modules/commander": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, "license": "MIT", "engines": { @@ -14512,8 +13002,6 @@ }, "node_modules/svgo/node_modules/css-select": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14529,8 +13017,6 @@ }, "node_modules/tapable": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", "dev": true, "license": "MIT", "engines": { @@ -14542,9 +13028,7 @@ } }, "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", + "version": "7.5.15", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -14560,8 +13044,6 @@ }, "node_modules/tar-fs": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "dependencies": { "chownr": "^1.1.1", @@ -14572,14 +13054,10 @@ }, "node_modules/tar-fs/node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC" }, "node_modules/tar-stream": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", "dependencies": { "bl": "^4.0.3", @@ -14592,24 +13070,8 @@ "node": ">=6" } }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -14618,8 +13080,6 @@ }, "node_modules/temp": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "license": "MIT", "peer": true, @@ -14633,8 +13093,6 @@ }, "node_modules/temp-file": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", "dev": true, "license": "MIT", "dependencies": { @@ -14644,8 +13102,6 @@ }, "node_modules/temp-file/node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14659,8 +13115,6 @@ }, "node_modules/temp-file/node_modules/jsonfile": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14672,8 +13126,6 @@ }, "node_modules/temp-file/node_modules/universalify": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -14682,9 +13134,6 @@ }, "node_modules/temp/node_modules/rimraf": { "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "peer": true, @@ -14696,9 +13145,7 @@ } }, "node_modules/terser": { - "version": "5.46.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.2.tgz", - "integrity": "sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==", + "version": "5.48.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14715,9 +13162,7 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==", + "version": "5.6.0", "dev": true, "license": "MIT", "dependencies": { @@ -14737,12 +13182,39 @@ "webpack": "^5.1.0" }, "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, "@swc/core": { "optional": true }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, "esbuild": { "optional": true }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, "uglify-js": { "optional": true } @@ -14750,8 +13222,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -14765,8 +13235,6 @@ }, "node_modules/terser-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -14781,22 +13249,16 @@ }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "license": "MIT" }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/thingies": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", - "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", "dev": true, "license": "MIT", "engines": { @@ -14812,15 +13274,11 @@ }, "node_modules/thunky": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true, "license": "MIT" }, "node_modules/tiny-async-pool": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", - "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", "dev": true, "license": "MIT", "dependencies": { @@ -14829,15 +13287,11 @@ }, "node_modules/tiny-typed-emitter": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", "dev": true, "license": "MIT", "dependencies": { @@ -14853,8 +13307,6 @@ }, "node_modules/tmp": { "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "dev": true, "license": "MIT", "engines": { @@ -14863,8 +13315,6 @@ }, "node_modules/tmp-promise": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14886,8 +13336,6 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", "engines": { @@ -14896,15 +13344,11 @@ }, "node_modules/token-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==", "dev": true, "license": "MIT" }, "node_modules/token-types": { "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", "dependencies": { "@borewit/text-codec": "^0.2.1", @@ -14921,8 +13365,6 @@ }, "node_modules/traverse": { "version": "0.6.11", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", - "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", "dev": true, "license": "MIT", "dependencies": { @@ -14939,8 +13381,6 @@ }, "node_modules/tree-dump": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -14956,8 +13396,6 @@ }, "node_modules/tree-kill": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -14966,8 +13404,6 @@ }, "node_modules/truncate-utf8-bytes": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", "dev": true, "license": "WTFPL", "dependencies": { @@ -14976,8 +13412,6 @@ }, "node_modules/ts-api-utils": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, "license": "MIT", "engines": { @@ -14989,8 +13423,6 @@ }, "node_modules/ts-loader": { "version": "9.5.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.7.tgz", - "integrity": "sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==", "dev": true, "license": "MIT", "dependencies": { @@ -15010,8 +13442,6 @@ }, "node_modules/ts-loader/node_modules/source-map": { "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -15020,8 +13450,6 @@ }, "node_modules/tsconfig-paths": { "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "peer": true, @@ -15034,15 +13462,11 @@ }, "node_modules/tslib": { "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tsyringe": { "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", "dev": true, "license": "MIT", "dependencies": { @@ -15054,15 +13478,11 @@ }, "node_modules/tsyringe/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tunnel": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" @@ -15070,8 +13490,6 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" @@ -15082,8 +13500,6 @@ }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -15095,8 +13511,6 @@ }, "node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -15108,8 +13522,6 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { @@ -15122,8 +13534,6 @@ }, "node_modules/type-is/node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", "engines": { @@ -15132,8 +13542,6 @@ }, "node_modules/typed-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { @@ -15147,8 +13555,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { @@ -15167,8 +13573,6 @@ }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15189,8 +13593,6 @@ }, "node_modules/typed-array-length": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { @@ -15210,8 +13612,6 @@ }, "node_modules/typedarray.prototype.slice": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", - "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", "dev": true, "license": "MIT", "dependencies": { @@ -15233,8 +13633,6 @@ }, "node_modules/typescript": { "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -15247,8 +13645,6 @@ }, "node_modules/uint8array-extras": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", "engines": { "node": ">=18" @@ -15259,8 +13655,6 @@ }, "node_modules/unbox-primitive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { @@ -15278,8 +13672,6 @@ }, "node_modules/undici": { "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -15287,15 +13679,11 @@ }, "node_modules/undici-types": { "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true, "license": "MIT" }, "node_modules/unidecode": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/unidecode/-/unidecode-0.1.8.tgz", - "integrity": "sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA==", "dev": true, "engines": { "node": ">= 0.4.12" @@ -15303,15 +13691,33 @@ }, "node_modules/uniq": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", "dev": true, "license": "MIT" }, + "node_modules/unique-filename": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/unique-slug": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", "engines": { @@ -15320,8 +13726,6 @@ }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", "engines": { @@ -15330,15 +13734,11 @@ }, "node_modules/unquote": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", "dev": true, "license": "MIT" }, "node_modules/unzip-crx-3": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15347,10 +13747,52 @@ "yaku": "^0.16.6" } }, + "node_modules/unzipper": { + "version": "0.12.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "^11.2.0", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/unzipper/node_modules/jsonfile": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/unzipper/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -15380,8 +13822,6 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -15390,15 +13830,11 @@ }, "node_modules/urijs": { "version": "1.19.11", - "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", - "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==", "dev": true, "license": "MIT" }, "node_modules/url-slug": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/url-slug/-/url-slug-2.0.0.tgz", - "integrity": "sha512-aiNmSsVgrjCiJ2+KWPferjT46YFKoE8i0YX04BlMVDue022Xwhg/zYlnZ6V9/mP3p8Wj7LEp0myiTkC/p6sxew==", "dev": true, "license": "MIT", "dependencies": { @@ -15407,8 +13843,6 @@ }, "node_modules/utf-8-validate": { "version": "6.0.6", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.6.tgz", - "integrity": "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -15420,28 +13854,20 @@ }, "node_modules/utf8-byte-length": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", "dev": true, "license": "(WTFPL OR MIT)" }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true, "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", "engines": { @@ -15450,9 +13876,6 @@ }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", "dev": true, "license": "MIT", "bin": { @@ -15461,8 +13884,6 @@ }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "engines": { @@ -15485,18 +13906,8 @@ "node": ">=0.6.0" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/void-elements": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", "dev": true, "license": "MIT", "engines": { @@ -15505,15 +13916,11 @@ }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", "dev": true, "license": "MIT" }, "node_modules/vue": { "version": "3.3.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.13.tgz", - "integrity": "sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==", "license": "MIT", "dependencies": { "@vue/compiler-dom": "3.3.13", @@ -15533,8 +13940,6 @@ }, "node_modules/vue-eslint-parser": { "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", "dev": true, "license": "MIT", "dependencies": { @@ -15558,8 +13963,6 @@ }, "node_modules/vue-eslint-parser-template-tokenizer-pug": { "version": "0.4.11", - "resolved": "https://registry.npmjs.org/vue-eslint-parser-template-tokenizer-pug/-/vue-eslint-parser-template-tokenizer-pug-0.4.11.tgz", - "integrity": "sha512-fZ+KprCfIuk2Nt1aBUa0k3dpHyKj5D1oRx0H+GRA1GsqTg5f5lJpto7n6crwDeSIQWsn/1zBb+6b3d3b7n/AVQ==", "dev": true, "license": "ISC", "dependencies": { @@ -15571,8 +13974,6 @@ }, "node_modules/vue-loader": { "version": "17.4.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz", - "integrity": "sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -15594,8 +13995,6 @@ }, "node_modules/vue-router": { "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", - "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", "license": "MIT", "dependencies": { "@vue/devtools-api": "^6.6.4" @@ -15609,8 +14008,6 @@ }, "node_modules/watchpack": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", - "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", "dev": true, "license": "MIT", "dependencies": { @@ -15623,22 +14020,25 @@ }, "node_modules/wbuf": { "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, "node_modules/webpack": { - "version": "5.106.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", - "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "version": "5.107.1", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", @@ -15648,20 +14048,20 @@ "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.20.0", - "es-module-lexer": "^2.0.0", + "enhanced-resolve": "^5.21.4", + "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.1", + "loader-runner": "^4.3.2", "mime-db": "^1.54.0", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.17", + "terser-webpack-plugin": "^5.5.0", "watchpack": "^2.5.1", - "webpack-sources": "^3.3.4" + "webpack-sources": "^3.4.1" }, "bin": { "webpack": "bin/webpack.js" @@ -15681,8 +14081,6 @@ }, "node_modules/webpack-cli": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.0.2.tgz", - "integrity": "sha512-dB0R4T+C/8YuvM+fabdvil6QE44/ChDXikV5lOOkrUeCkW5hTJv2pGLE3keh+D5hjYw8icBaJkZzpFoaHV4T+g==", "dev": true, "license": "MIT", "dependencies": { @@ -15722,8 +14120,6 @@ }, "node_modules/webpack-cli/node_modules/commander": { "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -15732,8 +14128,6 @@ }, "node_modules/webpack-dev-middleware": { "version": "7.4.5", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.5.tgz", - "integrity": "sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==", "dev": true, "license": "MIT", "dependencies": { @@ -15762,8 +14156,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -15772,8 +14164,6 @@ }, "node_modules/webpack-dev-middleware/node_modules/mime-types": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "dependencies": { @@ -15789,8 +14179,6 @@ }, "node_modules/webpack-dev-server": { "version": "5.2.3", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.3.tgz", - "integrity": "sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15847,8 +14235,6 @@ }, "node_modules/webpack-dev-server/node_modules/@types/ws": { "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { @@ -15869,8 +14255,6 @@ }, "node_modules/webpack-hot-middleware/node_modules/ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true, "license": "MIT", "engines": { @@ -15879,8 +14263,6 @@ }, "node_modules/webpack-hot-middleware/node_modules/strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "license": "MIT", "dependencies": { @@ -15892,8 +14274,6 @@ }, "node_modules/webpack-merge": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "license": "MIT", "dependencies": { @@ -15907,8 +14287,6 @@ }, "node_modules/webpack-sources": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", - "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", "dev": true, "license": "MIT", "engines": { @@ -15917,8 +14295,6 @@ }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -15931,8 +14307,6 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -15941,8 +14315,6 @@ }, "node_modules/webpack/node_modules/mime-db": { "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { @@ -15951,8 +14323,6 @@ }, "node_modules/websocket-driver": { "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -15966,8 +14336,6 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -15976,8 +14344,6 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -15992,8 +14358,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { @@ -16012,8 +14376,6 @@ }, "node_modules/which-builtin-type": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -16040,8 +14402,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -16059,8 +14419,6 @@ }, "node_modules/which-typed-array": { "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -16081,21 +14439,15 @@ }, "node_modules/wildcard": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true, "license": "MIT" }, "node_modules/win-guid": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/win-guid/-/win-guid-0.2.1.tgz", - "integrity": "sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A==", "license": "MIT" }, "node_modules/with": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "dev": true, "license": "MIT", "dependencies": { @@ -16110,8 +14462,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -16120,8 +14470,23 @@ }, "node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { @@ -16138,14 +14503,10 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, "node_modules/ws": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", - "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "version": "8.20.1", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -16165,8 +14526,6 @@ }, "node_modules/wsl-utils": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", - "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", "dev": true, "license": "MIT", "dependencies": { @@ -16181,8 +14540,6 @@ }, "node_modules/xml-name-validator": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -16191,8 +14548,6 @@ }, "node_modules/xmlbuilder": { "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, "license": "MIT", "engines": { @@ -16201,8 +14556,6 @@ }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -16211,22 +14564,16 @@ }, "node_modules/yaku": { "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", "dev": true, "license": "MIT" }, "node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true, "license": "ISC" }, "node_modules/yargs": { "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -16244,8 +14591,6 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { @@ -16254,8 +14599,6 @@ }, "node_modules/yauzl": { "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "license": "MIT", "dependencies": { @@ -16265,8 +14608,6 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index cc041c3a5e..0c33c35cdc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lx-music-desktop", - "version": "2.12.2", + "version": "2.12.3-sunny.5", "description": "一个免费的音乐查找助手", "main": "./dist/main.js", "scripts": { @@ -60,6 +60,7 @@ "build:main": "cross-env NODE_ENV=production webpack --config build-config/main/webpack.config.prod.js --progress", "build:renderer": "cross-env NODE_ENV=production webpack --config build-config/renderer/webpack.config.prod.js --progress", "build:renderer-lyric": "cross-env NODE_ENV=production webpack --config build-config/renderer-lyric/webpack.config.prod.js --progress", + "build:renderer-taskbar-lyric": "cross-env NODE_ENV=production webpack --config build-config/renderer-taskbar-lyric/webpack.config.prod.js --progress", "build:renderer-scripts": "cross-env NODE_ENV=production webpack --config build-config/renderer-scripts/webpack.config.prod.js --progress", "lint": "eslint --ext .ts,.js,.vue -f node_modules/eslint-formatter-friendly src", "lint:fix": "eslint --ext .ts,.js,.vue -f node_modules/eslint-formatter-friendly --fix src", @@ -113,7 +114,7 @@ "@types/node": "^20.19.39", "@types/tunnel": "^0.0.7", "@types/ws": "8.5.4", - "@vue/language-plugin-pug": "^3.2.7", + "@vue/language-plugin-pug": "^3.2.8", "browserslist": "^4.28.2", "chalk": "^4.1.2", "changelog-parser": "^3.0.1", @@ -123,11 +124,11 @@ "css-loader": "^7.1.4", "css-minimizer-webpack-plugin": "^8.0.0", "del": "^6.1.1", - "electron": "40.9.2", + "electron": "40.9.3", "electron-builder": "^26.9.0", "electron-debug": "^3.2.0", "electron-devtools-installer": "github:lyswhut/electron-devtools-installer#64596d615c1fc891eefd8aef1dfcb2c87aaadf03", - "electron-to-chromium": "^1.5.345", + "electron-to-chromium": "^1.5.349", "electron-updater": "6.8.4", "eslint": "^8.57.1", "eslint-config-standard": "^17.1.0", @@ -142,7 +143,7 @@ "less-loader": "^12.3.2", "mini-css-extract-plugin": "^2.10.2", "node-loader": "^2.1.0", - "postcss": "^8.5.12", + "postcss": "^8.5.14", "postcss-loader": "^8.2.1", "postcss-pxtorem": "^6.1.0", "pug": "^3.0.4", diff --git a/publish/changeLog.md b/publish/changeLog.md index 5f98247cdc..8949e79008 100644 --- a/publish/changeLog.md +++ b/publish/changeLog.md @@ -1,17 +1,3 @@ -我们很高兴地宣布新项目 Any Listen 的桌面版已发布,目前已支持列表跟随本地文件自动更新、加载并播放WebDAV上的歌曲等功能,更多功能仍在积极开发中,桌面版与Web版将同步更新。 -对于有播放本地音乐或播放服务器上音乐需求的人可以试试,若遇到任何问题可以发 issue 反馈。 - -### 优化 - -- 优化歌单内歌曲搜索结果排序 (#2734) - ### 修复 -- 修复桌面歌词的 鼠标移入歌词区域时提高透明度 设置不稳定的问题(#2679, @Little100) -- 修复某些情况下可能播放没有声音的问题(#2693) -- 修复 tx 搜索结果显示异常的问题(#2753) -- 修复音乐名称和歌手信息格式化问题(#2733) - -### 其他 - -- 更新 Electron 到 40.8.3 +- 修复 kg 搜索结果显示问题(#2782) diff --git a/src/common/constants.ts b/src/common/constants.ts index 5323dbed54..bc950286e0 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -21,6 +21,7 @@ export const APP_EVENT_NAMES = { winMainName: 'win_main', winLyricName: 'win_lyric', trayName: 'tray', + taskbarLyricName: 'taskbar_lyric', } as const export const LIST_IDS = { diff --git a/src/common/defaultSetting.ts b/src/common/defaultSetting.ts index e4ce730f6a..5955ad2b86 100644 --- a/src/common/defaultSetting.ts +++ b/src/common/defaultSetting.ts @@ -103,6 +103,24 @@ const defaultSetting: LX.AppSetting = { 'desktopLyric.style.isFontWeightLine': true, 'desktopLyric.style.isFontWeightExtended': true, + 'taskbarLyric.enable': false, + 'taskbarLyric.position': 'right', + 'taskbarLyric.width': 230, + 'taskbarLyric.offsetX': 0, + 'taskbarLyric.showCover': true, + 'taskbarLyric.showSongInfo': true, + 'taskbarLyric.showCurrentLine': true, + 'taskbarLyric.swapTitleAndArtist': false, + 'taskbarLyric.style.backgroundColorMode': 'theme', + 'taskbarLyric.style.backgroundColor': 'rgba(15, 23, 42, 1)', + 'taskbarLyric.style.backgroundOpacity': 72, + 'taskbarLyric.style.songInfoFontColorMode': 'theme', + 'taskbarLyric.style.songInfoFontColor': 'rgba(226, 232, 240, 1)', + 'taskbarLyric.style.lyricFontColorMode': 'theme', + 'taskbarLyric.style.lyricFontColor': 'rgba(248, 250, 252, 1)', + 'taskbarLyric.style.songInfoFontSize': 11, + 'taskbarLyric.style.lyricFontSize': 12, + 'list.isClickPlayList': false, 'list.isShowSource': true, 'list.isSaveScrollLocation': true, diff --git a/src/common/ipcNames.ts b/src/common/ipcNames.ts index 58ee3100b8..e9381669aa 100644 --- a/src/common/ipcNames.ts +++ b/src/common/ipcNames.ts @@ -140,6 +140,14 @@ const modules = { sync_remove_server_device: 'sync_remove_server_device', process_new_desktop_lyric_client: 'process_new_desktop_lyric_client', + process_new_taskbar_lyric_client: 'process_new_taskbar_lyric_client', + taskbar_lyric_set_state: 'taskbar_lyric_set_state', + taskbar_lyric_show_menu: 'taskbar_lyric_show_menu', + taskbar_lyric_show_main_interface: 'taskbar_lyric_show_main_interface', + taskbar_lyric_request_refresh: 'taskbar_lyric_request_refresh', + taskbar_lyric_drag_move: 'taskbar_lyric_drag_move', + taskbar_lyric_drag_end: 'taskbar_lyric_drag_end', + taskbar_lyric_control: 'taskbar_lyric_control', player_action_set_buttons: 'player_action_set_buttons', // player_action_set_thumbnail_clip: 'player_action_set_thumbnail_clip', diff --git a/src/common/types/app_setting.d.ts b/src/common/types/app_setting.d.ts index 14ca61afc6..8a6d151b2f 100644 --- a/src/common/types/app_setting.d.ts +++ b/src/common/types/app_setting.d.ts @@ -690,6 +690,91 @@ declare global { * 是否在离开搜索界面时自动清空搜索结果列表 */ 'odc.isAutoClearSearchList': boolean + + /** + * Enable the taskbar lyric bar + */ + 'taskbarLyric.enable': boolean + + /** + * Anchor the bar to the right or center of the taskbar + */ + 'taskbarLyric.position': 'right' | 'center' + + /** + * Preferred width of the taskbar lyric bar + */ + 'taskbarLyric.width': number + + /** + * Horizontal offset from the configured taskbar lyric anchor + */ + 'taskbarLyric.offsetX': number + + /** + * Show album cover art in the bar + */ + 'taskbarLyric.showCover': boolean + + /** + * Show song title and artist info + */ + 'taskbarLyric.showSongInfo': boolean + + /** + * Show the current active lyric line + */ + 'taskbarLyric.showCurrentLine': boolean + + /** + * Swap the display order of song title and artist in taskbar lyric + */ + 'taskbarLyric.swapTitleAndArtist': boolean + + /** + * Use theme color or a custom background color for the taskbar lyric bar + */ + 'taskbarLyric.style.backgroundColorMode': 'theme' | 'custom' + + /** + * Custom background color for the taskbar lyric bar + */ + 'taskbarLyric.style.backgroundColor': string + + /** + * Background opacity for the taskbar lyric bar + */ + 'taskbarLyric.style.backgroundOpacity': number + + /** + * Use theme color or a custom font color for the taskbar lyric bar + */ + 'taskbarLyric.style.songInfoFontColorMode': 'theme' | 'custom' + + /** + * Custom font color for the taskbar lyric bar + */ + 'taskbarLyric.style.songInfoFontColor': string + + /** + * 任务栏歌词歌词文字颜色模式 + */ + 'taskbarLyric.style.lyricFontColorMode': 'theme' | 'custom' + + /** + * 任务栏歌词歌词文字颜色 + */ + 'taskbarLyric.style.lyricFontColor': string + + /** + * Taskbar lyric song info font size + */ + 'taskbarLyric.style.songInfoFontSize': number + + /** + * Taskbar lyric lyric line font size + */ + 'taskbarLyric.style.lyricFontSize': number } } diff --git a/src/common/types/taskbar_lyric.d.ts b/src/common/types/taskbar_lyric.d.ts new file mode 100644 index 0000000000..864985ce57 --- /dev/null +++ b/src/common/types/taskbar_lyric.d.ts @@ -0,0 +1,29 @@ +declare namespace LX { + namespace TaskbarLyric { + interface State { + enabled: boolean + isPlaying: boolean + isCollected: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string | null + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean + swapTitleAndArtist: boolean + themeColor: string + backgroundColorMode: LX.AppSetting['taskbarLyric.style.backgroundColorMode'] + backgroundColor: LX.AppSetting['taskbarLyric.style.backgroundColor'] + backgroundOpacity: LX.AppSetting['taskbarLyric.style.backgroundOpacity'] + songInfoFontColorMode: LX.AppSetting['taskbarLyric.style.songInfoFontColorMode'] + songInfoFontColor: LX.AppSetting['taskbarLyric.style.songInfoFontColor'] + lyricFontColorMode: LX.AppSetting['taskbarLyric.style.lyricFontColorMode'] + lyricFontColor: LX.AppSetting['taskbarLyric.style.lyricFontColor'] + songInfoFontSize: LX.AppSetting['taskbarLyric.style.songInfoFontSize'] + lyricFontSize: LX.AppSetting['taskbarLyric.style.lyricFontSize'] + } + } +} diff --git a/src/common/utils/migrateSetting.ts b/src/common/utils/migrateSetting.ts index 6c06630f6d..5b37a2719e 100644 --- a/src/common/utils/migrateSetting.ts +++ b/src/common/utils/migrateSetting.ts @@ -140,6 +140,19 @@ export default (setting: any): Partial => { setting.version = '2.1.0' } + if (setting['taskbarLyric.style.songInfoFontColorMode'] == null) { + setting['taskbarLyric.style.songInfoFontColorMode'] = setting['taskbarLyric.style.fontColorMode'] + } + if (setting['taskbarLyric.style.songInfoFontColor'] == null) { + setting['taskbarLyric.style.songInfoFontColor'] = setting['taskbarLyric.style.fontColor'] + } + if (setting['taskbarLyric.style.lyricFontColorMode'] == null) { + setting['taskbarLyric.style.lyricFontColorMode'] = setting['taskbarLyric.style.fontColorMode'] + } + if (setting['taskbarLyric.style.lyricFontColor'] == null) { + setting['taskbarLyric.style.lyricFontColor'] = setting['taskbarLyric.style.fontColor'] + } + return setting } diff --git a/src/lang/en-us.json b/src/lang/en-us.json index f04971a59c..bb398ba979 100644 --- a/src/lang/en-us.json +++ b/src/lang/en-us.json @@ -236,6 +236,7 @@ "player__play_toggle_mode_off": "Disable", "player__play_toggle_mode_random": "Shuffle", "player__play_toggle_mode_single_loop": "Repeat", + "player__play_queue": "Current queue", "player__playback_preserves_pitch": "Pitch compensation", "player__playback_rate": "Current playback rate: ", "player__playback_rate_reset_btn": "Reset", @@ -282,6 +283,10 @@ "player__sound_effect_pitch_shifter_reset_btn": "Reset", "player__sound_effect_pitch_shifter_tip": "This results in additional CPU usage, as raising/lowering the pitch requires real-time processing of audio data.\n\nKnown issues:\nInsufficient CPU resources will cause processing tasks to pile up, and a sound exception will occur.\nAt this time, it is necessary to pause the playback for a period of time and wait for the accumulated tasks to be processed before playing.", "player__stop": "Paused", + "player__queue_clear": "Clear", + "player__queue_current": "Current list", + "player__queue_empty": "There is no playable queue to show right now.", + "player__queue_temp": "Play later", "player__volume": "Volume: ", "player__volume_mute_label": "Mute", "player__volume_muted": "Muted", @@ -401,6 +406,25 @@ "setting__desktop_lyric_show_taskbar": "Show lyric window process on the taskbar", "setting__desktop_lyric_show_taskbar_tip": "This option is used as a workaround when the screen recording program cannot capture the lyric window.", "setting__desktop_lyric_unplay_color": "Not Played", + "setting__taskbar_lyric": "Taskbar Lyric", + "setting__taskbar_lyric_enable": "Enable taskbar lyric", + "setting__taskbar_lyric_experimental": "Windows-only experimental feature that visually attaches to the taskbar rather than using a true system taskbar extension; currently supports the primary display top or bottom taskbar only", + "setting__taskbar_lyric_show_cover": "Show cover art", + "setting__taskbar_lyric_show_song_info": "Show song info", + "setting__taskbar_lyric_show_current_line": "Show current lyric line", + "setting__taskbar_lyric_swap_title_and_artist": "Swap title and artist", + "setting__taskbar_lyric_position": "Taskbar lyric position", + "setting__taskbar_lyric_background": "Background color", + "setting__taskbar_lyric_font_color": "Text color", + "setting__taskbar_lyric_song_info_color": "Song info", + "setting__taskbar_lyric_line_color": "Lyric", + "setting__taskbar_lyric_song_info_size": "Song size", + "setting__taskbar_lyric_line_size": "Lyric size", + "setting__taskbar_lyric_color": "Color", + "setting__taskbar_lyric_opacity": "Opacity", + "setting__taskbar_lyric_theme_color": "Theme", + "setting__taskbar_lyric_custom_color": "Custom", + "setting__taskbar_lyric_width": "Taskbar lyric width: {width}px", "setting__dislike_list_input_tip": "song_name@artist_name\nsong_name\n@artist_name", "setting__dislike_list_save_btn": "Save", "setting__dislike_list_tips": "1. One line per entry. If there is an \"@\" symbol in the name of the song or artist, it needs to be replaced with \"#\"\n2. Specify a song by a certain artist: song_name@artist_name\n3. Specify a song: song_name\n4. Specify an artist: @artist_name", diff --git a/src/lang/zh-cn.json b/src/lang/zh-cn.json index c5a5242380..4b43345dd9 100644 --- a/src/lang/zh-cn.json +++ b/src/lang/zh-cn.json @@ -236,6 +236,7 @@ "player__play_toggle_mode_off": "禁用歌曲切换", "player__play_toggle_mode_random": "列表随机播放", "player__play_toggle_mode_single_loop": "单曲循环播放", + "player__play_queue": "当前播放列表", "player__playback_preserves_pitch": "音调补偿", "player__playback_rate": "当前播放速率:", "player__playback_rate_reset_btn": "重置", @@ -282,6 +283,10 @@ "player__sound_effect_pitch_shifter_reset_btn": "重置", "player__sound_effect_pitch_shifter_tip": "由于升降调需要实时处理音频数据,这会导致额外的 CPU 占用。\n\n已知问题:\n如果 CPU 资源不够将导致处理任务堆积而出现声音异常。\n这时需要暂停播放一段时间等堆积的任务处理完毕再播放。", "player__stop": "暂停播放", + "player__queue_clear": "清空", + "player__queue_current": "当前歌单", + "player__queue_empty": "当前没有可显示的播放队列", + "player__queue_temp": "稍后播放", "player__volume": "当前音量:", "player__volume_mute_label": "静音", "player__volume_muted": "已静音", @@ -401,6 +406,25 @@ "setting__desktop_lyric_show_taskbar": "在任务栏显示歌词进程", "setting__desktop_lyric_show_taskbar_tip": "此选项作为在录屏软件无法捕获歌词窗口时的变通解决方法", "setting__desktop_lyric_unplay_color": "未播放颜色", + "setting__taskbar_lyric": "任务栏歌词", + "setting__taskbar_lyric_enable": "启用任务栏歌词", + "setting__taskbar_lyric_experimental": "仅限 Windows 的实验性功能,视觉上贴附任务栏,并非真正的系统任务栏扩展;当前仅支持主屏顶部或底部任务栏", + "setting__taskbar_lyric_show_cover": "显示封面", + "setting__taskbar_lyric_show_song_info": "显示歌曲信息", + "setting__taskbar_lyric_show_current_line": "显示当前歌词", + "setting__taskbar_lyric_swap_title_and_artist": "交换歌名和作者位置", + "setting__taskbar_lyric_position": "任务栏歌词位置", + "setting__taskbar_lyric_background": "背景颜色", + "setting__taskbar_lyric_font_color": "文字颜色", + "setting__taskbar_lyric_song_info_color": "歌曲信息", + "setting__taskbar_lyric_line_color": "歌词", + "setting__taskbar_lyric_song_info_size": "歌曲字号", + "setting__taskbar_lyric_line_size": "歌词字号", + "setting__taskbar_lyric_color": "颜色", + "setting__taskbar_lyric_opacity": "不透明度", + "setting__taskbar_lyric_theme_color": "主题", + "setting__taskbar_lyric_custom_color": "自定义", + "setting__taskbar_lyric_width": "任务栏歌词宽度:{width}px", "setting__dislike_list_input_tip": "歌曲名@艺术家\n歌曲名\n@艺术家", "setting__dislike_list_save_btn": "保存", "setting__dislike_list_tips": "1. 每条一行,若歌曲或者艺术家名字中存在「@」符号,需要将其替换成「#」\n2. 指定某艺术家的某首歌:歌曲名@艺术家\n3. 指定某首歌:歌曲名\n4. 指定某艺术家:@艺术家", diff --git a/src/lang/zh-tw.json b/src/lang/zh-tw.json index 491563fa56..5f61893c94 100644 --- a/src/lang/zh-tw.json +++ b/src/lang/zh-tw.json @@ -236,6 +236,7 @@ "player__play_toggle_mode_off": "停用歌曲切換", "player__play_toggle_mode_random": "隨機播放", "player__play_toggle_mode_single_loop": "重複播放", + "player__play_queue": "目前播放清單", "player__playback_preserves_pitch": "音調補償", "player__playback_rate": "目前播放速率:", "player__playback_rate_reset_btn": "重設", @@ -282,6 +283,10 @@ "player__sound_effect_pitch_shifter_reset_btn": "重設", "player__sound_effect_pitch_shifter_tip": "由於升降調需要即時處理音訊資料,這會導致額外的 CPU 占用。\n\n已知問題:\n如果 CPU 資源不夠將導致處理任務堆積而出現聲音異常。\n這時需要暫停播放一段時間等堆積的任務處理完畢再播放。", "player__stop": "暫停播放", + "player__queue_clear": "清空", + "player__queue_current": "目前歌單", + "player__queue_empty": "目前沒有可顯示的播放佇列", + "player__queue_temp": "稍後播放", "player__volume": "目前音量:", "player__volume_mute_label": "靜音", "player__volume_muted": "已靜音", @@ -745,4 +750,23 @@ "user_api_import_online__input_loading": "匯入中...", "user_api_import_online__input_tip": "請輸入 HTTP 連結", "user_api_import_online__title": "從線上匯入自訂來源 API" + , "setting__taskbar_lyric": "工作列歌詞", + "setting__taskbar_lyric_enable": "啟用工作列歌詞", + "setting__taskbar_lyric_experimental": "僅限 Windows 的實驗性功能,會在視覺上貼附工作列,並非真正的系統工作列擴充;目前僅支援主螢幕頂部或底部工作列", + "setting__taskbar_lyric_show_cover": "顯示封面", + "setting__taskbar_lyric_show_song_info": "顯示歌曲資訊", + "setting__taskbar_lyric_show_current_line": "顯示目前歌詞", + "setting__taskbar_lyric_swap_title_and_artist": "交換歌名和作者位置", + "setting__taskbar_lyric_position": "工作列歌詞位置", + "setting__taskbar_lyric_background": "背景顏色", + "setting__taskbar_lyric_font_color": "文字顏色", + "setting__taskbar_lyric_song_info_color": "歌曲資訊", + "setting__taskbar_lyric_line_color": "歌詞", + "setting__taskbar_lyric_song_info_size": "歌曲字級", + "setting__taskbar_lyric_line_size": "歌詞字級", + "setting__taskbar_lyric_color": "顏色", + "setting__taskbar_lyric_opacity": "不透明度", + "setting__taskbar_lyric_theme_color": "主題", + "setting__taskbar_lyric_custom_color": "自訂", + "setting__taskbar_lyric_width": "工作列歌詞寬度:{width}px" } diff --git a/src/main/modules/index.ts b/src/main/modules/index.ts index e95d1713c0..884dc8746e 100644 --- a/src/main/modules/index.ts +++ b/src/main/modules/index.ts @@ -5,6 +5,7 @@ import registerTray from './tray' import registerAppMenu from './appMenu' import registerWinLyric from './winLyric' import registerCommonRenderers from './commonRenderers' +import registerTaskbarLyric from './taskbarLyric' let isRegistered = false export default () => { @@ -16,5 +17,6 @@ export default () => { registerTray() registerAppMenu() registerWinLyric() + registerTaskbarLyric() isRegistered = true } diff --git a/src/main/modules/taskbarLyric/index.ts b/src/main/modules/taskbarLyric/index.ts new file mode 100644 index 0000000000..7423a9dc73 --- /dev/null +++ b/src/main/modules/taskbarLyric/index.ts @@ -0,0 +1,69 @@ +import { screen, powerMonitor } from 'electron' +import { isWin } from '@common/utils' +import { closeWindow, createWindow, refreshBounds, refreshWindowStateFromConfig, isExistWindow, updatePlayerStatus } from './main' + +let isRegistered = false + +const refreshBoundsIfEnabled = () => { + if (!global.lx.appSetting['taskbarLyric.enable']) return + if (isExistWindow()) refreshBounds() + else createWindow() +} + +const handleConfigChange = (keys: Array) => { + if (!keys.some(key => key.startsWith('taskbarLyric.'))) return + + if (keys.includes('taskbarLyric.enable')) { + if (global.lx.appSetting['taskbarLyric.enable']) createWindow() + else closeWindow() + return + } + + if (global.lx.appSetting['taskbarLyric.enable'] && ( + keys.includes('taskbarLyric.position') || + keys.includes('taskbarLyric.width') || + keys.includes('taskbarLyric.offsetX') + )) refreshBounds() + + if (global.lx.appSetting['taskbarLyric.enable'] && ( + keys.includes('taskbarLyric.showCover') || + keys.includes('taskbarLyric.showSongInfo') || + keys.includes('taskbarLyric.showCurrentLine') || + keys.includes('taskbarLyric.swapTitleAndArtist') || + keys.includes('taskbarLyric.style.backgroundColorMode') || + keys.includes('taskbarLyric.style.backgroundColor') || + keys.includes('taskbarLyric.style.backgroundOpacity') || + keys.includes('taskbarLyric.style.songInfoFontColorMode') || + keys.includes('taskbarLyric.style.songInfoFontColor') || + keys.includes('taskbarLyric.style.lyricFontColorMode') || + keys.includes('taskbarLyric.style.lyricFontColor') || + keys.includes('taskbarLyric.style.songInfoFontSize') || + keys.includes('taskbarLyric.style.lyricFontSize') + )) refreshWindowStateFromConfig() +} + +export default () => { + if (isRegistered || !isWin) return + isRegistered = true + + global.lx.event_app.on('app_inited', () => { + if (global.lx.appSetting['taskbarLyric.enable']) createWindow() + }) + + global.lx.event_app.on('updated_config', (keys) => { + handleConfigChange(keys) + }) + + global.lx.event_app.on('player_status', (status) => { + if (!global.lx.appSetting['taskbarLyric.enable']) return + updatePlayerStatus(status) + }) + + screen.on('display-added', refreshBoundsIfEnabled) + screen.on('display-removed', refreshBoundsIfEnabled) + screen.on('display-metrics-changed', refreshBoundsIfEnabled) + powerMonitor.on('resume', refreshBoundsIfEnabled) + powerMonitor.on('unlock-screen', refreshBoundsIfEnabled) +} + +export * from './main' diff --git a/src/main/modules/taskbarLyric/main.ts b/src/main/modules/taskbarLyric/main.ts new file mode 100644 index 0000000000..a2bd6afb59 --- /dev/null +++ b/src/main/modules/taskbarLyric/main.ts @@ -0,0 +1,350 @@ +import path from 'node:path' +import { existsSync } from 'node:fs' +import { BrowserWindow, Menu, screen } from 'electron' +import { WIN_MAIN_RENDERER_EVENT_NAME } from '@common/ipcNames' +import { encodePath } from '@common/utils/electron' +import { sendTaskbarButtonClick } from '@main/modules/winMain' +import { showWindow as showMainInterface } from '@main/modules/winMain/main' +import type { TaskbarLyricState } from './types' +import { calcTaskbarLyricBounds, calcTaskbarLyricClampedOffsetX } from './utils' + +const TASKBAR_LYRIC_HEIGHT = 56 +const TASKBAR_LYRIC_ALWAYS_ON_TOP_LEVEL = 'pop-up-menu' +const TASKBAR_LYRIC_ZORDER_INTERVAL = 500 +const DEFAULT_THEME_COLOR = 'rgb(77, 175, 124)' + +let browserWindow: Electron.BrowserWindow | null = null +let currentState: TaskbarLyricState | null = null +let dragOffsetX: number | null = null +let zOrderTimer: NodeJS.Timeout | null = null +let isMenuPopupVisible = false + +const clearZOrderTimer = () => { + if (!zOrderTimer) return + clearInterval(zOrderTimer) + zOrderTimer = null +} + +const refreshWindowZOrder = () => { + if (!browserWindow || browserWindow.isDestroyed()) return + browserWindow.setAlwaysOnTop(true, TASKBAR_LYRIC_ALWAYS_ON_TOP_LEVEL) + browserWindow.moveTop() +} + +const ensureWindowZOrder = () => { + clearZOrderTimer() + refreshWindowZOrder() + zOrderTimer = setInterval(() => { + refreshWindowZOrder() + }, TASKBAR_LYRIC_ZORDER_INTERVAL) +} + +const getStyleState = () => { + return { + backgroundColorMode: global.lx.appSetting['taskbarLyric.style.backgroundColorMode'], + backgroundColor: global.lx.appSetting['taskbarLyric.style.backgroundColor'], + backgroundOpacity: global.lx.appSetting['taskbarLyric.style.backgroundOpacity'], + songInfoFontColorMode: global.lx.appSetting['taskbarLyric.style.songInfoFontColorMode'], + songInfoFontColor: global.lx.appSetting['taskbarLyric.style.songInfoFontColor'], + lyricFontColorMode: global.lx.appSetting['taskbarLyric.style.lyricFontColorMode'], + lyricFontColor: global.lx.appSetting['taskbarLyric.style.lyricFontColor'], + songInfoFontSize: global.lx.appSetting['taskbarLyric.style.songInfoFontSize'], + lyricFontSize: global.lx.appSetting['taskbarLyric.style.lyricFontSize'], + } +} + +const getDefaultState = (): TaskbarLyricState => { + return { + enabled: global.lx.appSetting['taskbarLyric.enable'], + isPlaying: false, + isCollected: false, + songId: null, + title: 'LX Music', + artist: '', + lyricLine: '', + albumCoverUrl: null, + offsetX: global.lx.appSetting['taskbarLyric.offsetX'], + showCover: global.lx.appSetting['taskbarLyric.showCover'], + showSongInfo: global.lx.appSetting['taskbarLyric.showSongInfo'], + showCurrentLine: global.lx.appSetting['taskbarLyric.showCurrentLine'], + swapTitleAndArtist: global.lx.appSetting['taskbarLyric.swapTitleAndArtist'], + themeColor: DEFAULT_THEME_COLOR, + ...getStyleState(), + } +} + +const sendStateToWindow = (webContents?: Electron.WebContents) => { + const target = webContents ?? browserWindow?.webContents + if (!target || target.isDestroyed()) return + + target.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, currentState ?? getDefaultState()) +} + +const getWindowBounds = (): Electron.Rectangle | null => { + const display = screen.getPrimaryDisplay() + const offsetX = dragOffsetX ?? global.lx.appSetting['taskbarLyric.offsetX'] + const bounds = calcTaskbarLyricBounds({ + display: { + ...display.bounds, + workArea: display.workArea, + }, + width: global.lx.appSetting['taskbarLyric.width'], + height: TASKBAR_LYRIC_HEIGHT, + position: global.lx.appSetting['taskbarLyric.position'], + offsetX, + }) + return bounds +} + +const getClampedOffsetX = (offsetX: number) => { + const display = screen.getPrimaryDisplay() + return calcTaskbarLyricClampedOffsetX({ + display: { + ...display.bounds, + workArea: display.workArea, + }, + width: global.lx.appSetting['taskbarLyric.width'], + position: global.lx.appSetting['taskbarLyric.position'], + offsetX, + }) +} + +const getWindowUrl = () => { + if (process.env.NODE_ENV !== 'production') return 'http://localhost:9082/taskbar-lyric.html' + + const filePath = path.join(__dirname, 'taskbar-lyric.html') + if (!existsSync(filePath)) return null + + return `file://${encodePath(filePath)}` +} + +const hasActiveSong = (state?: TaskbarLyricState | null) => { + return !!state?.songId +} + +const closeTaskbarLyricBySetting = () => { + global.lx.event_app.update_config({ + 'taskbarLyric.enable': false, + }) +} + +export const showTaskbarLyricMainInterface = () => { + showMainInterface() +} + +const createTaskbarLyricMenuTemplate = (state?: TaskbarLyricState | null): Electron.MenuItemConstructorOptions[] => { + const enabled = hasActiveSong(state) + const isPlaying = !!state?.isPlaying + const isCollected = !!state?.isCollected + + return [ + { + label: '上一首', + enabled, + click: () => { + sendTaskbarButtonClick('prev') + }, + }, + { + label: isPlaying ? '暂停' : '播放', + enabled, + click: () => { + sendTaskbarButtonClick(isPlaying ? 'pause' : 'play') + }, + }, + { + label: '下一首', + enabled, + click: () => { + sendTaskbarButtonClick('next') + }, + }, + { + label: isCollected ? '取消收藏' : '收藏', + enabled, + click: () => { + sendTaskbarButtonClick(isCollected ? 'unCollect' : 'collect') + }, + }, + { type: 'separator' }, + { + label: '显示主界面', + click: () => { + showTaskbarLyricMainInterface() + }, + }, + { + label: '关闭任务栏歌词', + click: () => { + closeTaskbarLyricBySetting() + }, + }, + ] +} + +export const createWindow = () => { + if (browserWindow) { + const bounds = getWindowBounds() + if (!bounds) { + closeWindow() + return null + } + + browserWindow.setBounds(bounds) + return browserWindow + } + + const windowUrl = getWindowUrl() + const bounds = getWindowBounds() + if (!windowUrl || !bounds) return null + + browserWindow = new BrowserWindow({ + ...bounds, + useContentSize: true, + frame: false, + transparent: true, + hasShadow: false, + resizable: false, + minimizable: false, + maximizable: false, + fullscreenable: false, + movable: false, + roundedCorners: false, + show: false, + skipTaskbar: true, + alwaysOnTop: true, + focusable: false, + webPreferences: { + contextIsolation: false, + webSecurity: false, + sandbox: false, + nodeIntegration: true, + enableWebSQL: false, + webgl: false, + spellcheck: false, + backgroundThrottling: false, + }, + }) + + browserWindow.on('closed', () => { + clearZOrderTimer() + browserWindow = null + }) + + browserWindow.once('ready-to-show', () => { + ensureWindowZOrder() + browserWindow?.showInactive() + }) + + browserWindow.webContents.on('did-finish-load', () => { + sendStateToWindow() + }) + + void browserWindow.loadURL(windowUrl) + + return browserWindow +} + +export const closeWindow = () => { + if (!browserWindow) return + clearZOrderTimer() + browserWindow.close() +} + +export const refreshWindowStateFromConfig = () => { + currentState = { + ...(currentState ?? getDefaultState()), + enabled: global.lx.appSetting['taskbarLyric.enable'], + offsetX: dragOffsetX ?? global.lx.appSetting['taskbarLyric.offsetX'], + showCover: global.lx.appSetting['taskbarLyric.showCover'], + showSongInfo: global.lx.appSetting['taskbarLyric.showSongInfo'], + showCurrentLine: global.lx.appSetting['taskbarLyric.showCurrentLine'], + swapTitleAndArtist: global.lx.appSetting['taskbarLyric.swapTitleAndArtist'], + themeColor: currentState?.themeColor ?? DEFAULT_THEME_COLOR, + ...getStyleState(), + } + sendStateToWindow() +} + +export const showTaskbarLyricMenu = () => { + if (!browserWindow || browserWindow.isDestroyed() || isMenuPopupVisible) return + isMenuPopupVisible = true + + browserWindow.setFocusable(true) + browserWindow.setSkipTaskbar(true) + refreshWindowZOrder() + + const menu = Menu.buildFromTemplate(createTaskbarLyricMenuTemplate(currentState)) + menu.popup({ + window: browserWindow, + callback: () => { + if (!browserWindow || browserWindow.isDestroyed()) { + isMenuPopupVisible = false + return + } + browserWindow.setSkipTaskbar(true) + browserWindow.blur() + browserWindow.setFocusable(false) + browserWindow.showInactive() + refreshWindowZOrder() + isMenuPopupVisible = false + }, + }) +} + +export const refreshBounds = () => { + if (!browserWindow) return + const bounds = getWindowBounds() + if (!bounds) { + closeWindow() + return + } + browserWindow.setBounds(bounds) +} + +export const updateWindowState = (state?: TaskbarLyricState) => { + currentState = state ?? currentState ?? getDefaultState() + currentState.offsetX = dragOffsetX ?? global.lx.appSetting['taskbarLyric.offsetX'] + sendStateToWindow() +} + +export const updatePlayerStatus = (status: Partial) => { + const nextState = currentState ?? getDefaultState() + + if (status.status != null) { + nextState.isPlaying = status.status === 'playing' + } + if (status.collect != null) nextState.isCollected = status.collect + if (status.name != null) nextState.title = status.name || 'LX Music' + if (status.singer != null) nextState.artist = status.singer + if (status.lyricLineText != null) nextState.lyricLine = status.lyricLineText + + currentState = nextState + currentState.offsetX = dragOffsetX ?? global.lx.appSetting['taskbarLyric.offsetX'] + sendStateToWindow() +} + +export const sendCurrentStateToWindow = (webContents?: Electron.WebContents) => { + sendStateToWindow(webContents) +} + +export const isExistWindow = () => { + return !!browserWindow +} + +export const updateDragOffsetX = (offsetX: number) => { + dragOffsetX = getClampedOffsetX(offsetX) + if (currentState) currentState.offsetX = dragOffsetX + refreshBounds() + sendStateToWindow() +} + +export const commitDragOffsetX = () => { + if (dragOffsetX == null) return + const nextOffsetX = getClampedOffsetX(dragOffsetX) + dragOffsetX = null + if (currentState) currentState.offsetX = nextOffsetX + global.lx.event_app.update_config({ + 'taskbarLyric.offsetX': nextOffsetX, + }) +} diff --git a/src/main/modules/taskbarLyric/types.ts b/src/main/modules/taskbarLyric/types.ts new file mode 100644 index 0000000000..9bfe3ee13a --- /dev/null +++ b/src/main/modules/taskbarLyric/types.ts @@ -0,0 +1,43 @@ +export interface TaskbarLyricDisplay extends Electron.Rectangle { + workArea: Electron.Rectangle +} + +export interface TaskbarLyricBoundsOptions { + display: TaskbarLyricDisplay + width: number + height: number + position: LX.AppSetting['taskbarLyric.position'] + offsetX: number +} + +export type TaskbarPosition = 'top' | 'right' | 'bottom' | 'left' + +export interface TaskbarLyricState { + enabled: boolean + isPlaying: boolean + isCollected: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string | null + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean + swapTitleAndArtist: boolean + themeColor: string + backgroundColorMode: LX.AppSetting['taskbarLyric.style.backgroundColorMode'] + backgroundColor: LX.AppSetting['taskbarLyric.style.backgroundColor'] + backgroundOpacity: LX.AppSetting['taskbarLyric.style.backgroundOpacity'] + songInfoFontColorMode: LX.AppSetting['taskbarLyric.style.songInfoFontColorMode'] + songInfoFontColor: LX.AppSetting['taskbarLyric.style.songInfoFontColor'] + lyricFontColorMode: LX.AppSetting['taskbarLyric.style.lyricFontColorMode'] + lyricFontColor: LX.AppSetting['taskbarLyric.style.lyricFontColor'] + songInfoFontSize: LX.AppSetting['taskbarLyric.style.songInfoFontSize'] + lyricFontSize: LX.AppSetting['taskbarLyric.style.lyricFontSize'] +} + +export interface TaskbarLyricDragMoveParams { + offsetX: number +} diff --git a/src/main/modules/taskbarLyric/utils.ts b/src/main/modules/taskbarLyric/utils.ts new file mode 100644 index 0000000000..950b883153 --- /dev/null +++ b/src/main/modules/taskbarLyric/utils.ts @@ -0,0 +1,128 @@ +import type { TaskbarLyricBoundsOptions, TaskbarPosition } from './types' + +interface IgnoreMouseEventsTarget { + setIgnoreMouseEvents: (ignore: boolean, options?: Electron.IgnoreMouseEventsOptions) => void +} + +export const enableTaskbarLyricIgnoreMouseEvents = (target: IgnoreMouseEventsTarget) => { + target.setIgnoreMouseEvents(true, { forward: true }) +} + +const clamp = (value: number, min: number, max: number) => { + return Math.min(Math.max(value, min), max) +} + +const getTaskbarRect = ({ display }: Pick): Electron.Rectangle | null => { + if (display.workArea.x > display.x) { + return { + x: display.x, + y: display.y, + width: display.workArea.x - display.x, + height: display.height, + } + } + + if (display.workArea.y > display.y) { + return { + x: display.x, + y: display.y, + width: display.width, + height: display.workArea.y - display.y, + } + } + + const taskbarRight = display.workArea.x + display.workArea.width + const displayRight = display.x + display.width + if (taskbarRight < displayRight) { + return { + x: taskbarRight, + y: display.y, + width: displayRight - taskbarRight, + height: display.height, + } + } + + const taskbarBottom = display.workArea.y + display.workArea.height + const displayBottom = display.y + display.height + if (taskbarBottom < displayBottom) { + return { + x: display.x, + y: taskbarBottom, + width: display.width, + height: displayBottom - taskbarBottom, + } + } + + return null +} + +const getTaskbarPosition = ({ display }: Pick): TaskbarPosition | null => { + if (display.workArea.x > display.x) return 'left' + if (display.workArea.y > display.y) return 'top' + if (display.workArea.x + display.workArea.width < display.x + display.width) return 'right' + if (display.workArea.y + display.workArea.height < display.y + display.height) return 'bottom' + return null +} + +export const calcTaskbarLyricBounds = ({ display, width, height, position, offsetX }: TaskbarLyricBoundsOptions): Electron.Rectangle | null => { + const taskbarPosition = getTaskbarPosition({ display }) + if (taskbarPosition === 'left' || taskbarPosition === 'right') return null + + const taskbarRect = getTaskbarRect({ display }) + + const safeWidth = Math.max(0, Math.min(Math.round(width), taskbarRect?.width ?? display.width)) + const safeHeight = Math.max(0, Math.min(Math.round(height), taskbarRect?.height ?? display.height)) + const horizontalAreaX = taskbarRect?.x ?? display.workArea.x + const horizontalAreaWidth = taskbarRect?.width ?? display.workArea.width + const baseHorizontalX = position === 'center' + ? Math.round(horizontalAreaX + (horizontalAreaWidth - safeWidth) / 2) + : Math.round(horizontalAreaX + horizontalAreaWidth - safeWidth) + const minX = Math.round(horizontalAreaX) + const maxX = Math.round(horizontalAreaX + horizontalAreaWidth - safeWidth) + const horizontalX = clamp(Math.round(baseHorizontalX + offsetX), minX, maxX) + + if (taskbarPosition == null) { + return { + x: Math.round(display.workArea.x + display.workArea.width - safeWidth), + y: Math.max(display.workArea.y, display.workArea.y + display.workArea.height - safeHeight), + width: safeWidth, + height: safeHeight, + } + } + + let x: number + let y: number + + switch (taskbarPosition) { + case 'top': + x = horizontalX + y = display.y + break + case 'bottom': + default: + x = horizontalX + y = (taskbarRect?.y ?? display.workArea.y) + (taskbarRect?.height ?? 0) - safeHeight + break + } + + return { + x, + y, + width: safeWidth, + height: safeHeight, + } +} + +export const calcTaskbarLyricClampedOffsetX = ({ display, width, position, offsetX }: Pick) => { + const taskbarRect = getTaskbarRect({ display }) + const horizontalAreaX = taskbarRect?.x ?? display.workArea.x + const horizontalAreaWidth = taskbarRect?.width ?? display.workArea.width + const safeWidth = Math.max(0, Math.min(Math.round(width), horizontalAreaWidth)) + const baseHorizontalX = position === 'center' + ? Math.round(horizontalAreaX + (horizontalAreaWidth - safeWidth) / 2) + : Math.round(horizontalAreaX + horizontalAreaWidth - safeWidth) + const minX = Math.round(horizontalAreaX) + const maxX = Math.round(horizontalAreaX + horizontalAreaWidth - safeWidth) + const actualX = clamp(Math.round(baseHorizontalX + offsetX), minX, maxX) + return actualX - baseHorizontalX +} diff --git a/src/main/modules/winMain/main.ts b/src/main/modules/winMain/main.ts index ca6d64ddf9..92399a21a1 100644 --- a/src/main/modules/winMain/main.ts +++ b/src/main/modules/winMain/main.ts @@ -96,6 +96,7 @@ export const createWindow = () => { sandbox: false, enableWebSQL: false, webgl: false, + backgroundThrottling: false, spellcheck: false, // 禁用拼写检查器 }, } diff --git a/src/main/modules/winMain/rendererEvent/index.ts b/src/main/modules/winMain/rendererEvent/index.ts index f2200ad7b2..e79e9547c7 100644 --- a/src/main/modules/winMain/rendererEvent/index.ts +++ b/src/main/modules/winMain/rendererEvent/index.ts @@ -12,6 +12,7 @@ import music from './music' import download from './download' import soundEffect from './soundEffect' import openAPI from './openAPI' +import taskbarLyric from './taskbarLyric' import { sendEvent } from '../main' export * from './app' @@ -39,6 +40,7 @@ export default () => { download() soundEffect() openAPI() + taskbarLyric() global.lx.event_app.on('updated_config', (keys, setting) => { sendConfigChange(setting) diff --git a/src/main/modules/winMain/rendererEvent/process.ts b/src/main/modules/winMain/rendererEvent/process.ts index 0c28efa748..86e23c661e 100644 --- a/src/main/modules/winMain/rendererEvent/process.ts +++ b/src/main/modules/winMain/rendererEvent/process.ts @@ -15,4 +15,12 @@ export const sendNewDesktopLyricClient = (port: Electron.MessagePortMain) => { getWebContents().postMessage(WIN_MAIN_RENDERER_EVENT_NAME.process_new_desktop_lyric_client, null, [port]) } +/** + * Send taskbar lyric process channel to the main renderer. + * @param port message port + */ +export const sendNewTaskbarLyricClient = (port: Electron.MessagePortMain) => { + getWebContents().postMessage(WIN_MAIN_RENDERER_EVENT_NAME.process_new_taskbar_lyric_client, null, [port]) +} + diff --git a/src/main/modules/winMain/rendererEvent/taskbarLyric.ts b/src/main/modules/winMain/rendererEvent/taskbarLyric.ts new file mode 100644 index 0000000000..1d7f7713c4 --- /dev/null +++ b/src/main/modules/winMain/rendererEvent/taskbarLyric.ts @@ -0,0 +1,35 @@ +import { WIN_MAIN_RENDERER_EVENT_NAME } from '@common/ipcNames' +import { mainOn } from '@common/mainIpc' +import { commitDragOffsetX, sendCurrentStateToWindow, showTaskbarLyricMainInterface, showTaskbarLyricMenu, updateDragOffsetX, updateWindowState } from '@main/modules/taskbarLyric' +import { sendTaskbarButtonClick } from './app' +import type { TaskbarLyricDragMoveParams, TaskbarLyricState } from '@main/modules/taskbarLyric/types' + +export default () => { + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, ({ params }) => { + updateWindowState(params) + }) + + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_request_refresh, ({ event }) => { + sendCurrentStateToWindow(event.sender) + }) + + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_menu, () => { + showTaskbarLyricMenu() + }) + + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_main_interface, () => { + showTaskbarLyricMainInterface() + }) + + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_drag_move, ({ params }) => { + updateDragOffsetX(params.offsetX) + }) + + mainOn(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_drag_end, () => { + commitDragOffsetX() + }) + + mainOn<'prev' | 'next' | 'play' | 'pause'>(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_control, ({ params }) => { + sendTaskbarButtonClick(params) + }) +} diff --git a/src/renderer-taskbar-lyric/.eslintrc.cjs b/src/renderer-taskbar-lyric/.eslintrc.cjs new file mode 100644 index 0000000000..47436f7da4 --- /dev/null +++ b/src/renderer-taskbar-lyric/.eslintrc.cjs @@ -0,0 +1,17 @@ +/* eslint-env node */ +const { base, html, typescript, vue } = require('../../.eslintrc.base.cjs') + +module.exports = { + root: true, + ...base, + overrides: [ + html, + vue, + { + ...typescript, + parserOptions: { + project: './tsconfig.json', + }, + }, + ], +} diff --git a/src/renderer-taskbar-lyric/App.vue b/src/renderer-taskbar-lyric/App.vue new file mode 100644 index 0000000000..89c166c0e5 --- /dev/null +++ b/src/renderer-taskbar-lyric/App.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/src/renderer-taskbar-lyric/components/TaskbarLyricActionButtons.vue b/src/renderer-taskbar-lyric/components/TaskbarLyricActionButtons.vue new file mode 100644 index 0000000000..a7927045d0 --- /dev/null +++ b/src/renderer-taskbar-lyric/components/TaskbarLyricActionButtons.vue @@ -0,0 +1,37 @@ + + + diff --git a/src/renderer-taskbar-lyric/components/TaskbarLyricLyricLine.vue b/src/renderer-taskbar-lyric/components/TaskbarLyricLyricLine.vue new file mode 100644 index 0000000000..d73de8c47a --- /dev/null +++ b/src/renderer-taskbar-lyric/components/TaskbarLyricLyricLine.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/renderer-taskbar-lyric/components/TaskbarLyricSongInfo.vue b/src/renderer-taskbar-lyric/components/TaskbarLyricSongInfo.vue new file mode 100644 index 0000000000..8f12b51f3b --- /dev/null +++ b/src/renderer-taskbar-lyric/components/TaskbarLyricSongInfo.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/renderer-taskbar-lyric/composables/useTaskbarLyricOverflowMarquee.ts b/src/renderer-taskbar-lyric/composables/useTaskbarLyricOverflowMarquee.ts new file mode 100644 index 0000000000..af705caf30 --- /dev/null +++ b/src/renderer-taskbar-lyric/composables/useTaskbarLyricOverflowMarquee.ts @@ -0,0 +1,70 @@ +import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch, type CSSProperties, type Ref, type WatchSource } from 'vue' + +interface UseTaskbarLyricOverflowMarqueeOptions { + text: Ref + minDuration: number + pixelsPerSecond: number + distanceVarName: string + durationVarName: string + watchSources?: Array> +} + +export const useTaskbarLyricOverflowMarquee = ({ + text, + minDuration, + pixelsPerSecond, + distanceVarName, + durationVarName, + watchSources = [], +}: UseTaskbarLyricOverflowMarqueeOptions) => { + const containerRef = ref(null) + const measureRef = ref(null) + const shouldScroll = ref(false) + const scrollDistance = ref(0) + let resizeObserver: ResizeObserver | null = null + + const updateScrollState = () => { + const containerWidth = containerRef.value?.clientWidth ?? 0 + const contentWidth = measureRef.value?.scrollWidth ?? 0 + const overflowWidth = Math.max(contentWidth - containerWidth, 0) + shouldScroll.value = overflowWidth > 6 + scrollDistance.value = overflowWidth + } + + const trackStyle = computed(() => { + const distance = Math.max(scrollDistance.value, 0) + const gap = 24 + const duration = Math.max(minDuration, distance / pixelsPerSecond) + return { + [distanceVarName]: `${distance + gap}px`, + [durationVarName]: `${duration.toFixed(2)}s`, + } + }) + + const queueUpdate = () => { + void nextTick(() => { + updateScrollState() + }) + } + + onMounted(() => { + resizeObserver = new ResizeObserver(updateScrollState) + if (containerRef.value) resizeObserver.observe(containerRef.value) + if (measureRef.value) resizeObserver.observe(measureRef.value) + queueUpdate() + }) + + onBeforeUnmount(() => { + resizeObserver?.disconnect() + resizeObserver = null + }) + + watch([text, ...watchSources], queueUpdate) + + return { + containerRef, + measureRef, + shouldScroll, + trackStyle, + } +} diff --git a/src/renderer-taskbar-lyric/composables/useTaskbarLyricShellStyle.ts b/src/renderer-taskbar-lyric/composables/useTaskbarLyricShellStyle.ts new file mode 100644 index 0000000000..fb65ec84b4 --- /dev/null +++ b/src/renderer-taskbar-lyric/composables/useTaskbarLyricShellStyle.ts @@ -0,0 +1,129 @@ +import { computed } from 'vue' +import { state } from '../store/state' + +interface RGB { + r: number + g: number + b: number +} + +const lyricState = state as LX.TaskbarLyric.State + +const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max) + +const parseRgb = (color: string | null | undefined): RGB | null => { + if (!color) return null + const value = color.trim() + if (!value) return null + + const hex = value.replace(/^#/, '') + if (/^[\da-f]{3}$/i.test(hex)) { + return { + r: parseInt(hex[0] + hex[0], 16), + g: parseInt(hex[1] + hex[1], 16), + b: parseInt(hex[2] + hex[2], 16), + } + } + if (/^[\da-f]{6}$/i.test(hex)) { + return { + r: parseInt(hex.slice(0, 2), 16), + g: parseInt(hex.slice(2, 4), 16), + b: parseInt(hex.slice(4, 6), 16), + } + } + + const match = value.match(/rgba?\(([\d.]+)[, ]+([\d.]+)[, ]+([\d.]+)/i) + if (!match) return null + + return { + r: clamp(Math.round(Number(match[1])), 0, 255), + g: clamp(Math.round(Number(match[2])), 0, 255), + b: clamp(Math.round(Number(match[3])), 0, 255), + } +} + +const toRgbString = (color: RGB) => `rgb(${color.r}, ${color.g}, ${color.b})` +const withAlpha = (color: RGB, alpha: number) => `rgba(${color.r}, ${color.g}, ${color.b}, ${clamp(alpha, 0, 1)})` + +const mix = (colorA: RGB, colorB: RGB, weight: number): RGB => { + const ratio = clamp(weight, 0, 1) + const remain = 1 - ratio + return { + r: Math.round(colorA.r * remain + colorB.r * ratio), + g: Math.round(colorA.g * remain + colorB.g * ratio), + b: Math.round(colorA.b * remain + colorB.b * ratio), + } +} + +const getLuminance = ({ r, g, b }: RGB) => { + const normalize = (channel: number) => { + const value = channel / 255 + return value <= 0.03928 ? value / 12.92 : ((value + 0.055) / 1.055) ** 2.4 + } + + const red = normalize(r) + const green = normalize(g) + const blue = normalize(b) + return red * 0.2126 + green * 0.7152 + blue * 0.0722 +} + +const getContrastRatio = (foreground: RGB, background: RGB) => { + const [lighter, darker] = [getLuminance(foreground), getLuminance(background)].sort((a, b) => b - a) + return (lighter + 0.05) / (darker + 0.05) +} + +const getReadableTextColor = (background: RGB) => { + const lightText = { r: 248, g: 250, b: 252 } + const darkText = { r: 15, g: 23, b: 42 } + return getContrastRatio(lightText, background) >= getContrastRatio(darkText, background) + ? lightText + : darkText +} + +export const useTaskbarLyricShellStyle = () => { + const shellStyle = computed(() => { + const backgroundOpacity = clamp((lyricState.backgroundOpacity ?? 72) / 100, 0, 1) + const themeColor = parseRgb(lyricState.themeColor) ?? { r: 77, g: 175, b: 124 } + const isLightTheme = getLuminance(themeColor) > 0.58 + const isCustomSongInfoFontMode = lyricState.songInfoFontColorMode === 'custom' + const isCustomLyricFontMode = lyricState.lyricFontColorMode === 'custom' + + const backgroundBase = lyricState.backgroundColorMode === 'custom' + ? parseRgb(lyricState.backgroundColor) ?? themeColor + : isLightTheme + ? mix(themeColor, { r: 255, g: 255, b: 255 }, 0.82) + : mix(themeColor, { r: 15, g: 23, b: 42 }, 0.72) + + const backgroundStrong = lyricState.backgroundColorMode === 'custom' + ? backgroundBase + : isLightTheme + ? mix(themeColor, { r: 255, g: 255, b: 255 }, 0.72) + : mix(themeColor, { r: 30, g: 41, b: 59 }, 0.6) + + const defaultLyricText = getReadableTextColor(backgroundBase) + const defaultSongInfoText = mix(defaultLyricText, backgroundBase, 0.34) + const lyricText = isCustomLyricFontMode + ? parseRgb(lyricState.lyricFontColor) ?? defaultLyricText + : defaultLyricText + const songInfoText = isCustomSongInfoFontMode + ? parseRgb(lyricState.songInfoFontColor) ?? defaultSongInfoText + : defaultSongInfoText + + const borderColor = mix(lyricText, backgroundBase, 0.76) + const borderOpacity = backgroundOpacity * 0.26 + + return { + '--taskbar-lyric-bg': withAlpha(backgroundBase, backgroundOpacity), + '--taskbar-lyric-bg-strong': withAlpha(backgroundStrong, backgroundOpacity), + '--taskbar-lyric-border': withAlpha(borderColor, borderOpacity), + '--taskbar-lyric-text': toRgbString(lyricText), + '--taskbar-lyric-text-secondary': toRgbString(songInfoText), + '--taskbar-lyric-song-info-font-size': `${clamp(lyricState.songInfoFontSize ?? 11, 9, 18)}px`, + '--taskbar-lyric-line-font-size': `${clamp(lyricState.lyricFontSize ?? 12, 10, 22)}px`, + } + }) + + return { + shellStyle, + } +} diff --git a/src/renderer-taskbar-lyric/composables/useTaskbarLyricWindowDrag.ts b/src/renderer-taskbar-lyric/composables/useTaskbarLyricWindowDrag.ts new file mode 100644 index 0000000000..56726431e9 --- /dev/null +++ b/src/renderer-taskbar-lyric/composables/useTaskbarLyricWindowDrag.ts @@ -0,0 +1,82 @@ +import { ref } from 'vue' +import { state } from '../store/state' +import { + requestTaskbarLyricMenu, + requestTaskbarLyricShowMainInterface, + sendTaskbarLyricDragEnd, + sendTaskbarLyricDragMove, +} from '../utils/ipc' + +export const useTaskbarLyricWindowDrag = () => { + const isDragging = ref(false) + const isHovering = ref(false) + + let startClientX = 0 + let startOffsetX = 0 + + const detachDragListeners = () => { + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', stopDragging) + window.removeEventListener('blur', stopDragging) + document.removeEventListener('visibilitychange', handleVisibilityChange) + } + + const handleMouseMove = (event: MouseEvent) => { + if (!isDragging.value) return + const offsetX = startOffsetX + (event.clientX - startClientX) + sendTaskbarLyricDragMove(offsetX) + } + + const stopDragging = () => { + if (!isDragging.value) return + isDragging.value = false + sendTaskbarLyricDragEnd() + detachDragListeners() + } + + const handleVisibilityChange = () => { + if (document.hidden) stopDragging() + } + + const handlePointerDown = (event: PointerEvent) => { + if (event.button !== 0) return + stopDragging() + event.preventDefault() + isDragging.value = true + startClientX = event.clientX + startOffsetX = state.offsetX + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', stopDragging) + window.addEventListener('blur', stopDragging) + document.addEventListener('visibilitychange', handleVisibilityChange) + } + + const handlePointerEnter = () => { + isHovering.value = true + } + + const handlePointerLeave = () => { + isHovering.value = false + } + + const handleContextMenu = () => { + stopDragging() + requestTaskbarLyricMenu() + } + + const handleDoubleClick = () => { + stopDragging() + requestTaskbarLyricShowMainInterface() + } + + return { + isDragging, + isHovering, + handlePointerDown, + handlePointerEnter, + handlePointerLeave, + handleContextMenu, + handleDoubleClick, + stopDragging, + } +} diff --git a/src/renderer-taskbar-lyric/index.html b/src/renderer-taskbar-lyric/index.html new file mode 100644 index 0000000000..0088d2fd5c --- /dev/null +++ b/src/renderer-taskbar-lyric/index.html @@ -0,0 +1,11 @@ + + + + + + Taskbar Lyric - LX Music + + +
+ + diff --git a/src/renderer-taskbar-lyric/main.ts b/src/renderer-taskbar-lyric/main.ts new file mode 100644 index 0000000000..8bf745e792 --- /dev/null +++ b/src/renderer-taskbar-lyric/main.ts @@ -0,0 +1,17 @@ +import { createApp } from 'vue' + +import App from './App.vue' +import { patchState } from './store/state' +import { onTaskbarLyricState, requestTaskbarLyricRefresh } from './utils/ipc' + +const removeTaskbarLyricStateListener = onTaskbarLyricState((taskbarLyricState) => { + patchState(taskbarLyricState) +}) + +requestTaskbarLyricRefresh() + +createApp(App).mount('#root') + +window.addEventListener('beforeunload', () => { + removeTaskbarLyricStateListener() +}) diff --git a/src/renderer-taskbar-lyric/store/state.ts b/src/renderer-taskbar-lyric/store/state.ts new file mode 100644 index 0000000000..1611b52467 --- /dev/null +++ b/src/renderer-taskbar-lyric/store/state.ts @@ -0,0 +1,55 @@ +import { shallowReactive } from '@common/utils/vueTools' + +interface TaskbarLyricViewState { + enabled: boolean + isPlaying: boolean + songId: string | null + title: string + artist: string + lyricLine: string + albumCoverUrl: string | null + offsetX: number + showCover: boolean + showSongInfo: boolean + showCurrentLine: boolean + swapTitleAndArtist: boolean + themeColor: string + backgroundColorMode: 'theme' | 'custom' + backgroundColor: string + backgroundOpacity: number + songInfoFontColorMode: 'theme' | 'custom' + songInfoFontColor: string + lyricFontColorMode: 'theme' | 'custom' + lyricFontColor: string + songInfoFontSize: number + lyricFontSize: number +} + +export const state = shallowReactive({ + enabled: false, + isPlaying: false, + songId: null, + title: 'LX Music', + artist: 'Taskbar lyric', + lyricLine: 'Renderer target ready for state wiring.', + albumCoverUrl: null, + offsetX: 0, + showCover: true, + showSongInfo: true, + showCurrentLine: true, + swapTitleAndArtist: false, + themeColor: 'rgb(77, 175, 124)', + backgroundColorMode: 'theme', + backgroundColor: 'rgba(15, 23, 42, 1)', + backgroundOpacity: 72, + songInfoFontColorMode: 'theme', + songInfoFontColor: 'rgba(226, 232, 240, 1)', + lyricFontColorMode: 'theme', + lyricFontColor: 'rgba(248, 250, 252, 1)', + songInfoFontSize: 11, + lyricFontSize: 12, +}) + +export const patchState = (payload: Partial) => { + Object.assign(state, payload) +} diff --git a/src/renderer-taskbar-lyric/tsconfig.json b/src/renderer-taskbar-lyric/tsconfig.json new file mode 100644 index 0000000000..9fdb533b8d --- /dev/null +++ b/src/renderer-taskbar-lyric/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "isolatedModules": true, + "paths": { /* Specify a set of entries that re-map imports to additional lookup locations. */ + "@common/*": ["../common/*"], + "@renderer/*": ["../renderer/*"], + "@lyric/*": ["../renderer-lyric/*"], + "@taskbar-lyric/*": ["../renderer-taskbar-lyric/*"], + "@static/*": ["../static/*"], + "@root/*": ["../*"] + }, + "typeRoots": [ /* Specify multiple folders that act like './node_modules/@types'. */ + "./types" + ] + }, + "vueCompilerOptions": { + "plugins": [ + "@vue/language-plugin-pug" + ] + } +} diff --git a/src/renderer-taskbar-lyric/types/app.d.ts b/src/renderer-taskbar-lyric/types/app.d.ts new file mode 100644 index 0000000000..8870e8ec6d --- /dev/null +++ b/src/renderer-taskbar-lyric/types/app.d.ts @@ -0,0 +1,7 @@ +declare global { + interface Window { + ELECTRON_DISABLE_SECURITY_WARNINGS?: string + } +} + +export {} diff --git a/src/renderer-taskbar-lyric/types/common.d.ts b/src/renderer-taskbar-lyric/types/common.d.ts new file mode 100644 index 0000000000..876534ccb6 --- /dev/null +++ b/src/renderer-taskbar-lyric/types/common.d.ts @@ -0,0 +1,2 @@ +import '@common/types/shims_vue' +import '@common/types/taskbar_lyric' diff --git a/src/renderer-taskbar-lyric/utils/ipc.ts b/src/renderer-taskbar-lyric/utils/ipc.ts new file mode 100644 index 0000000000..90970e1097 --- /dev/null +++ b/src/renderer-taskbar-lyric/utils/ipc.ts @@ -0,0 +1,43 @@ +import { ipcRenderer } from 'electron' +import { WIN_MAIN_RENDERER_EVENT_NAME } from '@common/ipcNames' + +export type TaskbarLyricStatePayload = LX.TaskbarLyric.State + +type TaskbarLyricStateListener = (state: TaskbarLyricStatePayload) => void +type RemoveListener = () => void + +export const onTaskbarLyricState = (listener: TaskbarLyricStateListener): RemoveListener => { + const wrappedListener = (_event: Electron.IpcRendererEvent, state: TaskbarLyricStatePayload) => { + listener(state) + } + + ipcRenderer.on(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, wrappedListener) + + return () => { + ipcRenderer.removeListener(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, wrappedListener) + } +} + +export const requestTaskbarLyricRefresh = () => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_request_refresh) +} + +export const requestTaskbarLyricMenu = () => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_menu) +} + +export const requestTaskbarLyricShowMainInterface = () => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_show_main_interface) +} + +export const sendTaskbarLyricDragMove = (offsetX: number) => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_drag_move, { offsetX }) +} + +export const sendTaskbarLyricDragEnd = () => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_drag_end) +} + +export const sendTaskbarLyricControl = (action: 'prev' | 'next' | 'play' | 'pause') => { + ipcRenderer.send(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_control, action) +} diff --git a/src/renderer/components/common/PlayQueueBtn.vue b/src/renderer/components/common/PlayQueueBtn.vue new file mode 100644 index 0000000000..45b472eae8 --- /dev/null +++ b/src/renderer/components/common/PlayQueueBtn.vue @@ -0,0 +1,464 @@ + + + + + diff --git a/src/renderer/components/layout/PlayBar/ControlBtns.vue b/src/renderer/components/layout/PlayBar/ControlBtns.vue index 4601342fd7..afc64c9f6d 100644 --- a/src/renderer/components/layout/PlayBar/ControlBtns.vue +++ b/src/renderer/components/layout/PlayBar/ControlBtns.vue @@ -14,6 +14,7 @@ + diff --git a/src/renderer/components/material/OnlineList/index.vue b/src/renderer/components/material/OnlineList/index.vue index fcdf52728d..4ffe8f3e78 100644 --- a/src/renderer/components/material/OnlineList/index.vue +++ b/src/renderer/components/material/OnlineList/index.vue @@ -102,6 +102,7 @@ import { clipboardWriteText } from '@common/utils/electron' import { assertApiSupport } from '@renderer/store/utils' import { ref } from '@common/utils/vueTools' +import { shouldCopyListTextOnContextMenu, formatListSelectionText } from '@renderer/utils/listContextMenu.mjs' import useList from './useList' import useMenu from './useMenu' import usePlay from './usePlay' @@ -218,14 +219,17 @@ export default { menuClick(action, index) } const handleListRightClick = (event) => { - if (!event.target.classList.contains('select')) return + const selectionText = window.getSelection().toString() + if (!shouldCopyListTextOnContextMenu({ + isSelectTextTarget: event.target.classList.contains('select'), + selectionText, + })) return event.stopImmediatePropagation() let classList = dom_listContent.value.classList classList.add('copying') window.requestAnimationFrame(() => { - let str = window.getSelection().toString() classList.remove('copying') - str = str.split(/\n\n/).map(s => s.replace(/\n/g, ' ')).join('\n').trim() + let str = formatListSelectionText(window.getSelection().toString()) if (!str.length) return clipboardWriteText(str) }) diff --git a/src/renderer/core/lyric.ts b/src/renderer/core/lyric.ts index fc5840fe21..f2e8cd5f8f 100644 --- a/src/renderer/core/lyric.ts +++ b/src/renderer/core/lyric.ts @@ -1,11 +1,13 @@ import Lyric from '@common/utils/lyric-font-player' import { getAnalyser, getCurrentTime as getPlayerCurrentTime } from '@renderer/plugins/player' import { lyric, setLines, setOffset, setTempOffset, setText } from '@renderer/store/player/lyric' -import { isPlay, musicInfo } from '@renderer/store/player/state' +import { isPlay, musicInfo, playMusicInfo } from '@renderer/store/player/state' import { setStatusText } from '@renderer/store/player/action' import { markRawList } from '@common/utils/vueTools' import { appSetting } from '@renderer/store/setting' -import { onNewDesktopLyricProcess } from '@renderer/utils/ipc' +import { loveList } from '@renderer/store/list/state' +import { checkListExistMusic } from '@renderer/store/list/action' +import { onNewDesktopLyricProcess, onThemeChange, sendTaskbarLyricState } from '@renderer/utils/ipc' const getCurrentTime = () => { return getPlayerCurrentTime() * 1000 @@ -43,6 +45,90 @@ export const sendDesktopLyricInfo = (info: LX.DesktopLyric.LyricActions, transfe if (transferList) desktopLyricPort.postMessage(info, transferList) else desktopLyricPort.postMessage(info) } + +let isCollected = false +let collectStatusCheckInfo: { songId: string, promise: Promise } | null = null +const DEFAULT_THEME_COLOR = 'rgb(77, 175, 124)' +let removeThemeChangeListener: null | (() => void) = null + +const getTaskbarLyricThemeColor = () => { + const color = window.getComputedStyle(document.documentElement).getPropertyValue('--color-theme').trim() + return color || DEFAULT_THEME_COLOR +} + +const sendTaskbarLyricStateSnapshot = () => { + sendTaskbarLyricState(getTaskbarLyricState()) +} + +const refreshTaskbarLyricCollectStatus = async() => { + const songId = playMusicInfo.musicInfo?.id + if (!songId) { + const changed = isCollected + isCollected = false + collectStatusCheckInfo = null + return changed + } + + if (collectStatusCheckInfo?.songId == songId) return collectStatusCheckInfo.promise + + let refreshPromise: Promise + refreshPromise = checkListExistMusic(loveList.id, songId) + .then(status => { + if (playMusicInfo.musicInfo?.id != songId) return false + if (isCollected == status) return false + isCollected = status + return true + }) + .finally(() => { + if (collectStatusCheckInfo?.songId == songId && collectStatusCheckInfo.promise === refreshPromise) collectStatusCheckInfo = null + }) + collectStatusCheckInfo = { + songId, + promise: refreshPromise, + } + return refreshPromise +} + +const syncTaskbarLyricCollectState = () => { + void refreshTaskbarLyricCollectStatus().then(changed => { + if (!changed) return + sendTaskbarLyricStateSnapshot() + }) +} + +const getTaskbarLyricState = (): LX.TaskbarLyric.State => { + return { + enabled: appSetting['taskbarLyric.enable'], + isPlaying: isPlay.value, + isCollected, + songId: musicInfo.id, + title: musicInfo.name, + artist: musicInfo.singer, + lyricLine: lyric.text, + albumCoverUrl: musicInfo.pic, + offsetX: appSetting['taskbarLyric.offsetX'], + showCover: appSetting['taskbarLyric.showCover'], + showSongInfo: appSetting['taskbarLyric.showSongInfo'], + showCurrentLine: appSetting['taskbarLyric.showCurrentLine'], + swapTitleAndArtist: appSetting['taskbarLyric.swapTitleAndArtist'], + themeColor: getTaskbarLyricThemeColor(), + backgroundColorMode: appSetting['taskbarLyric.style.backgroundColorMode'], + backgroundColor: appSetting['taskbarLyric.style.backgroundColor'], + backgroundOpacity: appSetting['taskbarLyric.style.backgroundOpacity'], + songInfoFontColorMode: appSetting['taskbarLyric.style.songInfoFontColorMode'], + songInfoFontColor: appSetting['taskbarLyric.style.songInfoFontColor'], + lyricFontColorMode: appSetting['taskbarLyric.style.lyricFontColorMode'], + lyricFontColor: appSetting['taskbarLyric.style.lyricFontColor'], + songInfoFontSize: appSetting['taskbarLyric.style.songInfoFontSize'], + lyricFontSize: appSetting['taskbarLyric.style.lyricFontSize'], + } +} + +const syncTaskbarLyricState = () => { + sendTaskbarLyricStateSnapshot() + syncTaskbarLyricCollectState() +} + const handleDesktopLyricMessage = (action: LX.DesktopLyric.WinMainActions) => { switch (action) { case 'get_info': @@ -81,32 +167,40 @@ const handleDesktopLyricMessage = (action: LX.DesktopLyric.WinMainActions) => { break } } + export const init = () => { + const handleLoveListUpdate = (ids: string[]) => { + if (!ids.includes(loveList.id)) return + syncTaskbarLyricCollectState() + } + lrc = new Lyric({ shadowContent: false, onPlay(line, text) { setText(text, Math.max(line, 0)) setStatusText(text) window.app_event.lyricLinePlay(text, line) + syncTaskbarLyricState() // console.log(line, text) }, onSetLyric(lines, offset) { // listening lyrics seting event // console.log(lines) // lines is array of all lyric text setLines(markRawList([...lines])) setText(lines[0] ?? '', 0) - setOffset(offset) // 歌词延迟 - setTempOffset(0) // 重置临时延迟 + setOffset(offset) // Apply parsed lyric offset + setTempOffset(0) // Reset temporary offset + syncTaskbarLyricState() }, onUpdateLyric(lines) { setLines(markRawList([...lines])) setText(lines[0] ?? '', 0) + syncTaskbarLyricState() }, rate: appSetting['player.playbackRate'], // offset: 80, }) onNewDesktopLyricProcess(({ event }) => { - console.log('onNewDesktopLyricProcess') const [port] = event.ports desktopLyricPort = port @@ -122,6 +216,13 @@ export const init = () => { console.log('onmessageerror', event) } }) + + removeThemeChangeListener?.() + removeThemeChangeListener = onThemeChange(() => { + sendTaskbarLyricStateSnapshot() + }) + + window.app_event.on('myListUpdate', handleLoveListUpdate) } export const setLyricOffset = (offset: number) => { @@ -186,6 +287,8 @@ export const setLyric = () => { lrc.play(time) }) } + + syncTaskbarLyricState() } export const setDisabledAutoPause = (disabledAutoPause: boolean) => { @@ -208,11 +311,13 @@ export const play = () => { const currentTime = getCurrentTime() lrc.play(currentTime) sendDesktopLyricInfo({ action: 'set_play', data: currentTime }) + syncTaskbarLyricState() } export const pause = () => { lrc.pause() sendDesktopLyricInfo({ action: 'set_pause' }) + syncTaskbarLyricState() } export const stop = () => { @@ -220,6 +325,7 @@ export const stop = () => { sendDesktopLyricInfo({ action: 'set_stop' }) // setLines([]) setText('', 0) + syncTaskbarLyricState() } export const sendInfo = () => { @@ -240,4 +346,5 @@ export const sendInfo = () => { played_time: getCurrentTime(), }, }) + syncTaskbarLyricState() } diff --git a/src/renderer/core/player/action.ts b/src/renderer/core/player/action.ts index 88995d0a99..e95d5809a3 100644 --- a/src/renderer/core/player/action.ts +++ b/src/renderer/core/player/action.ts @@ -369,6 +369,13 @@ const handlePlayNext = (playMusicInfo: LX.Player.PlayMusicInfo) => { setPlayMusicInfo(playMusicInfo.listId, playMusicInfo.musicInfo, playMusicInfo.isTempPlay) handlePlay() } + +export const playTempPlayItem = (index: number) => { + const target = tempPlayList[index] + if (!target) return + removeTempPlayList(index) + handlePlayNext(target) +} /** * 下一曲 * @param isAutoToggle 是否自动切换 diff --git a/src/renderer/core/player/queue.mjs b/src/renderer/core/player/queue.mjs new file mode 100644 index 0000000000..828286e548 --- /dev/null +++ b/src/renderer/core/player/queue.mjs @@ -0,0 +1,67 @@ +const isSamePlayItem = (queueItem, playMusicInfo) => { + if (!queueItem || !playMusicInfo?.musicInfo) return false + if (queueItem.musicInfo.id !== playMusicInfo.musicInfo.id) return false + return queueItem.isTempPlay + ? playMusicInfo.isTempPlay + : !playMusicInfo.isTempPlay && queueItem.listId === playMusicInfo.listId +} + +const createQueueItem = (queueItem, index, section) => ({ + key: `${section}_${queueItem.musicInfo.id}_${index}`, + index, + listId: queueItem.listId, + musicInfo: queueItem.musicInfo, + isTempPlay: queueItem.isTempPlay, + isActive: false, + canRemove: section === 'temp', + canDrag: section === 'temp', +}) + +export const buildPlayQueueSections = ({ + tempPlayList = [], + baseList = [], + baseListId = null, + playMusicInfo = null, +}) => { + const sections = [] + + if (tempPlayList.length) { + sections.push({ + key: 'temp', + items: tempPlayList.map((item, index) => { + const queueItem = createQueueItem(item, index, 'temp') + queueItem.isActive = isSamePlayItem(item, playMusicInfo) + return queueItem + }), + }) + } + + if (baseList.length) { + sections.push({ + key: 'base', + items: baseList.map((musicInfo, index) => { + const item = { + listId: baseListId, + musicInfo, + isTempPlay: false, + } + const queueItem = createQueueItem(item, index, 'base') + queueItem.isActive = isSamePlayItem(item, playMusicInfo) + return queueItem + }), + }) + } + + return sections +} + +export const moveTempQueueItem = (list, oldIndex, newIndex) => { + if (oldIndex === newIndex) return [...list] + if (oldIndex < 0 || oldIndex >= list.length) return [...list] + if (newIndex < 0 || newIndex >= list.length) return [...list] + + const nextList = [...list] + const [target] = nextList.splice(oldIndex, 1) + nextList.splice(newIndex, 0, target) + return nextList +} diff --git a/src/renderer/core/useApp/usePlayer/useLyric.ts b/src/renderer/core/useApp/usePlayer/useLyric.ts index 9c04d5cb7c..533209b759 100644 --- a/src/renderer/core/useApp/usePlayer/useLyric.ts +++ b/src/renderer/core/useApp/usePlayer/useLyric.ts @@ -17,12 +17,17 @@ const handleApplyPlaybackRate = debounce(setPlaybackRate, 300) export default () => { init() + sendInfo() const setPlayInfo = () => { stop() sendInfo() } + watch(() => appSetting['taskbarLyric.enable'], sendInfo) + watch(() => appSetting['taskbarLyric.showCover'], sendInfo) + watch(() => appSetting['taskbarLyric.showSongInfo'], sendInfo) + watch(() => appSetting['taskbarLyric.showCurrentLine'], sendInfo) watch(() => appSetting['player.isShowLyricTranslation'], setLyric) watch(() => appSetting['player.isShowLyricRoma'], setLyric) watch(() => appSetting['player.isSwapLyricTranslationAndRoma'], setLyric) @@ -34,6 +39,7 @@ export default () => { window.app_event.on('error', pause) window.app_event.on('musicToggled', setPlayInfo) window.app_event.on('lyricUpdated', setLyric) + window.app_event.on('picUpdated', sendInfo) window.app_event.on('setPlaybackRate', handleApplyPlaybackRate) onBeforeUnmount(() => { @@ -43,6 +49,7 @@ export default () => { window.app_event.off('error', pause) window.app_event.off('musicToggled', setPlayInfo) window.app_event.off('lyricUpdated', setLyric) + window.app_event.off('picUpdated', sendInfo) window.app_event.off('setPlaybackRate', handleApplyPlaybackRate) }) } diff --git a/src/renderer/store/player/action.ts b/src/renderer/store/player/action.ts index 87977fc1a1..536e1f1798 100644 --- a/src/renderer/store/player/action.ts +++ b/src/renderer/store/player/action.ts @@ -8,6 +8,7 @@ import { isShowPlayerDetail, isShowPlayComment, isShowLrcSelectContent, + isShowPlayQueue, playInfo, playMusicInfo, playedList, @@ -17,6 +18,7 @@ import { getListMusicsFromCache } from '@renderer/store/list/action' import { downloadList } from '@renderer/store/download/state' import { setProgress } from './playProgress' import { playNext } from '@renderer/core/player' +import { moveTempQueueItem } from '@renderer/core/player/queue.mjs' import { LIST_IDS } from '@common/constants' import { toRaw } from '@common/utils/vueTools' import { arrPush, arrUnshift } from '@common/utils/common' @@ -69,6 +71,10 @@ export const setShowPlayLrcSelectContentLrc = (val: boolean) => { isShowLrcSelectContent.value = val } +export const setShowPlayQueue = (val: boolean) => { + isShowPlayQueue.value = val +} + export const setPlayListId = (listId: string | null) => { playInfo.playerListId = listId } @@ -245,6 +251,11 @@ export const addTempPlayList = (list: LX.Player.TempPlayListItem[]) => { export const removeTempPlayList = (index: number) => { tempPlayList.splice(index, 1) } + +export const moveTempPlayList = (oldIndex: number, newIndex: number) => { + const list = moveTempQueueItem(tempPlayList, oldIndex, newIndex) + tempPlayList.splice(0, tempPlayList.length, ...list) +} /** * 清空稍后播放列表 */ diff --git a/src/renderer/store/player/state.ts b/src/renderer/store/player/state.ts index 48aea238bb..8b0b205465 100644 --- a/src/renderer/store/player/state.ts +++ b/src/renderer/store/player/state.ts @@ -40,6 +40,8 @@ export const isShowPlayComment = ref(false) export const isShowLrcSelectContent = ref(false) +export const isShowPlayQueue = ref(false) + export const playMusicInfo = shallowReactive<{ /** * 当前播放歌曲的列表 id diff --git a/src/renderer/types/common.d.ts b/src/renderer/types/common.d.ts index 7436b11142..386272bb5c 100644 --- a/src/renderer/types/common.d.ts +++ b/src/renderer/types/common.d.ts @@ -11,6 +11,7 @@ import '@common/types/shims_vue' import '@common/types/utils' import '@common/types/theme' import '@common/types/desktop_lyric' +import '@common/types/taskbar_lyric' import '@common/types/ipc_renderer' import '@common/types/config_files' import '@common/types/music_metadata' diff --git a/src/renderer/utils/compositions/useDrag.js b/src/renderer/utils/compositions/useDrag.js index 6204e2f395..3f4fb684af 100644 --- a/src/renderer/utils/compositions/useDrag.js +++ b/src/renderer/utils/compositions/useDrag.js @@ -2,7 +2,10 @@ import Sortable, { AutoScroll } from 'sortablejs/modular/sortable.core.esm' import { onMounted } from '@common/utils/vueTools' import { clearDownKeys } from '@renderer/event' -Sortable.mount(new AutoScroll()) +if (!window.__lx_sortableAutoScrollMounted) { + Sortable.mount(new AutoScroll()) + window.__lx_sortableAutoScrollMounted = true +} const noop = () => {} diff --git a/src/renderer/utils/ipc.ts b/src/renderer/utils/ipc.ts index ca4b8a7082..26d6c66908 100644 --- a/src/renderer/utils/ipc.ts +++ b/src/renderer/utils/ipc.ts @@ -176,6 +176,14 @@ export const sendPlayerStatus = (status: Partial) => { rendererSend>(WIN_MAIN_RENDERER_EVENT_NAME.player_status, status) } +export const sendTaskbarLyricState = (state: LX.TaskbarLyric.State) => { + rendererSend(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_set_state, state) +} + +export const requestTaskbarLyricRefresh = () => { + rendererSend(WIN_MAIN_RENDERER_EVENT_NAME.taskbar_lyric_request_refresh) +} + export const sendOpenAPIAction = async(action: LX.OpenAPI.Actions) => { return rendererInvoke(WIN_MAIN_RENDERER_EVENT_NAME.open_api_action, action) @@ -834,6 +842,18 @@ export const onNewDesktopLyricProcess = (listener: LX.IpcRendererEventListener): } } +/** + * Taskbar lyric process created event + * @param listener + * @returns + */ +export const onNewTaskbarLyricProcess = (listener: LX.IpcRendererEventListener): RemoveListener => { + rendererOn(WIN_MAIN_RENDERER_EVENT_NAME.process_new_taskbar_lyric_client, listener) + return () => { + rendererOff(WIN_MAIN_RENDERER_EVENT_NAME.process_new_taskbar_lyric_client, listener) + } +} + export const downloadTasksGet = async() => { return rendererInvoke(WIN_MAIN_RENDERER_EVENT_NAME.download_list_get) diff --git a/src/renderer/utils/listContextMenu.mjs b/src/renderer/utils/listContextMenu.mjs new file mode 100644 index 0000000000..e557477ef1 --- /dev/null +++ b/src/renderer/utils/listContextMenu.mjs @@ -0,0 +1,14 @@ +export const shouldCopyListTextOnContextMenu = ({ + isSelectTextTarget, + selectionText, +}) => { + return isSelectTextTarget && !!selectionText.trim() +} + +export const formatListSelectionText = (selectionText) => { + return selectionText + .split(/\n\n/) + .map(text => text.replace(/\n/g, ' ')) + .join('\n') + .trim() +} diff --git a/src/renderer/utils/musicSdk/kg/musicSearch.js b/src/renderer/utils/musicSdk/kg/musicSearch.js index 9fa60ba148..dabb7073cd 100644 --- a/src/renderer/utils/musicSdk/kg/musicSearch.js +++ b/src/renderer/utils/musicSdk/kg/musicSearch.js @@ -49,7 +49,7 @@ export default { } return { singer: decodeName(formatSingerName(rawData.Singers, 'name')), - name: decodeName(rawData.SongName), + name: decodeName(`${rawData.OriSongName}${rawData.Suffix ? ` ${rawData.Suffix}` : ''}`), albumName: decodeName(rawData.AlbumName), albumId: rawData.AlbumID, songmid: rawData.Audioid, diff --git a/src/renderer/views/Download/index.vue b/src/renderer/views/Download/index.vue index b8f1a53798..ab101b232b 100644 --- a/src/renderer/views/Download/index.vue +++ b/src/renderer/views/Download/index.vue @@ -258,6 +258,15 @@ export default { color: var(--color-button-font); } } + + .active { + background-color: var(--color-primary-light-100-alpha-900); + color: var(--color-button-font); + + &:hover { + background-color: var(--color-primary-light-100-alpha-900); + } + } } .num { height: 100%; diff --git a/src/renderer/views/List/MusicList/index.vue b/src/renderer/views/List/MusicList/index.vue index 9681972deb..cc5a6174f3 100644 --- a/src/renderer/views/List/MusicList/index.vue +++ b/src/renderer/views/List/MusicList/index.vue @@ -106,6 +106,7 @@ + + diff --git a/src/renderer/views/Setting/index.vue b/src/renderer/views/Setting/index.vue index 49780d7f69..bc78f139dd 100644 --- a/src/renderer/views/Setting/index.vue +++ b/src/renderer/views/Setting/index.vue @@ -56,6 +56,7 @@ import SettingBasic from './components/SettingBasic.vue' import SettingPlay from './components/SettingPlay.vue' import SettingPlayDetail from './components/SettingPlayDetail.vue' import SettingDesktopLyric from './components/SettingDesktopLyric.vue' +import SettingTaskbarLyric from './components/SettingTaskbarLyric.vue' import SettingSearch from './components/SettingSearch.vue' import SettingList from './components/SettingList.vue' import SettingDownload from './components/SettingDownload.vue' @@ -76,6 +77,7 @@ export default { SettingPlay, SettingPlayDetail, SettingDesktopLyric, + SettingTaskbarLyric, SettingSearch, SettingList, SettingDownload, @@ -101,6 +103,7 @@ export default { { id: 'SettingPlay', title: t('setting__play') }, { id: 'SettingPlayDetail', title: t('setting__play_detail') }, { id: 'SettingDesktopLyric', title: t('setting__desktop_lyric') }, + { id: 'SettingTaskbarLyric', title: t('setting__taskbar_lyric') }, { id: 'SettingSearch', title: t('setting__search') }, { id: 'SettingList', title: t('setting__list') }, { id: 'SettingDownload', title: t('setting__download') }, diff --git a/src/renderer/views/songList/List/components/TagList.vue b/src/renderer/views/songList/List/components/TagList.vue index 20c8f6b327..cbd5cbe17f 100644 --- a/src/renderer/views/songList/List/components/TagList.vue +++ b/src/renderer/views/songList/List/components/TagList.vue @@ -86,6 +86,7 @@ const popupStyle = reactive({ const setTagPopupWidth = () => { window.setTimeout(() => { const dom_view = document.getElementById('view') + if (!dom_view) return popupStyle.width = dom_view.clientWidth * 0.96 + 'px' popupStyle.maxHeight = dom_view.clientHeight * 0.65 + 'px' }, 50)