├── pnpm-workspace.yaml
├── .DS_Store
├── src
├── plugins
│ ├── youtube-music-background-play
│ │ ├── userscript.ts
│ │ ├── manifest.ts
│ │ ├── README.md
│ │ ├── nonStop.ts
│ │ └── event.ts
│ ├── hztsg-wifi
│ │ ├── manifest.ts
│ │ ├── README.md
│ │ └── userscript.ts
│ ├── reddit-ctrl-enter-sender
│ │ ├── manifest.ts
│ │ ├── README.md
│ │ └── userscript.ts
│ ├── tvtropes-anti-adblock-bypass
│ │ ├── manifest.ts
│ │ ├── userscript.ts
│ │ ├── README.md
│ │ └── hijackScript.ts
│ └── reddit-search-options-persist
│ │ ├── manifest.ts
│ │ ├── README.md
│ │ ├── userscript.ts
│ │ ├── observeElement.ts
│ │ └── observeElement.test.ts
├── vite-env.d.ts
└── build.ts
├── .gitignore
├── tsconfig.json
├── vitest.config.ts
├── README.md
├── .github
└── workflows
│ └── release.yml
├── package.json
├── LICENSE
└── pnpm-lock.yaml
/pnpm-workspace.yaml:
--------------------------------------------------------------------------------
1 | packages:
2 | - 'packages/*'
3 |
--------------------------------------------------------------------------------
/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rxliuli/userjs/HEAD/.DS_Store
--------------------------------------------------------------------------------
/src/plugins/youtube-music-background-play/userscript.ts:
--------------------------------------------------------------------------------
1 | import { nonStop } from './nonStop'
2 |
3 | nonStop()
4 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ////
4 | ///
5 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # idea
2 | .idea/
3 | *.iml
4 |
5 | # vscode
6 | .vscode/
7 | .history/
8 | .claude/
9 |
10 | # npm
11 | node_modules/
12 | package-lock.json
13 | .yarn/*
14 | !.yarn/patches
15 | !.yarn/releases
16 | !.yarn/plugins
17 | !.yarn/sdks
18 | !.yarn/versions
19 | .pnp.*
20 |
21 | # parcel
22 | .cache
23 | test/
24 | dist/
25 |
--------------------------------------------------------------------------------
/src/plugins/hztsg-wifi/manifest.ts:
--------------------------------------------------------------------------------
1 | import type { MonkeyUserScript } from 'vite-plugin-monkey'
2 |
3 | export function manifest(): MonkeyUserScript {
4 | return {
5 | name: 'Hangzhou Library Wifi Auto Login',
6 | namespace: 'https://rxliuli.com',
7 | description: 'Automatically log in to the Hangzhou Library Wifi.',
8 | match: ['http://3.3.3.3/ac_portal/*/pc.html?*'],
9 | author: 'rxliuli',
10 | license: 'GPL-3.0-only',
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/plugins/reddit-ctrl-enter-sender/manifest.ts:
--------------------------------------------------------------------------------
1 | import type { MonkeyUserScript } from 'vite-plugin-monkey'
2 |
3 | export function manifest(): MonkeyUserScript {
4 | return {
5 | name: 'Reddit Ctrl+Enter Sender',
6 | namespace: 'https://rxliuli.com',
7 | description: 'Use Ctrl/Cmd+Enter to quickly send replies, comments, or save edits on Reddit.',
8 | match: ['https://www.reddit.com/**'],
9 | author: 'rxliuli',
10 | license: 'GPL-3.0-only',
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/plugins/tvtropes-anti-adblock-bypass/manifest.ts:
--------------------------------------------------------------------------------
1 | import type { MonkeyUserScript } from 'vite-plugin-monkey'
2 |
3 | export function manifest(): MonkeyUserScript {
4 | return {
5 | name: 'TVTropes Anti-Adblock Bypass',
6 | namespace: 'https://rxliuli.com',
7 | description: 'Bypass anti-adblock on TVTropes.',
8 | match: ['https://tvtropes.org/**'],
9 | author: 'rxliuli',
10 | license: 'GPL-3.0-only',
11 | 'run-at': 'document-start',
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/plugins/reddit-search-options-persist/manifest.ts:
--------------------------------------------------------------------------------
1 | import type { MonkeyUserScript } from 'vite-plugin-monkey'
2 |
3 | export function manifest(): MonkeyUserScript {
4 | return {
5 | name: 'Reddit Search Options Persist',
6 | namespace: 'https://rxliuli.com',
7 | description: 'Keeps your Reddit search filters (sort, time range, type) when searching with new keywords',
8 | match: ['https://www.reddit.com/**'],
9 | author: 'rxliuli',
10 | license: 'GPL-3.0-only',
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/src/plugins/youtube-music-background-play/manifest.ts:
--------------------------------------------------------------------------------
1 | import type { MonkeyUserScript } from 'vite-plugin-monkey'
2 |
3 | export function manifest(): MonkeyUserScript {
4 | return {
5 | name: 'YouTube Music Background Play',
6 | namespace: 'https://rxliuli.com',
7 | description: 'Keep YouTube Music playing in background',
8 | match: ['https://music.youtube.com/*'],
9 | 'run-at': 'document-start',
10 | sandbox: 'DOM',
11 | grant: 'none',
12 | author: 'rxliuli',
13 | license: 'GPL-3.0-only',
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/plugins/tvtropes-anti-adblock-bypass/userscript.ts:
--------------------------------------------------------------------------------
1 | import { hijackScript } from './hijackScript'
2 |
3 | hijackScript((node) => {
4 | let text = node.textContent
5 | if (text.includes('Please allow ads on our site or subscribe')) {
6 | // Modify detection logic to never trigger
7 | text = text.replace(text.match(/if\((\w+?>=2.+?===false\))\)/)?.[1]!, 'false')
8 | text = text.replace(text.match(/else if\((\(.+?<40)\){/)?.[1]!, 'false')
9 | node.textContent = text
10 | console.log('✏️ Modified anti-adblock script')
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2022",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2022", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 |
9 | "moduleResolution": "bundler",
10 | "allowImportingTsExtensions": true,
11 | "verbatimModuleSyntax": true,
12 | "moduleDetection": "force",
13 | "noEmit": true,
14 |
15 | "strict": true,
16 | "noUnusedLocals": true,
17 | "noUnusedParameters": true,
18 | "erasableSyntaxOnly": true,
19 | "noFallthroughCasesInSwitch": true,
20 | "noUncheckedSideEffectImports": true
21 | },
22 | "include": ["src"]
23 | }
24 |
--------------------------------------------------------------------------------
/src/plugins/hztsg-wifi/README.md:
--------------------------------------------------------------------------------
1 | # Hangzhou Library Wifi Auto Login
2 |
3 | A userscript that enables automatic login to the Hangzhou Library Wifi.
4 |
5 | ## Installation
6 |
7 | 1. Install a userscript manager like [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
8 | 2. Download the userscript from
9 |
10 | ## How to Use
11 |
12 | 1. **Visit the Login Page**: Navigate to the Hangzhou Library Wifi login page
13 | 2. **Start Typing**: Enter your library account and password
14 | 3. **Use the Shortcut**: Press Ctrl+Enter (Windows/Linux) or Cmd+Enter (Mac)
15 | 4. **Auto Submit**: The script automatically finds and clicks the appropriate submit/save button
16 |
--------------------------------------------------------------------------------
/vitest.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vitest/config'
2 | import tsconfigPaths from 'vite-tsconfig-paths'
3 |
4 | export default defineConfig({
5 | test: {
6 | projects: [
7 | {
8 | plugins: [tsconfigPaths()] as any,
9 | test: {
10 | exclude: ['**/*.unit.test.ts', 'node_modules/**'],
11 | browser: {
12 | enabled: true,
13 | provider: 'playwright',
14 | // https://vitest.dev/guide/browser/playwright
15 | instances: [{ browser: 'chromium', headless: true }],
16 | },
17 | },
18 | },
19 | {
20 | plugins: [tsconfigPaths()] as any,
21 | test: {
22 | include: ['**/*.unit.test.ts'],
23 | exclude: ['*.test.ts', 'node_modules/**'],
24 | },
25 | },
26 | ],
27 | },
28 | })
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # My UserScripts
2 |
3 | - [Reddit Ctrl+Enter Sender](./src/plugins/reddit-ctrl-enter-sender/README.md): Send Reddit comments with Ctrl+Enter.
4 | - [Reddit Search Options Persist](./src/plugins/reddit-search-options-persist/README.md): Keep Reddit search filters when searching with new keywords.
5 | - [YouTube Music Background Play](./src/plugins/youtube-music-background-play/README.md): Enable background play on YouTube Music.
6 | - [TVTropes Anti-Adblock Bypass](./src/plugins/tvtropes-anti-adblock-bypass/README.md): Bypass anti-adblock detection on TVTropes.org.
7 |
8 | ## FAQ
9 |
10 | ### Why not publish on GreasyFork?
11 |
12 | In fact, they removed my userscript. Since they require all code to be unminified, while third-party dependencies (like React) are minified by default and can only be included via `@require`, but not all npm packages support the iife (browser-specific) format (usually they support esm/cjs), I gave up because I didn't want to deal with these complications.
13 |
--------------------------------------------------------------------------------
/src/plugins/tvtropes-anti-adblock-bypass/README.md:
--------------------------------------------------------------------------------
1 | # TVTropes Anti-Adblock Bypass
2 |
3 | A userscript that bypasses anti-adblock detection on TVTropes.org, allowing you to browse the site with your adblocker enabled.
4 |
5 | ## What it does
6 |
7 | This userscript intercepts and modifies scripts that detect ad blockers on TVTropes, preventing the anti-adblock warning from appearing. It also blocks ad-related scripts from loading.
8 |
9 | ## Installation
10 |
11 | 1. Install a userscript manager like [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
12 | 2. Download the userscript from
13 |
14 | ## How it works
15 |
16 | The userscript runs at document-start and:
17 |
18 | - Intercepts script loading via DOM manipulation hooks and MutationObserver
19 | - Blocks ad scripts from Google (googlesyndication, doubleclick, googletagservices) and BigCrunch
20 | - Modifies the anti-adblock detection script to prevent it from triggering
21 |
22 | ## Disclaimer
23 |
24 | This userscript is for personal use. Please consider supporting TVTropes by subscribing or allowing ads if you find their content valuable.
25 |
--------------------------------------------------------------------------------
/src/plugins/hztsg-wifi/userscript.ts:
--------------------------------------------------------------------------------
1 | async function main() {
2 | let username = await GM.getValue('username')
3 | if (!username) {
4 | const result = prompt('Please enter your library account:')
5 | if (!result) {
6 | alert('No account entered, script terminated')
7 | return
8 | }
9 | await GM.setValue('username', result)
10 | username = result
11 | }
12 | let password = await GM.getValue('password')
13 | if (!password) {
14 | const result = prompt('Please enter your library password:')
15 | if (!result) {
16 | alert('No password entered, script terminated')
17 | return
18 | }
19 | await GM.setValue('password', result)
20 | password = result
21 | }
22 |
23 | const $name = document.querySelector('#password_name') as HTMLInputElement
24 | $name.value = username
25 | const $pwd = document.querySelector('#password_pwd') as HTMLInputElement
26 | $pwd.value = password
27 | const $remeber = document.querySelector('#rememberPwd') as HTMLInputElement
28 | $remeber.checked = true
29 | const $password_disclaimer = document.querySelector('#password_disclaimer') as HTMLInputElement
30 | $password_disclaimer.checked = true
31 | const $submitBtn = document.querySelector('#password_submitBtn') as HTMLButtonElement
32 | $submitBtn.click()
33 | setTimeout(() => {
34 | window.close()
35 | }, 1000)
36 | }
37 |
38 | main()
39 |
--------------------------------------------------------------------------------
/src/plugins/reddit-ctrl-enter-sender/README.md:
--------------------------------------------------------------------------------
1 | # Reddit Ctrl+Enter Sender
2 |
3 | A userscript that enables quick submission of replies, comments, or edits on Reddit using the Ctrl+Enter (Windows/Linux) or Cmd+Enter (Mac) keyboard shortcut.
4 |
5 | ## Features
6 |
7 | - **Universal Shortcuts**: Supports Ctrl+Enter (Windows/Linux) and Cmd+Enter (Mac)
8 | - **Smart Button Detection**: Automatically identifies submit/save buttons on the current page
9 | - **Multi-level Search**: Prioritizes buttons within the current editing area, falls back to global page buttons
10 | - **Multiple Scenarios**: Works with comment replies, edit submissions, post creation, and more
11 | - **Lightweight**: No permissions required, works entirely in the browser
12 |
13 | ## Installation
14 |
15 | 1. Install a userscript manager like [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
16 | 2. Download the userscript from
17 |
18 | ## How to Use
19 |
20 | 1. **Visit Reddit**: Navigate to any Reddit page (the script works on `https://www.reddit.com/**`)
21 | 2. **Start Typing**: Enter your content in a comment box, reply field, or edit area
22 | 3. **Use the Shortcut**: Press Ctrl+Enter (Windows/Linux) or Cmd+Enter (Mac)
23 | 4. **Auto Submit**: The script automatically finds and clicks the appropriate submit/save button
24 |
--------------------------------------------------------------------------------
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | name: Release
2 |
3 | on:
4 | push:
5 | branches: [master]
6 | paths:
7 | - 'package.json'
8 |
9 | jobs:
10 | version:
11 | runs-on: ubuntu-latest
12 | outputs:
13 | changed: ${{ steps.version.outputs.changed }}
14 | version: ${{ steps.version.outputs.version }}
15 | steps:
16 | - uses: actions/checkout@v4
17 | with:
18 | fetch-depth: 2
19 | - name: Check version change
20 | id: version
21 | uses: rxliuli/version-check@v1
22 | with:
23 | file: package.json
24 |
25 | release:
26 | runs-on: ubuntu-latest
27 | permissions:
28 | contents: write
29 | needs: version
30 | if: needs.version.outputs.changed == 'true'
31 | steps:
32 | - uses: actions/checkout@v4
33 | - uses: pnpm/action-setup@v3
34 | with:
35 | version: 'latest'
36 | - uses: actions/setup-node@v4
37 | with:
38 | node-version: 24
39 | cache: 'pnpm'
40 | - name: Install dependencies
41 | run: pnpm install
42 | - name: Build packages
43 | run: pnpm build
44 | - name: Create Release
45 | uses: softprops/action-gh-release@v2
46 | with:
47 | tag_name: 'v${{ needs.version.outputs.version }}'
48 | name: 'v${{ needs.version.outputs.version }}'
49 | draft: false
50 | prerelease: false
51 | files: dist/*.user.js
52 |
--------------------------------------------------------------------------------
/src/plugins/youtube-music-background-play/README.md:
--------------------------------------------------------------------------------
1 | # YouTube Music Background Play
2 |
3 | A userscript that prevents YouTube Music from pausing playback when running in background tabs.
4 |
5 | ## What it does
6 |
7 | This userscript intercepts browser APIs that YouTube uses to detect if you're actively watching, allowing music to continue playing when you switch to other tabs.
8 |
9 | ## Installation
10 |
11 | 1. Install a userscript manager like [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
12 | 2. Download the userscript from
13 |
14 | ## Limitations
15 |
16 | - **Unstable**: YouTube may update their detection methods at any time, causing this userscript to stop working
17 | - **Computer sleep**: Playback will still pause when your computer goes to sleep or hibernates
18 | - **iOS Safari**: This userscript does not work on iOS Safari due to platform-specific restrictions
19 | - **Updates**: May break when YouTube updates their site
20 |
21 | ## How it works
22 |
23 | The userscript overrides the following browser APIs:
24 |
25 | - `document.hidden` - always returns `false`
26 | - `document.visibilityState` - always returns `'visible'`
27 | - `document.hasFocus()` - always returns `true`
28 | - Blocks visibility change and focus events
29 |
30 | ## Disclaimer
31 |
32 | This userscript is for personal use. Use at your own risk.
33 |
--------------------------------------------------------------------------------
/src/plugins/reddit-search-options-persist/README.md:
--------------------------------------------------------------------------------
1 | # Reddit Search Options Persist
2 |
3 | A userscript that keeps your Reddit search filters (sort, time range, type) when searching with new keywords.
4 |
5 | ## What it does
6 |
7 | Reddit resets all search options every time you enter a new search term. This userscript intercepts the search input and preserves your filter preferences (sort order, time range, search type) when you perform a new search.
8 |
9 | ## Features
10 |
11 | - **Preserves Sort Order**: Keeps your sort preference (relevance, hot, top, new, comments)
12 | - **Preserves Time Range**: Maintains time filter (hour, day, week, month, year, all time)
13 | - **Preserves Search Type**: Retains type filter (posts, comments, communities, people)
14 | - **Subreddit & Site-wide**: Works in both subreddit-specific and global Reddit search
15 | - **Lightweight**: Minimal overhead, works entirely in the browser
16 |
17 | ## Installation
18 |
19 | 1. Install a userscript manager like [Tampermonkey](https://www.tampermonkey.net/) or [Greasemonkey](https://www.greasespot.net/)
20 | 2. Download the userscript from
21 |
22 | ## How to Use
23 |
24 | 1. **Visit Reddit**: Navigate to any Reddit page
25 | 2. **Perform a Search**: Use the search bar with your preferred filters (sort, time, type)
26 | 3. **Search Again**: Enter a new search term and press Enter
27 | 4. **Filters Preserved**: Your previous filter settings are automatically applied to the new search
28 |
--------------------------------------------------------------------------------
/src/build.ts:
--------------------------------------------------------------------------------
1 | import { glob, fs, chalk } from 'zx'
2 | import { build } from 'vite'
3 | import monkey from 'vite-plugin-monkey'
4 | import { version } from '../package.json'
5 | import { bundleRequire } from 'bundle-require'
6 | import path from 'path'
7 | import chokidar from 'chokidar'
8 |
9 | const isWatchMode = process.argv.includes('--watch') || process.argv.includes('-w')
10 |
11 | async function buildScripts() {
12 | const plugins = await glob('./src/plugins/*', {
13 | onlyDirectories: true,
14 | cwd: process.cwd(),
15 | })
16 | await fs.rm(path.resolve('./dist'), { recursive: true, force: true })
17 | for (const plugin of plugins) {
18 | const name = path.basename(plugin)
19 | console.log(`Building plugin: ${name}`)
20 | const manifest = (
21 | await bundleRequire({
22 | filepath: path.resolve(plugin, 'manifest.ts'),
23 | })
24 | ).mod.manifest()
25 | await build({
26 | plugins: [
27 | monkey({
28 | entry: path.resolve(plugin, 'userscript.ts'),
29 | build: {
30 | fileName: `${name}.user.js`,
31 | },
32 | userscript: {
33 | ...manifest,
34 | version,
35 | },
36 | }) as any,
37 | ],
38 | build: {
39 | emptyOutDir: false,
40 | },
41 | logLevel: 'error',
42 | })
43 | }
44 | }
45 |
46 | buildScripts()
47 | if (isWatchMode) {
48 | console.log(chalk.blue('Watching for file changes...'))
49 | chokidar.watch(path.resolve('./src')).on('change', async () => {
50 | console.log(chalk.blue('File change detected. Rebuilding...'))
51 | await buildScripts()
52 | })
53 | }
54 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "userscripts",
3 | "description": "A collection of user scripts for various purposes.",
4 | "version": "0.0.13",
5 | "type": "module",
6 | "private": true,
7 | "author": "https://rxliuli.com/",
8 | "license": "GPL-3.0-only",
9 | "scripts": {
10 | "build": "tsx src/build.ts",
11 | "test": "vitest run",
12 | "postinstall": "simple-git-hooks"
13 | },
14 | "workspaces": [
15 | "packages/*"
16 | ],
17 | "prettier": "@liuli-util/prettier-standard-config",
18 | "devDependencies": {
19 | "@liuli-util/prettier-standard-config": "^0.3.0",
20 | "@types/node": "^22.15.30",
21 | "@types/query-selector-shadow-dom": "^1.0.4",
22 | "@types/tampermonkey": "^5.0.4",
23 | "@vitest/browser": "^3.2.2",
24 | "bundle-require": "^5.1.0",
25 | "chokidar": "^5.0.0",
26 | "lint-staged": "^16.2.1",
27 | "playwright": "^1.52.0",
28 | "prettier": "^3.6.2",
29 | "simple-git-hooks": "^2.13.1",
30 | "tsx": "^4.21.0",
31 | "typescript": "^5.8.3",
32 | "vite": "^6.3.5",
33 | "vite-node": "^3.2.4",
34 | "vite-plugin-monkey": "^7.1.4",
35 | "vite-tsconfig-paths": "^5.1.4",
36 | "vitest": "^3.2.4",
37 | "vitest-browser-react": "^0.2.0",
38 | "zx": "^8.5.5"
39 | },
40 | "dependencies": {
41 | "@medv/finder": "^4.0.2",
42 | "@rxliuli/vista": "^0.4.5",
43 | "es-toolkit": "^1.41.0",
44 | "query-selector-shadow-dom": "^1.0.1"
45 | },
46 | "simple-git-hooks": {
47 | "pre-commit": "npx lint-staged"
48 | },
49 | "lint-staged": {
50 | "*.{ts,tsx,js,jsx,css,vue}": [
51 | "prettier --write"
52 | ]
53 | },
54 | "packageManager": "pnpm@10.15.1+sha512.34e538c329b5553014ca8e8f4535997f96180a1d0f614339357449935350d924e22f8614682191264ec33d1462ac21561aff97f6bb18065351c162c7e8f6de67"
55 | }
56 |
--------------------------------------------------------------------------------
/src/plugins/reddit-search-options-persist/userscript.ts:
--------------------------------------------------------------------------------
1 | import { debounce } from 'es-toolkit'
2 | import { querySelectorDeep } from 'query-selector-shadow-dom'
3 | import { observeElement } from './observeElement'
4 |
5 | observeElement({
6 | selector: '.input-container > input[name="q"]',
7 | onElement: debounce((element) => {
8 | const searchInput = element as HTMLInputElement
9 | console.debug('interceptSearch', searchInput)
10 |
11 | searchInput.addEventListener(
12 | 'keydown',
13 | (ev) => {
14 | // console.debug('keydown', ev.key)
15 | if (ev.key === 'Enter') {
16 | ev.preventDefault()
17 | ev.stopPropagation()
18 |
19 | const query = searchInput.value.trim()
20 | if (!query) {
21 | return
22 | }
23 |
24 | performSearch(query)
25 | }
26 | },
27 | true,
28 | )
29 | }, 100),
30 | supportShadowDOM: true,
31 | root: document.body,
32 | })
33 |
34 | function performSearch(query: string) {
35 | let baseURL = '/search'
36 | if (querySelectorDeep('faceplate-search-input #search-input-chip')) {
37 | const subredditMatch = location.pathname.match(/^\/r\/([^\/]+)/)
38 | if (subredditMatch) {
39 | baseURL = `/r/${subredditMatch[1]}/search`
40 | }
41 | const userMatch = location.pathname.match(/^\/user\/([^\/]+)/)
42 | if (userMatch) {
43 | baseURL = `/user/${userMatch[1]}/search`
44 | }
45 | }
46 | const params = new URLSearchParams(location.search)
47 | const paramsToKeep = ['sort', 't', 'type']
48 | const keysToDelete = Array.from(params.keys()).filter((key) => !paramsToKeep.includes(key))
49 | keysToDelete.forEach((key) => params.delete(key))
50 | params.set('q', query)
51 | location.href = `${baseURL}?${params.toString()}`
52 | }
53 |
--------------------------------------------------------------------------------
/src/plugins/tvtropes-anti-adblock-bypass/hijackScript.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * hijackScript - Intercept script loading
3 | * @param callback Callback function that receives the script node and can modify or block script execution
4 | */
5 | export function hijackScript(callback: (node: HTMLScriptElement) => void) {
6 | const dynamicScripts = new WeakSet()
7 |
8 | const originalCreateElement = document.createElement.bind(document)
9 | document.createElement = ((tagName: string, options?: any) => {
10 | const element = originalCreateElement(tagName, options)
11 | if (tagName.toLowerCase() === 'script') {
12 | dynamicScripts.add(element as HTMLScriptElement)
13 | }
14 | return element
15 | }) as typeof document.createElement
16 |
17 | const originalAppendChild = Node.prototype.appendChild
18 | Node.prototype.appendChild = function (node: T): T {
19 | if (node instanceof HTMLScriptElement && dynamicScripts.has(node)) {
20 | callback(node)
21 | }
22 | return originalAppendChild.call(this, node) as T
23 | }
24 |
25 | const originalInsertBefore = Node.prototype.insertBefore
26 | Node.prototype.insertBefore = function (node: T, child: Node | null): T {
27 | if (node instanceof HTMLScriptElement && dynamicScripts.has(node)) {
28 | callback(node)
29 | }
30 | return originalInsertBefore.call(this, node, child) as T
31 | }
32 |
33 | const observer = new MutationObserver((mutations) => {
34 | mutations.forEach((mutation) => {
35 | mutation.addedNodes.forEach((node) => {
36 | if (node instanceof HTMLScriptElement && !dynamicScripts.has(node)) {
37 | callback(node)
38 | }
39 | })
40 | })
41 | })
42 |
43 | observer.observe(document.documentElement, {
44 | childList: true,
45 | subtree: true,
46 | })
47 |
48 | return () => {
49 | document.createElement = originalCreateElement
50 | Node.prototype.appendChild = originalAppendChild
51 | Node.prototype.insertBefore = originalInsertBefore
52 | observer.disconnect()
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/src/plugins/youtube-music-background-play/nonStop.ts:
--------------------------------------------------------------------------------
1 | import { Vista } from '@rxliuli/vista'
2 | import { finder } from '@medv/finder'
3 | import { interceptEvent } from './event'
4 |
5 | export function nonStop() {
6 | Object.defineProperty(document, 'hidden', {
7 | get: () => false,
8 | configurable: true,
9 | })
10 | Object.defineProperty(document, 'visibilityState', {
11 | get: () => 'visible',
12 | configurable: true,
13 | })
14 | document.hasFocus = () => true
15 | const observer = new MutationObserver((mutations) => {
16 | mutations.forEach((mutation) => {
17 | mutation.addedNodes.forEach((node) => {
18 | if (
19 | node.nodeName === 'YTMUSIC-YOU-THERE-RENDERER' ||
20 | (node instanceof HTMLElement && node.querySelector('ytmusic-you-there-renderer'))
21 | ) {
22 | console.log('Auto-closing "Are you there?" dialog')
23 |
24 | setTimeout(() => {
25 | const yesButton = document.querySelector(
26 | 'ytmusic-you-there-renderer:not([aria-hidden="true"]) button[aria-label="Yes"]',
27 | )
28 | if (yesButton instanceof HTMLButtonElement) {
29 | yesButton.click()
30 | console.log('Clicked "Yes" button')
31 | }
32 | }, 100)
33 | }
34 | })
35 | })
36 | })
37 | observer.observe(document.body, {
38 | attributes: true,
39 | })
40 | new Vista([interceptEvent])
41 | .use(async (c, next) => {
42 | if (
43 | c.event.target instanceof HTMLVideoElement ||
44 | c.event.target instanceof HTMLAudioElement ||
45 | c.event.target instanceof HTMLImageElement ||
46 | c.event.target instanceof XMLHttpRequest ||
47 | c.event.target instanceof IDBRequest ||
48 | c.event.target instanceof IDBTransaction ||
49 | c.event.target instanceof SourceBuffer
50 | ) {
51 | return await next()
52 | }
53 | if (c.event.target === window || c.event.target === document) {
54 | if (
55 | ['focus', 'focusin', 'pageshow', 'visibilitychange', 'mouseenter', 'mouseover', 'mousemove'].includes(
56 | c.event.type,
57 | )
58 | ) {
59 | console.log('Blocked event listener:', c.event.target, c.event.type)
60 | return
61 | }
62 | }
63 |
64 | console.log('Event:', c.event.type, c.event.target instanceof Element ? finder(c.event.target) : null)
65 | await next()
66 | })
67 | .intercept()
68 | }
69 |
--------------------------------------------------------------------------------
/src/plugins/reddit-search-options-persist/observeElement.ts:
--------------------------------------------------------------------------------
1 | import { querySelectorDeep } from 'query-selector-shadow-dom'
2 |
3 | export interface ObserveElementOptions {
4 | selector: string
5 | onElement: (element: Element) => void
6 | supportShadowDOM?: boolean
7 | root?: Element
8 | }
9 |
10 | export function observeElement(options: ObserveElementOptions): () => void {
11 | const { selector, onElement, supportShadowDOM, root = document.body } = options
12 |
13 | const processedElements = new WeakSet()
14 | const observers: MutationObserver[] = []
15 | const observedShadowRoots = new WeakSet()
16 |
17 | const findElement = (): Element | null => {
18 | const querySelector: (selector: string) => Element | null = supportShadowDOM
19 | ? querySelectorDeep
20 | : document.querySelector.bind(document)
21 | const el = querySelector(selector)
22 | if (el) {
23 | return el
24 | }
25 | return null
26 | }
27 |
28 | const observeShadowRoot = (shadowRoot: ShadowRoot) => {
29 | if (observedShadowRoots.has(shadowRoot)) {
30 | return
31 | }
32 | observedShadowRoots.add(shadowRoot)
33 |
34 | const shadowObserver = new MutationObserver(checkElement)
35 | shadowObserver.observe(shadowRoot, {
36 | childList: true,
37 | subtree: true,
38 | })
39 | observers.push(shadowObserver)
40 | }
41 |
42 | const findAndObserveShadowRoots = (node: Node) => {
43 | if (node instanceof Element && node.shadowRoot) {
44 | observeShadowRoot(node.shadowRoot)
45 | }
46 | // node.childNodes.forEach((child) => findAndObserveShadowRoots(child))
47 | }
48 |
49 | const checkElement = () => {
50 | const element = findElement()
51 |
52 | if (!element) {
53 | return
54 | }
55 |
56 | if (processedElements.has(element)) {
57 | return
58 | }
59 |
60 | processedElements.add(element)
61 | onElement(element)
62 | }
63 |
64 | checkElement()
65 |
66 | if (supportShadowDOM) {
67 | findAndObserveShadowRoots(root)
68 | }
69 |
70 | const observer = new MutationObserver((mutations) => {
71 | checkElement()
72 |
73 | if (supportShadowDOM) {
74 | mutations.forEach((mutation) => {
75 | mutation.addedNodes.forEach((node) => {
76 | findAndObserveShadowRoots(node)
77 | })
78 | })
79 | }
80 | })
81 |
82 | observer.observe(root, {
83 | childList: true,
84 | subtree: true,
85 | })
86 | observers.push(observer)
87 |
88 | const cleanup = () => {
89 | observers.forEach((obs) => obs.disconnect())
90 | }
91 |
92 | return cleanup
93 | }
94 |
--------------------------------------------------------------------------------
/src/plugins/youtube-music-background-play/event.ts:
--------------------------------------------------------------------------------
1 | import type { BaseContext, BaseMiddleware, Interceptor } from '@rxliuli/vista'
2 |
3 | async function handleRequest(context: T, middlewares: BaseMiddleware[]) {
4 | const compose = (i: number): Promise => {
5 | if (i >= middlewares.length) {
6 | return Promise.resolve()
7 | }
8 | return middlewares[i](context, () => compose(i + 1)) as Promise
9 | }
10 | await compose(0)
11 | }
12 |
13 | export interface EventContext {
14 | type: 'event'
15 | event: Event
16 | }
17 | export type EventMiddleware = BaseMiddleware
18 |
19 | export interface InterceptEventOptions {
20 | wrappedListeners?: {
21 | original: EventListenerOrEventListenerObject
22 | wrapped: EventListener // to wrapped
23 | type: string
24 | dom: EventTarget // to element
25 | options?: boolean | AddEventListenerOptions
26 | }[]
27 | }
28 |
29 | export const interceptEvent: Interceptor = (middlewares, options) => {
30 | const originalAddEventListener = EventTarget.prototype.addEventListener
31 | const originalRemoveEventListener = EventTarget.prototype.removeEventListener
32 | const wrappedListeners = options?.wrappedListeners ?? []
33 | EventTarget.prototype.addEventListener = function (type, listener, options) {
34 | if (!listener) {
35 | console.warn('Event listener is null or undefined')
36 | return
37 | }
38 | const wrappedListener = function (this: EventTarget, event: Event) {
39 | if (typeof options === 'object' && 'once' in options && options.once) {
40 | this.removeEventListener(type, listener)
41 | }
42 | return handleRequest({ type: 'event' as const, event }, [
43 | ...middlewares,
44 | (c) => (typeof listener === 'function' ? listener?.(c.event) : listener?.handleEvent(c.event)),
45 | ])
46 | }
47 | wrappedListeners.push({
48 | original: listener,
49 | dom: this,
50 | wrapped: wrappedListener,
51 | type,
52 | options,
53 | })
54 | return originalAddEventListener.call(this, type, wrappedListener, options)
55 | }
56 | EventTarget.prototype.removeEventListener = function (type, listener, options) {
57 | if (!listener) {
58 | console.warn('Event listener is null or undefined')
59 | return
60 | }
61 | const listeners = wrappedListeners.filter((it) => it.dom === this && it.type === type && it.original === listener)
62 | if (listeners.length === 0) {
63 | console.warn('Event listener is not wrapped, cannot remove listener')
64 | return
65 | }
66 | listeners.forEach((it) => {
67 | originalRemoveEventListener.call(this, type, it.wrapped, options)
68 | wrappedListeners.splice(wrappedListeners.indexOf(it), 1)
69 | })
70 | }
71 | return () => {
72 | wrappedListeners.forEach((it) => {
73 | originalRemoveEventListener.call(it.dom, it.type, it.wrapped, it.options)
74 | originalAddEventListener.call(it.dom, it.type, it.original, it.options)
75 | })
76 | wrappedListeners.length = 0
77 | EventTarget.prototype.addEventListener = originalAddEventListener
78 | EventTarget.prototype.removeEventListener = originalRemoveEventListener
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/src/plugins/reddit-search-options-persist/observeElement.test.ts:
--------------------------------------------------------------------------------
1 | import { expect, it, vi } from 'vitest'
2 | import { observeElement } from './observeElement'
3 | import { userEvent } from '@vitest/browser/context'
4 | import { debounce } from 'es-toolkit'
5 |
6 | const sleep = (ms: number = 0) => new Promise((resolve) => setTimeout(resolve, ms))
7 | it('listen single selector changes', async () => {
8 | const onChange = vi.fn()
9 | const cleanup = observeElement({
10 | selector: 'input',
11 | onElement: (element) => {
12 | ;(element as HTMLInputElement).addEventListener('input', onChange)
13 | },
14 | })
15 |
16 | const input = document.createElement('input')
17 | document.body.append(input)
18 | const trigger = () => userEvent.type(document.querySelector('input')!, 'a')
19 | await trigger()
20 | expect(onChange).toHaveBeenCalledTimes(1)
21 | document.querySelector('input')!.replaceWith(input.cloneNode())
22 | await trigger()
23 | expect(onChange).toHaveBeenCalledTimes(2)
24 | cleanup()
25 | })
26 | it('stop observing when onElement', async () => {
27 | const onElement = vi.fn()
28 | const cleanup = observeElement({
29 | selector: 'div',
30 | onElement,
31 | })
32 | onElement.mockImplementation(cleanup)
33 | const div = document.createElement('div')
34 | document.body.append(div)
35 | await Promise.resolve()
36 | expect(onElement).toHaveBeenCalledTimes(1)
37 | div.replaceWith(div.cloneNode())
38 | expect(onElement).toHaveBeenCalledTimes(1)
39 | })
40 | it('observe within a custom root element', async () => {
41 | const root = document.createElement('div')
42 | document.body.append(root)
43 | const onElement = vi.fn()
44 | const cleanup = observeElement({
45 | selector: 'span',
46 | root,
47 | onElement,
48 | })
49 | const span = document.createElement('span')
50 | root.append(span)
51 | await sleep()
52 | expect(onElement).toHaveBeenCalledTimes(1)
53 | span.replaceWith(span.cloneNode())
54 | await sleep()
55 | expect(onElement).toHaveBeenCalledTimes(2)
56 | document.body.append(span.cloneNode())
57 | await sleep()
58 | expect(onElement).toHaveBeenCalledTimes(2)
59 | cleanup()
60 | })
61 | it('cleanup works correctly', async () => {
62 | const onElement = vi.fn()
63 | const cleanup = observeElement({
64 | selector: 'span',
65 | onElement,
66 | })
67 | const span = document.createElement('span')
68 | document.body.append(span)
69 | await sleep()
70 | expect(onElement).toHaveBeenCalledTimes(1)
71 | cleanup()
72 | await sleep()
73 | expect(onElement).toHaveBeenCalledTimes(1)
74 | })
75 | it('works with Shadow DOM', async () => {
76 | const onElement = vi.fn()
77 | const cleanup = observeElement({
78 | selector: 'button',
79 | onElement,
80 | supportShadowDOM: true,
81 | })
82 | const host = document.createElement('div')
83 | const shadow = host.attachShadow({ mode: 'open' })
84 | const button = document.createElement('button')
85 | document.body.append(host)
86 | shadow.append(button)
87 | await sleep()
88 | expect(onElement).toHaveBeenCalledTimes(1)
89 | const cloned = button.cloneNode()
90 | shadow.replaceChild(cloned, button)
91 | await sleep()
92 | console.log(shadow.innerHTML)
93 | expect(onElement).toHaveBeenCalledTimes(2)
94 | expect(onElement).toHaveBeenCalledWith(button)
95 | expect(onElement).toHaveBeenCalledWith(cloned)
96 | cleanup()
97 | })
98 | it('debounce works correctly', async () => {
99 | const onElement = vi.fn(debounce(() => {}, 100))
100 | const cleanup = observeElement({
101 | selector: 'input',
102 | onElement,
103 | })
104 | const input = document.createElement('input')
105 | document.body.append(input)
106 | const trigger = () => userEvent.type(document.querySelector('input')!, 'a')
107 | await trigger()
108 | await trigger()
109 | await trigger()
110 | await sleep(200)
111 | expect(onElement).toHaveBeenCalledTimes(1)
112 | cleanup()
113 | })
114 |
--------------------------------------------------------------------------------
/src/plugins/reddit-ctrl-enter-sender/userscript.ts:
--------------------------------------------------------------------------------
1 | async function main() {
2 | console.log('Reddit Ctrl+Enter Sender: Content script loaded')
3 |
4 | document.addEventListener('keydown', handleKeyDown, true)
5 |
6 | function handleKeyDown(event: KeyboardEvent) {
7 | if ((event.ctrlKey || event.metaKey) && event.key === 'Enter') {
8 | console.log('Reddit Ctrl+Enter Sender: Ctrl/Cmd+Enter detected')
9 |
10 | event.preventDefault()
11 | event.stopPropagation()
12 |
13 | findAndClickButton()
14 | }
15 | }
16 |
17 | function findAndClickButton() {
18 | const activeElement = document.activeElement
19 | if (!activeElement) {
20 | console.log('Reddit Ctrl+Enter Sender: No active element found')
21 | return
22 | }
23 |
24 | console.log('Reddit Ctrl+Enter Sender: Active element:', activeElement)
25 | console.log('Reddit Ctrl+Enter Sender: Active element tag:', activeElement.tagName)
26 | console.log('Reddit Ctrl+Enter Sender: Active element class:', activeElement.className)
27 |
28 | // First try to find edit save button (highest priority)
29 | let submitButton = findEditSaveButton(activeElement)
30 |
31 | // If no edit save button found, try to find reply submit button
32 | if (!submitButton) {
33 | submitButton = findReplySubmitButton(activeElement)
34 | }
35 |
36 | // Finally try to search in the page (as a fallback)
37 | if (!submitButton) {
38 | console.log('Reddit Ctrl+Enter Sender: Trying to find submit button in page')
39 | submitButton = findSubmitButtonInPage()
40 | }
41 |
42 | if (submitButton) {
43 | console.log('Reddit Ctrl+Enter Sender: Found submit button:', submitButton)
44 | console.log('Reddit Ctrl+Enter Sender: Button text:', submitButton.textContent?.trim())
45 | console.log('Reddit Ctrl+Enter Sender: Button type:', submitButton.type)
46 | console.log('Reddit Ctrl+Enter Sender: Button aria-label:', submitButton.getAttribute('aria-label'))
47 | console.log('Reddit Ctrl+Enter Sender: Clicking button...')
48 |
49 | try {
50 | submitButton.click()
51 | console.log('Reddit Ctrl+Enter Sender: Button clicked successfully')
52 | } catch (error) {
53 | console.error('Reddit Ctrl+Enter Sender: Error clicking button:', error)
54 | }
55 | } else {
56 | console.log('Reddit Ctrl+Enter Sender: No submit button found')
57 | }
58 | }
59 |
60 | function findEditSaveButton(activeElement: Element): HTMLButtonElement | null {
61 | // Find edit save button - usually contains "save edits", "save" etc.
62 | let composer = activeElement.closest('shreddit-composer')
63 | if (!composer) {
64 | console.log('Reddit Ctrl+Enter Sender: No shreddit-composer found in parent elements')
65 | return null
66 | }
67 |
68 | console.log('Reddit Ctrl+Enter Sender: Looking for edit save button in composer')
69 |
70 | // Prioritize finding explicit edit save buttons
71 | const allButtons = composer.querySelectorAll('button')
72 | for (const button of allButtons) {
73 | const buttonText = button.textContent?.toLowerCase().trim() || ''
74 | const ariaLabel = button.getAttribute('aria-label')?.toLowerCase() || ''
75 |
76 | // Check if it's an edit save button
77 | if (isEditSaveButton(button as HTMLButtonElement, buttonText, ariaLabel)) {
78 | console.log('Reddit Ctrl+Enter Sender: Found edit save button:', buttonText)
79 | return button as HTMLButtonElement
80 | }
81 | }
82 |
83 | return null
84 | }
85 |
86 | function findReplySubmitButton(activeElement: Element): HTMLButtonElement | null {
87 | // Find reply submit button - usually used to submit new comments or replies
88 | let composer = activeElement.closest('shreddit-composer')
89 | if (!composer) {
90 | return null
91 | }
92 |
93 | console.log('Reddit Ctrl+Enter Sender: Looking for reply submit button in composer')
94 |
95 | const allButtons = composer.querySelectorAll('button')
96 | for (const button of allButtons) {
97 | const buttonText = button.textContent?.toLowerCase().trim() || ''
98 | const ariaLabel = button.getAttribute('aria-label')?.toLowerCase() || ''
99 |
100 | // Check if it's a reply submit button
101 | if (isReplySubmitButton(button as HTMLButtonElement, buttonText, ariaLabel)) {
102 | console.log('Reddit Ctrl+Enter Sender: Found reply submit button:', buttonText)
103 | return button as HTMLButtonElement
104 | }
105 | }
106 |
107 | return null
108 | }
109 |
110 | function isEditSaveButton(button: HTMLButtonElement, buttonText: string, ariaLabel: string): boolean {
111 | // Characteristics of edit save button
112 | const editSavePatterns = ['save edits', 'save edit', 'save changes', 'update comment']
113 |
114 | // Check button text
115 | if (editSavePatterns.some((pattern) => buttonText.includes(pattern))) {
116 | return true
117 | }
118 |
119 | // Check aria-label
120 | if (editSavePatterns.some((pattern) => ariaLabel.includes(pattern))) {
121 | return true
122 | }
123 |
124 | // Check if button is in edit context (by parent element or other attributes)
125 | const isInEditContext = button.closest('[data-testid*="edit"], [class*="edit"], [id*="edit"]')
126 | if (isInEditContext && buttonText.includes('save')) {
127 | return true
128 | }
129 |
130 | return false
131 | }
132 |
133 | function isReplySubmitButton(button: HTMLButtonElement, buttonText: string, ariaLabel: string): boolean {
134 | // Characteristics of reply submit button
135 | const replySubmitPatterns = ['reply', 'comment', 'post', 'submit', 'send']
136 |
137 | // Check button text
138 | if (replySubmitPatterns.some((pattern) => buttonText.includes(pattern))) {
139 | return true
140 | }
141 |
142 | // Check aria-label
143 | if (replySubmitPatterns.some((pattern) => ariaLabel.includes(pattern))) {
144 | return true
145 | }
146 |
147 | // Check if it's a standard submit button
148 | if (button.type === 'submit' && button.getAttribute('slot') === 'submit-button') {
149 | return true
150 | }
151 |
152 | return false
153 | }
154 |
155 | function findSubmitButtonInPage(): HTMLButtonElement | null {
156 | const possibleSelectors = [
157 | 'button[slot="submit-button"]',
158 | 'button[type="submit"]',
159 | 'button',
160 | 'input[type="submit"]',
161 | ]
162 |
163 | for (const selector of possibleSelectors) {
164 | try {
165 | const elements = document.querySelectorAll(selector)
166 | console.log(`Reddit Ctrl+Enter Sender: Found ${elements.length} elements with selector: ${selector}`)
167 |
168 | for (const element of elements) {
169 | if (element instanceof HTMLButtonElement && isSubmitButton(element)) {
170 | console.log('Reddit Ctrl+Enter Sender: Found submit button with selector:', selector)
171 | return element
172 | }
173 | }
174 | } catch (e) {
175 | console.log(`Reddit Ctrl+Enter Sender: Selector ${selector} not supported, continuing...`)
176 | continue
177 | }
178 | }
179 |
180 | return null
181 | }
182 |
183 | function isSubmitButton(button: HTMLButtonElement): boolean {
184 | const text = button.textContent?.toLowerCase().trim() || ''
185 | const classes = button.className.toLowerCase()
186 | const type = button.type.toLowerCase()
187 | const slot = button.getAttribute('slot')
188 |
189 | console.log('Reddit Ctrl+Enter Sender: Checking button:', {
190 | text,
191 | classes,
192 | type,
193 | slot,
194 | tagName: button.tagName,
195 | })
196 |
197 | if (type === 'submit') {
198 | console.log('Reddit Ctrl+Enter Sender: Button is type="submit"')
199 | return true
200 | }
201 |
202 | const submitTexts = ['save edits', 'reply', 'comment', 'post', 'submit', 'send', 'save']
203 | if (submitTexts.some((submitText) => text.includes(submitText))) {
204 | console.log('Reddit Ctrl+Enter Sender: Button text matches submit pattern:', text)
205 | return true
206 | }
207 |
208 | if (classes.includes('button-primary') || classes.includes('submit') || classes.includes('primary')) {
209 | console.log('Reddit Ctrl+Enter Sender: Button has primary/submit class')
210 | return true
211 | }
212 |
213 | if (slot === 'submit-button') {
214 | console.log('Reddit Ctrl+Enter Sender: Button has slot="submit-button"')
215 | return true
216 | }
217 |
218 | if (button.offsetParent === null || button.disabled) {
219 | console.log('Reddit Ctrl+Enter Sender: Button is not visible or disabled')
220 | return false
221 | }
222 |
223 | console.log('Reddit Ctrl+Enter Sender: Button does not match submit criteria')
224 | return false
225 | }
226 |
227 | return () => {
228 | document.removeEventListener('keydown', handleKeyDown, true)
229 | console.log('Reddit Ctrl+Enter Sender: Content script unloaded')
230 | }
231 | }
232 |
233 | main()
234 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | '@medv/finder':
12 | specifier: ^4.0.2
13 | version: 4.0.2
14 | '@rxliuli/vista':
15 | specifier: ^0.4.5
16 | version: 0.4.5
17 | es-toolkit:
18 | specifier: ^1.41.0
19 | version: 1.41.0
20 | query-selector-shadow-dom:
21 | specifier: ^1.0.1
22 | version: 1.0.1
23 | devDependencies:
24 | '@liuli-util/prettier-standard-config':
25 | specifier: ^0.3.0
26 | version: 0.3.0(prettier@3.6.2)
27 | '@types/node':
28 | specifier: ^22.15.30
29 | version: 22.18.6
30 | '@types/query-selector-shadow-dom':
31 | specifier: ^1.0.4
32 | version: 1.0.4
33 | '@types/tampermonkey':
34 | specifier: ^5.0.4
35 | version: 5.0.4
36 | '@vitest/browser':
37 | specifier: ^3.2.2
38 | version: 3.2.4(playwright@1.55.1)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)
39 | bundle-require:
40 | specifier: ^5.1.0
41 | version: 5.1.0(esbuild@0.27.0)
42 | chokidar:
43 | specifier: ^5.0.0
44 | version: 5.0.0
45 | lint-staged:
46 | specifier: ^16.2.1
47 | version: 16.2.1
48 | playwright:
49 | specifier: ^1.52.0
50 | version: 1.55.1
51 | prettier:
52 | specifier: ^3.6.2
53 | version: 3.6.2
54 | simple-git-hooks:
55 | specifier: ^2.13.1
56 | version: 2.13.1
57 | tsx:
58 | specifier: ^4.21.0
59 | version: 4.21.0
60 | typescript:
61 | specifier: ^5.8.3
62 | version: 5.9.2
63 | vite:
64 | specifier: ^6.3.5
65 | version: 6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
66 | vite-node:
67 | specifier: ^3.2.4
68 | version: 3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
69 | vite-plugin-monkey:
70 | specifier: ^7.1.4
71 | version: 7.1.4(postcss@8.5.6)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))
72 | vite-tsconfig-paths:
73 | specifier: ^5.1.4
74 | version: 5.1.4(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))
75 | vitest:
76 | specifier: ^3.2.4
77 | version: 3.2.4(@types/node@22.18.6)(@vitest/browser@3.2.4)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
78 | vitest-browser-react:
79 | specifier: ^0.2.0
80 | version: 0.2.0(@vitest/browser@3.2.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vitest@3.2.4)
81 | zx:
82 | specifier: ^8.5.5
83 | version: 8.8.3
84 |
85 | packages:
86 |
87 | '@babel/code-frame@7.27.1':
88 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
89 | engines: {node: '>=6.9.0'}
90 |
91 | '@babel/helper-validator-identifier@7.27.1':
92 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
93 | engines: {node: '>=6.9.0'}
94 |
95 | '@babel/runtime@7.28.4':
96 | resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
97 | engines: {node: '>=6.9.0'}
98 |
99 | '@esbuild/aix-ppc64@0.25.10':
100 | resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==}
101 | engines: {node: '>=18'}
102 | cpu: [ppc64]
103 | os: [aix]
104 |
105 | '@esbuild/aix-ppc64@0.27.0':
106 | resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==}
107 | engines: {node: '>=18'}
108 | cpu: [ppc64]
109 | os: [aix]
110 |
111 | '@esbuild/android-arm64@0.25.10':
112 | resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==}
113 | engines: {node: '>=18'}
114 | cpu: [arm64]
115 | os: [android]
116 |
117 | '@esbuild/android-arm64@0.27.0':
118 | resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==}
119 | engines: {node: '>=18'}
120 | cpu: [arm64]
121 | os: [android]
122 |
123 | '@esbuild/android-arm@0.25.10':
124 | resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==}
125 | engines: {node: '>=18'}
126 | cpu: [arm]
127 | os: [android]
128 |
129 | '@esbuild/android-arm@0.27.0':
130 | resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==}
131 | engines: {node: '>=18'}
132 | cpu: [arm]
133 | os: [android]
134 |
135 | '@esbuild/android-x64@0.25.10':
136 | resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==}
137 | engines: {node: '>=18'}
138 | cpu: [x64]
139 | os: [android]
140 |
141 | '@esbuild/android-x64@0.27.0':
142 | resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==}
143 | engines: {node: '>=18'}
144 | cpu: [x64]
145 | os: [android]
146 |
147 | '@esbuild/darwin-arm64@0.25.10':
148 | resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==}
149 | engines: {node: '>=18'}
150 | cpu: [arm64]
151 | os: [darwin]
152 |
153 | '@esbuild/darwin-arm64@0.27.0':
154 | resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==}
155 | engines: {node: '>=18'}
156 | cpu: [arm64]
157 | os: [darwin]
158 |
159 | '@esbuild/darwin-x64@0.25.10':
160 | resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==}
161 | engines: {node: '>=18'}
162 | cpu: [x64]
163 | os: [darwin]
164 |
165 | '@esbuild/darwin-x64@0.27.0':
166 | resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==}
167 | engines: {node: '>=18'}
168 | cpu: [x64]
169 | os: [darwin]
170 |
171 | '@esbuild/freebsd-arm64@0.25.10':
172 | resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==}
173 | engines: {node: '>=18'}
174 | cpu: [arm64]
175 | os: [freebsd]
176 |
177 | '@esbuild/freebsd-arm64@0.27.0':
178 | resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==}
179 | engines: {node: '>=18'}
180 | cpu: [arm64]
181 | os: [freebsd]
182 |
183 | '@esbuild/freebsd-x64@0.25.10':
184 | resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==}
185 | engines: {node: '>=18'}
186 | cpu: [x64]
187 | os: [freebsd]
188 |
189 | '@esbuild/freebsd-x64@0.27.0':
190 | resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==}
191 | engines: {node: '>=18'}
192 | cpu: [x64]
193 | os: [freebsd]
194 |
195 | '@esbuild/linux-arm64@0.25.10':
196 | resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==}
197 | engines: {node: '>=18'}
198 | cpu: [arm64]
199 | os: [linux]
200 |
201 | '@esbuild/linux-arm64@0.27.0':
202 | resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==}
203 | engines: {node: '>=18'}
204 | cpu: [arm64]
205 | os: [linux]
206 |
207 | '@esbuild/linux-arm@0.25.10':
208 | resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==}
209 | engines: {node: '>=18'}
210 | cpu: [arm]
211 | os: [linux]
212 |
213 | '@esbuild/linux-arm@0.27.0':
214 | resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==}
215 | engines: {node: '>=18'}
216 | cpu: [arm]
217 | os: [linux]
218 |
219 | '@esbuild/linux-ia32@0.25.10':
220 | resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==}
221 | engines: {node: '>=18'}
222 | cpu: [ia32]
223 | os: [linux]
224 |
225 | '@esbuild/linux-ia32@0.27.0':
226 | resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==}
227 | engines: {node: '>=18'}
228 | cpu: [ia32]
229 | os: [linux]
230 |
231 | '@esbuild/linux-loong64@0.25.10':
232 | resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==}
233 | engines: {node: '>=18'}
234 | cpu: [loong64]
235 | os: [linux]
236 |
237 | '@esbuild/linux-loong64@0.27.0':
238 | resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==}
239 | engines: {node: '>=18'}
240 | cpu: [loong64]
241 | os: [linux]
242 |
243 | '@esbuild/linux-mips64el@0.25.10':
244 | resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==}
245 | engines: {node: '>=18'}
246 | cpu: [mips64el]
247 | os: [linux]
248 |
249 | '@esbuild/linux-mips64el@0.27.0':
250 | resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==}
251 | engines: {node: '>=18'}
252 | cpu: [mips64el]
253 | os: [linux]
254 |
255 | '@esbuild/linux-ppc64@0.25.10':
256 | resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==}
257 | engines: {node: '>=18'}
258 | cpu: [ppc64]
259 | os: [linux]
260 |
261 | '@esbuild/linux-ppc64@0.27.0':
262 | resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==}
263 | engines: {node: '>=18'}
264 | cpu: [ppc64]
265 | os: [linux]
266 |
267 | '@esbuild/linux-riscv64@0.25.10':
268 | resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==}
269 | engines: {node: '>=18'}
270 | cpu: [riscv64]
271 | os: [linux]
272 |
273 | '@esbuild/linux-riscv64@0.27.0':
274 | resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==}
275 | engines: {node: '>=18'}
276 | cpu: [riscv64]
277 | os: [linux]
278 |
279 | '@esbuild/linux-s390x@0.25.10':
280 | resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==}
281 | engines: {node: '>=18'}
282 | cpu: [s390x]
283 | os: [linux]
284 |
285 | '@esbuild/linux-s390x@0.27.0':
286 | resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==}
287 | engines: {node: '>=18'}
288 | cpu: [s390x]
289 | os: [linux]
290 |
291 | '@esbuild/linux-x64@0.25.10':
292 | resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==}
293 | engines: {node: '>=18'}
294 | cpu: [x64]
295 | os: [linux]
296 |
297 | '@esbuild/linux-x64@0.27.0':
298 | resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==}
299 | engines: {node: '>=18'}
300 | cpu: [x64]
301 | os: [linux]
302 |
303 | '@esbuild/netbsd-arm64@0.25.10':
304 | resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==}
305 | engines: {node: '>=18'}
306 | cpu: [arm64]
307 | os: [netbsd]
308 |
309 | '@esbuild/netbsd-arm64@0.27.0':
310 | resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==}
311 | engines: {node: '>=18'}
312 | cpu: [arm64]
313 | os: [netbsd]
314 |
315 | '@esbuild/netbsd-x64@0.25.10':
316 | resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==}
317 | engines: {node: '>=18'}
318 | cpu: [x64]
319 | os: [netbsd]
320 |
321 | '@esbuild/netbsd-x64@0.27.0':
322 | resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==}
323 | engines: {node: '>=18'}
324 | cpu: [x64]
325 | os: [netbsd]
326 |
327 | '@esbuild/openbsd-arm64@0.25.10':
328 | resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==}
329 | engines: {node: '>=18'}
330 | cpu: [arm64]
331 | os: [openbsd]
332 |
333 | '@esbuild/openbsd-arm64@0.27.0':
334 | resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==}
335 | engines: {node: '>=18'}
336 | cpu: [arm64]
337 | os: [openbsd]
338 |
339 | '@esbuild/openbsd-x64@0.25.10':
340 | resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==}
341 | engines: {node: '>=18'}
342 | cpu: [x64]
343 | os: [openbsd]
344 |
345 | '@esbuild/openbsd-x64@0.27.0':
346 | resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==}
347 | engines: {node: '>=18'}
348 | cpu: [x64]
349 | os: [openbsd]
350 |
351 | '@esbuild/openharmony-arm64@0.25.10':
352 | resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==}
353 | engines: {node: '>=18'}
354 | cpu: [arm64]
355 | os: [openharmony]
356 |
357 | '@esbuild/openharmony-arm64@0.27.0':
358 | resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==}
359 | engines: {node: '>=18'}
360 | cpu: [arm64]
361 | os: [openharmony]
362 |
363 | '@esbuild/sunos-x64@0.25.10':
364 | resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==}
365 | engines: {node: '>=18'}
366 | cpu: [x64]
367 | os: [sunos]
368 |
369 | '@esbuild/sunos-x64@0.27.0':
370 | resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==}
371 | engines: {node: '>=18'}
372 | cpu: [x64]
373 | os: [sunos]
374 |
375 | '@esbuild/win32-arm64@0.25.10':
376 | resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==}
377 | engines: {node: '>=18'}
378 | cpu: [arm64]
379 | os: [win32]
380 |
381 | '@esbuild/win32-arm64@0.27.0':
382 | resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==}
383 | engines: {node: '>=18'}
384 | cpu: [arm64]
385 | os: [win32]
386 |
387 | '@esbuild/win32-ia32@0.25.10':
388 | resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==}
389 | engines: {node: '>=18'}
390 | cpu: [ia32]
391 | os: [win32]
392 |
393 | '@esbuild/win32-ia32@0.27.0':
394 | resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==}
395 | engines: {node: '>=18'}
396 | cpu: [ia32]
397 | os: [win32]
398 |
399 | '@esbuild/win32-x64@0.25.10':
400 | resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==}
401 | engines: {node: '>=18'}
402 | cpu: [x64]
403 | os: [win32]
404 |
405 | '@esbuild/win32-x64@0.27.0':
406 | resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==}
407 | engines: {node: '>=18'}
408 | cpu: [x64]
409 | os: [win32]
410 |
411 | '@jridgewell/sourcemap-codec@1.5.5':
412 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
413 |
414 | '@liuli-util/prettier-standard-config@0.3.0':
415 | resolution: {integrity: sha512-3cwp9oCh8jy9jbmqdOKHfSkfUbIwNW+7Sr5bX/ziGg5XxtdkUB5tkaqcx+P9/xpQL+oiJUVkZD22gRTVD/K4fg==}
416 | peerDependencies:
417 | prettier: ^2
418 |
419 | '@medv/finder@4.0.2':
420 | resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==}
421 |
422 | '@polka/url@1.0.0-next.29':
423 | resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
424 |
425 | '@rollup/rollup-android-arm-eabi@4.52.2':
426 | resolution: {integrity: sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==}
427 | cpu: [arm]
428 | os: [android]
429 |
430 | '@rollup/rollup-android-arm64@4.52.2':
431 | resolution: {integrity: sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==}
432 | cpu: [arm64]
433 | os: [android]
434 |
435 | '@rollup/rollup-darwin-arm64@4.52.2':
436 | resolution: {integrity: sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==}
437 | cpu: [arm64]
438 | os: [darwin]
439 |
440 | '@rollup/rollup-darwin-x64@4.52.2':
441 | resolution: {integrity: sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==}
442 | cpu: [x64]
443 | os: [darwin]
444 |
445 | '@rollup/rollup-freebsd-arm64@4.52.2':
446 | resolution: {integrity: sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==}
447 | cpu: [arm64]
448 | os: [freebsd]
449 |
450 | '@rollup/rollup-freebsd-x64@4.52.2':
451 | resolution: {integrity: sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==}
452 | cpu: [x64]
453 | os: [freebsd]
454 |
455 | '@rollup/rollup-linux-arm-gnueabihf@4.52.2':
456 | resolution: {integrity: sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==}
457 | cpu: [arm]
458 | os: [linux]
459 |
460 | '@rollup/rollup-linux-arm-musleabihf@4.52.2':
461 | resolution: {integrity: sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==}
462 | cpu: [arm]
463 | os: [linux]
464 |
465 | '@rollup/rollup-linux-arm64-gnu@4.52.2':
466 | resolution: {integrity: sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==}
467 | cpu: [arm64]
468 | os: [linux]
469 |
470 | '@rollup/rollup-linux-arm64-musl@4.52.2':
471 | resolution: {integrity: sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==}
472 | cpu: [arm64]
473 | os: [linux]
474 |
475 | '@rollup/rollup-linux-loong64-gnu@4.52.2':
476 | resolution: {integrity: sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==}
477 | cpu: [loong64]
478 | os: [linux]
479 |
480 | '@rollup/rollup-linux-ppc64-gnu@4.52.2':
481 | resolution: {integrity: sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==}
482 | cpu: [ppc64]
483 | os: [linux]
484 |
485 | '@rollup/rollup-linux-riscv64-gnu@4.52.2':
486 | resolution: {integrity: sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==}
487 | cpu: [riscv64]
488 | os: [linux]
489 |
490 | '@rollup/rollup-linux-riscv64-musl@4.52.2':
491 | resolution: {integrity: sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==}
492 | cpu: [riscv64]
493 | os: [linux]
494 |
495 | '@rollup/rollup-linux-s390x-gnu@4.52.2':
496 | resolution: {integrity: sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==}
497 | cpu: [s390x]
498 | os: [linux]
499 |
500 | '@rollup/rollup-linux-x64-gnu@4.52.2':
501 | resolution: {integrity: sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==}
502 | cpu: [x64]
503 | os: [linux]
504 |
505 | '@rollup/rollup-linux-x64-musl@4.52.2':
506 | resolution: {integrity: sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==}
507 | cpu: [x64]
508 | os: [linux]
509 |
510 | '@rollup/rollup-openharmony-arm64@4.52.2':
511 | resolution: {integrity: sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==}
512 | cpu: [arm64]
513 | os: [openharmony]
514 |
515 | '@rollup/rollup-win32-arm64-msvc@4.52.2':
516 | resolution: {integrity: sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==}
517 | cpu: [arm64]
518 | os: [win32]
519 |
520 | '@rollup/rollup-win32-ia32-msvc@4.52.2':
521 | resolution: {integrity: sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==}
522 | cpu: [ia32]
523 | os: [win32]
524 |
525 | '@rollup/rollup-win32-x64-gnu@4.52.2':
526 | resolution: {integrity: sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==}
527 | cpu: [x64]
528 | os: [win32]
529 |
530 | '@rollup/rollup-win32-x64-msvc@4.52.2':
531 | resolution: {integrity: sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==}
532 | cpu: [x64]
533 | os: [win32]
534 |
535 | '@rxliuli/vista@0.4.5':
536 | resolution: {integrity: sha512-baW+VpprpJvWsBSmGO85QBKDXdz+OO8z19I84q74E3/IL92XN1lWDRnBFdGM2WsH8iSOTc0M+syKWVocdh+BXA==}
537 |
538 | '@testing-library/dom@10.4.1':
539 | resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
540 | engines: {node: '>=18'}
541 |
542 | '@testing-library/user-event@14.6.1':
543 | resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
544 | engines: {node: '>=12', npm: '>=6'}
545 | peerDependencies:
546 | '@testing-library/dom': '>=7.21.4'
547 |
548 | '@types/aria-query@5.0.4':
549 | resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
550 |
551 | '@types/chai@5.2.2':
552 | resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==}
553 |
554 | '@types/deep-eql@4.0.2':
555 | resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
556 |
557 | '@types/estree@1.0.8':
558 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
559 |
560 | '@types/node@22.18.6':
561 | resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==}
562 |
563 | '@types/query-selector-shadow-dom@1.0.4':
564 | resolution: {integrity: sha512-8jfGPD0wCMCdyBvrvOrWVn8bHL1UEjkPVJKsqNZpEXp+a7mIIvvGpJMd6n6dlNl7IkG2ryxIVqFI516RPE0uhQ==}
565 |
566 | '@types/tampermonkey@5.0.4':
567 | resolution: {integrity: sha512-HEJ0O5CkDZSwIgd9Zip4xM8o7gZC8zBmJuH1YEXNINIC+aCWEXD10pnpo3NQG5IWHx+Xr4fMSGq1jqeKXH2lpA==}
568 |
569 | '@vitest/browser@3.2.4':
570 | resolution: {integrity: sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==}
571 | peerDependencies:
572 | playwright: '*'
573 | safaridriver: '*'
574 | vitest: 3.2.4
575 | webdriverio: ^7.0.0 || ^8.0.0 || ^9.0.0
576 | peerDependenciesMeta:
577 | playwright:
578 | optional: true
579 | safaridriver:
580 | optional: true
581 | webdriverio:
582 | optional: true
583 |
584 | '@vitest/expect@3.2.4':
585 | resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==}
586 |
587 | '@vitest/mocker@3.2.4':
588 | resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==}
589 | peerDependencies:
590 | msw: ^2.4.9
591 | vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
592 | peerDependenciesMeta:
593 | msw:
594 | optional: true
595 | vite:
596 | optional: true
597 |
598 | '@vitest/pretty-format@3.2.4':
599 | resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==}
600 |
601 | '@vitest/runner@3.2.4':
602 | resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==}
603 |
604 | '@vitest/snapshot@3.2.4':
605 | resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==}
606 |
607 | '@vitest/spy@3.2.4':
608 | resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==}
609 |
610 | '@vitest/utils@3.2.4':
611 | resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==}
612 |
613 | acorn-walk@8.3.4:
614 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==}
615 | engines: {node: '>=0.4.0'}
616 |
617 | acorn@8.15.0:
618 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
619 | engines: {node: '>=0.4.0'}
620 | hasBin: true
621 |
622 | ansi-escapes@7.1.1:
623 | resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==}
624 | engines: {node: '>=18'}
625 |
626 | ansi-regex@5.0.1:
627 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
628 | engines: {node: '>=8'}
629 |
630 | ansi-regex@6.2.2:
631 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
632 | engines: {node: '>=12'}
633 |
634 | ansi-styles@5.2.0:
635 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
636 | engines: {node: '>=10'}
637 |
638 | ansi-styles@6.2.3:
639 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
640 | engines: {node: '>=12'}
641 |
642 | aria-query@5.3.0:
643 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
644 |
645 | assertion-error@2.0.1:
646 | resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
647 | engines: {node: '>=12'}
648 |
649 | balanced-match@1.0.2:
650 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
651 |
652 | brace-expansion@1.1.12:
653 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
654 |
655 | braces@3.0.3:
656 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
657 | engines: {node: '>=8'}
658 |
659 | bundle-name@4.1.0:
660 | resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
661 | engines: {node: '>=18'}
662 |
663 | bundle-require@5.1.0:
664 | resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
665 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
666 | peerDependencies:
667 | esbuild: '>=0.18'
668 |
669 | cac@6.7.14:
670 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
671 | engines: {node: '>=8'}
672 |
673 | chai@5.3.3:
674 | resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==}
675 | engines: {node: '>=18'}
676 |
677 | check-error@2.1.1:
678 | resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
679 | engines: {node: '>= 16'}
680 |
681 | chokidar@5.0.0:
682 | resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
683 | engines: {node: '>= 20.19.0'}
684 |
685 | cli-cursor@5.0.0:
686 | resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
687 | engines: {node: '>=18'}
688 |
689 | cli-truncate@5.1.0:
690 | resolution: {integrity: sha512-7JDGG+4Zp0CsknDCedl0DYdaeOhc46QNpXi3NLQblkZpXXgA6LncLDUUyvrjSvZeF3VRQa+KiMGomazQrC1V8g==}
691 | engines: {node: '>=20'}
692 |
693 | colorette@2.0.20:
694 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
695 |
696 | commander@14.0.1:
697 | resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==}
698 | engines: {node: '>=20'}
699 |
700 | concat-map@0.0.1:
701 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
702 |
703 | cross-spawn@7.0.6:
704 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
705 | engines: {node: '>= 8'}
706 |
707 | cuint@0.2.2:
708 | resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==}
709 |
710 | debug@4.4.3:
711 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
712 | engines: {node: '>=6.0'}
713 | peerDependencies:
714 | supports-color: '*'
715 | peerDependenciesMeta:
716 | supports-color:
717 | optional: true
718 |
719 | deep-eql@5.0.2:
720 | resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
721 | engines: {node: '>=6'}
722 |
723 | default-browser-id@5.0.0:
724 | resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==}
725 | engines: {node: '>=18'}
726 |
727 | default-browser@5.2.1:
728 | resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==}
729 | engines: {node: '>=18'}
730 |
731 | define-lazy-prop@3.0.0:
732 | resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
733 | engines: {node: '>=12'}
734 |
735 | dequal@2.0.3:
736 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
737 | engines: {node: '>=6'}
738 |
739 | dom-accessibility-api@0.5.16:
740 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
741 |
742 | dom-serializer@2.0.0:
743 | resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
744 |
745 | domelementtype@2.3.0:
746 | resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
747 |
748 | domhandler@5.0.3:
749 | resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
750 | engines: {node: '>= 4'}
751 |
752 | domutils@3.2.2:
753 | resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
754 |
755 | emoji-regex@10.5.0:
756 | resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==}
757 |
758 | entities@4.5.0:
759 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
760 | engines: {node: '>=0.12'}
761 |
762 | entities@6.0.1:
763 | resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
764 | engines: {node: '>=0.12'}
765 |
766 | environment@1.1.0:
767 | resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
768 | engines: {node: '>=18'}
769 |
770 | es-module-lexer@1.7.0:
771 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==}
772 |
773 | es-toolkit@1.41.0:
774 | resolution: {integrity: sha512-bDd3oRmbVgqZCJS6WmeQieOrzpl3URcWBUVDXxOELlUW2FuW+0glPOz1n0KnRie+PdyvUZcXz2sOn00c6pPRIA==}
775 |
776 | esbuild@0.25.10:
777 | resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==}
778 | engines: {node: '>=18'}
779 | hasBin: true
780 |
781 | esbuild@0.27.0:
782 | resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==}
783 | engines: {node: '>=18'}
784 | hasBin: true
785 |
786 | estree-walker@3.0.3:
787 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
788 |
789 | eventemitter3@5.0.1:
790 | resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
791 |
792 | expect-type@1.2.2:
793 | resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==}
794 | engines: {node: '>=12.0.0'}
795 |
796 | fdir@6.5.0:
797 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
798 | engines: {node: '>=12.0.0'}
799 | peerDependencies:
800 | picomatch: ^3 || ^4
801 | peerDependenciesMeta:
802 | picomatch:
803 | optional: true
804 |
805 | fill-range@7.1.1:
806 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
807 | engines: {node: '>=8'}
808 |
809 | fsevents@2.3.2:
810 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
811 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
812 | os: [darwin]
813 |
814 | fsevents@2.3.3:
815 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
816 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
817 | os: [darwin]
818 |
819 | get-east-asian-width@1.4.0:
820 | resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
821 | engines: {node: '>=18'}
822 |
823 | get-tsconfig@4.13.0:
824 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
825 |
826 | globrex@0.1.2:
827 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
828 |
829 | htmlparser2@10.0.0:
830 | resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==}
831 |
832 | import-meta-resolve@4.2.0:
833 | resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
834 |
835 | is-docker@3.0.0:
836 | resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
837 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
838 | hasBin: true
839 |
840 | is-fullwidth-code-point@5.1.0:
841 | resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
842 | engines: {node: '>=18'}
843 |
844 | is-inside-container@1.0.0:
845 | resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
846 | engines: {node: '>=14.16'}
847 | hasBin: true
848 |
849 | is-number@7.0.0:
850 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
851 | engines: {node: '>=0.12.0'}
852 |
853 | is-wsl@3.1.0:
854 | resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
855 | engines: {node: '>=16'}
856 |
857 | isexe@2.0.0:
858 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
859 |
860 | jiti@2.6.0:
861 | resolution: {integrity: sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==}
862 | hasBin: true
863 |
864 | js-tokens@4.0.0:
865 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
866 |
867 | js-tokens@9.0.1:
868 | resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
869 |
870 | lint-staged@16.2.1:
871 | resolution: {integrity: sha512-KMeYmH9wKvHsXdUp+z6w7HN3fHKHXwT1pSTQTYxB9kI6ekK1rlL3kLZEoXZCppRPXFK9PFW/wfQctV7XUqMrPQ==}
872 | engines: {node: '>=20.17'}
873 | hasBin: true
874 |
875 | listr2@9.0.4:
876 | resolution: {integrity: sha512-1wd/kpAdKRLwv7/3OKC8zZ5U8e/fajCfWMxacUvB79S5nLrYGPtUI/8chMQhn3LQjsRVErTb9i1ECAwW0ZIHnQ==}
877 | engines: {node: '>=20.0.0'}
878 |
879 | load-tsconfig@0.2.5:
880 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
881 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
882 |
883 | log-update@6.1.0:
884 | resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
885 | engines: {node: '>=18'}
886 |
887 | loupe@3.2.1:
888 | resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==}
889 |
890 | lz-string@1.5.0:
891 | resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
892 | hasBin: true
893 |
894 | magic-string@0.30.19:
895 | resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==}
896 |
897 | make-dir@3.1.0:
898 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
899 | engines: {node: '>=8'}
900 |
901 | micromatch@4.0.8:
902 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
903 | engines: {node: '>=8.6'}
904 |
905 | mime@2.5.2:
906 | resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==}
907 | engines: {node: '>=4.0.0'}
908 | hasBin: true
909 |
910 | mimic-function@5.0.1:
911 | resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
912 | engines: {node: '>=18'}
913 |
914 | minimatch@3.0.8:
915 | resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
916 |
917 | mrmime@2.0.1:
918 | resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
919 | engines: {node: '>=10'}
920 |
921 | ms@2.1.3:
922 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
923 |
924 | nano-spawn@1.0.3:
925 | resolution: {integrity: sha512-jtpsQDetTnvS2Ts1fiRdci5rx0VYws5jGyC+4IYOTnIQ/wwdf6JdomlHBwqC3bJYOvaKu0C2GSZ1A60anrYpaA==}
926 | engines: {node: '>=20.17'}
927 |
928 | nanoid@3.3.11:
929 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
930 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
931 | hasBin: true
932 |
933 | onetime@7.0.0:
934 | resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
935 | engines: {node: '>=18'}
936 |
937 | open@10.2.0:
938 | resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
939 | engines: {node: '>=18'}
940 |
941 | path-key@3.1.1:
942 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
943 | engines: {node: '>=8'}
944 |
945 | pathe@2.0.3:
946 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
947 |
948 | pathval@2.0.1:
949 | resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==}
950 | engines: {node: '>= 14.16'}
951 |
952 | picocolors@1.1.1:
953 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
954 |
955 | picomatch@2.3.1:
956 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
957 | engines: {node: '>=8.6'}
958 |
959 | picomatch@4.0.3:
960 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
961 | engines: {node: '>=12'}
962 |
963 | pidtree@0.6.0:
964 | resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
965 | engines: {node: '>=0.10'}
966 | hasBin: true
967 |
968 | playwright-core@1.55.1:
969 | resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==}
970 | engines: {node: '>=18'}
971 | hasBin: true
972 |
973 | playwright@1.55.1:
974 | resolution: {integrity: sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==}
975 | engines: {node: '>=18'}
976 | hasBin: true
977 |
978 | postcss-url@10.1.3:
979 | resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==}
980 | engines: {node: '>=10'}
981 | peerDependencies:
982 | postcss: ^8.0.0
983 |
984 | postcss@8.5.6:
985 | resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
986 | engines: {node: ^10 || ^12 || >=14}
987 |
988 | prettier@3.6.2:
989 | resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
990 | engines: {node: '>=14'}
991 | hasBin: true
992 |
993 | pretty-format@27.5.1:
994 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
995 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
996 |
997 | query-selector-shadow-dom@1.0.1:
998 | resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==}
999 |
1000 | react-dom@19.1.1:
1001 | resolution: {integrity: sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==}
1002 | peerDependencies:
1003 | react: ^19.1.1
1004 |
1005 | react-is@17.0.2:
1006 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
1007 |
1008 | react@19.1.1:
1009 | resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==}
1010 | engines: {node: '>=0.10.0'}
1011 |
1012 | readdirp@5.0.0:
1013 | resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
1014 | engines: {node: '>= 20.19.0'}
1015 |
1016 | resolve-pkg-maps@1.0.0:
1017 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
1018 |
1019 | restore-cursor@5.1.0:
1020 | resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
1021 | engines: {node: '>=18'}
1022 |
1023 | rfdc@1.4.1:
1024 | resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
1025 |
1026 | rollup@4.52.2:
1027 | resolution: {integrity: sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==}
1028 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
1029 | hasBin: true
1030 |
1031 | run-applescript@7.1.0:
1032 | resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
1033 | engines: {node: '>=18'}
1034 |
1035 | scheduler@0.26.0:
1036 | resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
1037 |
1038 | semver@6.3.1:
1039 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1040 | hasBin: true
1041 |
1042 | shebang-command@2.0.0:
1043 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1044 | engines: {node: '>=8'}
1045 |
1046 | shebang-regex@3.0.0:
1047 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1048 | engines: {node: '>=8'}
1049 |
1050 | siginfo@2.0.0:
1051 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
1052 |
1053 | signal-exit@4.1.0:
1054 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
1055 | engines: {node: '>=14'}
1056 |
1057 | simple-git-hooks@2.13.1:
1058 | resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==}
1059 | hasBin: true
1060 |
1061 | sirv@3.0.2:
1062 | resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
1063 | engines: {node: '>=18'}
1064 |
1065 | slice-ansi@7.1.2:
1066 | resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
1067 | engines: {node: '>=18'}
1068 |
1069 | source-map-js@1.2.1:
1070 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
1071 | engines: {node: '>=0.10.0'}
1072 |
1073 | stackback@0.0.2:
1074 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
1075 |
1076 | std-env@3.9.0:
1077 | resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
1078 |
1079 | string-argv@0.3.2:
1080 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
1081 | engines: {node: '>=0.6.19'}
1082 |
1083 | string-width@7.2.0:
1084 | resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
1085 | engines: {node: '>=18'}
1086 |
1087 | string-width@8.1.0:
1088 | resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==}
1089 | engines: {node: '>=20'}
1090 |
1091 | strip-ansi@7.1.2:
1092 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
1093 | engines: {node: '>=12'}
1094 |
1095 | strip-literal@3.0.0:
1096 | resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==}
1097 |
1098 | systemjs@6.15.1:
1099 | resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==}
1100 |
1101 | tinybench@2.9.0:
1102 | resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
1103 |
1104 | tinyexec@0.3.2:
1105 | resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
1106 |
1107 | tinyglobby@0.2.15:
1108 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
1109 | engines: {node: '>=12.0.0'}
1110 |
1111 | tinypool@1.1.1:
1112 | resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==}
1113 | engines: {node: ^18.0.0 || >=20.0.0}
1114 |
1115 | tinyrainbow@2.0.0:
1116 | resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
1117 | engines: {node: '>=14.0.0'}
1118 |
1119 | tinyspy@4.0.4:
1120 | resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==}
1121 | engines: {node: '>=14.0.0'}
1122 |
1123 | to-regex-range@5.0.1:
1124 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1125 | engines: {node: '>=8.0'}
1126 |
1127 | totalist@3.0.1:
1128 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
1129 | engines: {node: '>=6'}
1130 |
1131 | tsconfck@3.1.6:
1132 | resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==}
1133 | engines: {node: ^18 || >=20}
1134 | hasBin: true
1135 | peerDependencies:
1136 | typescript: ^5.0.0
1137 | peerDependenciesMeta:
1138 | typescript:
1139 | optional: true
1140 |
1141 | tsx@4.21.0:
1142 | resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
1143 | engines: {node: '>=18.0.0'}
1144 | hasBin: true
1145 |
1146 | typescript@5.9.2:
1147 | resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==}
1148 | engines: {node: '>=14.17'}
1149 | hasBin: true
1150 |
1151 | undici-types@6.21.0:
1152 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
1153 |
1154 | vite-node@3.2.4:
1155 | resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==}
1156 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
1157 | hasBin: true
1158 |
1159 | vite-plugin-monkey@7.1.4:
1160 | resolution: {integrity: sha512-nA/uWbLT3b0uyCFBV7bsIUn+OZCpPzymDX1Nx9btKrG7in06m0txbT2SipCZPZJZyyQHPFNLrCSrWsQIFDHDlg==}
1161 | peerDependencies:
1162 | vite: ^6.0.0 || ^7.0.0
1163 | peerDependenciesMeta:
1164 | vite:
1165 | optional: true
1166 |
1167 | vite-tsconfig-paths@5.1.4:
1168 | resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
1169 | peerDependencies:
1170 | vite: '*'
1171 | peerDependenciesMeta:
1172 | vite:
1173 | optional: true
1174 |
1175 | vite@6.3.6:
1176 | resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==}
1177 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
1178 | hasBin: true
1179 | peerDependencies:
1180 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
1181 | jiti: '>=1.21.0'
1182 | less: '*'
1183 | lightningcss: ^1.21.0
1184 | sass: '*'
1185 | sass-embedded: '*'
1186 | stylus: '*'
1187 | sugarss: '*'
1188 | terser: ^5.16.0
1189 | tsx: ^4.8.1
1190 | yaml: ^2.4.2
1191 | peerDependenciesMeta:
1192 | '@types/node':
1193 | optional: true
1194 | jiti:
1195 | optional: true
1196 | less:
1197 | optional: true
1198 | lightningcss:
1199 | optional: true
1200 | sass:
1201 | optional: true
1202 | sass-embedded:
1203 | optional: true
1204 | stylus:
1205 | optional: true
1206 | sugarss:
1207 | optional: true
1208 | terser:
1209 | optional: true
1210 | tsx:
1211 | optional: true
1212 | yaml:
1213 | optional: true
1214 |
1215 | vite@7.1.12:
1216 | resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==}
1217 | engines: {node: ^20.19.0 || >=22.12.0}
1218 | hasBin: true
1219 | peerDependencies:
1220 | '@types/node': ^20.19.0 || >=22.12.0
1221 | jiti: '>=1.21.0'
1222 | less: ^4.0.0
1223 | lightningcss: ^1.21.0
1224 | sass: ^1.70.0
1225 | sass-embedded: ^1.70.0
1226 | stylus: '>=0.54.8'
1227 | sugarss: ^5.0.0
1228 | terser: ^5.16.0
1229 | tsx: ^4.8.1
1230 | yaml: ^2.4.2
1231 | peerDependenciesMeta:
1232 | '@types/node':
1233 | optional: true
1234 | jiti:
1235 | optional: true
1236 | less:
1237 | optional: true
1238 | lightningcss:
1239 | optional: true
1240 | sass:
1241 | optional: true
1242 | sass-embedded:
1243 | optional: true
1244 | stylus:
1245 | optional: true
1246 | sugarss:
1247 | optional: true
1248 | terser:
1249 | optional: true
1250 | tsx:
1251 | optional: true
1252 | yaml:
1253 | optional: true
1254 |
1255 | vitest-browser-react@0.2.0:
1256 | resolution: {integrity: sha512-tVUVngdcTMFPSywxEo42hAAO074VjEF7Q1QkV8wqjI9oiYuguUfqp6Uw4mTbZ+DLFSITHXiked+PYQFH69XkLQ==}
1257 | engines: {node: ^18.0.0 || >=20.0.0}
1258 | peerDependencies:
1259 | '@types/react': '>18.0.0'
1260 | '@types/react-dom': '>18.0.0'
1261 | '@vitest/browser': '>=2.1.0'
1262 | react: '>18.0.0'
1263 | react-dom: '>18.0.0'
1264 | vitest: '>=2.1.0'
1265 | peerDependenciesMeta:
1266 | '@types/react':
1267 | optional: true
1268 | '@types/react-dom':
1269 | optional: true
1270 |
1271 | vitest@3.2.4:
1272 | resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==}
1273 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
1274 | hasBin: true
1275 | peerDependencies:
1276 | '@edge-runtime/vm': '*'
1277 | '@types/debug': ^4.1.12
1278 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
1279 | '@vitest/browser': 3.2.4
1280 | '@vitest/ui': 3.2.4
1281 | happy-dom: '*'
1282 | jsdom: '*'
1283 | peerDependenciesMeta:
1284 | '@edge-runtime/vm':
1285 | optional: true
1286 | '@types/debug':
1287 | optional: true
1288 | '@types/node':
1289 | optional: true
1290 | '@vitest/browser':
1291 | optional: true
1292 | '@vitest/ui':
1293 | optional: true
1294 | happy-dom:
1295 | optional: true
1296 | jsdom:
1297 | optional: true
1298 |
1299 | which@2.0.2:
1300 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1301 | engines: {node: '>= 8'}
1302 | hasBin: true
1303 |
1304 | why-is-node-running@2.3.0:
1305 | resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
1306 | engines: {node: '>=8'}
1307 | hasBin: true
1308 |
1309 | wrap-ansi@9.0.2:
1310 | resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
1311 | engines: {node: '>=18'}
1312 |
1313 | ws@8.18.3:
1314 | resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
1315 | engines: {node: '>=10.0.0'}
1316 | peerDependencies:
1317 | bufferutil: ^4.0.1
1318 | utf-8-validate: '>=5.0.2'
1319 | peerDependenciesMeta:
1320 | bufferutil:
1321 | optional: true
1322 | utf-8-validate:
1323 | optional: true
1324 |
1325 | wsl-utils@0.1.0:
1326 | resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
1327 | engines: {node: '>=18'}
1328 |
1329 | xxhashjs@0.2.2:
1330 | resolution: {integrity: sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==}
1331 |
1332 | yaml@2.8.1:
1333 | resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
1334 | engines: {node: '>= 14.6'}
1335 | hasBin: true
1336 |
1337 | zx@8.8.3:
1338 | resolution: {integrity: sha512-8GWaBTVU6wzTdqO0v5qwGMUFLCYduW7UUxaliRD+FXGRfYM8KLDGL93idbdGFLomHDi18ZxCfhAJqYZB8rJNvw==}
1339 | engines: {node: '>= 12.17.0'}
1340 | hasBin: true
1341 |
1342 | snapshots:
1343 |
1344 | '@babel/code-frame@7.27.1':
1345 | dependencies:
1346 | '@babel/helper-validator-identifier': 7.27.1
1347 | js-tokens: 4.0.0
1348 | picocolors: 1.1.1
1349 |
1350 | '@babel/helper-validator-identifier@7.27.1': {}
1351 |
1352 | '@babel/runtime@7.28.4': {}
1353 |
1354 | '@esbuild/aix-ppc64@0.25.10':
1355 | optional: true
1356 |
1357 | '@esbuild/aix-ppc64@0.27.0':
1358 | optional: true
1359 |
1360 | '@esbuild/android-arm64@0.25.10':
1361 | optional: true
1362 |
1363 | '@esbuild/android-arm64@0.27.0':
1364 | optional: true
1365 |
1366 | '@esbuild/android-arm@0.25.10':
1367 | optional: true
1368 |
1369 | '@esbuild/android-arm@0.27.0':
1370 | optional: true
1371 |
1372 | '@esbuild/android-x64@0.25.10':
1373 | optional: true
1374 |
1375 | '@esbuild/android-x64@0.27.0':
1376 | optional: true
1377 |
1378 | '@esbuild/darwin-arm64@0.25.10':
1379 | optional: true
1380 |
1381 | '@esbuild/darwin-arm64@0.27.0':
1382 | optional: true
1383 |
1384 | '@esbuild/darwin-x64@0.25.10':
1385 | optional: true
1386 |
1387 | '@esbuild/darwin-x64@0.27.0':
1388 | optional: true
1389 |
1390 | '@esbuild/freebsd-arm64@0.25.10':
1391 | optional: true
1392 |
1393 | '@esbuild/freebsd-arm64@0.27.0':
1394 | optional: true
1395 |
1396 | '@esbuild/freebsd-x64@0.25.10':
1397 | optional: true
1398 |
1399 | '@esbuild/freebsd-x64@0.27.0':
1400 | optional: true
1401 |
1402 | '@esbuild/linux-arm64@0.25.10':
1403 | optional: true
1404 |
1405 | '@esbuild/linux-arm64@0.27.0':
1406 | optional: true
1407 |
1408 | '@esbuild/linux-arm@0.25.10':
1409 | optional: true
1410 |
1411 | '@esbuild/linux-arm@0.27.0':
1412 | optional: true
1413 |
1414 | '@esbuild/linux-ia32@0.25.10':
1415 | optional: true
1416 |
1417 | '@esbuild/linux-ia32@0.27.0':
1418 | optional: true
1419 |
1420 | '@esbuild/linux-loong64@0.25.10':
1421 | optional: true
1422 |
1423 | '@esbuild/linux-loong64@0.27.0':
1424 | optional: true
1425 |
1426 | '@esbuild/linux-mips64el@0.25.10':
1427 | optional: true
1428 |
1429 | '@esbuild/linux-mips64el@0.27.0':
1430 | optional: true
1431 |
1432 | '@esbuild/linux-ppc64@0.25.10':
1433 | optional: true
1434 |
1435 | '@esbuild/linux-ppc64@0.27.0':
1436 | optional: true
1437 |
1438 | '@esbuild/linux-riscv64@0.25.10':
1439 | optional: true
1440 |
1441 | '@esbuild/linux-riscv64@0.27.0':
1442 | optional: true
1443 |
1444 | '@esbuild/linux-s390x@0.25.10':
1445 | optional: true
1446 |
1447 | '@esbuild/linux-s390x@0.27.0':
1448 | optional: true
1449 |
1450 | '@esbuild/linux-x64@0.25.10':
1451 | optional: true
1452 |
1453 | '@esbuild/linux-x64@0.27.0':
1454 | optional: true
1455 |
1456 | '@esbuild/netbsd-arm64@0.25.10':
1457 | optional: true
1458 |
1459 | '@esbuild/netbsd-arm64@0.27.0':
1460 | optional: true
1461 |
1462 | '@esbuild/netbsd-x64@0.25.10':
1463 | optional: true
1464 |
1465 | '@esbuild/netbsd-x64@0.27.0':
1466 | optional: true
1467 |
1468 | '@esbuild/openbsd-arm64@0.25.10':
1469 | optional: true
1470 |
1471 | '@esbuild/openbsd-arm64@0.27.0':
1472 | optional: true
1473 |
1474 | '@esbuild/openbsd-x64@0.25.10':
1475 | optional: true
1476 |
1477 | '@esbuild/openbsd-x64@0.27.0':
1478 | optional: true
1479 |
1480 | '@esbuild/openharmony-arm64@0.25.10':
1481 | optional: true
1482 |
1483 | '@esbuild/openharmony-arm64@0.27.0':
1484 | optional: true
1485 |
1486 | '@esbuild/sunos-x64@0.25.10':
1487 | optional: true
1488 |
1489 | '@esbuild/sunos-x64@0.27.0':
1490 | optional: true
1491 |
1492 | '@esbuild/win32-arm64@0.25.10':
1493 | optional: true
1494 |
1495 | '@esbuild/win32-arm64@0.27.0':
1496 | optional: true
1497 |
1498 | '@esbuild/win32-ia32@0.25.10':
1499 | optional: true
1500 |
1501 | '@esbuild/win32-ia32@0.27.0':
1502 | optional: true
1503 |
1504 | '@esbuild/win32-x64@0.25.10':
1505 | optional: true
1506 |
1507 | '@esbuild/win32-x64@0.27.0':
1508 | optional: true
1509 |
1510 | '@jridgewell/sourcemap-codec@1.5.5': {}
1511 |
1512 | '@liuli-util/prettier-standard-config@0.3.0(prettier@3.6.2)':
1513 | dependencies:
1514 | prettier: 3.6.2
1515 |
1516 | '@medv/finder@4.0.2': {}
1517 |
1518 | '@polka/url@1.0.0-next.29': {}
1519 |
1520 | '@rollup/rollup-android-arm-eabi@4.52.2':
1521 | optional: true
1522 |
1523 | '@rollup/rollup-android-arm64@4.52.2':
1524 | optional: true
1525 |
1526 | '@rollup/rollup-darwin-arm64@4.52.2':
1527 | optional: true
1528 |
1529 | '@rollup/rollup-darwin-x64@4.52.2':
1530 | optional: true
1531 |
1532 | '@rollup/rollup-freebsd-arm64@4.52.2':
1533 | optional: true
1534 |
1535 | '@rollup/rollup-freebsd-x64@4.52.2':
1536 | optional: true
1537 |
1538 | '@rollup/rollup-linux-arm-gnueabihf@4.52.2':
1539 | optional: true
1540 |
1541 | '@rollup/rollup-linux-arm-musleabihf@4.52.2':
1542 | optional: true
1543 |
1544 | '@rollup/rollup-linux-arm64-gnu@4.52.2':
1545 | optional: true
1546 |
1547 | '@rollup/rollup-linux-arm64-musl@4.52.2':
1548 | optional: true
1549 |
1550 | '@rollup/rollup-linux-loong64-gnu@4.52.2':
1551 | optional: true
1552 |
1553 | '@rollup/rollup-linux-ppc64-gnu@4.52.2':
1554 | optional: true
1555 |
1556 | '@rollup/rollup-linux-riscv64-gnu@4.52.2':
1557 | optional: true
1558 |
1559 | '@rollup/rollup-linux-riscv64-musl@4.52.2':
1560 | optional: true
1561 |
1562 | '@rollup/rollup-linux-s390x-gnu@4.52.2':
1563 | optional: true
1564 |
1565 | '@rollup/rollup-linux-x64-gnu@4.52.2':
1566 | optional: true
1567 |
1568 | '@rollup/rollup-linux-x64-musl@4.52.2':
1569 | optional: true
1570 |
1571 | '@rollup/rollup-openharmony-arm64@4.52.2':
1572 | optional: true
1573 |
1574 | '@rollup/rollup-win32-arm64-msvc@4.52.2':
1575 | optional: true
1576 |
1577 | '@rollup/rollup-win32-ia32-msvc@4.52.2':
1578 | optional: true
1579 |
1580 | '@rollup/rollup-win32-x64-gnu@4.52.2':
1581 | optional: true
1582 |
1583 | '@rollup/rollup-win32-x64-msvc@4.52.2':
1584 | optional: true
1585 |
1586 | '@rxliuli/vista@0.4.5': {}
1587 |
1588 | '@testing-library/dom@10.4.1':
1589 | dependencies:
1590 | '@babel/code-frame': 7.27.1
1591 | '@babel/runtime': 7.28.4
1592 | '@types/aria-query': 5.0.4
1593 | aria-query: 5.3.0
1594 | dom-accessibility-api: 0.5.16
1595 | lz-string: 1.5.0
1596 | picocolors: 1.1.1
1597 | pretty-format: 27.5.1
1598 |
1599 | '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)':
1600 | dependencies:
1601 | '@testing-library/dom': 10.4.1
1602 |
1603 | '@types/aria-query@5.0.4': {}
1604 |
1605 | '@types/chai@5.2.2':
1606 | dependencies:
1607 | '@types/deep-eql': 4.0.2
1608 |
1609 | '@types/deep-eql@4.0.2': {}
1610 |
1611 | '@types/estree@1.0.8': {}
1612 |
1613 | '@types/node@22.18.6':
1614 | dependencies:
1615 | undici-types: 6.21.0
1616 |
1617 | '@types/query-selector-shadow-dom@1.0.4': {}
1618 |
1619 | '@types/tampermonkey@5.0.4': {}
1620 |
1621 | '@vitest/browser@3.2.4(playwright@1.55.1)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)':
1622 | dependencies:
1623 | '@testing-library/dom': 10.4.1
1624 | '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
1625 | '@vitest/mocker': 3.2.4(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))
1626 | '@vitest/utils': 3.2.4
1627 | magic-string: 0.30.19
1628 | sirv: 3.0.2
1629 | tinyrainbow: 2.0.0
1630 | vitest: 3.2.4(@types/node@22.18.6)(@vitest/browser@3.2.4)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
1631 | ws: 8.18.3
1632 | optionalDependencies:
1633 | playwright: 1.55.1
1634 | transitivePeerDependencies:
1635 | - bufferutil
1636 | - msw
1637 | - utf-8-validate
1638 | - vite
1639 |
1640 | '@vitest/expect@3.2.4':
1641 | dependencies:
1642 | '@types/chai': 5.2.2
1643 | '@vitest/spy': 3.2.4
1644 | '@vitest/utils': 3.2.4
1645 | chai: 5.3.3
1646 | tinyrainbow: 2.0.0
1647 |
1648 | '@vitest/mocker@3.2.4(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))':
1649 | dependencies:
1650 | '@vitest/spy': 3.2.4
1651 | estree-walker: 3.0.3
1652 | magic-string: 0.30.19
1653 | optionalDependencies:
1654 | vite: 6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
1655 |
1656 | '@vitest/mocker@3.2.4(vite@7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))':
1657 | dependencies:
1658 | '@vitest/spy': 3.2.4
1659 | estree-walker: 3.0.3
1660 | magic-string: 0.30.19
1661 | optionalDependencies:
1662 | vite: 7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
1663 |
1664 | '@vitest/pretty-format@3.2.4':
1665 | dependencies:
1666 | tinyrainbow: 2.0.0
1667 |
1668 | '@vitest/runner@3.2.4':
1669 | dependencies:
1670 | '@vitest/utils': 3.2.4
1671 | pathe: 2.0.3
1672 | strip-literal: 3.0.0
1673 |
1674 | '@vitest/snapshot@3.2.4':
1675 | dependencies:
1676 | '@vitest/pretty-format': 3.2.4
1677 | magic-string: 0.30.19
1678 | pathe: 2.0.3
1679 |
1680 | '@vitest/spy@3.2.4':
1681 | dependencies:
1682 | tinyspy: 4.0.4
1683 |
1684 | '@vitest/utils@3.2.4':
1685 | dependencies:
1686 | '@vitest/pretty-format': 3.2.4
1687 | loupe: 3.2.1
1688 | tinyrainbow: 2.0.0
1689 |
1690 | acorn-walk@8.3.4:
1691 | dependencies:
1692 | acorn: 8.15.0
1693 |
1694 | acorn@8.15.0: {}
1695 |
1696 | ansi-escapes@7.1.1:
1697 | dependencies:
1698 | environment: 1.1.0
1699 |
1700 | ansi-regex@5.0.1: {}
1701 |
1702 | ansi-regex@6.2.2: {}
1703 |
1704 | ansi-styles@5.2.0: {}
1705 |
1706 | ansi-styles@6.2.3: {}
1707 |
1708 | aria-query@5.3.0:
1709 | dependencies:
1710 | dequal: 2.0.3
1711 |
1712 | assertion-error@2.0.1: {}
1713 |
1714 | balanced-match@1.0.2: {}
1715 |
1716 | brace-expansion@1.1.12:
1717 | dependencies:
1718 | balanced-match: 1.0.2
1719 | concat-map: 0.0.1
1720 |
1721 | braces@3.0.3:
1722 | dependencies:
1723 | fill-range: 7.1.1
1724 |
1725 | bundle-name@4.1.0:
1726 | dependencies:
1727 | run-applescript: 7.1.0
1728 |
1729 | bundle-require@5.1.0(esbuild@0.27.0):
1730 | dependencies:
1731 | esbuild: 0.27.0
1732 | load-tsconfig: 0.2.5
1733 |
1734 | cac@6.7.14: {}
1735 |
1736 | chai@5.3.3:
1737 | dependencies:
1738 | assertion-error: 2.0.1
1739 | check-error: 2.1.1
1740 | deep-eql: 5.0.2
1741 | loupe: 3.2.1
1742 | pathval: 2.0.1
1743 |
1744 | check-error@2.1.1: {}
1745 |
1746 | chokidar@5.0.0:
1747 | dependencies:
1748 | readdirp: 5.0.0
1749 |
1750 | cli-cursor@5.0.0:
1751 | dependencies:
1752 | restore-cursor: 5.1.0
1753 |
1754 | cli-truncate@5.1.0:
1755 | dependencies:
1756 | slice-ansi: 7.1.2
1757 | string-width: 8.1.0
1758 |
1759 | colorette@2.0.20: {}
1760 |
1761 | commander@14.0.1: {}
1762 |
1763 | concat-map@0.0.1: {}
1764 |
1765 | cross-spawn@7.0.6:
1766 | dependencies:
1767 | path-key: 3.1.1
1768 | shebang-command: 2.0.0
1769 | which: 2.0.2
1770 |
1771 | cuint@0.2.2: {}
1772 |
1773 | debug@4.4.3:
1774 | dependencies:
1775 | ms: 2.1.3
1776 |
1777 | deep-eql@5.0.2: {}
1778 |
1779 | default-browser-id@5.0.0: {}
1780 |
1781 | default-browser@5.2.1:
1782 | dependencies:
1783 | bundle-name: 4.1.0
1784 | default-browser-id: 5.0.0
1785 |
1786 | define-lazy-prop@3.0.0: {}
1787 |
1788 | dequal@2.0.3: {}
1789 |
1790 | dom-accessibility-api@0.5.16: {}
1791 |
1792 | dom-serializer@2.0.0:
1793 | dependencies:
1794 | domelementtype: 2.3.0
1795 | domhandler: 5.0.3
1796 | entities: 4.5.0
1797 |
1798 | domelementtype@2.3.0: {}
1799 |
1800 | domhandler@5.0.3:
1801 | dependencies:
1802 | domelementtype: 2.3.0
1803 |
1804 | domutils@3.2.2:
1805 | dependencies:
1806 | dom-serializer: 2.0.0
1807 | domelementtype: 2.3.0
1808 | domhandler: 5.0.3
1809 |
1810 | emoji-regex@10.5.0: {}
1811 |
1812 | entities@4.5.0: {}
1813 |
1814 | entities@6.0.1: {}
1815 |
1816 | environment@1.1.0: {}
1817 |
1818 | es-module-lexer@1.7.0: {}
1819 |
1820 | es-toolkit@1.41.0: {}
1821 |
1822 | esbuild@0.25.10:
1823 | optionalDependencies:
1824 | '@esbuild/aix-ppc64': 0.25.10
1825 | '@esbuild/android-arm': 0.25.10
1826 | '@esbuild/android-arm64': 0.25.10
1827 | '@esbuild/android-x64': 0.25.10
1828 | '@esbuild/darwin-arm64': 0.25.10
1829 | '@esbuild/darwin-x64': 0.25.10
1830 | '@esbuild/freebsd-arm64': 0.25.10
1831 | '@esbuild/freebsd-x64': 0.25.10
1832 | '@esbuild/linux-arm': 0.25.10
1833 | '@esbuild/linux-arm64': 0.25.10
1834 | '@esbuild/linux-ia32': 0.25.10
1835 | '@esbuild/linux-loong64': 0.25.10
1836 | '@esbuild/linux-mips64el': 0.25.10
1837 | '@esbuild/linux-ppc64': 0.25.10
1838 | '@esbuild/linux-riscv64': 0.25.10
1839 | '@esbuild/linux-s390x': 0.25.10
1840 | '@esbuild/linux-x64': 0.25.10
1841 | '@esbuild/netbsd-arm64': 0.25.10
1842 | '@esbuild/netbsd-x64': 0.25.10
1843 | '@esbuild/openbsd-arm64': 0.25.10
1844 | '@esbuild/openbsd-x64': 0.25.10
1845 | '@esbuild/openharmony-arm64': 0.25.10
1846 | '@esbuild/sunos-x64': 0.25.10
1847 | '@esbuild/win32-arm64': 0.25.10
1848 | '@esbuild/win32-ia32': 0.25.10
1849 | '@esbuild/win32-x64': 0.25.10
1850 |
1851 | esbuild@0.27.0:
1852 | optionalDependencies:
1853 | '@esbuild/aix-ppc64': 0.27.0
1854 | '@esbuild/android-arm': 0.27.0
1855 | '@esbuild/android-arm64': 0.27.0
1856 | '@esbuild/android-x64': 0.27.0
1857 | '@esbuild/darwin-arm64': 0.27.0
1858 | '@esbuild/darwin-x64': 0.27.0
1859 | '@esbuild/freebsd-arm64': 0.27.0
1860 | '@esbuild/freebsd-x64': 0.27.0
1861 | '@esbuild/linux-arm': 0.27.0
1862 | '@esbuild/linux-arm64': 0.27.0
1863 | '@esbuild/linux-ia32': 0.27.0
1864 | '@esbuild/linux-loong64': 0.27.0
1865 | '@esbuild/linux-mips64el': 0.27.0
1866 | '@esbuild/linux-ppc64': 0.27.0
1867 | '@esbuild/linux-riscv64': 0.27.0
1868 | '@esbuild/linux-s390x': 0.27.0
1869 | '@esbuild/linux-x64': 0.27.0
1870 | '@esbuild/netbsd-arm64': 0.27.0
1871 | '@esbuild/netbsd-x64': 0.27.0
1872 | '@esbuild/openbsd-arm64': 0.27.0
1873 | '@esbuild/openbsd-x64': 0.27.0
1874 | '@esbuild/openharmony-arm64': 0.27.0
1875 | '@esbuild/sunos-x64': 0.27.0
1876 | '@esbuild/win32-arm64': 0.27.0
1877 | '@esbuild/win32-ia32': 0.27.0
1878 | '@esbuild/win32-x64': 0.27.0
1879 |
1880 | estree-walker@3.0.3:
1881 | dependencies:
1882 | '@types/estree': 1.0.8
1883 |
1884 | eventemitter3@5.0.1: {}
1885 |
1886 | expect-type@1.2.2: {}
1887 |
1888 | fdir@6.5.0(picomatch@4.0.3):
1889 | optionalDependencies:
1890 | picomatch: 4.0.3
1891 |
1892 | fill-range@7.1.1:
1893 | dependencies:
1894 | to-regex-range: 5.0.1
1895 |
1896 | fsevents@2.3.2:
1897 | optional: true
1898 |
1899 | fsevents@2.3.3:
1900 | optional: true
1901 |
1902 | get-east-asian-width@1.4.0: {}
1903 |
1904 | get-tsconfig@4.13.0:
1905 | dependencies:
1906 | resolve-pkg-maps: 1.0.0
1907 |
1908 | globrex@0.1.2: {}
1909 |
1910 | htmlparser2@10.0.0:
1911 | dependencies:
1912 | domelementtype: 2.3.0
1913 | domhandler: 5.0.3
1914 | domutils: 3.2.2
1915 | entities: 6.0.1
1916 |
1917 | import-meta-resolve@4.2.0: {}
1918 |
1919 | is-docker@3.0.0: {}
1920 |
1921 | is-fullwidth-code-point@5.1.0:
1922 | dependencies:
1923 | get-east-asian-width: 1.4.0
1924 |
1925 | is-inside-container@1.0.0:
1926 | dependencies:
1927 | is-docker: 3.0.0
1928 |
1929 | is-number@7.0.0: {}
1930 |
1931 | is-wsl@3.1.0:
1932 | dependencies:
1933 | is-inside-container: 1.0.0
1934 |
1935 | isexe@2.0.0: {}
1936 |
1937 | jiti@2.6.0:
1938 | optional: true
1939 |
1940 | js-tokens@4.0.0: {}
1941 |
1942 | js-tokens@9.0.1: {}
1943 |
1944 | lint-staged@16.2.1:
1945 | dependencies:
1946 | commander: 14.0.1
1947 | listr2: 9.0.4
1948 | micromatch: 4.0.8
1949 | nano-spawn: 1.0.3
1950 | pidtree: 0.6.0
1951 | string-argv: 0.3.2
1952 | yaml: 2.8.1
1953 |
1954 | listr2@9.0.4:
1955 | dependencies:
1956 | cli-truncate: 5.1.0
1957 | colorette: 2.0.20
1958 | eventemitter3: 5.0.1
1959 | log-update: 6.1.0
1960 | rfdc: 1.4.1
1961 | wrap-ansi: 9.0.2
1962 |
1963 | load-tsconfig@0.2.5: {}
1964 |
1965 | log-update@6.1.0:
1966 | dependencies:
1967 | ansi-escapes: 7.1.1
1968 | cli-cursor: 5.0.0
1969 | slice-ansi: 7.1.2
1970 | strip-ansi: 7.1.2
1971 | wrap-ansi: 9.0.2
1972 |
1973 | loupe@3.2.1: {}
1974 |
1975 | lz-string@1.5.0: {}
1976 |
1977 | magic-string@0.30.19:
1978 | dependencies:
1979 | '@jridgewell/sourcemap-codec': 1.5.5
1980 |
1981 | make-dir@3.1.0:
1982 | dependencies:
1983 | semver: 6.3.1
1984 |
1985 | micromatch@4.0.8:
1986 | dependencies:
1987 | braces: 3.0.3
1988 | picomatch: 2.3.1
1989 |
1990 | mime@2.5.2: {}
1991 |
1992 | mimic-function@5.0.1: {}
1993 |
1994 | minimatch@3.0.8:
1995 | dependencies:
1996 | brace-expansion: 1.1.12
1997 |
1998 | mrmime@2.0.1: {}
1999 |
2000 | ms@2.1.3: {}
2001 |
2002 | nano-spawn@1.0.3: {}
2003 |
2004 | nanoid@3.3.11: {}
2005 |
2006 | onetime@7.0.0:
2007 | dependencies:
2008 | mimic-function: 5.0.1
2009 |
2010 | open@10.2.0:
2011 | dependencies:
2012 | default-browser: 5.2.1
2013 | define-lazy-prop: 3.0.0
2014 | is-inside-container: 1.0.0
2015 | wsl-utils: 0.1.0
2016 |
2017 | path-key@3.1.1: {}
2018 |
2019 | pathe@2.0.3: {}
2020 |
2021 | pathval@2.0.1: {}
2022 |
2023 | picocolors@1.1.1: {}
2024 |
2025 | picomatch@2.3.1: {}
2026 |
2027 | picomatch@4.0.3: {}
2028 |
2029 | pidtree@0.6.0: {}
2030 |
2031 | playwright-core@1.55.1: {}
2032 |
2033 | playwright@1.55.1:
2034 | dependencies:
2035 | playwright-core: 1.55.1
2036 | optionalDependencies:
2037 | fsevents: 2.3.2
2038 |
2039 | postcss-url@10.1.3(postcss@8.5.6):
2040 | dependencies:
2041 | make-dir: 3.1.0
2042 | mime: 2.5.2
2043 | minimatch: 3.0.8
2044 | postcss: 8.5.6
2045 | xxhashjs: 0.2.2
2046 |
2047 | postcss@8.5.6:
2048 | dependencies:
2049 | nanoid: 3.3.11
2050 | picocolors: 1.1.1
2051 | source-map-js: 1.2.1
2052 |
2053 | prettier@3.6.2: {}
2054 |
2055 | pretty-format@27.5.1:
2056 | dependencies:
2057 | ansi-regex: 5.0.1
2058 | ansi-styles: 5.2.0
2059 | react-is: 17.0.2
2060 |
2061 | query-selector-shadow-dom@1.0.1: {}
2062 |
2063 | react-dom@19.1.1(react@19.1.1):
2064 | dependencies:
2065 | react: 19.1.1
2066 | scheduler: 0.26.0
2067 |
2068 | react-is@17.0.2: {}
2069 |
2070 | react@19.1.1: {}
2071 |
2072 | readdirp@5.0.0: {}
2073 |
2074 | resolve-pkg-maps@1.0.0: {}
2075 |
2076 | restore-cursor@5.1.0:
2077 | dependencies:
2078 | onetime: 7.0.0
2079 | signal-exit: 4.1.0
2080 |
2081 | rfdc@1.4.1: {}
2082 |
2083 | rollup@4.52.2:
2084 | dependencies:
2085 | '@types/estree': 1.0.8
2086 | optionalDependencies:
2087 | '@rollup/rollup-android-arm-eabi': 4.52.2
2088 | '@rollup/rollup-android-arm64': 4.52.2
2089 | '@rollup/rollup-darwin-arm64': 4.52.2
2090 | '@rollup/rollup-darwin-x64': 4.52.2
2091 | '@rollup/rollup-freebsd-arm64': 4.52.2
2092 | '@rollup/rollup-freebsd-x64': 4.52.2
2093 | '@rollup/rollup-linux-arm-gnueabihf': 4.52.2
2094 | '@rollup/rollup-linux-arm-musleabihf': 4.52.2
2095 | '@rollup/rollup-linux-arm64-gnu': 4.52.2
2096 | '@rollup/rollup-linux-arm64-musl': 4.52.2
2097 | '@rollup/rollup-linux-loong64-gnu': 4.52.2
2098 | '@rollup/rollup-linux-ppc64-gnu': 4.52.2
2099 | '@rollup/rollup-linux-riscv64-gnu': 4.52.2
2100 | '@rollup/rollup-linux-riscv64-musl': 4.52.2
2101 | '@rollup/rollup-linux-s390x-gnu': 4.52.2
2102 | '@rollup/rollup-linux-x64-gnu': 4.52.2
2103 | '@rollup/rollup-linux-x64-musl': 4.52.2
2104 | '@rollup/rollup-openharmony-arm64': 4.52.2
2105 | '@rollup/rollup-win32-arm64-msvc': 4.52.2
2106 | '@rollup/rollup-win32-ia32-msvc': 4.52.2
2107 | '@rollup/rollup-win32-x64-gnu': 4.52.2
2108 | '@rollup/rollup-win32-x64-msvc': 4.52.2
2109 | fsevents: 2.3.3
2110 |
2111 | run-applescript@7.1.0: {}
2112 |
2113 | scheduler@0.26.0: {}
2114 |
2115 | semver@6.3.1: {}
2116 |
2117 | shebang-command@2.0.0:
2118 | dependencies:
2119 | shebang-regex: 3.0.0
2120 |
2121 | shebang-regex@3.0.0: {}
2122 |
2123 | siginfo@2.0.0: {}
2124 |
2125 | signal-exit@4.1.0: {}
2126 |
2127 | simple-git-hooks@2.13.1: {}
2128 |
2129 | sirv@3.0.2:
2130 | dependencies:
2131 | '@polka/url': 1.0.0-next.29
2132 | mrmime: 2.0.1
2133 | totalist: 3.0.1
2134 |
2135 | slice-ansi@7.1.2:
2136 | dependencies:
2137 | ansi-styles: 6.2.3
2138 | is-fullwidth-code-point: 5.1.0
2139 |
2140 | source-map-js@1.2.1: {}
2141 |
2142 | stackback@0.0.2: {}
2143 |
2144 | std-env@3.9.0: {}
2145 |
2146 | string-argv@0.3.2: {}
2147 |
2148 | string-width@7.2.0:
2149 | dependencies:
2150 | emoji-regex: 10.5.0
2151 | get-east-asian-width: 1.4.0
2152 | strip-ansi: 7.1.2
2153 |
2154 | string-width@8.1.0:
2155 | dependencies:
2156 | get-east-asian-width: 1.4.0
2157 | strip-ansi: 7.1.2
2158 |
2159 | strip-ansi@7.1.2:
2160 | dependencies:
2161 | ansi-regex: 6.2.2
2162 |
2163 | strip-literal@3.0.0:
2164 | dependencies:
2165 | js-tokens: 9.0.1
2166 |
2167 | systemjs@6.15.1: {}
2168 |
2169 | tinybench@2.9.0: {}
2170 |
2171 | tinyexec@0.3.2: {}
2172 |
2173 | tinyglobby@0.2.15:
2174 | dependencies:
2175 | fdir: 6.5.0(picomatch@4.0.3)
2176 | picomatch: 4.0.3
2177 |
2178 | tinypool@1.1.1: {}
2179 |
2180 | tinyrainbow@2.0.0: {}
2181 |
2182 | tinyspy@4.0.4: {}
2183 |
2184 | to-regex-range@5.0.1:
2185 | dependencies:
2186 | is-number: 7.0.0
2187 |
2188 | totalist@3.0.1: {}
2189 |
2190 | tsconfck@3.1.6(typescript@5.9.2):
2191 | optionalDependencies:
2192 | typescript: 5.9.2
2193 |
2194 | tsx@4.21.0:
2195 | dependencies:
2196 | esbuild: 0.27.0
2197 | get-tsconfig: 4.13.0
2198 | optionalDependencies:
2199 | fsevents: 2.3.3
2200 |
2201 | typescript@5.9.2: {}
2202 |
2203 | undici-types@6.21.0: {}
2204 |
2205 | vite-node@3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1):
2206 | dependencies:
2207 | cac: 6.7.14
2208 | debug: 4.4.3
2209 | es-module-lexer: 1.7.0
2210 | pathe: 2.0.3
2211 | vite: 7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2212 | transitivePeerDependencies:
2213 | - '@types/node'
2214 | - jiti
2215 | - less
2216 | - lightningcss
2217 | - sass
2218 | - sass-embedded
2219 | - stylus
2220 | - sugarss
2221 | - supports-color
2222 | - terser
2223 | - tsx
2224 | - yaml
2225 |
2226 | vite-plugin-monkey@7.1.4(postcss@8.5.6)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)):
2227 | dependencies:
2228 | acorn: 8.15.0
2229 | acorn-walk: 8.3.4
2230 | cross-spawn: 7.0.6
2231 | htmlparser2: 10.0.0
2232 | import-meta-resolve: 4.2.0
2233 | magic-string: 0.30.19
2234 | mrmime: 2.0.1
2235 | open: 10.2.0
2236 | picocolors: 1.1.1
2237 | postcss-url: 10.1.3(postcss@8.5.6)
2238 | systemjs: 6.15.1
2239 | optionalDependencies:
2240 | vite: 6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2241 | transitivePeerDependencies:
2242 | - postcss
2243 |
2244 | vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)):
2245 | dependencies:
2246 | debug: 4.4.3
2247 | globrex: 0.1.2
2248 | tsconfck: 3.1.6(typescript@5.9.2)
2249 | optionalDependencies:
2250 | vite: 6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2251 | transitivePeerDependencies:
2252 | - supports-color
2253 | - typescript
2254 |
2255 | vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1):
2256 | dependencies:
2257 | esbuild: 0.25.10
2258 | fdir: 6.5.0(picomatch@4.0.3)
2259 | picomatch: 4.0.3
2260 | postcss: 8.5.6
2261 | rollup: 4.52.2
2262 | tinyglobby: 0.2.15
2263 | optionalDependencies:
2264 | '@types/node': 22.18.6
2265 | fsevents: 2.3.3
2266 | jiti: 2.6.0
2267 | tsx: 4.21.0
2268 | yaml: 2.8.1
2269 |
2270 | vite@7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1):
2271 | dependencies:
2272 | esbuild: 0.25.10
2273 | fdir: 6.5.0(picomatch@4.0.3)
2274 | picomatch: 4.0.3
2275 | postcss: 8.5.6
2276 | rollup: 4.52.2
2277 | tinyglobby: 0.2.15
2278 | optionalDependencies:
2279 | '@types/node': 22.18.6
2280 | fsevents: 2.3.3
2281 | jiti: 2.6.0
2282 | tsx: 4.21.0
2283 | yaml: 2.8.1
2284 |
2285 | vitest-browser-react@0.2.0(@vitest/browser@3.2.4)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(vitest@3.2.4):
2286 | dependencies:
2287 | '@vitest/browser': 3.2.4(playwright@1.55.1)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)
2288 | react: 19.1.1
2289 | react-dom: 19.1.1(react@19.1.1)
2290 | vitest: 3.2.4(@types/node@22.18.6)(@vitest/browser@3.2.4)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2291 |
2292 | vitest@3.2.4(@types/node@22.18.6)(@vitest/browser@3.2.4)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1):
2293 | dependencies:
2294 | '@types/chai': 5.2.2
2295 | '@vitest/expect': 3.2.4
2296 | '@vitest/mocker': 3.2.4(vite@7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))
2297 | '@vitest/pretty-format': 3.2.4
2298 | '@vitest/runner': 3.2.4
2299 | '@vitest/snapshot': 3.2.4
2300 | '@vitest/spy': 3.2.4
2301 | '@vitest/utils': 3.2.4
2302 | chai: 5.3.3
2303 | debug: 4.4.3
2304 | expect-type: 1.2.2
2305 | magic-string: 0.30.19
2306 | pathe: 2.0.3
2307 | picomatch: 4.0.3
2308 | std-env: 3.9.0
2309 | tinybench: 2.9.0
2310 | tinyexec: 0.3.2
2311 | tinyglobby: 0.2.15
2312 | tinypool: 1.1.1
2313 | tinyrainbow: 2.0.0
2314 | vite: 7.1.12(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2315 | vite-node: 3.2.4(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1)
2316 | why-is-node-running: 2.3.0
2317 | optionalDependencies:
2318 | '@types/node': 22.18.6
2319 | '@vitest/browser': 3.2.4(playwright@1.55.1)(vite@6.3.6(@types/node@22.18.6)(jiti@2.6.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4)
2320 | transitivePeerDependencies:
2321 | - jiti
2322 | - less
2323 | - lightningcss
2324 | - msw
2325 | - sass
2326 | - sass-embedded
2327 | - stylus
2328 | - sugarss
2329 | - supports-color
2330 | - terser
2331 | - tsx
2332 | - yaml
2333 |
2334 | which@2.0.2:
2335 | dependencies:
2336 | isexe: 2.0.0
2337 |
2338 | why-is-node-running@2.3.0:
2339 | dependencies:
2340 | siginfo: 2.0.0
2341 | stackback: 0.0.2
2342 |
2343 | wrap-ansi@9.0.2:
2344 | dependencies:
2345 | ansi-styles: 6.2.3
2346 | string-width: 7.2.0
2347 | strip-ansi: 7.1.2
2348 |
2349 | ws@8.18.3: {}
2350 |
2351 | wsl-utils@0.1.0:
2352 | dependencies:
2353 | is-wsl: 3.1.0
2354 |
2355 | xxhashjs@0.2.2:
2356 | dependencies:
2357 | cuint: 0.2.2
2358 |
2359 | yaml@2.8.1: {}
2360 |
2361 | zx@8.8.3: {}
2362 |
--------------------------------------------------------------------------------