├── .editorconfig ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── documentation.md │ └── feature_request.md └── workflows │ ├── build.yml │ ├── pr-build.yml │ └── release.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── README_zh.md ├── SECURITY.md ├── commitlint.config.js ├── eslint.config.js ├── lint-staged.config.js ├── package.json ├── packages ├── chrome-extension │ ├── config │ │ ├── pack.js │ │ ├── paths.js │ │ ├── webpack.common.js │ │ └── webpack.config.js │ ├── package.json │ ├── src │ │ ├── background.ts │ │ ├── contentScript.ts │ │ ├── injectedScript.ts │ │ ├── options.scss │ │ ├── options.ts │ │ ├── popup.scss │ │ ├── popup.ts │ │ └── types │ │ │ └── global.d.ts │ └── tsconfig.json ├── firefox-extension │ ├── config │ │ ├── pack.js │ │ ├── paths.js │ │ ├── webpack.common.js │ │ └── webpack.config.js │ ├── package.json │ ├── src │ │ ├── background.ts │ │ ├── contentScript.ts │ │ ├── injectedScript.ts │ │ ├── options.scss │ │ ├── options.ts │ │ ├── popup.scss │ │ ├── popup.ts │ │ └── types │ │ │ └── global.d.ts │ └── tsconfig.json └── shared │ ├── config │ ├── paths.js │ ├── webpack.common.js │ └── webpack.config.js │ ├── package.json │ ├── src │ ├── main.ts │ ├── types │ │ └── index.ts │ └── utils │ │ └── index.ts │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── public ├── chrome-manifest.json ├── firefox-manifest.json ├── icons │ ├── icon_128.png │ ├── icon_16.png │ ├── icon_32.png │ └── icon_48.png ├── options.html └── popup.html ├── renovate.json └── tsconfig.root.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # See https://editorconfig.org for more about editor config. 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | # Match all files 7 | [*] 8 | charset = utf-8 9 | end_of_line = lf 10 | indent_size = 2 11 | indent_style = space 12 | insert_final_newline = true 13 | max_line_length = 80 14 | trim_trailing_whitespace = true 15 | 16 | # Markdown files 17 | [*.md] 18 | max_line_length = 0 19 | trim_trailing_whitespace = false 20 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | custom: [https://zhensherlock.github.io/img/微信打赏.jpg] 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "🐛 Bug Report (缺陷反馈)" 3 | about: 'Report errors to help us improve(报告错误以帮助我们改进)' 4 | labels: '🐛 Bug' 5 | --- 6 | 7 | 12 | 13 | ### 以前的Issues 14 | 15 | 16 | 17 | ### 问题描述 18 | 19 | 20 | 21 | ### 复现步骤 22 | 23 | 26 | 27 | ### 环境详情 28 | 29 | - **`vue-devtools-unlocker` version:** 30 | - **`vue` version:** 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: 🤔 Ask a question(提问和讨论) 4 | url: https://github.com/zhensherlock/vue-devtools-unlocker/discussions 5 | about: Ask questions and discuss with other community members(提出问题并与其他社区成员讨论) 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "📝 Documentation (文档相关)" 3 | about: 'Repair or supplement documentation(修复或补充文档)' 4 | labels: '📝 Documentation' 5 | --- 6 | 7 | 10 | 11 | ## 哪些文档页面需要修复 12 | 13 | ## 需要修改什么来解决问题 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: '✨ Feature request(新需求)' 3 | about: 'Propose new functional requirements(提出新的功能需求)' 4 | labels: '✨ Feature Request' 5 | --- 6 | 7 | 10 | 11 | ## 新功能 12 | 13 | ### 您建议的新功能或更新功能是什么? 14 | 15 | ### 为什么要包含此功能? 16 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | build: 10 | if: github.repository == 'zhensherlock/vue-devtools-unlocker' 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | with: 16 | fetch-depth: 0 17 | 18 | - name: Install Node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: 22 22 | 23 | - name: Install PNPM 24 | run: npm i pnpm@latest -g 25 | 26 | - name: Setup npmrc 27 | run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc 28 | 29 | - name: setup pnpm config 30 | run: pnpm config set store-dir $PNPM_CACHE_FOLDER 31 | 32 | - name: Install Package 33 | run: pnpm install 34 | 35 | - name: Build Package 36 | run: pnpm build 37 | 38 | # - name: Test Package 39 | # run: pnpm run test 40 | 41 | # - name: Upload coverage reports to Codecov 42 | # uses: codecov/codecov-action@v5 43 | # with: 44 | # verbose: true 45 | # env: 46 | # CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 47 | -------------------------------------------------------------------------------- /.github/workflows/pr-build.yml: -------------------------------------------------------------------------------- 1 | name: PR Build 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | - dev 8 | 9 | jobs: 10 | build: 11 | if: github.repository == 'zhensherlock/vue-devtools-unlocker' 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v4 16 | with: 17 | fetch-depth: 0 18 | 19 | - name: Install Node 20 | uses: actions/setup-node@v4 21 | with: 22 | node-version: 22 23 | 24 | - name: Install PNPM 25 | run: npm i pnpm@latest -g 26 | 27 | - name: Setup npmrc 28 | run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc 29 | 30 | - name: setup pnpm config 31 | run: pnpm config set store-dir $PNPM_CACHE_FOLDER 32 | 33 | - name: Install Package 34 | run: pnpm install 35 | 36 | - name: Build Package 37 | run: pnpm build 38 | 39 | # - name: Test Package 40 | # run: pnpm run test 41 | 42 | - name: Pack Extension 43 | run: pnpm run pack 44 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | release: 5 | types: [created] 6 | 7 | jobs: 8 | build: 9 | if: github.repository == 'zhensherlock/vue-devtools-unlocker' 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: write 13 | steps: 14 | - name: Set Version from Release Tag 15 | run: echo "VERSION=${{ github.event.release.tag_name }}" >> $GITHUB_ENV 16 | 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Install Node 23 | uses: actions/setup-node@v4 24 | with: 25 | node-version: 22 26 | 27 | - name: Install PNPM 28 | run: npm i pnpm@latest -g 29 | 30 | - name: Setup npmrc 31 | run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > .npmrc 32 | 33 | - name: setup pnpm config 34 | run: pnpm config set store-dir $PNPM_CACHE_FOLDER 35 | 36 | - name: Install Package 37 | run: pnpm install 38 | 39 | - name: Build Package 40 | run: pnpm build 41 | 42 | - name: Pack Extension 43 | run: pnpm run pack 44 | 45 | - name: Install GitHub CLI 46 | run: sudo apt-get install gh 47 | 48 | - name: Upload Chrome Extension 49 | env: 50 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 51 | VERSION: ${{ env.VERSION }} 52 | run: gh release upload ${{ github.event.release.tag_name }} "packages/chrome-extension/release/Vue Devtools Unlocker-chrome-${{ env.VERSION }}.zip" --repo ${{ github.repository }} 53 | 54 | - name: Upload Firefox Extension 55 | env: 56 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 57 | VERSION: ${{ env.VERSION }} 58 | run: gh release upload ${{ github.event.release.tag_name }} "packages/firefox-extension/release/Vue Devtools Unlocker-firefox-${{ env.VERSION }}.zip" --repo ${{ github.repository }} 59 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules/ 5 | 6 | # production 7 | build/ 8 | 9 | # misc 10 | .DS_Store 11 | 12 | npm-debug.log* 13 | 14 | # packed files 15 | release/ 16 | 17 | .idea 18 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | npx --no-install commitlint --edit $1 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npx lint-staged 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v22 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # See https://prettier.io/docs/en/ignore.html for more about ignoring files from Prettier. 2 | 3 | # Ignore artifacts: 4 | build 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "singleQuote": true, 4 | "trailingComma": "es5", 5 | "bracketSpacing": true, 6 | "bracketSameLine": false, 7 | "arrowParens": "always", 8 | "htmlWhitespaceSensitivity": "css", 9 | "insertPragma": false, 10 | "semi": true 11 | } 12 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. 6 | 7 | We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. 8 | 9 | ## Our Standards 10 | 11 | Examples of behavior that contributes to a positive environment for our community include: 12 | 13 | - Demonstrating empathy and kindness toward other people 14 | - Being respectful of differing opinions, viewpoints, and experiences 15 | - Giving and gracefully accepting constructive feedback 16 | - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience 17 | - Focusing on what is best not just for us as individuals, but for the overall community 18 | 19 | Examples of unacceptable behavior include: 20 | 21 | - The use of sexualized language or imagery, and sexual attention or advances of any kind 22 | - Trolling, insulting or derogatory comments, and personal or political attacks 23 | - Public or private harassment 24 | - Publishing others' private information, such as a physical or email address, without their explicit permission 25 | - Other conduct which could reasonably be considered inappropriate in a professional setting 26 | 27 | ## Enforcement Responsibilities 28 | 29 | Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. 32 | 33 | ## Scope 34 | 35 | This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. 36 | 37 | ## Enforcement 38 | 39 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [zhensherlock@126.com](mailto:zhensherlock@126.com). All complaints will be reviewed and investigated promptly and fairly. 40 | 41 | All community leaders are obligated to respect the privacy and security of the reporter of any incident. 42 | 43 | ## Enforcement Guidelines 44 | 45 | Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: 46 | 47 | ### 1. Correction 48 | 49 | **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. 50 | 51 | **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. 52 | 53 | ### 2. Warning 54 | 55 | **Community Impact**: A violation through a single incident or series of actions. 56 | 57 | **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. 58 | 59 | ### 3. Temporary Ban 60 | 61 | **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. 62 | 63 | **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. 64 | 65 | ### 4. Permanent Ban 66 | 67 | **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. 68 | 69 | **Consequence**: A permanent ban from any sort of public interaction within the community. 70 | 71 | ## Attribution 72 | 73 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 74 | 75 | Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 76 | 77 | For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. 78 | 79 | [homepage]: https://www.contributor-covenant.org 80 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 81 | [Mozilla CoC]: https://github.com/mozilla/diversity 82 | [FAQ]: https://www.contributor-covenant.org/faq 83 | [translations]: https://www.contributor-covenant.org/translations 84 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 MichaelSun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |
6 | 7 | [![][chrome-web-store-version]][chrome-web-store-link] 8 | [![][chrome-web-store-size]][chrome-web-store-link] 9 | [![][chrome-web-store-last-updated]][chrome-web-store-link] 10 | [![][github-action-build-shield]][github-action-build-link] 11 | [![][github-license-shield]][github-license-link] 12 | 13 |
14 | 15 | # Vue DevTools Unlocker 16 | > A Chrome Extension that enables Vue DevTools in production environments. 17 | 18 | # Translations 19 | 20 | * [中文文档](README_zh.md) 21 | 22 | ## Features 23 | 24 | - 🔑 Unlocks Vue DevTools in production environments 25 | - 🌐 Works with both Vue 2 and Vue 3 26 | - 📦 Shows Vue version information 27 | 28 | ## Install 29 | 30 | [**Chrome** extension](https://chromewebstore.google.com/detail/vue-devtools-unlocker/fbihgkimpchlnlcnbffhbpcghafemopa) 31 | 32 | [**Edge** extension](https://microsoftedge.microsoft.com/addons/detail/vue-devtools-unlocker/lehadmjlbmlapdkapjoapbhhbcpcoepd) 33 | 34 | [**Firefox** extension](https://addons.mozilla.org/zh-CN/firefox/addon/vue-devtools-unlocker/) 35 | 36 | ## Usage 37 | 38 | 1. Install the extension from the Chrome Web Store 39 | 2. Visit any website using Vue.js in production 40 | 3. Open Chrome DevTools (F12 or right-click "Inspect") 41 | 4. Access the Vue panel in DevTools 42 | 43 | ## How It Works 44 | 45 | This extension modifies the Vue instance configuration to enable developer tools at runtime, even in production environments. 46 | 47 | ## Compatibility 48 | 49 | - Chrome 88+ 50 | - Vue.js 2.x and 3.x 51 | 52 | ## Maintainers 53 | 54 | [@zhensherlock](https://github.com/zhensherlock). 55 | 56 | ## Contributing 57 | 58 | Feel free to dive in! [Open an issue](https://github.com/zhensherlock/vue-devtools-unlocker/issues/new/choose) or submit PRs. 59 | 60 | Standard Readme follows the [Contributor Covenant](http://contributor-covenant.org/version/1/3/0/) Code of Conduct. 61 | 62 | ### Contributors 63 | 64 | This project exists thanks to all the people who contribute. 65 | 66 | 67 | 68 | 69 | 70 | ## License 71 | 72 | [MIT](LICENSE) © MichaelSun 73 | 74 | [chrome-web-store-link]: https://chromewebstore.google.com/detail/vue-devtools-unlocker/fbihgkimpchlnlcnbffhbpcghafemopa 75 | [chrome-web-store-version]: https://img.shields.io/chrome-web-store/v/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 76 | [chrome-web-store-size]: https://img.shields.io/chrome-web-store/size/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 77 | [chrome-web-store-last-updated]: https://img.shields.io/chrome-web-store/last-updated/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 78 | [github-action-build-link]: https://github.com/zhensherlock/vue-devtools-unlocker/actions/workflows/build.yml 79 | [github-action-build-shield]: https://img.shields.io/github/actions/workflow/status/zhensherlock/vue-devtools-unlocker/build.yml?branch=main&color=1677FF&label=build&labelColor=black&logo=githubactions&logoColor=white&style=flat-square 80 | [github-license-link]: https://github.com/zhensherlock/vue-devtools-unlocker/blob/main/LICENSE 81 | [github-license-shield]: https://img.shields.io/github/license/zhensherlock/vue-devtools-unlocker?color=1677FF&labelColor=black&style=flat-square 82 | -------------------------------------------------------------------------------- /README_zh.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |
6 | 7 | [![][chrome-web-store-version]][chrome-web-store-link] 8 | [![][chrome-web-store-size]][chrome-web-store-link] 9 | [![][chrome-web-store-last-updated]][chrome-web-store-link] 10 | [![][github-action-build-shield]][github-action-build-link] 11 | [![][github-license-shield]][github-license-link] 12 | 13 |
14 | 15 | # Vue DevTools Unlocker 16 | > 一个能够在生产环境中启用 Vue DevTools 的 Chrome 扩展。 17 | 18 | ## 功能特性 19 | 20 | - 🔑 在生产环境中解锁 Vue DevTools 21 | - 🌐 同时支持 Vue 2 和 Vue 3 22 | - 📦 显示 Vue 版本信息 23 | 24 | ## 安装 25 | 26 | [**Chrome** 扩展商店](https://chromewebstore.google.com/detail/vue-devtools-unlocker/fbihgkimpchlnlcnbffhbpcghafemopa) 27 | 28 | [**Edge** 扩展商店](https://microsoftedge.microsoft.com/addons/detail/vue-devtools-unlocker/lehadmjlbmlapdkapjoapbhhbcpcoepd) 29 | 30 | [**Firefox** 扩展商店](https://addons.mozilla.org/zh-CN/firefox/addon/vue-devtools-unlocker/) 31 | 32 | ## 使用方法 33 | 34 | 1. 从 Chrome 网上应用店安装扩展 35 | 2. 访问任何使用 Vue.js 的生产环境网站 36 | 3. 打开 Chrome DevTools (F12 或右键点击 "检查") 37 | 4. 在 DevTools 中查看 Vue 面板 38 | 39 | ## 工作原理 40 | 41 | 该扩展通过修改 Vue 实例的配置,在运行时启用开发者工具,即使在生产环境中也能正常工作。 42 | 43 | ## 兼容性 44 | 45 | - Chrome 88+ 46 | - Vue.js 2.x 和 3.x 47 | 48 | ## 维护者 49 | 50 | [@zhensherlock](https://github.com/zhensherlock)。 51 | 52 | ## 如何贡献 53 | 54 | 非常欢迎你的加入![提一个 Issue](https://github.com/zhensherlock/vue-devtools-unlocker/issues/new/choose) 或者提交一个 Pull Request。 55 | 56 | 标准 Readme 遵循 [Contributor Covenant](http://contributor-covenant.org/version/1/3/0/) 行为规范。 57 | 58 | ### 贡献者 59 | 60 | 感谢以下参与项目的人: 61 | 62 | 63 | 64 | 65 | 66 | ## 使用许可 67 | 68 | [MIT](LICENSE) © MichaelSun 69 | 70 | [chrome-web-store-link]: https://chromewebstore.google.com/detail/vue-devtools-unlocker/fbihgkimpchlnlcnbffhbpcghafemopa 71 | [chrome-web-store-version]: https://img.shields.io/chrome-web-store/v/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 72 | [chrome-web-store-size]: https://img.shields.io/chrome-web-store/size/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 73 | [chrome-web-store-last-updated]: https://img.shields.io/chrome-web-store/last-updated/fbihgkimpchlnlcnbffhbpcghafemopa?color=1677FF&labelColor=black&logo=chromewebstore&logoColor=white&style=flat-square 74 | [github-action-build-link]: https://github.com/zhensherlock/vue-devtools-unlocker/actions/workflows/build.yml 75 | [github-action-build-shield]: https://img.shields.io/github/actions/workflow/status/zhensherlock/vue-devtools-unlocker/build.yml?branch=main&color=1677FF&label=build&labelColor=black&logo=githubactions&logoColor=white&style=flat-square 76 | [github-license-link]: https://github.com/zhensherlock/vue-devtools-unlocker/blob/main/LICENSE 77 | [github-license-shield]: https://img.shields.io/github/license/zhensherlock/vue-devtools-unlocker?color=1677FF&labelColor=black&style=flat-square 78 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Have you found a security vulnerability? Please report it here: [zhensherlock@126.com](mailto:zhensherlock@126.com). 4 | 5 | Please provide as much details as possible: reproduction steps, screenshots, GIFs, etc. 6 | 7 | Thanks for keeping everyone safe! 8 | -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | rules: { 4 | // type 类型定义,表示 git 提交的 type 必须在以下类型范围内 5 | 'type-enum': [ 6 | 2, 7 | 'always', 8 | [ 9 | 'feat', // 新功能 10 | 'fix', // 修复 11 | 'docs', // 文档变更 12 | 'style', // 代码格式 13 | 'refactor', // 重构 14 | 'perf', // 性能优化 15 | 'test', // 增加测试 16 | 'build', // 构建 17 | 'ci', // CI配置 18 | 'chore', // 构建过程或辅助工具的变动 19 | 'revert', // 回退 20 | 'build', // 打包 21 | 'release', // 发版 22 | ], 23 | ], 24 | // subject 大小写不做校验 25 | 'subject-case': [0], 26 | }, 27 | } 28 | -------------------------------------------------------------------------------- /eslint.config.js: -------------------------------------------------------------------------------- 1 | // import tseslint from 'typescript-eslint'; 2 | // import prettierPlugin from 'eslint-plugin-prettier'; 3 | const tseslint = require('typescript-eslint'); 4 | const prettierPlugin = require('eslint-plugin-prettier'); 5 | 6 | module.exports = [ 7 | // 应用 TypeScript ESLint 推荐配置 8 | ...tseslint.configs.recommended, 9 | 10 | { 11 | ignores: ['node_modules/**', 'build/**', 'release/**', '**/*.json', '**/*.html', '**/*.css', '**/*.js'], 12 | }, 13 | 14 | { 15 | files: ['packages/shared/**/*.{js,ts}'], 16 | ignores: ['config/**/*.{js,ts}'], 17 | }, 18 | 19 | // 全局配置 20 | { 21 | files: ['packages/**/*.{js,ts}'], 22 | 23 | languageOptions: { 24 | ecmaVersion: 2020, 25 | sourceType: 'module', 26 | parserOptions: { 27 | ecmaVersion: 2020, 28 | sourceType: 'module', 29 | }, 30 | globals: { 31 | // 浏览器环境 32 | window: 'readonly', 33 | document: 'readonly', 34 | navigator: 'readonly', 35 | // Chrome 扩展 API 36 | chrome: 'readonly', 37 | }, 38 | }, 39 | 40 | rules: { 41 | 'prettier/prettier': 'error', 42 | '@typescript-eslint/explicit-function-return-type': 'off', 43 | '@typescript-eslint/no-explicit-any': 'warn', 44 | '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], 45 | 'no-console': ['warn', { allow: ['warn', 'error'] }], 46 | }, 47 | 48 | plugins: { 49 | prettier: prettierPlugin, 50 | }, 51 | }, 52 | ]; 53 | -------------------------------------------------------------------------------- /lint-staged.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'packages/**/*.{ts,js}': ['npx eslint'], 3 | } 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-devtools-unlocker", 3 | "version": "1.0.0", 4 | "description": "Enable Vue DevTools in production environments", 5 | "author": "zhensherlock", 6 | "license": "MIT", 7 | "scripts": { 8 | "dev": "pnpm -r --aggregate-output --filter=./packages/* watch", 9 | "dev:shared": "pnpm -r --aggregate-output --filter=./packages/shared watch", 10 | "dev:chrome": "pnpm -r --aggregate-output --filter=./packages/chrome-extension watch", 11 | "dev:firefox": "pnpm -r --aggregate-output --filter=./packages/firefox-extension watch", 12 | "build": "pnpm -r --aggregate-output --filter=./packages/* build", 13 | "build:shared": "pnpm -r --aggregate-output --filter=./packages/shared build", 14 | "build:chrome": "pnpm -r --aggregate-output --filter=./packages/chrome-extension build", 15 | "build:firefox": "pnpm -r --aggregate-output --filter=./packages/firefox-extension build", 16 | "pack": "pnpm -r --aggregate-output --filter=./packages/* build:zip", 17 | "pack:chrome": "pnpm -r --aggregate-output --filter=./packages/chrome-extension build:zip", 18 | "pack:firefox": "pnpm -r --aggregate-output --filter=./packages/firefox-extension build:zip", 19 | "prepare": "husky" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/zhensherlock/vue-devtools-unlocker.git" 24 | }, 25 | "bugs": { 26 | "url": "https://github.com/zhensherlock/vue-devtools-unlocker/issues" 27 | }, 28 | "devDependencies": { 29 | "@commitlint/cli": "^19.8.1", 30 | "@commitlint/config-conventional": "^19.8.1", 31 | "@types/chrome": "^0.0.326", 32 | "@typescript-eslint/parser": "^8.32.1", 33 | "adm-zip": "^0.5.16", 34 | "copy-webpack-plugin": "^13.0.0", 35 | "css-loader": "^7.1.2", 36 | "eslint": "^9.26.0", 37 | "eslint-plugin-prettier": "^5.4.0", 38 | "file-loader": "^6.2.0", 39 | "husky": "^9.1.7", 40 | "mini-css-extract-plugin": "^2.9.2", 41 | "prettier": "^3.5.3", 42 | "rimraf": "^6.0.1", 43 | "sass": "^1.88.0", 44 | "sass-loader": "^16.0.5", 45 | "terser-webpack-plugin": "^5.3.14", 46 | "ts-loader": "^9.5.2", 47 | "typescript": "^5.8.3", 48 | "typescript-eslint": "^8.32.1", 49 | "webpack": "^5.99.8", 50 | "webpack-cli": "^6.0.1", 51 | "webpack-merge": "^6.0.1" 52 | }, 53 | "engines": { 54 | "node": ">=22.0.0" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /packages/chrome-extension/config/pack.js: -------------------------------------------------------------------------------- 1 | import { readFileSync, existsSync, mkdirSync } from 'fs'; 2 | import { dirname, resolve } from 'path'; 3 | import AdmZip from 'adm-zip'; 4 | import { fileURLToPath } from 'url'; 5 | 6 | const __filename = fileURLToPath(import.meta.url); 7 | const __dirname = dirname(__filename); 8 | 9 | try { 10 | const { version, name } = JSON.parse(readFileSync(resolve(__dirname, '../build', 'manifest.json'), 'utf8')); 11 | 12 | const outdir = 'release'; 13 | const filename = `${name}-chrome-v${version}.zip`; 14 | const zip = new AdmZip(); 15 | zip.addLocalFolder('build'); 16 | if (!existsSync(outdir)) { 17 | mkdirSync(outdir); 18 | } 19 | zip.writeZip(`${outdir}/${filename}`); 20 | 21 | console.log(`Success! Created a ${filename} file under ${outdir} directory. You can upload this file to web store.`); 22 | } catch (e) { 23 | console.error('Error! Failed to generate a zip file.', e); 24 | } 25 | -------------------------------------------------------------------------------- /packages/chrome-extension/config/paths.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { fileURLToPath } from 'url'; 3 | import { dirname } from 'path'; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const PATHS = { 9 | src: path.resolve(__dirname, '../src'), 10 | build: path.resolve(__dirname, '../build'), 11 | }; 12 | 13 | export default PATHS; 14 | -------------------------------------------------------------------------------- /packages/chrome-extension/config/webpack.common.js: -------------------------------------------------------------------------------- 1 | import CopyWebpackPlugin from 'copy-webpack-plugin'; 2 | import MiniCssExtractPlugin from 'mini-css-extract-plugin'; 3 | 4 | import PATHS from './paths.js'; 5 | 6 | // used in the module rules and in the stats exlude list 7 | const IMAGE_TYPES = /\.(png|jpe?g|gif|svg)$/i; 8 | 9 | // To re-use webpack configuration across templates, 10 | // CLI maintains a common webpack configuration file - `webpack.common.js`. 11 | // Whenever user creates an extension, CLI adds `webpack.common.js` file 12 | // in template's `config` folder 13 | const common = { 14 | output: { 15 | // the build folder to output bundles and assets in. 16 | path: PATHS.build, 17 | // the filename template for entry chunks 18 | filename: '[name].js', 19 | clean: true, 20 | }, 21 | stats: { 22 | all: false, 23 | errors: true, 24 | builtAt: true, 25 | assets: true, 26 | excludeAssets: [IMAGE_TYPES], 27 | }, 28 | module: { 29 | rules: [ 30 | // Check for TypeScript files 31 | { 32 | test: /\.ts$/, 33 | use: ['ts-loader'], 34 | }, 35 | // Help webpack in understanding CSS files imported in .js files 36 | { 37 | test: /\.(css|scss|sass)$/, 38 | use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], 39 | }, 40 | // Check for images imported in .js files and 41 | { 42 | test: IMAGE_TYPES, 43 | use: [ 44 | { 45 | loader: 'file-loader', 46 | options: { 47 | outputPath: 'images', 48 | name: '[name].[ext]', 49 | }, 50 | }, 51 | ], 52 | }, 53 | ], 54 | }, 55 | resolve: { 56 | alias: { 57 | '@': PATHS.src, 58 | }, 59 | // Help webpack resolve these extensions in order 60 | extensions: ['.ts', '.js'], 61 | }, 62 | plugins: [ 63 | // Copy static assets from `public` folder to `build` folder 64 | new CopyWebpackPlugin({ 65 | patterns: [ 66 | { 67 | from: 'chrome-manifest.json', 68 | to: 'manifest.json', 69 | context: '../../public', 70 | }, 71 | { 72 | from: '**/*', 73 | context: '../../public', 74 | globOptions: { 75 | ignore: ['**/firefox-manifest.json', '**/chrome-manifest.json'], 76 | }, 77 | }, 78 | ], 79 | }), 80 | // Extract CSS into separate files 81 | new MiniCssExtractPlugin({ 82 | filename: '[name].css', 83 | }), 84 | ], 85 | }; 86 | 87 | export default common; 88 | -------------------------------------------------------------------------------- /packages/chrome-extension/config/webpack.config.js: -------------------------------------------------------------------------------- 1 | import TerserPlugin from 'terser-webpack-plugin'; 2 | import { merge } from 'webpack-merge'; 3 | import common from './webpack.common.js'; 4 | import PATHS from './paths.js'; 5 | 6 | // Merge webpack configuration files 7 | const config = (env, argv) => { 8 | const isProduction = argv.mode === 'production'; 9 | return merge(common, { 10 | entry: { 11 | popup: PATHS.src + '/popup.ts', 12 | contentScript: PATHS.src + '/contentScript.ts', 13 | background: PATHS.src + '/background.ts', 14 | injectedScript: PATHS.src + '/injectedScript.ts', 15 | options: PATHS.src + '/options.ts', 16 | }, 17 | devtool: isProduction ? false : 'source-map', 18 | optimization: { 19 | minimize: isProduction, 20 | minimizer: [ 21 | new TerserPlugin({ 22 | terserOptions: { 23 | compress: { 24 | drop_console: true, 25 | }, 26 | }, 27 | }), 28 | ], 29 | }, 30 | }); 31 | }; 32 | 33 | export default config; 34 | -------------------------------------------------------------------------------- /packages/chrome-extension/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vue-devtools-unlocker/chrome-extension", 3 | "version": "1.1.0", 4 | "description": "Enable Vue DevTools in production environments in Chrome browser", 5 | "type": "module", 6 | "scripts": { 7 | "clean": "rimraf build", 8 | "watch": "webpack --mode=development --watch --config config/webpack.config.js", 9 | "build": "npm run clean && webpack --mode=production --config config/webpack.config.js", 10 | "build:zip": "npm run build && node ./config/pack.js", 11 | "format": "prettier --write --ignore-unknown \"{config,public,src}/**/*.{html,css,js,ts,json}\"", 12 | "lint": "eslint --ext .ts,.js src/", 13 | "lint:fix": "eslint --ext .ts,.js src/ --fix" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/zhensherlock/vue-devtools-unlocker.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/zhensherlock/vue-devtools-unlocker/issues" 21 | }, 22 | "dependencies": { 23 | "@vue-devtools-unlocker/shared": "workspace:^" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/background.ts: -------------------------------------------------------------------------------- 1 | import { checkAllowedStatus } from '@vue-devtools-unlocker/shared'; 2 | 3 | // Store Vue DevTools unlock status for each tab 4 | const tabStatus: Record = {}; 5 | 6 | // Listen for messages from content script 7 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 8 | if (message.type === 'VueDevtoolsStatus' && sender.tab?.id) { 9 | // Store unlock status for current tab 10 | tabStatus[sender.tab.id] = message.payload; 11 | console.log(tabStatus); 12 | sendResponse({ success: true }); 13 | } 14 | }); 15 | 16 | // Listen for popup open event 17 | chrome.runtime.onConnect.addListener((port) => { 18 | if (port.name === 'popup') { 19 | port.postMessage({ 20 | type: 'VueDevtoolsStatus', 21 | payload: { 22 | loading: true, 23 | }, 24 | }); 25 | // When popup connects, query the current active tab 26 | chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { 27 | if (tabs[0] && tabs[0].id) { 28 | const tabId = tabs[0].id; 29 | let retryCount = 0; 30 | const MAX_RETRIES = 5; // (5 * 500ms = 2500ms) 31 | 32 | const checkStatus = () => { 33 | if (tabStatus[tabId]) { 34 | port.postMessage({ 35 | type: 'VueDevtoolsStatus', 36 | payload: tabStatus[tabId], 37 | }); 38 | } else if (retryCount < MAX_RETRIES) { 39 | retryCount++; 40 | setTimeout(checkStatus, 500); 41 | } else { 42 | // 超时后发送错误状态 43 | port.postMessage({ 44 | type: 'VueDevtoolsStatus', 45 | payload: { 46 | success: false, 47 | message: 'Unable to detect Vue application status. Please refresh the page and try again.', 48 | }, 49 | }); 50 | } 51 | }; 52 | 53 | checkStatus(); 54 | } 55 | }); 56 | } 57 | }); 58 | 59 | chrome.tabs.onRemoved.addListener((tabId) => { 60 | delete tabStatus[tabId]; 61 | }); 62 | 63 | chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { 64 | delete tabStatus[tabId]; 65 | if (changeInfo.status === 'complete' && tab.url) { 66 | checkAllowedStatus(tabId, tab.url); 67 | } 68 | }); 69 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/contentScript.ts: -------------------------------------------------------------------------------- 1 | import { injectScriptFile } from '@vue-devtools-unlocker/shared'; 2 | 3 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 4 | if (message.type === 'CheckIsAllowed' && message.isAllowed) { 5 | injectScriptFile('injectedScript.js'); 6 | window.addEventListener('message', (event) => { 7 | if (event.data?.source === 'vue-devtools-unlocker') { 8 | chrome.runtime.sendMessage(event.data); 9 | } 10 | }); 11 | 12 | sendResponse({ success: true }); 13 | } else { 14 | chrome.runtime.sendMessage({ 15 | source: 'vue-devtools-unlocker', 16 | type: 'VueDevtoolsStatus', 17 | payload: { 18 | success: false, 19 | isNotAllowed: true, 20 | message: 'This page is not allowed to use Vue DevTools.', 21 | }, 22 | }); 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/injectedScript.ts: -------------------------------------------------------------------------------- 1 | import { getVueInstanceWithRetry, unlockVueDevTools } from '@vue-devtools-unlocker/shared'; 2 | 3 | const devtools = window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 4 | 5 | const postMessageToExtension = (type: string = 'VueDevtoolsMessage', payload: unknown) => { 6 | window.postMessage( 7 | { 8 | source: 'vue-devtools-unlocker', 9 | type, 10 | payload, 11 | }, 12 | '*' 13 | ); 14 | }; 15 | 16 | if (devtools) { 17 | const version = window.__VUE__ ? 3 : 2; 18 | 19 | getVueInstanceWithRetry(version).then((instance) => { 20 | if (instance) { 21 | const { vueVersion } = unlockVueDevTools(devtools, version, instance); 22 | postMessageToExtension('VueDevtoolsStatus', { 23 | success: true, 24 | message: 'Vue DevTools unlocked successfully.', 25 | vueVersion, 26 | }); 27 | } else { 28 | postMessageToExtension('VueDevtoolsStatus', { 29 | success: false, 30 | message: 'Vue instance not found.', 31 | }); 32 | } 33 | }); 34 | } else { 35 | postMessageToExtension('VueDevtoolsStatus', { 36 | success: false, 37 | message: 'Vue DevTools not found.', 38 | }); 39 | } 40 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/options.scss: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | :root { 10 | --primary-color: #42b883; 11 | --secondary-color: #35495e; 12 | --background-color: #f8f8f8; 13 | --text-color: #2c3e50; 14 | --border-color: #e0e0e0; 15 | --success-color: #42b883; 16 | --error-color: #ff5252; 17 | } 18 | 19 | html { 20 | font-family: 21 | -apple-system, 22 | BlinkMacSystemFont, 23 | Segoe UI, 24 | Helvetica, 25 | Arial, 26 | sans-serif; 27 | } 28 | 29 | body { 30 | width: 400px; 31 | color: var(--text-color); 32 | } 33 | 34 | .container { 35 | background: #fff; 36 | padding: 20px; 37 | border-radius: 8px; 38 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 39 | } 40 | 41 | h1 { 42 | color: var(--secondary-color); 43 | margin-bottom: 20px; 44 | } 45 | 46 | main { 47 | margin-bottom: 20px; 48 | 49 | label { 50 | display: block; 51 | margin-bottom: 10px; 52 | color: var(--text-color); 53 | } 54 | 55 | textarea { 56 | width: 100%; 57 | height: 150px; 58 | padding: 10px; 59 | border: 1px solid var(--border-color); 60 | border-radius: 4px; 61 | font-family: monospace; 62 | resize: none; 63 | } 64 | 65 | .help-text { 66 | font-size: 12px; 67 | color: #666; 68 | margin-top: 5px; 69 | } 70 | } 71 | 72 | button { 73 | background: var(--primary-color); 74 | color: #fff; 75 | border: none; 76 | padding: 8px 16px; 77 | border-radius: 4px; 78 | cursor: pointer; 79 | 80 | &:hover { 81 | background: #3aa876; 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/options.ts: -------------------------------------------------------------------------------- 1 | import { getAllowedSites, setAllowedSites } from '@vue-devtools-unlocker/shared'; 2 | import '@/options.scss'; 3 | 4 | document.addEventListener('DOMContentLoaded', () => { 5 | const textarea = document.getElementById('allowedSites') as HTMLTextAreaElement; 6 | const saveButton = document.getElementById('save') as HTMLButtonElement; 7 | 8 | // Load saved settings 9 | getAllowedSites((text) => { 10 | textarea.value = text; 11 | }); 12 | 13 | // Save settings 14 | saveButton.addEventListener('click', () => { 15 | const sites = textarea.value 16 | .split('\n') 17 | .map((site) => site.trim()) 18 | .filter((site) => site.length > 0); 19 | 20 | setAllowedSites(sites, () => { 21 | saveButton.textContent = 'Saved!'; 22 | setTimeout(() => { 23 | saveButton.textContent = 'Save Settings'; 24 | }, 2000); 25 | }); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/popup.scss: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | :root { 10 | --primary-color: #42b883; 11 | --secondary-color: #35495e; 12 | --background-color: #f8f8f8; 13 | --text-color: #2c3e50; 14 | --border-color: #e0e0e0; 15 | --success-color: #42b883; 16 | --error-color: #ff5252; 17 | } 18 | 19 | html { 20 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif; 21 | } 22 | 23 | body { 24 | width: 300px; 25 | color: var(--text-color); 26 | } 27 | 28 | .container { 29 | display: flex; 30 | flex-direction: column; 31 | background-color: var(--background-color); 32 | overflow: hidden; 33 | } 34 | 35 | header { 36 | display: flex; 37 | align-items: center; 38 | padding: 12px 16px; 39 | background-color: white; 40 | color: var(--secondary-color); 41 | border-bottom: 1px solid var(--border-color); 42 | 43 | h1 { 44 | font-size: 16px; 45 | font-weight: 600; 46 | } 47 | 48 | .logo { 49 | width: 24px; 50 | height: 24px; 51 | margin-right: 10px; 52 | } 53 | } 54 | 55 | main { 56 | flex: 1; 57 | padding: 16px; 58 | 59 | .status-container { 60 | padding: 12px; 61 | border-radius: 6px; 62 | font-size: 14px; 63 | line-height: 1.5; 64 | background-color: white; 65 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); 66 | border: 1px solid var(--border-color); 67 | 68 | h3 { 69 | margin-bottom: 8px; 70 | } 71 | } 72 | 73 | .status-success { 74 | border-left: 4px solid var(--success-color); 75 | 76 | h3 { 77 | color: var(--success-color); 78 | } 79 | } 80 | 81 | .status-error { 82 | border-left: 4px solid var(--error-color); 83 | 84 | h3 { 85 | color: var(--error-color); 86 | } 87 | } 88 | 89 | .loading { 90 | display: flex; 91 | align-items: center; 92 | gap: 10px; 93 | } 94 | 95 | .version-info { 96 | margin-top: 8px; 97 | 98 | .version-tag { 99 | display: inline-block; 100 | padding: 2px 6px; 101 | background-color: var(--primary-color); 102 | color: white; 103 | border-radius: 4px; 104 | font-size: 12px; 105 | margin-left: 6px; 106 | } 107 | } 108 | 109 | .guide-text { 110 | margin-top: 8px; 111 | font-size: 12px; 112 | color: #666; 113 | } 114 | 115 | .guide-steps { 116 | margin-top: 4px; 117 | padding-left: 20px; 118 | } 119 | 120 | .spinner { 121 | width: 16px; 122 | height: 16px; 123 | border: 2px solid rgba(66, 184, 131, 0.2); 124 | border-top-color: var(--primary-color); 125 | border-radius: 50%; 126 | animation: spin 1s linear infinite; 127 | } 128 | 129 | @keyframes spin { 130 | to { 131 | transform: rotate(360deg); 132 | } 133 | } 134 | } 135 | 136 | footer { 137 | padding: 10px 16px; 138 | text-align: center; 139 | font-size: 12px; 140 | border-top: 1px solid var(--border-color); 141 | display: flex; 142 | justify-content: center; 143 | gap: 16px; 144 | 145 | .github-link, .settings-link { 146 | color: var(--secondary-color); 147 | text-decoration: none; 148 | display: inline-flex; 149 | align-items: center; 150 | gap: 4px; 151 | } 152 | 153 | .github-link:hover, .settings-link:hover { 154 | text-decoration: underline; 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/popup.ts: -------------------------------------------------------------------------------- 1 | import '@/popup.scss'; 2 | 3 | (function () { 4 | // Connect to background script 5 | const port = chrome.runtime.connect({ name: 'popup' }); 6 | 7 | // Connect to background script 8 | port.onMessage.addListener((message) => { 9 | if (message.type === 'VueDevtoolsStatus') { 10 | const data = message.payload; 11 | 12 | const statusElement = document.getElementById('status'); 13 | if (!statusElement) { 14 | return; 15 | } 16 | if (data.loading) { 17 | statusElement.className = 'status-container'; 18 | statusElement.innerHTML = ` 19 |
20 |
21 | Checking Vue DevTools status... 22 |
`; 23 | return; 24 | } 25 | if (data.success) { 26 | statusElement.className = 'status-container status-success'; 27 | statusElement.innerHTML = ` 28 |
29 |

✅ Unlocked Successfully

30 |

Vue DevTools has been successfully unlocked!

31 |

32 | Vue Version: ${data.vueVersion || 'Unknown'} 33 |

34 |
`; 35 | } else { 36 | statusElement.className = 'status-container status-error'; 37 | statusElement.innerHTML = ` 38 |
39 |

❌ Unlock Failed

40 |

${data.message || 'Unknown error'}

41 | ${ 42 | data.isNotAllowed 43 | ? ` 44 |

45 | To enable Vue DevTools on this page: 46 |

    47 |
  1. Click the "Settings" button below
  2. 48 |
  3. Add this website to the allowed sites list
  4. 49 |
  5. Refresh this page
  6. 50 |
51 |

` 52 | : '' 53 | } 54 |
55 | `; 56 | } 57 | } 58 | }); 59 | })(); 60 | 61 | document.addEventListener('DOMContentLoaded', () => { 62 | const settingsButton = document.getElementById('openSettings'); 63 | if (settingsButton) { 64 | settingsButton.addEventListener('click', (e) => { 65 | e.preventDefault(); 66 | chrome.runtime.openOptionsPage(); 67 | }); 68 | } 69 | }); 70 | -------------------------------------------------------------------------------- /packages/chrome-extension/src/types/global.d.ts: -------------------------------------------------------------------------------- 1 | import type { VueDevtoolsHook } from '@vue-devtools-unlocker/shared'; 2 | 3 | declare global { 4 | interface Window { 5 | __VUE_DEVTOOLS_GLOBAL_HOOK__: VueDevtoolsHook; 6 | __VUE__: boolean; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/chrome-extension/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.root.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "." 6 | }, 7 | "include": ["src"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/firefox-extension/config/pack.js: -------------------------------------------------------------------------------- 1 | import { readFileSync, existsSync, mkdirSync } from 'fs'; 2 | import { dirname, resolve } from 'path'; 3 | import AdmZip from 'adm-zip'; 4 | import { fileURLToPath } from 'url'; 5 | 6 | const __filename = fileURLToPath(import.meta.url); 7 | const __dirname = dirname(__filename); 8 | 9 | try { 10 | const { version, name } = JSON.parse(readFileSync(resolve(__dirname, '../build', 'manifest.json'), 'utf8')); 11 | 12 | const outdir = 'release'; 13 | const filename = `${name}-firefox-v${version}.zip`; 14 | const zip = new AdmZip(); 15 | zip.addLocalFolder('build'); 16 | if (!existsSync(outdir)) { 17 | mkdirSync(outdir); 18 | } 19 | zip.writeZip(`${outdir}/${filename}`); 20 | 21 | console.log(`Success! Created a ${filename} file under ${outdir} directory. You can upload this file to web store.`); 22 | } catch (e) { 23 | console.error('Error! Failed to generate a zip file.', e); 24 | } 25 | -------------------------------------------------------------------------------- /packages/firefox-extension/config/paths.js: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { fileURLToPath } from 'url'; 3 | import { dirname } from 'path'; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const PATHS = { 9 | src: path.resolve(__dirname, '../src'), 10 | build: path.resolve(__dirname, '../build'), 11 | }; 12 | 13 | export default PATHS; 14 | -------------------------------------------------------------------------------- /packages/firefox-extension/config/webpack.common.js: -------------------------------------------------------------------------------- 1 | import CopyWebpackPlugin from 'copy-webpack-plugin'; 2 | import MiniCssExtractPlugin from 'mini-css-extract-plugin'; 3 | 4 | import PATHS from './paths.js'; 5 | 6 | // used in the module rules and in the stats exlude list 7 | const IMAGE_TYPES = /\.(png|jpe?g|gif|svg)$/i; 8 | 9 | // To re-use webpack configuration across templates, 10 | // CLI maintains a common webpack configuration file - `webpack.common.js`. 11 | // Whenever user creates an extension, CLI adds `webpack.common.js` file 12 | // in template's `config` folder 13 | const common = { 14 | output: { 15 | // the build folder to output bundles and assets in. 16 | path: PATHS.build, 17 | // the filename template for entry chunks 18 | filename: '[name].js', 19 | clean: true, 20 | }, 21 | stats: { 22 | all: false, 23 | errors: true, 24 | builtAt: true, 25 | assets: true, 26 | excludeAssets: [IMAGE_TYPES], 27 | }, 28 | module: { 29 | rules: [ 30 | // Check for TypeScript files 31 | { 32 | test: /\.ts$/, 33 | use: ['ts-loader'], 34 | }, 35 | // Help webpack in understanding CSS files imported in .js files 36 | { 37 | test: /\.(css|scss|sass)$/, 38 | use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'], 39 | }, 40 | // Check for images imported in .js files and 41 | { 42 | test: IMAGE_TYPES, 43 | use: [ 44 | { 45 | loader: 'file-loader', 46 | options: { 47 | outputPath: 'images', 48 | name: '[name].[ext]', 49 | }, 50 | }, 51 | ], 52 | }, 53 | ], 54 | }, 55 | resolve: { 56 | alias: { 57 | '@': PATHS.src, 58 | }, 59 | // Help webpack resolve these extensions in order 60 | extensions: ['.ts', '.js'], 61 | }, 62 | plugins: [ 63 | // Copy static assets from `public` folder to `build` folder 64 | new CopyWebpackPlugin({ 65 | patterns: [ 66 | { 67 | from: 'firefox-manifest.json', 68 | to: 'manifest.json', 69 | context: '../../public', 70 | }, 71 | { 72 | from: '**/*', 73 | context: '../../public', 74 | globOptions: { 75 | ignore: ['**/firefox-manifest.json', '**/chrome-manifest.json'], 76 | }, 77 | }, 78 | ], 79 | }), 80 | // Extract CSS into separate files 81 | new MiniCssExtractPlugin({ 82 | filename: '[name].css', 83 | }), 84 | ], 85 | }; 86 | 87 | export default common; 88 | -------------------------------------------------------------------------------- /packages/firefox-extension/config/webpack.config.js: -------------------------------------------------------------------------------- 1 | import TerserPlugin from 'terser-webpack-plugin'; 2 | import { merge } from 'webpack-merge'; 3 | import common from './webpack.common.js'; 4 | import PATHS from './paths.js'; 5 | 6 | // Merge webpack configuration files 7 | const config = (env, argv) => { 8 | const isProduction = argv.mode === 'production'; 9 | return merge(common, { 10 | entry: { 11 | popup: PATHS.src + '/popup.ts', 12 | contentScript: PATHS.src + '/contentScript.ts', 13 | background: PATHS.src + '/background.ts', 14 | injectedScript: PATHS.src + '/injectedScript.ts', 15 | options: PATHS.src + '/options.ts', 16 | }, 17 | devtool: isProduction ? false : 'source-map', 18 | optimization: { 19 | minimize: isProduction, 20 | minimizer: [ 21 | new TerserPlugin({ 22 | terserOptions: { 23 | compress: { 24 | drop_console: true, 25 | }, 26 | }, 27 | }), 28 | ], 29 | }, 30 | }); 31 | }; 32 | 33 | export default config; 34 | -------------------------------------------------------------------------------- /packages/firefox-extension/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vue-devtools-unlocker/firefox-extension", 3 | "version": "1.1.0", 4 | "description": "Enable Vue DevTools in production environments in Firefox browser", 5 | "type": "module", 6 | "scripts": { 7 | "clean": "rimraf build", 8 | "watch": "webpack --mode=development --watch --config config/webpack.config.js", 9 | "build": "npm run clean && webpack --mode=production --config config/webpack.config.js", 10 | "build:zip": "npm run build && node ./config/pack.js", 11 | "format": "prettier --write --ignore-unknown \"{config,public,src}/**/*.{html,css,js,ts,json}\"", 12 | "lint": "eslint --ext .ts,.js src/", 13 | "lint:fix": "eslint --ext .ts,.js src/ --fix" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/zhensherlock/vue-devtools-unlocker.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/zhensherlock/vue-devtools-unlocker/issues" 21 | }, 22 | "dependencies": { 23 | "@vue-devtools-unlocker/shared": "workspace:^" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/background.ts: -------------------------------------------------------------------------------- 1 | import { checkAllowedStatus } from '@vue-devtools-unlocker/shared'; 2 | 3 | // Store Vue DevTools unlock status for each tab 4 | const tabStatus: Record = {}; 5 | 6 | // Listen for messages from content script 7 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 8 | if (message.type === 'VueDevtoolsStatus' && sender.tab?.id) { 9 | // Store unlock status for current tab 10 | tabStatus[sender.tab.id] = message.payload; 11 | console.log(tabStatus); 12 | sendResponse({ success: true }); 13 | } 14 | }); 15 | 16 | // Listen for popup open event 17 | chrome.runtime.onConnect.addListener((port) => { 18 | if (port.name === 'popup') { 19 | port.postMessage({ 20 | type: 'VueDevtoolsStatus', 21 | payload: { 22 | loading: true, 23 | }, 24 | }); 25 | // When popup connects, query the current active tab 26 | chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { 27 | if (tabs[0] && tabs[0].id) { 28 | const tabId = tabs[0].id; 29 | let retryCount = 0; 30 | const MAX_RETRIES = 5; // (5 * 500ms = 2500ms) 31 | 32 | const checkStatus = () => { 33 | if (tabStatus[tabId]) { 34 | port.postMessage({ 35 | type: 'VueDevtoolsStatus', 36 | payload: tabStatus[tabId], 37 | }); 38 | } else if (retryCount < MAX_RETRIES) { 39 | retryCount++; 40 | setTimeout(checkStatus, 500); 41 | } else { 42 | // 超时后发送错误状态 43 | port.postMessage({ 44 | type: 'VueDevtoolsStatus', 45 | payload: { 46 | success: false, 47 | message: 'Unable to detect Vue application status. Please refresh the page and try again.', 48 | }, 49 | }); 50 | } 51 | }; 52 | 53 | checkStatus(); 54 | } 55 | }); 56 | } 57 | }); 58 | 59 | chrome.tabs.onRemoved.addListener((tabId) => { 60 | delete tabStatus[tabId]; 61 | }); 62 | 63 | chrome.tabs.onUpdated.addListener((tabId, _changeInfo, tab) => { 64 | delete tabStatus[tabId]; 65 | if (tab.url) { 66 | checkAllowedStatus(tabId, tab.url); 67 | } 68 | }); 69 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/contentScript.ts: -------------------------------------------------------------------------------- 1 | import { injectScriptFile } from '@vue-devtools-unlocker/shared'; 2 | 3 | chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { 4 | if (message.type === 'CheckIsAllowed' && message.isAllowed) { 5 | injectScriptFile('injectedScript.js'); 6 | window.addEventListener('message', (event) => { 7 | if (event.data?.source === 'vue-devtools-unlocker') { 8 | chrome.runtime.sendMessage(event.data); 9 | } 10 | }); 11 | 12 | sendResponse({ success: true }); 13 | } else { 14 | chrome.runtime.sendMessage({ 15 | source: 'vue-devtools-unlocker', 16 | type: 'VueDevtoolsStatus', 17 | payload: { 18 | success: false, 19 | isNotAllowed: true, 20 | message: 'This page is not allowed to use Vue DevTools.', 21 | }, 22 | }); 23 | } 24 | }); 25 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/injectedScript.ts: -------------------------------------------------------------------------------- 1 | import { getVueInstanceWithRetry, unlockVueDevTools } from '@vue-devtools-unlocker/shared'; 2 | 3 | const devtools = window.__VUE_DEVTOOLS_GLOBAL_HOOK__; 4 | 5 | const postMessageToExtension = (type: string = 'VueDevtoolsMessage', payload: unknown) => { 6 | window.postMessage( 7 | { 8 | source: 'vue-devtools-unlocker', 9 | type, 10 | payload, 11 | }, 12 | '*' 13 | ); 14 | }; 15 | 16 | if (devtools) { 17 | const version = window.__VUE__ ? 3 : 2; 18 | 19 | getVueInstanceWithRetry(version).then((instance) => { 20 | if (instance) { 21 | const { vueVersion } = unlockVueDevTools(devtools, version, instance); 22 | postMessageToExtension('VueDevtoolsStatus', { 23 | success: true, 24 | message: 'Vue DevTools unlocked successfully.', 25 | vueVersion, 26 | }); 27 | } else { 28 | postMessageToExtension('VueDevtoolsStatus', { 29 | success: false, 30 | message: 'Vue instance not found.', 31 | }); 32 | } 33 | }); 34 | } else { 35 | postMessageToExtension('VueDevtoolsStatus', { 36 | success: false, 37 | message: 'Vue DevTools not found.', 38 | }); 39 | } 40 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/options.scss: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | :root { 10 | --primary-color: #42b883; 11 | --secondary-color: #35495e; 12 | --background-color: #f8f8f8; 13 | --text-color: #2c3e50; 14 | --border-color: #e0e0e0; 15 | --success-color: #42b883; 16 | --error-color: #ff5252; 17 | } 18 | 19 | html { 20 | font-family: 21 | -apple-system, 22 | BlinkMacSystemFont, 23 | Segoe UI, 24 | Helvetica, 25 | Arial, 26 | sans-serif; 27 | } 28 | 29 | body { 30 | width: 400px; 31 | color: var(--text-color); 32 | } 33 | 34 | .container { 35 | background: #fff; 36 | padding: 20px; 37 | border-radius: 8px; 38 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 39 | } 40 | 41 | h1 { 42 | color: var(--secondary-color); 43 | margin-bottom: 20px; 44 | } 45 | 46 | main { 47 | margin-bottom: 20px; 48 | 49 | label { 50 | display: block; 51 | margin-bottom: 10px; 52 | color: var(--text-color); 53 | } 54 | 55 | textarea { 56 | width: 100%; 57 | height: 150px; 58 | padding: 10px; 59 | border: 1px solid var(--border-color); 60 | border-radius: 4px; 61 | font-family: monospace; 62 | resize: none; 63 | } 64 | 65 | .help-text { 66 | font-size: 12px; 67 | color: #666; 68 | margin-top: 5px; 69 | } 70 | } 71 | 72 | button { 73 | background: var(--primary-color); 74 | color: #fff; 75 | border: none; 76 | padding: 8px 16px; 77 | border-radius: 4px; 78 | cursor: pointer; 79 | 80 | &:hover { 81 | background: #3aa876; 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/options.ts: -------------------------------------------------------------------------------- 1 | import { getAllowedSites, setAllowedSites } from '@vue-devtools-unlocker/shared'; 2 | import '@/options.scss'; 3 | 4 | document.addEventListener('DOMContentLoaded', () => { 5 | const textarea = document.getElementById('allowedSites') as HTMLTextAreaElement; 6 | const saveButton = document.getElementById('save') as HTMLButtonElement; 7 | 8 | // Load saved settings 9 | getAllowedSites((text) => { 10 | textarea.value = text; 11 | }); 12 | 13 | // Save settings 14 | saveButton.addEventListener('click', () => { 15 | const sites = textarea.value 16 | .split('\n') 17 | .map((site) => site.trim()) 18 | .filter((site) => site.length > 0); 19 | 20 | setAllowedSites(sites, () => { 21 | saveButton.textContent = 'Saved!'; 22 | setTimeout(() => { 23 | saveButton.textContent = 'Save Settings'; 24 | }, 2000); 25 | }); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/popup.scss: -------------------------------------------------------------------------------- 1 | *, 2 | *::before, 3 | *::after { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | :root { 10 | --primary-color: #42b883; 11 | --secondary-color: #35495e; 12 | --background-color: #f8f8f8; 13 | --text-color: #2c3e50; 14 | --border-color: #e0e0e0; 15 | --success-color: #42b883; 16 | --error-color: #ff5252; 17 | } 18 | 19 | html { 20 | font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif; 21 | } 22 | 23 | body { 24 | width: 300px; 25 | color: var(--text-color); 26 | } 27 | 28 | .container { 29 | display: flex; 30 | flex-direction: column; 31 | background-color: var(--background-color); 32 | overflow: hidden; 33 | } 34 | 35 | header { 36 | display: flex; 37 | align-items: center; 38 | padding: 12px 16px; 39 | background-color: white; 40 | color: var(--secondary-color); 41 | border-bottom: 1px solid var(--border-color); 42 | 43 | h1 { 44 | font-size: 16px; 45 | font-weight: 600; 46 | } 47 | 48 | .logo { 49 | width: 24px; 50 | height: 24px; 51 | margin-right: 10px; 52 | } 53 | } 54 | 55 | main { 56 | flex: 1; 57 | padding: 16px; 58 | 59 | .status-container { 60 | padding: 12px; 61 | border-radius: 6px; 62 | font-size: 14px; 63 | line-height: 1.5; 64 | background-color: white; 65 | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); 66 | border: 1px solid var(--border-color); 67 | 68 | h3 { 69 | margin-bottom: 8px; 70 | } 71 | } 72 | 73 | .status-success { 74 | border-left: 4px solid var(--success-color); 75 | 76 | h3 { 77 | color: var(--success-color); 78 | } 79 | } 80 | 81 | .status-error { 82 | border-left: 4px solid var(--error-color); 83 | 84 | h3 { 85 | color: var(--error-color); 86 | } 87 | } 88 | 89 | .loading { 90 | display: flex; 91 | align-items: center; 92 | gap: 10px; 93 | } 94 | 95 | .version-info { 96 | margin-top: 8px; 97 | 98 | .version-tag { 99 | display: inline-block; 100 | padding: 2px 6px; 101 | background-color: var(--primary-color); 102 | color: white; 103 | border-radius: 4px; 104 | font-size: 12px; 105 | margin-left: 6px; 106 | } 107 | } 108 | 109 | .guide-text { 110 | margin-top: 8px; 111 | font-size: 12px; 112 | color: #666; 113 | } 114 | 115 | .guide-steps { 116 | margin-top: 4px; 117 | padding-left: 20px; 118 | } 119 | 120 | .spinner { 121 | width: 16px; 122 | height: 16px; 123 | border: 2px solid rgba(66, 184, 131, 0.2); 124 | border-top-color: var(--primary-color); 125 | border-radius: 50%; 126 | animation: spin 1s linear infinite; 127 | } 128 | 129 | @keyframes spin { 130 | to { 131 | transform: rotate(360deg); 132 | } 133 | } 134 | } 135 | 136 | footer { 137 | padding: 10px 16px; 138 | text-align: center; 139 | font-size: 12px; 140 | border-top: 1px solid var(--border-color); 141 | display: flex; 142 | justify-content: center; 143 | gap: 16px; 144 | 145 | .github-link, .settings-link { 146 | color: var(--secondary-color); 147 | text-decoration: none; 148 | display: inline-flex; 149 | align-items: center; 150 | gap: 4px; 151 | } 152 | 153 | .github-link:hover, .settings-link:hover { 154 | text-decoration: underline; 155 | } 156 | } 157 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/popup.ts: -------------------------------------------------------------------------------- 1 | import '@/popup.scss'; 2 | 3 | (function () { 4 | // Connect to background script 5 | const port = chrome.runtime.connect({ name: 'popup' }); 6 | 7 | // Connect to background script 8 | port.onMessage.addListener((message) => { 9 | if (message.type === 'VueDevtoolsStatus') { 10 | const data = message.payload; 11 | 12 | const statusElement = document.getElementById('status'); 13 | if (!statusElement) { 14 | return; 15 | } 16 | if (data.loading) { 17 | statusElement.className = 'status-container'; 18 | statusElement.innerHTML = ` 19 |
20 |
21 | Checking Vue DevTools status... 22 |
`; 23 | return; 24 | } 25 | if (data.success) { 26 | statusElement.className = 'status-container status-success'; 27 | statusElement.innerHTML = ` 28 |
29 |

✅ Unlocked Successfully

30 |

Vue DevTools has been successfully unlocked!

31 |

32 | Vue Version: ${data.vueVersion || 'Unknown'} 33 |

34 |
`; 35 | } else { 36 | statusElement.className = 'status-container status-error'; 37 | statusElement.innerHTML = ` 38 |
39 |

❌ Unlock Failed

40 |

${data.message || 'Unknown error'}

41 | ${ 42 | data.isNotAllowed 43 | ? ` 44 |

45 | To enable Vue DevTools on this page: 46 |

    47 |
  1. Click the "Settings" button below
  2. 48 |
  3. Add this website to the allowed sites list
  4. 49 |
  5. Refresh this page
  6. 50 |
51 |

` 52 | : '' 53 | } 54 |
55 | `; 56 | } 57 | } 58 | }); 59 | })(); 60 | 61 | document.addEventListener('DOMContentLoaded', () => { 62 | const settingsButton = document.getElementById('openSettings'); 63 | if (settingsButton) { 64 | settingsButton.addEventListener('click', (e) => { 65 | e.preventDefault(); 66 | chrome.runtime.openOptionsPage(); 67 | }); 68 | } 69 | }); 70 | -------------------------------------------------------------------------------- /packages/firefox-extension/src/types/global.d.ts: -------------------------------------------------------------------------------- 1 | import type { VueDevtoolsHook } from '@vue-devtools-unlocker/shared'; 2 | 3 | declare global { 4 | interface Window { 5 | __VUE_DEVTOOLS_GLOBAL_HOOK__: VueDevtoolsHook; 6 | __VUE__: boolean; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/firefox-extension/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.root.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "." 6 | }, 7 | "include": ["src"] 8 | } 9 | -------------------------------------------------------------------------------- /packages/shared/config/paths.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | const PATHS = { 4 | src: path.resolve(__dirname, '../src'), 5 | build: path.resolve(__dirname, '../build'), 6 | }; 7 | 8 | module.exports = PATHS; 9 | -------------------------------------------------------------------------------- /packages/shared/config/webpack.common.js: -------------------------------------------------------------------------------- 1 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 2 | 3 | const PATHS = require('./paths'); 4 | 5 | // used in the module rules and in the stats exlude list 6 | const IMAGE_TYPES = /\.(png|jpe?g|gif|svg)$/i; 7 | 8 | // To re-use webpack configuration across templates, 9 | // CLI maintains a common webpack configuration file - `webpack.common.js`. 10 | // Whenever user creates an extension, CLI adds `webpack.common.js` file 11 | // in template's `config` folder 12 | const common = { 13 | output: { 14 | // the build folder to output bundles and assets in. 15 | path: PATHS.build, 16 | // the filename template for entry chunks 17 | filename: '[name].js', 18 | clean: true, 19 | library: { 20 | type: 'commonjs2', 21 | }, 22 | }, 23 | stats: { 24 | all: false, 25 | errors: true, 26 | builtAt: true, 27 | assets: true, 28 | excludeAssets: [IMAGE_TYPES], 29 | }, 30 | module: { 31 | rules: [ 32 | // Check for TypeScript files 33 | { 34 | test: /\.ts$/, 35 | use: ['ts-loader'], 36 | }, 37 | // Help webpack in understanding CSS files imported in .js files 38 | { 39 | test: /\.css$/, 40 | use: [MiniCssExtractPlugin.loader, 'css-loader'], 41 | }, 42 | // Check for images imported in .js files and 43 | { 44 | test: IMAGE_TYPES, 45 | use: [ 46 | { 47 | loader: 'file-loader', 48 | options: { 49 | outputPath: 'images', 50 | name: '[name].[ext]', 51 | }, 52 | }, 53 | ], 54 | }, 55 | ], 56 | }, 57 | resolve: { 58 | alias: { 59 | '@': PATHS.src, 60 | }, 61 | // Help webpack resolve these extensions in order 62 | extensions: ['.ts', '.js'], 63 | }, 64 | plugins: [ 65 | // Extract CSS into separate files 66 | new MiniCssExtractPlugin({ 67 | filename: '[name].css', 68 | }), 69 | ], 70 | }; 71 | 72 | module.exports = common; 73 | -------------------------------------------------------------------------------- /packages/shared/config/webpack.config.js: -------------------------------------------------------------------------------- 1 | const TerserPlugin = require('terser-webpack-plugin'); 2 | const { merge } = require('webpack-merge'); 3 | 4 | const common = require('./webpack.common.js'); 5 | const PATHS = require('./paths'); 6 | 7 | // Merge webpack configuration files 8 | const config = (env, argv) => { 9 | const isProduction = argv.mode === 'production'; 10 | return merge(common, { 11 | entry: { 12 | main: PATHS.src + '/main.ts', 13 | }, 14 | devtool: isProduction ? false : 'source-map', 15 | optimization: { 16 | minimize: isProduction, 17 | minimizer: [ 18 | new TerserPlugin({ 19 | terserOptions: { 20 | compress: { 21 | drop_console: true, 22 | }, 23 | }, 24 | }), 25 | ], 26 | }, 27 | }); 28 | }; 29 | 30 | module.exports = config; 31 | -------------------------------------------------------------------------------- /packages/shared/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vue-devtools-unlocker/shared", 3 | "version": "1.1.0", 4 | "description": "Enable Vue DevTools in production environments", 5 | "author": "zhensherlock", 6 | "license": "MIT", 7 | "main": "build/main.js", 8 | "types": "build/types/main.d.ts", 9 | "scripts": { 10 | "watch": "webpack --mode=development --watch --config config/webpack.config.js", 11 | "build": "webpack --mode=production --config config/webpack.config.js", 12 | "format": "prettier --write --ignore-unknown \"{config,public,src}/**/*.{html,css,js,ts,json}\"", 13 | "lint": "eslint --ext .ts,.js src/", 14 | "lint:fix": "eslint --ext .ts,.js src/ --fix" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/zhensherlock/vue-devtools-unlocker.git" 19 | }, 20 | "bugs": { 21 | "url": "https://github.com/zhensherlock/vue-devtools-unlocker/issues" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/shared/src/main.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /packages/shared/src/types/index.ts: -------------------------------------------------------------------------------- 1 | export interface VueDevtoolsHook { 2 | enabled?: boolean; 3 | emit: (event: string, ...args: unknown[]) => void; 4 | } 5 | 6 | export interface Vue2Instance { 7 | super?: Vue2Instance; 8 | version: string; 9 | config: { 10 | devtools: boolean; 11 | globalProperties: { 12 | $pinia?: { 13 | use: () => void; 14 | }; 15 | $router?: { 16 | use: () => void; 17 | }; 18 | }; 19 | }; 20 | } 21 | 22 | export interface Vue3Instance { 23 | version: string; 24 | } 25 | 26 | export interface VueInstance extends Vue2Instance, Vue3Instance {} 27 | -------------------------------------------------------------------------------- /packages/shared/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | import type { Vue2Instance, VueDevtoolsHook, VueInstance } from '@/types'; 2 | 3 | const getVueInstance = (version: number): VueInstance | undefined => { 4 | const vueKey = version === 2 ? '__vue__' : '__vue_app__'; 5 | const elements = Array.from(document.querySelectorAll>('*')); 6 | return elements.find((element) => element[vueKey])?.[vueKey] as VueInstance | undefined; 7 | }; 8 | 9 | export const injectScriptFile = (filePath: string) => { 10 | const script = document.createElement('script'); 11 | script.src = chrome.runtime.getURL(filePath); 12 | (document.head || document.documentElement).appendChild(script); 13 | script.onload = () => script.remove(); 14 | }; 15 | 16 | export const getVueInstanceWithRetry = async ( 17 | version: number, 18 | maxRetries: number = 2, 19 | interval: number = 1000 20 | ): Promise => { 21 | for (let attempt = 0; attempt <= maxRetries; attempt++) { 22 | const vueInstance = getVueInstance(version); 23 | 24 | if (vueInstance !== undefined) { 25 | return vueInstance; 26 | } 27 | 28 | if (attempt < maxRetries) { 29 | await new Promise((resolve) => setTimeout(resolve, interval)); 30 | } 31 | } 32 | 33 | return undefined; 34 | }; 35 | 36 | export const getAllowedSites = (callback: (text: string) => void) => { 37 | chrome.storage.sync.get('allowedSites', (result) => { 38 | if (result.allowedSites) { 39 | const text = (result.allowedSites?.join('\n') || '') as string; 40 | callback(text); 41 | } 42 | }); 43 | }; 44 | 45 | export const setAllowedSites = (allowedSites: string[], callback: () => void) => { 46 | chrome.storage.sync.set({ allowedSites }, () => { 47 | callback(); 48 | }); 49 | }; 50 | 51 | export const checkAllowedStatus = (tabId: number, url: string) => { 52 | chrome.storage.sync.get({ allowedSites: [] }, (data) => { 53 | const allowedSites = data.allowedSites as string[]; 54 | console.log(allowedSites); 55 | const isAllowed = isUrlAllowed(url, allowedSites); 56 | console.log(isAllowed); 57 | 58 | chrome.tabs.sendMessage(tabId, { type: 'CheckIsAllowed', isAllowed }).catch(() => {}); 59 | }); 60 | }; 61 | 62 | export const isUrlAllowed = (url: string, allowedDomains: string[]) => { 63 | if (!allowedDomains || allowedDomains.length === 0) { 64 | return true; 65 | } 66 | 67 | try { 68 | const hostname = new URL(url).hostname; 69 | 70 | return allowedDomains.some((domainPattern) => { 71 | if (domainPattern.startsWith('*.')) { 72 | const baseDomain = domainPattern.substring(2); 73 | return hostname === baseDomain || hostname.endsWith('.' + baseDomain); 74 | } 75 | return hostname === domainPattern; 76 | }); 77 | } catch { 78 | console.error('Invalid URL:', url); 79 | return false; 80 | } 81 | }; 82 | 83 | export const unlockPinia = (vueInstance: VueInstance) => { 84 | if (!vueInstance?.config?.globalProperties?.$pinia) { 85 | return; 86 | } 87 | const pinia = vueInstance?.config?.globalProperties?.$pinia; 88 | console.log(pinia); 89 | // pinia.use(devtoolsPlugin); 90 | // registerPiniaDevtools(vueInstance, pinia); 91 | }; 92 | 93 | export const unlockRouter = (vueInstance: VueInstance) => { 94 | if (!vueInstance?.config?.globalProperties?.$router) { 95 | return; 96 | } 97 | const router = vueInstance?.config?.globalProperties?.$router; 98 | // addDevtools(router); 99 | // console.log(router); 100 | }; 101 | 102 | export const unlockVueDevTools = (devtools: VueDevtoolsHook, version: number, vueInstance: VueInstance) => { 103 | let vueVersion: string; 104 | if (version === 3) { 105 | // Vue 3 106 | vueVersion = vueInstance.version; 107 | devtools.enabled = true; 108 | devtools.emit('app:init', vueInstance, vueVersion, { 109 | Fragment: Symbol.for('v-fgt'), 110 | Text: Symbol.for('v-txt'), 111 | Comment: Symbol.for('v-cmt'), 112 | Static: Symbol.for('v-stc'), 113 | }); 114 | // unlockPinia(vueInstance); 115 | // unlockRouter(vueInstance); 116 | } else { 117 | // Vue 2 118 | let vue2Constructor = Object.getPrototypeOf(vueInstance).constructor as Vue2Instance; 119 | while (vue2Constructor.super) { 120 | vue2Constructor = vue2Constructor.super; 121 | } 122 | vueVersion = vue2Constructor.version; 123 | vue2Constructor.config.devtools = true; 124 | devtools.emit('init', vue2Constructor); 125 | } 126 | return { 127 | vueVersion, 128 | }; 129 | }; 130 | -------------------------------------------------------------------------------- /packages/shared/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.root.json", 3 | "compilerOptions": { 4 | "baseUrl": ".", 5 | "rootDir": "./src", 6 | "outDir": "build/types", 7 | "declaration": true, 8 | "sourceMap": true 9 | }, 10 | "include": ["src"] 11 | } 12 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@commitlint/cli': 12 | specifier: ^19.8.1 13 | version: 19.8.1(@types/node@22.13.10)(typescript@5.8.3) 14 | '@commitlint/config-conventional': 15 | specifier: ^19.8.1 16 | version: 19.8.1 17 | '@types/chrome': 18 | specifier: ^0.0.326 19 | version: 0.0.326 20 | '@typescript-eslint/parser': 21 | specifier: ^8.32.1 22 | version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 23 | adm-zip: 24 | specifier: ^0.5.16 25 | version: 0.5.16 26 | copy-webpack-plugin: 27 | specifier: ^13.0.0 28 | version: 13.0.0(webpack@5.99.9) 29 | css-loader: 30 | specifier: ^7.1.2 31 | version: 7.1.2(webpack@5.99.9) 32 | eslint: 33 | specifier: ^9.26.0 34 | version: 9.28.0(jiti@2.4.2) 35 | eslint-plugin-prettier: 36 | specifier: ^5.4.0 37 | version: 5.4.1(@types/eslint@9.6.1)(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3) 38 | file-loader: 39 | specifier: ^6.2.0 40 | version: 6.2.0(webpack@5.99.9) 41 | husky: 42 | specifier: ^9.1.7 43 | version: 9.1.7 44 | mini-css-extract-plugin: 45 | specifier: ^2.9.2 46 | version: 2.9.2(webpack@5.99.9) 47 | prettier: 48 | specifier: ^3.5.3 49 | version: 3.5.3 50 | rimraf: 51 | specifier: ^6.0.1 52 | version: 6.0.1 53 | sass: 54 | specifier: ^1.88.0 55 | version: 1.89.1 56 | sass-loader: 57 | specifier: ^16.0.5 58 | version: 16.0.5(sass@1.89.1)(webpack@5.99.9) 59 | terser-webpack-plugin: 60 | specifier: ^5.3.14 61 | version: 5.3.14(webpack@5.99.9) 62 | ts-loader: 63 | specifier: ^9.5.2 64 | version: 9.5.2(typescript@5.8.3)(webpack@5.99.9) 65 | typescript: 66 | specifier: ^5.8.3 67 | version: 5.8.3 68 | typescript-eslint: 69 | specifier: ^8.32.1 70 | version: 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 71 | webpack: 72 | specifier: ^5.99.8 73 | version: 5.99.9(webpack-cli@6.0.1) 74 | webpack-cli: 75 | specifier: ^6.0.1 76 | version: 6.0.1(webpack@5.99.9) 77 | webpack-merge: 78 | specifier: ^6.0.1 79 | version: 6.0.1 80 | 81 | packages/chrome-extension: 82 | dependencies: 83 | '@vue-devtools-unlocker/shared': 84 | specifier: workspace:^ 85 | version: link:../shared 86 | 87 | packages/firefox-extension: 88 | dependencies: 89 | '@vue-devtools-unlocker/shared': 90 | specifier: workspace:^ 91 | version: link:../shared 92 | 93 | packages/shared: {} 94 | 95 | packages: 96 | 97 | '@babel/code-frame@7.27.1': 98 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 99 | engines: {node: '>=6.9.0'} 100 | 101 | '@babel/helper-validator-identifier@7.27.1': 102 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 103 | engines: {node: '>=6.9.0'} 104 | 105 | '@commitlint/cli@19.8.1': 106 | resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} 107 | engines: {node: '>=v18'} 108 | hasBin: true 109 | 110 | '@commitlint/config-conventional@19.8.1': 111 | resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} 112 | engines: {node: '>=v18'} 113 | 114 | '@commitlint/config-validator@19.8.1': 115 | resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} 116 | engines: {node: '>=v18'} 117 | 118 | '@commitlint/ensure@19.8.1': 119 | resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} 120 | engines: {node: '>=v18'} 121 | 122 | '@commitlint/execute-rule@19.8.1': 123 | resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} 124 | engines: {node: '>=v18'} 125 | 126 | '@commitlint/format@19.8.1': 127 | resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} 128 | engines: {node: '>=v18'} 129 | 130 | '@commitlint/is-ignored@19.8.1': 131 | resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} 132 | engines: {node: '>=v18'} 133 | 134 | '@commitlint/lint@19.8.1': 135 | resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} 136 | engines: {node: '>=v18'} 137 | 138 | '@commitlint/load@19.8.1': 139 | resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} 140 | engines: {node: '>=v18'} 141 | 142 | '@commitlint/message@19.8.1': 143 | resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} 144 | engines: {node: '>=v18'} 145 | 146 | '@commitlint/parse@19.8.1': 147 | resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} 148 | engines: {node: '>=v18'} 149 | 150 | '@commitlint/read@19.8.1': 151 | resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} 152 | engines: {node: '>=v18'} 153 | 154 | '@commitlint/resolve-extends@19.8.1': 155 | resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} 156 | engines: {node: '>=v18'} 157 | 158 | '@commitlint/rules@19.8.1': 159 | resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} 160 | engines: {node: '>=v18'} 161 | 162 | '@commitlint/to-lines@19.8.1': 163 | resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} 164 | engines: {node: '>=v18'} 165 | 166 | '@commitlint/top-level@19.8.1': 167 | resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} 168 | engines: {node: '>=v18'} 169 | 170 | '@commitlint/types@19.8.1': 171 | resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} 172 | engines: {node: '>=v18'} 173 | 174 | '@discoveryjs/json-ext@0.6.3': 175 | resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} 176 | engines: {node: '>=14.17.0'} 177 | 178 | '@eslint-community/eslint-utils@4.7.0': 179 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 180 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 181 | peerDependencies: 182 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 183 | 184 | '@eslint-community/regexpp@4.12.1': 185 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 186 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 187 | 188 | '@eslint/config-array@0.20.0': 189 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 190 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 191 | 192 | '@eslint/config-helpers@0.2.2': 193 | resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} 194 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 195 | 196 | '@eslint/core@0.14.0': 197 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 198 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 199 | 200 | '@eslint/eslintrc@3.3.1': 201 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 202 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 203 | 204 | '@eslint/js@9.28.0': 205 | resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} 206 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 207 | 208 | '@eslint/object-schema@2.1.6': 209 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 210 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 211 | 212 | '@eslint/plugin-kit@0.3.1': 213 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 214 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 215 | 216 | '@humanfs/core@0.19.1': 217 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 218 | engines: {node: '>=18.18.0'} 219 | 220 | '@humanfs/node@0.16.6': 221 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 222 | engines: {node: '>=18.18.0'} 223 | 224 | '@humanwhocodes/module-importer@1.0.1': 225 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 226 | engines: {node: '>=12.22'} 227 | 228 | '@humanwhocodes/retry@0.3.1': 229 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 230 | engines: {node: '>=18.18'} 231 | 232 | '@humanwhocodes/retry@0.4.3': 233 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 234 | engines: {node: '>=18.18'} 235 | 236 | '@isaacs/cliui@8.0.2': 237 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 238 | engines: {node: '>=12'} 239 | 240 | '@jridgewell/gen-mapping@0.3.8': 241 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 242 | engines: {node: '>=6.0.0'} 243 | 244 | '@jridgewell/resolve-uri@3.1.2': 245 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 246 | engines: {node: '>=6.0.0'} 247 | 248 | '@jridgewell/set-array@1.2.1': 249 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 250 | engines: {node: '>=6.0.0'} 251 | 252 | '@jridgewell/source-map@0.3.6': 253 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 254 | 255 | '@jridgewell/sourcemap-codec@1.5.0': 256 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 257 | 258 | '@jridgewell/trace-mapping@0.3.25': 259 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 260 | 261 | '@nodelib/fs.scandir@2.1.5': 262 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 263 | engines: {node: '>= 8'} 264 | 265 | '@nodelib/fs.stat@2.0.5': 266 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 267 | engines: {node: '>= 8'} 268 | 269 | '@nodelib/fs.walk@1.2.8': 270 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 271 | engines: {node: '>= 8'} 272 | 273 | '@parcel/watcher-android-arm64@2.5.1': 274 | resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} 275 | engines: {node: '>= 10.0.0'} 276 | cpu: [arm64] 277 | os: [android] 278 | 279 | '@parcel/watcher-darwin-arm64@2.5.1': 280 | resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} 281 | engines: {node: '>= 10.0.0'} 282 | cpu: [arm64] 283 | os: [darwin] 284 | 285 | '@parcel/watcher-darwin-x64@2.5.1': 286 | resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} 287 | engines: {node: '>= 10.0.0'} 288 | cpu: [x64] 289 | os: [darwin] 290 | 291 | '@parcel/watcher-freebsd-x64@2.5.1': 292 | resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} 293 | engines: {node: '>= 10.0.0'} 294 | cpu: [x64] 295 | os: [freebsd] 296 | 297 | '@parcel/watcher-linux-arm-glibc@2.5.1': 298 | resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} 299 | engines: {node: '>= 10.0.0'} 300 | cpu: [arm] 301 | os: [linux] 302 | 303 | '@parcel/watcher-linux-arm-musl@2.5.1': 304 | resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} 305 | engines: {node: '>= 10.0.0'} 306 | cpu: [arm] 307 | os: [linux] 308 | 309 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 310 | resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} 311 | engines: {node: '>= 10.0.0'} 312 | cpu: [arm64] 313 | os: [linux] 314 | 315 | '@parcel/watcher-linux-arm64-musl@2.5.1': 316 | resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} 317 | engines: {node: '>= 10.0.0'} 318 | cpu: [arm64] 319 | os: [linux] 320 | 321 | '@parcel/watcher-linux-x64-glibc@2.5.1': 322 | resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} 323 | engines: {node: '>= 10.0.0'} 324 | cpu: [x64] 325 | os: [linux] 326 | 327 | '@parcel/watcher-linux-x64-musl@2.5.1': 328 | resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} 329 | engines: {node: '>= 10.0.0'} 330 | cpu: [x64] 331 | os: [linux] 332 | 333 | '@parcel/watcher-win32-arm64@2.5.1': 334 | resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} 335 | engines: {node: '>= 10.0.0'} 336 | cpu: [arm64] 337 | os: [win32] 338 | 339 | '@parcel/watcher-win32-ia32@2.5.1': 340 | resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} 341 | engines: {node: '>= 10.0.0'} 342 | cpu: [ia32] 343 | os: [win32] 344 | 345 | '@parcel/watcher-win32-x64@2.5.1': 346 | resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} 347 | engines: {node: '>= 10.0.0'} 348 | cpu: [x64] 349 | os: [win32] 350 | 351 | '@parcel/watcher@2.5.1': 352 | resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} 353 | engines: {node: '>= 10.0.0'} 354 | 355 | '@pkgr/core@0.2.4': 356 | resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} 357 | engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} 358 | 359 | '@types/chrome@0.0.326': 360 | resolution: {integrity: sha512-WS7jKf3ZRZFHOX7dATCZwqNJgdfiSF0qBRFxaO0LhIOvTNBrfkab26bsZwp6EBpYtqp8loMHJTnD6vDTLWPKYw==} 361 | 362 | '@types/conventional-commits-parser@5.0.1': 363 | resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} 364 | 365 | '@types/eslint-scope@3.7.7': 366 | resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} 367 | 368 | '@types/eslint@9.6.1': 369 | resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} 370 | 371 | '@types/estree@1.0.7': 372 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 373 | 374 | '@types/filesystem@0.0.36': 375 | resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} 376 | 377 | '@types/filewriter@0.0.33': 378 | resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} 379 | 380 | '@types/har-format@1.2.16': 381 | resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} 382 | 383 | '@types/json-schema@7.0.15': 384 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 385 | 386 | '@types/node@22.13.10': 387 | resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} 388 | 389 | '@typescript-eslint/eslint-plugin@8.33.1': 390 | resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} 391 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 392 | peerDependencies: 393 | '@typescript-eslint/parser': ^8.33.1 394 | eslint: ^8.57.0 || ^9.0.0 395 | typescript: '>=4.8.4 <5.9.0' 396 | 397 | '@typescript-eslint/parser@8.33.1': 398 | resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} 399 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 400 | peerDependencies: 401 | eslint: ^8.57.0 || ^9.0.0 402 | typescript: '>=4.8.4 <5.9.0' 403 | 404 | '@typescript-eslint/project-service@8.33.1': 405 | resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} 406 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 407 | peerDependencies: 408 | typescript: '>=4.8.4 <5.9.0' 409 | 410 | '@typescript-eslint/scope-manager@8.33.1': 411 | resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} 412 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 413 | 414 | '@typescript-eslint/tsconfig-utils@8.33.1': 415 | resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} 416 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 417 | peerDependencies: 418 | typescript: '>=4.8.4 <5.9.0' 419 | 420 | '@typescript-eslint/type-utils@8.33.1': 421 | resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} 422 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 423 | peerDependencies: 424 | eslint: ^8.57.0 || ^9.0.0 425 | typescript: '>=4.8.4 <5.9.0' 426 | 427 | '@typescript-eslint/types@8.33.1': 428 | resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} 429 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 430 | 431 | '@typescript-eslint/typescript-estree@8.33.1': 432 | resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} 433 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 434 | peerDependencies: 435 | typescript: '>=4.8.4 <5.9.0' 436 | 437 | '@typescript-eslint/utils@8.33.1': 438 | resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} 439 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 440 | peerDependencies: 441 | eslint: ^8.57.0 || ^9.0.0 442 | typescript: '>=4.8.4 <5.9.0' 443 | 444 | '@typescript-eslint/visitor-keys@8.33.1': 445 | resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} 446 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 447 | 448 | '@webassemblyjs/ast@1.14.1': 449 | resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} 450 | 451 | '@webassemblyjs/floating-point-hex-parser@1.13.2': 452 | resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} 453 | 454 | '@webassemblyjs/helper-api-error@1.13.2': 455 | resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} 456 | 457 | '@webassemblyjs/helper-buffer@1.14.1': 458 | resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} 459 | 460 | '@webassemblyjs/helper-numbers@1.13.2': 461 | resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} 462 | 463 | '@webassemblyjs/helper-wasm-bytecode@1.13.2': 464 | resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} 465 | 466 | '@webassemblyjs/helper-wasm-section@1.14.1': 467 | resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} 468 | 469 | '@webassemblyjs/ieee754@1.13.2': 470 | resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} 471 | 472 | '@webassemblyjs/leb128@1.13.2': 473 | resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} 474 | 475 | '@webassemblyjs/utf8@1.13.2': 476 | resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} 477 | 478 | '@webassemblyjs/wasm-edit@1.14.1': 479 | resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} 480 | 481 | '@webassemblyjs/wasm-gen@1.14.1': 482 | resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} 483 | 484 | '@webassemblyjs/wasm-opt@1.14.1': 485 | resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} 486 | 487 | '@webassemblyjs/wasm-parser@1.14.1': 488 | resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} 489 | 490 | '@webassemblyjs/wast-printer@1.14.1': 491 | resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} 492 | 493 | '@webpack-cli/configtest@3.0.1': 494 | resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} 495 | engines: {node: '>=18.12.0'} 496 | peerDependencies: 497 | webpack: ^5.82.0 498 | webpack-cli: 6.x.x 499 | 500 | '@webpack-cli/info@3.0.1': 501 | resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} 502 | engines: {node: '>=18.12.0'} 503 | peerDependencies: 504 | webpack: ^5.82.0 505 | webpack-cli: 6.x.x 506 | 507 | '@webpack-cli/serve@3.0.1': 508 | resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} 509 | engines: {node: '>=18.12.0'} 510 | peerDependencies: 511 | webpack: ^5.82.0 512 | webpack-cli: 6.x.x 513 | webpack-dev-server: '*' 514 | peerDependenciesMeta: 515 | webpack-dev-server: 516 | optional: true 517 | 518 | '@xtuc/ieee754@1.2.0': 519 | resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} 520 | 521 | '@xtuc/long@4.2.2': 522 | resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 523 | 524 | JSONStream@1.3.5: 525 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 526 | hasBin: true 527 | 528 | acorn-jsx@5.3.2: 529 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 530 | peerDependencies: 531 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 532 | 533 | acorn@8.14.1: 534 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 535 | engines: {node: '>=0.4.0'} 536 | hasBin: true 537 | 538 | adm-zip@0.5.16: 539 | resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} 540 | engines: {node: '>=12.0'} 541 | 542 | ajv-formats@2.1.1: 543 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 544 | peerDependencies: 545 | ajv: ^8.0.0 546 | peerDependenciesMeta: 547 | ajv: 548 | optional: true 549 | 550 | ajv-keywords@3.5.2: 551 | resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} 552 | peerDependencies: 553 | ajv: ^6.9.1 554 | 555 | ajv-keywords@5.1.0: 556 | resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} 557 | peerDependencies: 558 | ajv: ^8.8.2 559 | 560 | ajv@6.12.6: 561 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 562 | 563 | ajv@8.17.1: 564 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 565 | 566 | ansi-regex@5.0.1: 567 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 568 | engines: {node: '>=8'} 569 | 570 | ansi-regex@6.1.0: 571 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 572 | engines: {node: '>=12'} 573 | 574 | ansi-styles@4.3.0: 575 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 576 | engines: {node: '>=8'} 577 | 578 | ansi-styles@6.2.1: 579 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 580 | engines: {node: '>=12'} 581 | 582 | argparse@2.0.1: 583 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 584 | 585 | array-ify@1.0.0: 586 | resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} 587 | 588 | balanced-match@1.0.2: 589 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 590 | 591 | big.js@5.2.2: 592 | resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} 593 | 594 | brace-expansion@1.1.11: 595 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 596 | 597 | brace-expansion@2.0.1: 598 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 599 | 600 | braces@3.0.3: 601 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 602 | engines: {node: '>=8'} 603 | 604 | browserslist@4.24.5: 605 | resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} 606 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 607 | hasBin: true 608 | 609 | buffer-from@1.1.2: 610 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 611 | 612 | callsites@3.1.0: 613 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 614 | engines: {node: '>=6'} 615 | 616 | caniuse-lite@1.0.30001718: 617 | resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} 618 | 619 | chalk@4.1.2: 620 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 621 | engines: {node: '>=10'} 622 | 623 | chalk@5.4.1: 624 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 625 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 626 | 627 | chokidar@4.0.3: 628 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 629 | engines: {node: '>= 14.16.0'} 630 | 631 | chrome-trace-event@1.0.4: 632 | resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} 633 | engines: {node: '>=6.0'} 634 | 635 | cliui@8.0.1: 636 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 637 | engines: {node: '>=12'} 638 | 639 | clone-deep@4.0.1: 640 | resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} 641 | engines: {node: '>=6'} 642 | 643 | color-convert@2.0.1: 644 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 645 | engines: {node: '>=7.0.0'} 646 | 647 | color-name@1.1.4: 648 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 649 | 650 | colorette@2.0.20: 651 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 652 | 653 | commander@12.1.0: 654 | resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 655 | engines: {node: '>=18'} 656 | 657 | commander@2.20.3: 658 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 659 | 660 | compare-func@2.0.0: 661 | resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} 662 | 663 | concat-map@0.0.1: 664 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 665 | 666 | conventional-changelog-angular@7.0.0: 667 | resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} 668 | engines: {node: '>=16'} 669 | 670 | conventional-changelog-conventionalcommits@7.0.2: 671 | resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} 672 | engines: {node: '>=16'} 673 | 674 | conventional-commits-parser@5.0.0: 675 | resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} 676 | engines: {node: '>=16'} 677 | hasBin: true 678 | 679 | copy-webpack-plugin@13.0.0: 680 | resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} 681 | engines: {node: '>= 18.12.0'} 682 | peerDependencies: 683 | webpack: ^5.1.0 684 | 685 | cosmiconfig-typescript-loader@6.1.0: 686 | resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} 687 | engines: {node: '>=v18'} 688 | peerDependencies: 689 | '@types/node': '*' 690 | cosmiconfig: '>=9' 691 | typescript: '>=5' 692 | 693 | cosmiconfig@9.0.0: 694 | resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} 695 | engines: {node: '>=14'} 696 | peerDependencies: 697 | typescript: '>=4.9.5' 698 | peerDependenciesMeta: 699 | typescript: 700 | optional: true 701 | 702 | cross-spawn@7.0.6: 703 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 704 | engines: {node: '>= 8'} 705 | 706 | css-loader@7.1.2: 707 | resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} 708 | engines: {node: '>= 18.12.0'} 709 | peerDependencies: 710 | '@rspack/core': 0.x || 1.x 711 | webpack: ^5.27.0 712 | peerDependenciesMeta: 713 | '@rspack/core': 714 | optional: true 715 | webpack: 716 | optional: true 717 | 718 | cssesc@3.0.0: 719 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 720 | engines: {node: '>=4'} 721 | hasBin: true 722 | 723 | dargs@8.1.0: 724 | resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} 725 | engines: {node: '>=12'} 726 | 727 | debug@4.4.1: 728 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 729 | engines: {node: '>=6.0'} 730 | peerDependencies: 731 | supports-color: '*' 732 | peerDependenciesMeta: 733 | supports-color: 734 | optional: true 735 | 736 | deep-is@0.1.4: 737 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 738 | 739 | detect-libc@1.0.3: 740 | resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} 741 | engines: {node: '>=0.10'} 742 | hasBin: true 743 | 744 | dot-prop@5.3.0: 745 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 746 | engines: {node: '>=8'} 747 | 748 | eastasianwidth@0.2.0: 749 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 750 | 751 | electron-to-chromium@1.5.155: 752 | resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} 753 | 754 | emoji-regex@8.0.0: 755 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 756 | 757 | emoji-regex@9.2.2: 758 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 759 | 760 | emojis-list@3.0.0: 761 | resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} 762 | engines: {node: '>= 4'} 763 | 764 | enhanced-resolve@5.18.1: 765 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 766 | engines: {node: '>=10.13.0'} 767 | 768 | env-paths@2.2.1: 769 | resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} 770 | engines: {node: '>=6'} 771 | 772 | envinfo@7.14.0: 773 | resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} 774 | engines: {node: '>=4'} 775 | hasBin: true 776 | 777 | error-ex@1.3.2: 778 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 779 | 780 | es-module-lexer@1.7.0: 781 | resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} 782 | 783 | escalade@3.2.0: 784 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 785 | engines: {node: '>=6'} 786 | 787 | escape-string-regexp@4.0.0: 788 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 789 | engines: {node: '>=10'} 790 | 791 | eslint-plugin-prettier@5.4.1: 792 | resolution: {integrity: sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==} 793 | engines: {node: ^14.18.0 || >=16.0.0} 794 | peerDependencies: 795 | '@types/eslint': '>=8.0.0' 796 | eslint: '>=8.0.0' 797 | eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' 798 | prettier: '>=3.0.0' 799 | peerDependenciesMeta: 800 | '@types/eslint': 801 | optional: true 802 | eslint-config-prettier: 803 | optional: true 804 | 805 | eslint-scope@5.1.1: 806 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 807 | engines: {node: '>=8.0.0'} 808 | 809 | eslint-scope@8.3.0: 810 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 811 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 812 | 813 | eslint-visitor-keys@3.4.3: 814 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 815 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 816 | 817 | eslint-visitor-keys@4.2.0: 818 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 819 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 820 | 821 | eslint@9.28.0: 822 | resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} 823 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 824 | hasBin: true 825 | peerDependencies: 826 | jiti: '*' 827 | peerDependenciesMeta: 828 | jiti: 829 | optional: true 830 | 831 | espree@10.3.0: 832 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 833 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 834 | 835 | esquery@1.6.0: 836 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 837 | engines: {node: '>=0.10'} 838 | 839 | esrecurse@4.3.0: 840 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 841 | engines: {node: '>=4.0'} 842 | 843 | estraverse@4.3.0: 844 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 845 | engines: {node: '>=4.0'} 846 | 847 | estraverse@5.3.0: 848 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 849 | engines: {node: '>=4.0'} 850 | 851 | esutils@2.0.3: 852 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 853 | engines: {node: '>=0.10.0'} 854 | 855 | events@3.3.0: 856 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 857 | engines: {node: '>=0.8.x'} 858 | 859 | fast-deep-equal@3.1.3: 860 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 861 | 862 | fast-diff@1.3.0: 863 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} 864 | 865 | fast-glob@3.3.3: 866 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 867 | engines: {node: '>=8.6.0'} 868 | 869 | fast-json-stable-stringify@2.1.0: 870 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 871 | 872 | fast-levenshtein@2.0.6: 873 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 874 | 875 | fast-uri@3.0.6: 876 | resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 877 | 878 | fastest-levenshtein@1.0.16: 879 | resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} 880 | engines: {node: '>= 4.9.1'} 881 | 882 | fastq@1.19.1: 883 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 884 | 885 | fdir@6.4.3: 886 | resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} 887 | peerDependencies: 888 | picomatch: ^3 || ^4 889 | peerDependenciesMeta: 890 | picomatch: 891 | optional: true 892 | 893 | file-entry-cache@8.0.0: 894 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 895 | engines: {node: '>=16.0.0'} 896 | 897 | file-loader@6.2.0: 898 | resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} 899 | engines: {node: '>= 10.13.0'} 900 | peerDependencies: 901 | webpack: ^4.0.0 || ^5.0.0 902 | 903 | fill-range@7.1.1: 904 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 905 | engines: {node: '>=8'} 906 | 907 | find-up@4.1.0: 908 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 909 | engines: {node: '>=8'} 910 | 911 | find-up@5.0.0: 912 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 913 | engines: {node: '>=10'} 914 | 915 | find-up@7.0.0: 916 | resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} 917 | engines: {node: '>=18'} 918 | 919 | flat-cache@4.0.1: 920 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 921 | engines: {node: '>=16'} 922 | 923 | flat@5.0.2: 924 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 925 | hasBin: true 926 | 927 | flatted@3.3.3: 928 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 929 | 930 | foreground-child@3.3.1: 931 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 932 | engines: {node: '>=14'} 933 | 934 | function-bind@1.1.2: 935 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 936 | 937 | get-caller-file@2.0.5: 938 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 939 | engines: {node: 6.* || 8.* || >= 10.*} 940 | 941 | git-raw-commits@4.0.0: 942 | resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} 943 | engines: {node: '>=16'} 944 | hasBin: true 945 | 946 | glob-parent@5.1.2: 947 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 948 | engines: {node: '>= 6'} 949 | 950 | glob-parent@6.0.2: 951 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 952 | engines: {node: '>=10.13.0'} 953 | 954 | glob-to-regexp@0.4.1: 955 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 956 | 957 | glob@11.0.1: 958 | resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} 959 | engines: {node: 20 || >=22} 960 | hasBin: true 961 | 962 | global-directory@4.0.1: 963 | resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} 964 | engines: {node: '>=18'} 965 | 966 | globals@14.0.0: 967 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 968 | engines: {node: '>=18'} 969 | 970 | graceful-fs@4.2.11: 971 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 972 | 973 | graphemer@1.4.0: 974 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 975 | 976 | has-flag@4.0.0: 977 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 978 | engines: {node: '>=8'} 979 | 980 | hasown@2.0.2: 981 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 982 | engines: {node: '>= 0.4'} 983 | 984 | husky@9.1.7: 985 | resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} 986 | engines: {node: '>=18'} 987 | hasBin: true 988 | 989 | icss-utils@5.1.0: 990 | resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} 991 | engines: {node: ^10 || ^12 || >= 14} 992 | peerDependencies: 993 | postcss: ^8.1.0 994 | 995 | ignore@5.3.2: 996 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 997 | engines: {node: '>= 4'} 998 | 999 | ignore@7.0.5: 1000 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 1001 | engines: {node: '>= 4'} 1002 | 1003 | immutable@5.1.2: 1004 | resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==} 1005 | 1006 | import-fresh@3.3.1: 1007 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 1008 | engines: {node: '>=6'} 1009 | 1010 | import-local@3.2.0: 1011 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 1012 | engines: {node: '>=8'} 1013 | hasBin: true 1014 | 1015 | import-meta-resolve@4.1.0: 1016 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} 1017 | 1018 | imurmurhash@0.1.4: 1019 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1020 | engines: {node: '>=0.8.19'} 1021 | 1022 | ini@4.1.1: 1023 | resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} 1024 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 1025 | 1026 | interpret@3.1.1: 1027 | resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} 1028 | engines: {node: '>=10.13.0'} 1029 | 1030 | is-arrayish@0.2.1: 1031 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1032 | 1033 | is-core-module@2.16.1: 1034 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 1035 | engines: {node: '>= 0.4'} 1036 | 1037 | is-extglob@2.1.1: 1038 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1039 | engines: {node: '>=0.10.0'} 1040 | 1041 | is-fullwidth-code-point@3.0.0: 1042 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1043 | engines: {node: '>=8'} 1044 | 1045 | is-glob@4.0.3: 1046 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1047 | engines: {node: '>=0.10.0'} 1048 | 1049 | is-number@7.0.0: 1050 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1051 | engines: {node: '>=0.12.0'} 1052 | 1053 | is-obj@2.0.0: 1054 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 1055 | engines: {node: '>=8'} 1056 | 1057 | is-plain-object@2.0.4: 1058 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 1059 | engines: {node: '>=0.10.0'} 1060 | 1061 | is-text-path@2.0.0: 1062 | resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} 1063 | engines: {node: '>=8'} 1064 | 1065 | isexe@2.0.0: 1066 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1067 | 1068 | isobject@3.0.1: 1069 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 1070 | engines: {node: '>=0.10.0'} 1071 | 1072 | jackspeak@4.1.0: 1073 | resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} 1074 | engines: {node: 20 || >=22} 1075 | 1076 | jest-worker@27.5.1: 1077 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 1078 | engines: {node: '>= 10.13.0'} 1079 | 1080 | jiti@2.4.2: 1081 | resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} 1082 | hasBin: true 1083 | 1084 | js-tokens@4.0.0: 1085 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1086 | 1087 | js-yaml@4.1.0: 1088 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1089 | hasBin: true 1090 | 1091 | json-buffer@3.0.1: 1092 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1093 | 1094 | json-parse-even-better-errors@2.3.1: 1095 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1096 | 1097 | json-schema-traverse@0.4.1: 1098 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1099 | 1100 | json-schema-traverse@1.0.0: 1101 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1102 | 1103 | json-stable-stringify-without-jsonify@1.0.1: 1104 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1105 | 1106 | json5@2.2.3: 1107 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1108 | engines: {node: '>=6'} 1109 | hasBin: true 1110 | 1111 | jsonparse@1.3.1: 1112 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 1113 | engines: {'0': node >= 0.2.0} 1114 | 1115 | keyv@4.5.4: 1116 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1117 | 1118 | kind-of@6.0.3: 1119 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1120 | engines: {node: '>=0.10.0'} 1121 | 1122 | levn@0.4.1: 1123 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1124 | engines: {node: '>= 0.8.0'} 1125 | 1126 | lines-and-columns@1.2.4: 1127 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1128 | 1129 | loader-runner@4.3.0: 1130 | resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} 1131 | engines: {node: '>=6.11.5'} 1132 | 1133 | loader-utils@2.0.4: 1134 | resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} 1135 | engines: {node: '>=8.9.0'} 1136 | 1137 | locate-path@5.0.0: 1138 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1139 | engines: {node: '>=8'} 1140 | 1141 | locate-path@6.0.0: 1142 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1143 | engines: {node: '>=10'} 1144 | 1145 | locate-path@7.2.0: 1146 | resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} 1147 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1148 | 1149 | lodash.camelcase@4.3.0: 1150 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} 1151 | 1152 | lodash.isplainobject@4.0.6: 1153 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 1154 | 1155 | lodash.kebabcase@4.1.1: 1156 | resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} 1157 | 1158 | lodash.merge@4.6.2: 1159 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1160 | 1161 | lodash.mergewith@4.6.2: 1162 | resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} 1163 | 1164 | lodash.snakecase@4.1.1: 1165 | resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} 1166 | 1167 | lodash.startcase@4.4.0: 1168 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 1169 | 1170 | lodash.uniq@4.5.0: 1171 | resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} 1172 | 1173 | lodash.upperfirst@4.3.1: 1174 | resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} 1175 | 1176 | lru-cache@11.0.2: 1177 | resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} 1178 | engines: {node: 20 || >=22} 1179 | 1180 | meow@12.1.1: 1181 | resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} 1182 | engines: {node: '>=16.10'} 1183 | 1184 | merge-stream@2.0.0: 1185 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1186 | 1187 | merge2@1.4.1: 1188 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1189 | engines: {node: '>= 8'} 1190 | 1191 | micromatch@4.0.8: 1192 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1193 | engines: {node: '>=8.6'} 1194 | 1195 | mime-db@1.52.0: 1196 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1197 | engines: {node: '>= 0.6'} 1198 | 1199 | mime-types@2.1.35: 1200 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1201 | engines: {node: '>= 0.6'} 1202 | 1203 | mini-css-extract-plugin@2.9.2: 1204 | resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} 1205 | engines: {node: '>= 12.13.0'} 1206 | peerDependencies: 1207 | webpack: ^5.0.0 1208 | 1209 | minimatch@10.0.1: 1210 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1211 | engines: {node: 20 || >=22} 1212 | 1213 | minimatch@3.1.2: 1214 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1215 | 1216 | minimatch@9.0.5: 1217 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1218 | engines: {node: '>=16 || 14 >=14.17'} 1219 | 1220 | minimist@1.2.8: 1221 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1222 | 1223 | minipass@7.1.2: 1224 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1225 | engines: {node: '>=16 || 14 >=14.17'} 1226 | 1227 | ms@2.1.3: 1228 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1229 | 1230 | nanoid@3.3.9: 1231 | resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} 1232 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1233 | hasBin: true 1234 | 1235 | natural-compare@1.4.0: 1236 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1237 | 1238 | neo-async@2.6.2: 1239 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1240 | 1241 | node-addon-api@7.1.1: 1242 | resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} 1243 | 1244 | node-releases@2.0.19: 1245 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1246 | 1247 | normalize-path@3.0.0: 1248 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1249 | engines: {node: '>=0.10.0'} 1250 | 1251 | optionator@0.9.4: 1252 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1253 | engines: {node: '>= 0.8.0'} 1254 | 1255 | p-limit@2.3.0: 1256 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1257 | engines: {node: '>=6'} 1258 | 1259 | p-limit@3.1.0: 1260 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1261 | engines: {node: '>=10'} 1262 | 1263 | p-limit@4.0.0: 1264 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 1265 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1266 | 1267 | p-locate@4.1.0: 1268 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1269 | engines: {node: '>=8'} 1270 | 1271 | p-locate@5.0.0: 1272 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1273 | engines: {node: '>=10'} 1274 | 1275 | p-locate@6.0.0: 1276 | resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} 1277 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1278 | 1279 | p-try@2.2.0: 1280 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1281 | engines: {node: '>=6'} 1282 | 1283 | package-json-from-dist@1.0.1: 1284 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1285 | 1286 | parent-module@1.0.1: 1287 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1288 | engines: {node: '>=6'} 1289 | 1290 | parse-json@5.2.0: 1291 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1292 | engines: {node: '>=8'} 1293 | 1294 | path-exists@4.0.0: 1295 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1296 | engines: {node: '>=8'} 1297 | 1298 | path-exists@5.0.0: 1299 | resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} 1300 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1301 | 1302 | path-key@3.1.1: 1303 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1304 | engines: {node: '>=8'} 1305 | 1306 | path-parse@1.0.7: 1307 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1308 | 1309 | path-scurry@2.0.0: 1310 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1311 | engines: {node: 20 || >=22} 1312 | 1313 | picocolors@1.1.1: 1314 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1315 | 1316 | picomatch@2.3.1: 1317 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1318 | engines: {node: '>=8.6'} 1319 | 1320 | picomatch@4.0.2: 1321 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1322 | engines: {node: '>=12'} 1323 | 1324 | pkg-dir@4.2.0: 1325 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1326 | engines: {node: '>=8'} 1327 | 1328 | postcss-modules-extract-imports@3.1.0: 1329 | resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} 1330 | engines: {node: ^10 || ^12 || >= 14} 1331 | peerDependencies: 1332 | postcss: ^8.1.0 1333 | 1334 | postcss-modules-local-by-default@4.2.0: 1335 | resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} 1336 | engines: {node: ^10 || ^12 || >= 14} 1337 | peerDependencies: 1338 | postcss: ^8.1.0 1339 | 1340 | postcss-modules-scope@3.2.1: 1341 | resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} 1342 | engines: {node: ^10 || ^12 || >= 14} 1343 | peerDependencies: 1344 | postcss: ^8.1.0 1345 | 1346 | postcss-modules-values@4.0.0: 1347 | resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} 1348 | engines: {node: ^10 || ^12 || >= 14} 1349 | peerDependencies: 1350 | postcss: ^8.1.0 1351 | 1352 | postcss-selector-parser@7.1.0: 1353 | resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} 1354 | engines: {node: '>=4'} 1355 | 1356 | postcss-value-parser@4.2.0: 1357 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1358 | 1359 | postcss@8.5.3: 1360 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 1361 | engines: {node: ^10 || ^12 || >=14} 1362 | 1363 | prelude-ls@1.2.1: 1364 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1365 | engines: {node: '>= 0.8.0'} 1366 | 1367 | prettier-linter-helpers@1.0.0: 1368 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} 1369 | engines: {node: '>=6.0.0'} 1370 | 1371 | prettier@3.5.3: 1372 | resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} 1373 | engines: {node: '>=14'} 1374 | hasBin: true 1375 | 1376 | punycode@2.3.1: 1377 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1378 | engines: {node: '>=6'} 1379 | 1380 | queue-microtask@1.2.3: 1381 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1382 | 1383 | randombytes@2.1.0: 1384 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1385 | 1386 | readdirp@4.1.2: 1387 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1388 | engines: {node: '>= 14.18.0'} 1389 | 1390 | rechoir@0.8.0: 1391 | resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} 1392 | engines: {node: '>= 10.13.0'} 1393 | 1394 | require-directory@2.1.1: 1395 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1396 | engines: {node: '>=0.10.0'} 1397 | 1398 | require-from-string@2.0.2: 1399 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1400 | engines: {node: '>=0.10.0'} 1401 | 1402 | resolve-cwd@3.0.0: 1403 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1404 | engines: {node: '>=8'} 1405 | 1406 | resolve-from@4.0.0: 1407 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1408 | engines: {node: '>=4'} 1409 | 1410 | resolve-from@5.0.0: 1411 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1412 | engines: {node: '>=8'} 1413 | 1414 | resolve@1.22.10: 1415 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1416 | engines: {node: '>= 0.4'} 1417 | hasBin: true 1418 | 1419 | reusify@1.1.0: 1420 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1421 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1422 | 1423 | rimraf@6.0.1: 1424 | resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} 1425 | engines: {node: 20 || >=22} 1426 | hasBin: true 1427 | 1428 | run-parallel@1.2.0: 1429 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1430 | 1431 | safe-buffer@5.2.1: 1432 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1433 | 1434 | sass-loader@16.0.5: 1435 | resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} 1436 | engines: {node: '>= 18.12.0'} 1437 | peerDependencies: 1438 | '@rspack/core': 0.x || 1.x 1439 | node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 1440 | sass: ^1.3.0 1441 | sass-embedded: '*' 1442 | webpack: ^5.0.0 1443 | peerDependenciesMeta: 1444 | '@rspack/core': 1445 | optional: true 1446 | node-sass: 1447 | optional: true 1448 | sass: 1449 | optional: true 1450 | sass-embedded: 1451 | optional: true 1452 | webpack: 1453 | optional: true 1454 | 1455 | sass@1.89.1: 1456 | resolution: {integrity: sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==} 1457 | engines: {node: '>=14.0.0'} 1458 | hasBin: true 1459 | 1460 | schema-utils@3.3.0: 1461 | resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} 1462 | engines: {node: '>= 10.13.0'} 1463 | 1464 | schema-utils@4.3.0: 1465 | resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} 1466 | engines: {node: '>= 10.13.0'} 1467 | 1468 | schema-utils@4.3.2: 1469 | resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} 1470 | engines: {node: '>= 10.13.0'} 1471 | 1472 | semver@7.7.1: 1473 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1474 | engines: {node: '>=10'} 1475 | hasBin: true 1476 | 1477 | semver@7.7.2: 1478 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1479 | engines: {node: '>=10'} 1480 | hasBin: true 1481 | 1482 | serialize-javascript@6.0.2: 1483 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1484 | 1485 | shallow-clone@3.0.1: 1486 | resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} 1487 | engines: {node: '>=8'} 1488 | 1489 | shebang-command@2.0.0: 1490 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1491 | engines: {node: '>=8'} 1492 | 1493 | shebang-regex@3.0.0: 1494 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1495 | engines: {node: '>=8'} 1496 | 1497 | signal-exit@4.1.0: 1498 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1499 | engines: {node: '>=14'} 1500 | 1501 | source-map-js@1.2.1: 1502 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1503 | engines: {node: '>=0.10.0'} 1504 | 1505 | source-map-support@0.5.21: 1506 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1507 | 1508 | source-map@0.6.1: 1509 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1510 | engines: {node: '>=0.10.0'} 1511 | 1512 | source-map@0.7.4: 1513 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 1514 | engines: {node: '>= 8'} 1515 | 1516 | split2@4.2.0: 1517 | resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 1518 | engines: {node: '>= 10.x'} 1519 | 1520 | string-width@4.2.3: 1521 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1522 | engines: {node: '>=8'} 1523 | 1524 | string-width@5.1.2: 1525 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1526 | engines: {node: '>=12'} 1527 | 1528 | strip-ansi@6.0.1: 1529 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1530 | engines: {node: '>=8'} 1531 | 1532 | strip-ansi@7.1.0: 1533 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1534 | engines: {node: '>=12'} 1535 | 1536 | strip-json-comments@3.1.1: 1537 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1538 | engines: {node: '>=8'} 1539 | 1540 | supports-color@7.2.0: 1541 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1542 | engines: {node: '>=8'} 1543 | 1544 | supports-color@8.1.1: 1545 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1546 | engines: {node: '>=10'} 1547 | 1548 | supports-preserve-symlinks-flag@1.0.0: 1549 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1550 | engines: {node: '>= 0.4'} 1551 | 1552 | synckit@0.11.8: 1553 | resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} 1554 | engines: {node: ^14.18.0 || >=16.0.0} 1555 | 1556 | tapable@2.2.1: 1557 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1558 | engines: {node: '>=6'} 1559 | 1560 | tapable@2.2.2: 1561 | resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} 1562 | engines: {node: '>=6'} 1563 | 1564 | terser-webpack-plugin@5.3.14: 1565 | resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} 1566 | engines: {node: '>= 10.13.0'} 1567 | peerDependencies: 1568 | '@swc/core': '*' 1569 | esbuild: '*' 1570 | uglify-js: '*' 1571 | webpack: ^5.1.0 1572 | peerDependenciesMeta: 1573 | '@swc/core': 1574 | optional: true 1575 | esbuild: 1576 | optional: true 1577 | uglify-js: 1578 | optional: true 1579 | 1580 | terser@5.39.0: 1581 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 1582 | engines: {node: '>=10'} 1583 | hasBin: true 1584 | 1585 | text-extensions@2.4.0: 1586 | resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} 1587 | engines: {node: '>=8'} 1588 | 1589 | through@2.3.8: 1590 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1591 | 1592 | tinyexec@1.0.1: 1593 | resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} 1594 | 1595 | tinyglobby@0.2.12: 1596 | resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} 1597 | engines: {node: '>=12.0.0'} 1598 | 1599 | to-regex-range@5.0.1: 1600 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1601 | engines: {node: '>=8.0'} 1602 | 1603 | ts-api-utils@2.1.0: 1604 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1605 | engines: {node: '>=18.12'} 1606 | peerDependencies: 1607 | typescript: '>=4.8.4' 1608 | 1609 | ts-loader@9.5.2: 1610 | resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} 1611 | engines: {node: '>=12.0.0'} 1612 | peerDependencies: 1613 | typescript: '*' 1614 | webpack: ^5.0.0 1615 | 1616 | type-check@0.4.0: 1617 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1618 | engines: {node: '>= 0.8.0'} 1619 | 1620 | typescript-eslint@8.33.1: 1621 | resolution: {integrity: sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==} 1622 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1623 | peerDependencies: 1624 | eslint: ^8.57.0 || ^9.0.0 1625 | typescript: '>=4.8.4 <5.9.0' 1626 | 1627 | typescript@5.8.3: 1628 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1629 | engines: {node: '>=14.17'} 1630 | hasBin: true 1631 | 1632 | undici-types@6.20.0: 1633 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1634 | 1635 | unicorn-magic@0.1.0: 1636 | resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} 1637 | engines: {node: '>=18'} 1638 | 1639 | update-browserslist-db@1.1.3: 1640 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1641 | hasBin: true 1642 | peerDependencies: 1643 | browserslist: '>= 4.21.0' 1644 | 1645 | uri-js@4.4.1: 1646 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1647 | 1648 | util-deprecate@1.0.2: 1649 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1650 | 1651 | watchpack@2.4.3: 1652 | resolution: {integrity: sha512-adBYQLivcg1jbdKEJeqScJJFvgm4qY9+3tXw+jdG6lkVeqRJEtiQmSWjmth8GKmDZuX7sYM4YFxQsf0AzMfGGw==} 1653 | engines: {node: '>=10.13.0'} 1654 | 1655 | webpack-cli@6.0.1: 1656 | resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} 1657 | engines: {node: '>=18.12.0'} 1658 | hasBin: true 1659 | peerDependencies: 1660 | webpack: ^5.82.0 1661 | webpack-bundle-analyzer: '*' 1662 | webpack-dev-server: '*' 1663 | peerDependenciesMeta: 1664 | webpack-bundle-analyzer: 1665 | optional: true 1666 | webpack-dev-server: 1667 | optional: true 1668 | 1669 | webpack-merge@6.0.1: 1670 | resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} 1671 | engines: {node: '>=18.0.0'} 1672 | 1673 | webpack-sources@3.2.3: 1674 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1675 | engines: {node: '>=10.13.0'} 1676 | 1677 | webpack@5.99.9: 1678 | resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} 1679 | engines: {node: '>=10.13.0'} 1680 | hasBin: true 1681 | peerDependencies: 1682 | webpack-cli: '*' 1683 | peerDependenciesMeta: 1684 | webpack-cli: 1685 | optional: true 1686 | 1687 | which@2.0.2: 1688 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1689 | engines: {node: '>= 8'} 1690 | hasBin: true 1691 | 1692 | wildcard@2.0.1: 1693 | resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} 1694 | 1695 | word-wrap@1.2.5: 1696 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1697 | engines: {node: '>=0.10.0'} 1698 | 1699 | wrap-ansi@7.0.0: 1700 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1701 | engines: {node: '>=10'} 1702 | 1703 | wrap-ansi@8.1.0: 1704 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1705 | engines: {node: '>=12'} 1706 | 1707 | y18n@5.0.8: 1708 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1709 | engines: {node: '>=10'} 1710 | 1711 | yargs-parser@21.1.1: 1712 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1713 | engines: {node: '>=12'} 1714 | 1715 | yargs@17.7.2: 1716 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1717 | engines: {node: '>=12'} 1718 | 1719 | yocto-queue@0.1.0: 1720 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1721 | engines: {node: '>=10'} 1722 | 1723 | yocto-queue@1.2.1: 1724 | resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} 1725 | engines: {node: '>=12.20'} 1726 | 1727 | snapshots: 1728 | 1729 | '@babel/code-frame@7.27.1': 1730 | dependencies: 1731 | '@babel/helper-validator-identifier': 7.27.1 1732 | js-tokens: 4.0.0 1733 | picocolors: 1.1.1 1734 | 1735 | '@babel/helper-validator-identifier@7.27.1': {} 1736 | 1737 | '@commitlint/cli@19.8.1(@types/node@22.13.10)(typescript@5.8.3)': 1738 | dependencies: 1739 | '@commitlint/format': 19.8.1 1740 | '@commitlint/lint': 19.8.1 1741 | '@commitlint/load': 19.8.1(@types/node@22.13.10)(typescript@5.8.3) 1742 | '@commitlint/read': 19.8.1 1743 | '@commitlint/types': 19.8.1 1744 | tinyexec: 1.0.1 1745 | yargs: 17.7.2 1746 | transitivePeerDependencies: 1747 | - '@types/node' 1748 | - typescript 1749 | 1750 | '@commitlint/config-conventional@19.8.1': 1751 | dependencies: 1752 | '@commitlint/types': 19.8.1 1753 | conventional-changelog-conventionalcommits: 7.0.2 1754 | 1755 | '@commitlint/config-validator@19.8.1': 1756 | dependencies: 1757 | '@commitlint/types': 19.8.1 1758 | ajv: 8.17.1 1759 | 1760 | '@commitlint/ensure@19.8.1': 1761 | dependencies: 1762 | '@commitlint/types': 19.8.1 1763 | lodash.camelcase: 4.3.0 1764 | lodash.kebabcase: 4.1.1 1765 | lodash.snakecase: 4.1.1 1766 | lodash.startcase: 4.4.0 1767 | lodash.upperfirst: 4.3.1 1768 | 1769 | '@commitlint/execute-rule@19.8.1': {} 1770 | 1771 | '@commitlint/format@19.8.1': 1772 | dependencies: 1773 | '@commitlint/types': 19.8.1 1774 | chalk: 5.4.1 1775 | 1776 | '@commitlint/is-ignored@19.8.1': 1777 | dependencies: 1778 | '@commitlint/types': 19.8.1 1779 | semver: 7.7.2 1780 | 1781 | '@commitlint/lint@19.8.1': 1782 | dependencies: 1783 | '@commitlint/is-ignored': 19.8.1 1784 | '@commitlint/parse': 19.8.1 1785 | '@commitlint/rules': 19.8.1 1786 | '@commitlint/types': 19.8.1 1787 | 1788 | '@commitlint/load@19.8.1(@types/node@22.13.10)(typescript@5.8.3)': 1789 | dependencies: 1790 | '@commitlint/config-validator': 19.8.1 1791 | '@commitlint/execute-rule': 19.8.1 1792 | '@commitlint/resolve-extends': 19.8.1 1793 | '@commitlint/types': 19.8.1 1794 | chalk: 5.4.1 1795 | cosmiconfig: 9.0.0(typescript@5.8.3) 1796 | cosmiconfig-typescript-loader: 6.1.0(@types/node@22.13.10)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) 1797 | lodash.isplainobject: 4.0.6 1798 | lodash.merge: 4.6.2 1799 | lodash.uniq: 4.5.0 1800 | transitivePeerDependencies: 1801 | - '@types/node' 1802 | - typescript 1803 | 1804 | '@commitlint/message@19.8.1': {} 1805 | 1806 | '@commitlint/parse@19.8.1': 1807 | dependencies: 1808 | '@commitlint/types': 19.8.1 1809 | conventional-changelog-angular: 7.0.0 1810 | conventional-commits-parser: 5.0.0 1811 | 1812 | '@commitlint/read@19.8.1': 1813 | dependencies: 1814 | '@commitlint/top-level': 19.8.1 1815 | '@commitlint/types': 19.8.1 1816 | git-raw-commits: 4.0.0 1817 | minimist: 1.2.8 1818 | tinyexec: 1.0.1 1819 | 1820 | '@commitlint/resolve-extends@19.8.1': 1821 | dependencies: 1822 | '@commitlint/config-validator': 19.8.1 1823 | '@commitlint/types': 19.8.1 1824 | global-directory: 4.0.1 1825 | import-meta-resolve: 4.1.0 1826 | lodash.mergewith: 4.6.2 1827 | resolve-from: 5.0.0 1828 | 1829 | '@commitlint/rules@19.8.1': 1830 | dependencies: 1831 | '@commitlint/ensure': 19.8.1 1832 | '@commitlint/message': 19.8.1 1833 | '@commitlint/to-lines': 19.8.1 1834 | '@commitlint/types': 19.8.1 1835 | 1836 | '@commitlint/to-lines@19.8.1': {} 1837 | 1838 | '@commitlint/top-level@19.8.1': 1839 | dependencies: 1840 | find-up: 7.0.0 1841 | 1842 | '@commitlint/types@19.8.1': 1843 | dependencies: 1844 | '@types/conventional-commits-parser': 5.0.1 1845 | chalk: 5.4.1 1846 | 1847 | '@discoveryjs/json-ext@0.6.3': {} 1848 | 1849 | '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@2.4.2))': 1850 | dependencies: 1851 | eslint: 9.28.0(jiti@2.4.2) 1852 | eslint-visitor-keys: 3.4.3 1853 | 1854 | '@eslint-community/regexpp@4.12.1': {} 1855 | 1856 | '@eslint/config-array@0.20.0': 1857 | dependencies: 1858 | '@eslint/object-schema': 2.1.6 1859 | debug: 4.4.1 1860 | minimatch: 3.1.2 1861 | transitivePeerDependencies: 1862 | - supports-color 1863 | 1864 | '@eslint/config-helpers@0.2.2': {} 1865 | 1866 | '@eslint/core@0.14.0': 1867 | dependencies: 1868 | '@types/json-schema': 7.0.15 1869 | 1870 | '@eslint/eslintrc@3.3.1': 1871 | dependencies: 1872 | ajv: 6.12.6 1873 | debug: 4.4.1 1874 | espree: 10.3.0 1875 | globals: 14.0.0 1876 | ignore: 5.3.2 1877 | import-fresh: 3.3.1 1878 | js-yaml: 4.1.0 1879 | minimatch: 3.1.2 1880 | strip-json-comments: 3.1.1 1881 | transitivePeerDependencies: 1882 | - supports-color 1883 | 1884 | '@eslint/js@9.28.0': {} 1885 | 1886 | '@eslint/object-schema@2.1.6': {} 1887 | 1888 | '@eslint/plugin-kit@0.3.1': 1889 | dependencies: 1890 | '@eslint/core': 0.14.0 1891 | levn: 0.4.1 1892 | 1893 | '@humanfs/core@0.19.1': {} 1894 | 1895 | '@humanfs/node@0.16.6': 1896 | dependencies: 1897 | '@humanfs/core': 0.19.1 1898 | '@humanwhocodes/retry': 0.3.1 1899 | 1900 | '@humanwhocodes/module-importer@1.0.1': {} 1901 | 1902 | '@humanwhocodes/retry@0.3.1': {} 1903 | 1904 | '@humanwhocodes/retry@0.4.3': {} 1905 | 1906 | '@isaacs/cliui@8.0.2': 1907 | dependencies: 1908 | string-width: 5.1.2 1909 | string-width-cjs: string-width@4.2.3 1910 | strip-ansi: 7.1.0 1911 | strip-ansi-cjs: strip-ansi@6.0.1 1912 | wrap-ansi: 8.1.0 1913 | wrap-ansi-cjs: wrap-ansi@7.0.0 1914 | 1915 | '@jridgewell/gen-mapping@0.3.8': 1916 | dependencies: 1917 | '@jridgewell/set-array': 1.2.1 1918 | '@jridgewell/sourcemap-codec': 1.5.0 1919 | '@jridgewell/trace-mapping': 0.3.25 1920 | 1921 | '@jridgewell/resolve-uri@3.1.2': {} 1922 | 1923 | '@jridgewell/set-array@1.2.1': {} 1924 | 1925 | '@jridgewell/source-map@0.3.6': 1926 | dependencies: 1927 | '@jridgewell/gen-mapping': 0.3.8 1928 | '@jridgewell/trace-mapping': 0.3.25 1929 | 1930 | '@jridgewell/sourcemap-codec@1.5.0': {} 1931 | 1932 | '@jridgewell/trace-mapping@0.3.25': 1933 | dependencies: 1934 | '@jridgewell/resolve-uri': 3.1.2 1935 | '@jridgewell/sourcemap-codec': 1.5.0 1936 | 1937 | '@nodelib/fs.scandir@2.1.5': 1938 | dependencies: 1939 | '@nodelib/fs.stat': 2.0.5 1940 | run-parallel: 1.2.0 1941 | 1942 | '@nodelib/fs.stat@2.0.5': {} 1943 | 1944 | '@nodelib/fs.walk@1.2.8': 1945 | dependencies: 1946 | '@nodelib/fs.scandir': 2.1.5 1947 | fastq: 1.19.1 1948 | 1949 | '@parcel/watcher-android-arm64@2.5.1': 1950 | optional: true 1951 | 1952 | '@parcel/watcher-darwin-arm64@2.5.1': 1953 | optional: true 1954 | 1955 | '@parcel/watcher-darwin-x64@2.5.1': 1956 | optional: true 1957 | 1958 | '@parcel/watcher-freebsd-x64@2.5.1': 1959 | optional: true 1960 | 1961 | '@parcel/watcher-linux-arm-glibc@2.5.1': 1962 | optional: true 1963 | 1964 | '@parcel/watcher-linux-arm-musl@2.5.1': 1965 | optional: true 1966 | 1967 | '@parcel/watcher-linux-arm64-glibc@2.5.1': 1968 | optional: true 1969 | 1970 | '@parcel/watcher-linux-arm64-musl@2.5.1': 1971 | optional: true 1972 | 1973 | '@parcel/watcher-linux-x64-glibc@2.5.1': 1974 | optional: true 1975 | 1976 | '@parcel/watcher-linux-x64-musl@2.5.1': 1977 | optional: true 1978 | 1979 | '@parcel/watcher-win32-arm64@2.5.1': 1980 | optional: true 1981 | 1982 | '@parcel/watcher-win32-ia32@2.5.1': 1983 | optional: true 1984 | 1985 | '@parcel/watcher-win32-x64@2.5.1': 1986 | optional: true 1987 | 1988 | '@parcel/watcher@2.5.1': 1989 | dependencies: 1990 | detect-libc: 1.0.3 1991 | is-glob: 4.0.3 1992 | micromatch: 4.0.8 1993 | node-addon-api: 7.1.1 1994 | optionalDependencies: 1995 | '@parcel/watcher-android-arm64': 2.5.1 1996 | '@parcel/watcher-darwin-arm64': 2.5.1 1997 | '@parcel/watcher-darwin-x64': 2.5.1 1998 | '@parcel/watcher-freebsd-x64': 2.5.1 1999 | '@parcel/watcher-linux-arm-glibc': 2.5.1 2000 | '@parcel/watcher-linux-arm-musl': 2.5.1 2001 | '@parcel/watcher-linux-arm64-glibc': 2.5.1 2002 | '@parcel/watcher-linux-arm64-musl': 2.5.1 2003 | '@parcel/watcher-linux-x64-glibc': 2.5.1 2004 | '@parcel/watcher-linux-x64-musl': 2.5.1 2005 | '@parcel/watcher-win32-arm64': 2.5.1 2006 | '@parcel/watcher-win32-ia32': 2.5.1 2007 | '@parcel/watcher-win32-x64': 2.5.1 2008 | optional: true 2009 | 2010 | '@pkgr/core@0.2.4': {} 2011 | 2012 | '@types/chrome@0.0.326': 2013 | dependencies: 2014 | '@types/filesystem': 0.0.36 2015 | '@types/har-format': 1.2.16 2016 | 2017 | '@types/conventional-commits-parser@5.0.1': 2018 | dependencies: 2019 | '@types/node': 22.13.10 2020 | 2021 | '@types/eslint-scope@3.7.7': 2022 | dependencies: 2023 | '@types/eslint': 9.6.1 2024 | '@types/estree': 1.0.7 2025 | 2026 | '@types/eslint@9.6.1': 2027 | dependencies: 2028 | '@types/estree': 1.0.7 2029 | '@types/json-schema': 7.0.15 2030 | 2031 | '@types/estree@1.0.7': {} 2032 | 2033 | '@types/filesystem@0.0.36': 2034 | dependencies: 2035 | '@types/filewriter': 0.0.33 2036 | 2037 | '@types/filewriter@0.0.33': {} 2038 | 2039 | '@types/har-format@1.2.16': {} 2040 | 2041 | '@types/json-schema@7.0.15': {} 2042 | 2043 | '@types/node@22.13.10': 2044 | dependencies: 2045 | undici-types: 6.20.0 2046 | 2047 | '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': 2048 | dependencies: 2049 | '@eslint-community/regexpp': 4.12.1 2050 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 2051 | '@typescript-eslint/scope-manager': 8.33.1 2052 | '@typescript-eslint/type-utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 2053 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 2054 | '@typescript-eslint/visitor-keys': 8.33.1 2055 | eslint: 9.28.0(jiti@2.4.2) 2056 | graphemer: 1.4.0 2057 | ignore: 7.0.5 2058 | natural-compare: 1.4.0 2059 | ts-api-utils: 2.1.0(typescript@5.8.3) 2060 | typescript: 5.8.3 2061 | transitivePeerDependencies: 2062 | - supports-color 2063 | 2064 | '@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': 2065 | dependencies: 2066 | '@typescript-eslint/scope-manager': 8.33.1 2067 | '@typescript-eslint/types': 8.33.1 2068 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 2069 | '@typescript-eslint/visitor-keys': 8.33.1 2070 | debug: 4.4.1 2071 | eslint: 9.28.0(jiti@2.4.2) 2072 | typescript: 5.8.3 2073 | transitivePeerDependencies: 2074 | - supports-color 2075 | 2076 | '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': 2077 | dependencies: 2078 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 2079 | '@typescript-eslint/types': 8.33.1 2080 | debug: 4.4.1 2081 | typescript: 5.8.3 2082 | transitivePeerDependencies: 2083 | - supports-color 2084 | 2085 | '@typescript-eslint/scope-manager@8.33.1': 2086 | dependencies: 2087 | '@typescript-eslint/types': 8.33.1 2088 | '@typescript-eslint/visitor-keys': 8.33.1 2089 | 2090 | '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': 2091 | dependencies: 2092 | typescript: 5.8.3 2093 | 2094 | '@typescript-eslint/type-utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': 2095 | dependencies: 2096 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 2097 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 2098 | debug: 4.4.1 2099 | eslint: 9.28.0(jiti@2.4.2) 2100 | ts-api-utils: 2.1.0(typescript@5.8.3) 2101 | typescript: 5.8.3 2102 | transitivePeerDependencies: 2103 | - supports-color 2104 | 2105 | '@typescript-eslint/types@8.33.1': {} 2106 | 2107 | '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': 2108 | dependencies: 2109 | '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) 2110 | '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) 2111 | '@typescript-eslint/types': 8.33.1 2112 | '@typescript-eslint/visitor-keys': 8.33.1 2113 | debug: 4.4.1 2114 | fast-glob: 3.3.3 2115 | is-glob: 4.0.3 2116 | minimatch: 9.0.5 2117 | semver: 7.7.2 2118 | ts-api-utils: 2.1.0(typescript@5.8.3) 2119 | typescript: 5.8.3 2120 | transitivePeerDependencies: 2121 | - supports-color 2122 | 2123 | '@typescript-eslint/utils@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3)': 2124 | dependencies: 2125 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) 2126 | '@typescript-eslint/scope-manager': 8.33.1 2127 | '@typescript-eslint/types': 8.33.1 2128 | '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) 2129 | eslint: 9.28.0(jiti@2.4.2) 2130 | typescript: 5.8.3 2131 | transitivePeerDependencies: 2132 | - supports-color 2133 | 2134 | '@typescript-eslint/visitor-keys@8.33.1': 2135 | dependencies: 2136 | '@typescript-eslint/types': 8.33.1 2137 | eslint-visitor-keys: 4.2.0 2138 | 2139 | '@webassemblyjs/ast@1.14.1': 2140 | dependencies: 2141 | '@webassemblyjs/helper-numbers': 1.13.2 2142 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 2143 | 2144 | '@webassemblyjs/floating-point-hex-parser@1.13.2': {} 2145 | 2146 | '@webassemblyjs/helper-api-error@1.13.2': {} 2147 | 2148 | '@webassemblyjs/helper-buffer@1.14.1': {} 2149 | 2150 | '@webassemblyjs/helper-numbers@1.13.2': 2151 | dependencies: 2152 | '@webassemblyjs/floating-point-hex-parser': 1.13.2 2153 | '@webassemblyjs/helper-api-error': 1.13.2 2154 | '@xtuc/long': 4.2.2 2155 | 2156 | '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} 2157 | 2158 | '@webassemblyjs/helper-wasm-section@1.14.1': 2159 | dependencies: 2160 | '@webassemblyjs/ast': 1.14.1 2161 | '@webassemblyjs/helper-buffer': 1.14.1 2162 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 2163 | '@webassemblyjs/wasm-gen': 1.14.1 2164 | 2165 | '@webassemblyjs/ieee754@1.13.2': 2166 | dependencies: 2167 | '@xtuc/ieee754': 1.2.0 2168 | 2169 | '@webassemblyjs/leb128@1.13.2': 2170 | dependencies: 2171 | '@xtuc/long': 4.2.2 2172 | 2173 | '@webassemblyjs/utf8@1.13.2': {} 2174 | 2175 | '@webassemblyjs/wasm-edit@1.14.1': 2176 | dependencies: 2177 | '@webassemblyjs/ast': 1.14.1 2178 | '@webassemblyjs/helper-buffer': 1.14.1 2179 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 2180 | '@webassemblyjs/helper-wasm-section': 1.14.1 2181 | '@webassemblyjs/wasm-gen': 1.14.1 2182 | '@webassemblyjs/wasm-opt': 1.14.1 2183 | '@webassemblyjs/wasm-parser': 1.14.1 2184 | '@webassemblyjs/wast-printer': 1.14.1 2185 | 2186 | '@webassemblyjs/wasm-gen@1.14.1': 2187 | dependencies: 2188 | '@webassemblyjs/ast': 1.14.1 2189 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 2190 | '@webassemblyjs/ieee754': 1.13.2 2191 | '@webassemblyjs/leb128': 1.13.2 2192 | '@webassemblyjs/utf8': 1.13.2 2193 | 2194 | '@webassemblyjs/wasm-opt@1.14.1': 2195 | dependencies: 2196 | '@webassemblyjs/ast': 1.14.1 2197 | '@webassemblyjs/helper-buffer': 1.14.1 2198 | '@webassemblyjs/wasm-gen': 1.14.1 2199 | '@webassemblyjs/wasm-parser': 1.14.1 2200 | 2201 | '@webassemblyjs/wasm-parser@1.14.1': 2202 | dependencies: 2203 | '@webassemblyjs/ast': 1.14.1 2204 | '@webassemblyjs/helper-api-error': 1.13.2 2205 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 2206 | '@webassemblyjs/ieee754': 1.13.2 2207 | '@webassemblyjs/leb128': 1.13.2 2208 | '@webassemblyjs/utf8': 1.13.2 2209 | 2210 | '@webassemblyjs/wast-printer@1.14.1': 2211 | dependencies: 2212 | '@webassemblyjs/ast': 1.14.1 2213 | '@xtuc/long': 4.2.2 2214 | 2215 | '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 2216 | dependencies: 2217 | webpack: 5.99.9(webpack-cli@6.0.1) 2218 | webpack-cli: 6.0.1(webpack@5.99.9) 2219 | 2220 | '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 2221 | dependencies: 2222 | webpack: 5.99.9(webpack-cli@6.0.1) 2223 | webpack-cli: 6.0.1(webpack@5.99.9) 2224 | 2225 | '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 2226 | dependencies: 2227 | webpack: 5.99.9(webpack-cli@6.0.1) 2228 | webpack-cli: 6.0.1(webpack@5.99.9) 2229 | 2230 | '@xtuc/ieee754@1.2.0': {} 2231 | 2232 | '@xtuc/long@4.2.2': {} 2233 | 2234 | JSONStream@1.3.5: 2235 | dependencies: 2236 | jsonparse: 1.3.1 2237 | through: 2.3.8 2238 | 2239 | acorn-jsx@5.3.2(acorn@8.14.1): 2240 | dependencies: 2241 | acorn: 8.14.1 2242 | 2243 | acorn@8.14.1: {} 2244 | 2245 | adm-zip@0.5.16: {} 2246 | 2247 | ajv-formats@2.1.1(ajv@8.17.1): 2248 | optionalDependencies: 2249 | ajv: 8.17.1 2250 | 2251 | ajv-keywords@3.5.2(ajv@6.12.6): 2252 | dependencies: 2253 | ajv: 6.12.6 2254 | 2255 | ajv-keywords@5.1.0(ajv@8.17.1): 2256 | dependencies: 2257 | ajv: 8.17.1 2258 | fast-deep-equal: 3.1.3 2259 | 2260 | ajv@6.12.6: 2261 | dependencies: 2262 | fast-deep-equal: 3.1.3 2263 | fast-json-stable-stringify: 2.1.0 2264 | json-schema-traverse: 0.4.1 2265 | uri-js: 4.4.1 2266 | 2267 | ajv@8.17.1: 2268 | dependencies: 2269 | fast-deep-equal: 3.1.3 2270 | fast-uri: 3.0.6 2271 | json-schema-traverse: 1.0.0 2272 | require-from-string: 2.0.2 2273 | 2274 | ansi-regex@5.0.1: {} 2275 | 2276 | ansi-regex@6.1.0: {} 2277 | 2278 | ansi-styles@4.3.0: 2279 | dependencies: 2280 | color-convert: 2.0.1 2281 | 2282 | ansi-styles@6.2.1: {} 2283 | 2284 | argparse@2.0.1: {} 2285 | 2286 | array-ify@1.0.0: {} 2287 | 2288 | balanced-match@1.0.2: {} 2289 | 2290 | big.js@5.2.2: {} 2291 | 2292 | brace-expansion@1.1.11: 2293 | dependencies: 2294 | balanced-match: 1.0.2 2295 | concat-map: 0.0.1 2296 | 2297 | brace-expansion@2.0.1: 2298 | dependencies: 2299 | balanced-match: 1.0.2 2300 | 2301 | braces@3.0.3: 2302 | dependencies: 2303 | fill-range: 7.1.1 2304 | 2305 | browserslist@4.24.5: 2306 | dependencies: 2307 | caniuse-lite: 1.0.30001718 2308 | electron-to-chromium: 1.5.155 2309 | node-releases: 2.0.19 2310 | update-browserslist-db: 1.1.3(browserslist@4.24.5) 2311 | 2312 | buffer-from@1.1.2: {} 2313 | 2314 | callsites@3.1.0: {} 2315 | 2316 | caniuse-lite@1.0.30001718: {} 2317 | 2318 | chalk@4.1.2: 2319 | dependencies: 2320 | ansi-styles: 4.3.0 2321 | supports-color: 7.2.0 2322 | 2323 | chalk@5.4.1: {} 2324 | 2325 | chokidar@4.0.3: 2326 | dependencies: 2327 | readdirp: 4.1.2 2328 | 2329 | chrome-trace-event@1.0.4: {} 2330 | 2331 | cliui@8.0.1: 2332 | dependencies: 2333 | string-width: 4.2.3 2334 | strip-ansi: 6.0.1 2335 | wrap-ansi: 7.0.0 2336 | 2337 | clone-deep@4.0.1: 2338 | dependencies: 2339 | is-plain-object: 2.0.4 2340 | kind-of: 6.0.3 2341 | shallow-clone: 3.0.1 2342 | 2343 | color-convert@2.0.1: 2344 | dependencies: 2345 | color-name: 1.1.4 2346 | 2347 | color-name@1.1.4: {} 2348 | 2349 | colorette@2.0.20: {} 2350 | 2351 | commander@12.1.0: {} 2352 | 2353 | commander@2.20.3: {} 2354 | 2355 | compare-func@2.0.0: 2356 | dependencies: 2357 | array-ify: 1.0.0 2358 | dot-prop: 5.3.0 2359 | 2360 | concat-map@0.0.1: {} 2361 | 2362 | conventional-changelog-angular@7.0.0: 2363 | dependencies: 2364 | compare-func: 2.0.0 2365 | 2366 | conventional-changelog-conventionalcommits@7.0.2: 2367 | dependencies: 2368 | compare-func: 2.0.0 2369 | 2370 | conventional-commits-parser@5.0.0: 2371 | dependencies: 2372 | JSONStream: 1.3.5 2373 | is-text-path: 2.0.0 2374 | meow: 12.1.1 2375 | split2: 4.2.0 2376 | 2377 | copy-webpack-plugin@13.0.0(webpack@5.99.9): 2378 | dependencies: 2379 | glob-parent: 6.0.2 2380 | normalize-path: 3.0.0 2381 | schema-utils: 4.3.0 2382 | serialize-javascript: 6.0.2 2383 | tinyglobby: 0.2.12 2384 | webpack: 5.99.9(webpack-cli@6.0.1) 2385 | 2386 | cosmiconfig-typescript-loader@6.1.0(@types/node@22.13.10)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): 2387 | dependencies: 2388 | '@types/node': 22.13.10 2389 | cosmiconfig: 9.0.0(typescript@5.8.3) 2390 | jiti: 2.4.2 2391 | typescript: 5.8.3 2392 | 2393 | cosmiconfig@9.0.0(typescript@5.8.3): 2394 | dependencies: 2395 | env-paths: 2.2.1 2396 | import-fresh: 3.3.1 2397 | js-yaml: 4.1.0 2398 | parse-json: 5.2.0 2399 | optionalDependencies: 2400 | typescript: 5.8.3 2401 | 2402 | cross-spawn@7.0.6: 2403 | dependencies: 2404 | path-key: 3.1.1 2405 | shebang-command: 2.0.0 2406 | which: 2.0.2 2407 | 2408 | css-loader@7.1.2(webpack@5.99.9): 2409 | dependencies: 2410 | icss-utils: 5.1.0(postcss@8.5.3) 2411 | postcss: 8.5.3 2412 | postcss-modules-extract-imports: 3.1.0(postcss@8.5.3) 2413 | postcss-modules-local-by-default: 4.2.0(postcss@8.5.3) 2414 | postcss-modules-scope: 3.2.1(postcss@8.5.3) 2415 | postcss-modules-values: 4.0.0(postcss@8.5.3) 2416 | postcss-value-parser: 4.2.0 2417 | semver: 7.7.1 2418 | optionalDependencies: 2419 | webpack: 5.99.9(webpack-cli@6.0.1) 2420 | 2421 | cssesc@3.0.0: {} 2422 | 2423 | dargs@8.1.0: {} 2424 | 2425 | debug@4.4.1: 2426 | dependencies: 2427 | ms: 2.1.3 2428 | 2429 | deep-is@0.1.4: {} 2430 | 2431 | detect-libc@1.0.3: 2432 | optional: true 2433 | 2434 | dot-prop@5.3.0: 2435 | dependencies: 2436 | is-obj: 2.0.0 2437 | 2438 | eastasianwidth@0.2.0: {} 2439 | 2440 | electron-to-chromium@1.5.155: {} 2441 | 2442 | emoji-regex@8.0.0: {} 2443 | 2444 | emoji-regex@9.2.2: {} 2445 | 2446 | emojis-list@3.0.0: {} 2447 | 2448 | enhanced-resolve@5.18.1: 2449 | dependencies: 2450 | graceful-fs: 4.2.11 2451 | tapable: 2.2.2 2452 | 2453 | env-paths@2.2.1: {} 2454 | 2455 | envinfo@7.14.0: {} 2456 | 2457 | error-ex@1.3.2: 2458 | dependencies: 2459 | is-arrayish: 0.2.1 2460 | 2461 | es-module-lexer@1.7.0: {} 2462 | 2463 | escalade@3.2.0: {} 2464 | 2465 | escape-string-regexp@4.0.0: {} 2466 | 2467 | eslint-plugin-prettier@5.4.1(@types/eslint@9.6.1)(eslint@9.28.0(jiti@2.4.2))(prettier@3.5.3): 2468 | dependencies: 2469 | eslint: 9.28.0(jiti@2.4.2) 2470 | prettier: 3.5.3 2471 | prettier-linter-helpers: 1.0.0 2472 | synckit: 0.11.8 2473 | optionalDependencies: 2474 | '@types/eslint': 9.6.1 2475 | 2476 | eslint-scope@5.1.1: 2477 | dependencies: 2478 | esrecurse: 4.3.0 2479 | estraverse: 4.3.0 2480 | 2481 | eslint-scope@8.3.0: 2482 | dependencies: 2483 | esrecurse: 4.3.0 2484 | estraverse: 5.3.0 2485 | 2486 | eslint-visitor-keys@3.4.3: {} 2487 | 2488 | eslint-visitor-keys@4.2.0: {} 2489 | 2490 | eslint@9.28.0(jiti@2.4.2): 2491 | dependencies: 2492 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@2.4.2)) 2493 | '@eslint-community/regexpp': 4.12.1 2494 | '@eslint/config-array': 0.20.0 2495 | '@eslint/config-helpers': 0.2.2 2496 | '@eslint/core': 0.14.0 2497 | '@eslint/eslintrc': 3.3.1 2498 | '@eslint/js': 9.28.0 2499 | '@eslint/plugin-kit': 0.3.1 2500 | '@humanfs/node': 0.16.6 2501 | '@humanwhocodes/module-importer': 1.0.1 2502 | '@humanwhocodes/retry': 0.4.3 2503 | '@types/estree': 1.0.7 2504 | '@types/json-schema': 7.0.15 2505 | ajv: 6.12.6 2506 | chalk: 4.1.2 2507 | cross-spawn: 7.0.6 2508 | debug: 4.4.1 2509 | escape-string-regexp: 4.0.0 2510 | eslint-scope: 8.3.0 2511 | eslint-visitor-keys: 4.2.0 2512 | espree: 10.3.0 2513 | esquery: 1.6.0 2514 | esutils: 2.0.3 2515 | fast-deep-equal: 3.1.3 2516 | file-entry-cache: 8.0.0 2517 | find-up: 5.0.0 2518 | glob-parent: 6.0.2 2519 | ignore: 5.3.2 2520 | imurmurhash: 0.1.4 2521 | is-glob: 4.0.3 2522 | json-stable-stringify-without-jsonify: 1.0.1 2523 | lodash.merge: 4.6.2 2524 | minimatch: 3.1.2 2525 | natural-compare: 1.4.0 2526 | optionator: 0.9.4 2527 | optionalDependencies: 2528 | jiti: 2.4.2 2529 | transitivePeerDependencies: 2530 | - supports-color 2531 | 2532 | espree@10.3.0: 2533 | dependencies: 2534 | acorn: 8.14.1 2535 | acorn-jsx: 5.3.2(acorn@8.14.1) 2536 | eslint-visitor-keys: 4.2.0 2537 | 2538 | esquery@1.6.0: 2539 | dependencies: 2540 | estraverse: 5.3.0 2541 | 2542 | esrecurse@4.3.0: 2543 | dependencies: 2544 | estraverse: 5.3.0 2545 | 2546 | estraverse@4.3.0: {} 2547 | 2548 | estraverse@5.3.0: {} 2549 | 2550 | esutils@2.0.3: {} 2551 | 2552 | events@3.3.0: {} 2553 | 2554 | fast-deep-equal@3.1.3: {} 2555 | 2556 | fast-diff@1.3.0: {} 2557 | 2558 | fast-glob@3.3.3: 2559 | dependencies: 2560 | '@nodelib/fs.stat': 2.0.5 2561 | '@nodelib/fs.walk': 1.2.8 2562 | glob-parent: 5.1.2 2563 | merge2: 1.4.1 2564 | micromatch: 4.0.8 2565 | 2566 | fast-json-stable-stringify@2.1.0: {} 2567 | 2568 | fast-levenshtein@2.0.6: {} 2569 | 2570 | fast-uri@3.0.6: {} 2571 | 2572 | fastest-levenshtein@1.0.16: {} 2573 | 2574 | fastq@1.19.1: 2575 | dependencies: 2576 | reusify: 1.1.0 2577 | 2578 | fdir@6.4.3(picomatch@4.0.2): 2579 | optionalDependencies: 2580 | picomatch: 4.0.2 2581 | 2582 | file-entry-cache@8.0.0: 2583 | dependencies: 2584 | flat-cache: 4.0.1 2585 | 2586 | file-loader@6.2.0(webpack@5.99.9): 2587 | dependencies: 2588 | loader-utils: 2.0.4 2589 | schema-utils: 3.3.0 2590 | webpack: 5.99.9(webpack-cli@6.0.1) 2591 | 2592 | fill-range@7.1.1: 2593 | dependencies: 2594 | to-regex-range: 5.0.1 2595 | 2596 | find-up@4.1.0: 2597 | dependencies: 2598 | locate-path: 5.0.0 2599 | path-exists: 4.0.0 2600 | 2601 | find-up@5.0.0: 2602 | dependencies: 2603 | locate-path: 6.0.0 2604 | path-exists: 4.0.0 2605 | 2606 | find-up@7.0.0: 2607 | dependencies: 2608 | locate-path: 7.2.0 2609 | path-exists: 5.0.0 2610 | unicorn-magic: 0.1.0 2611 | 2612 | flat-cache@4.0.1: 2613 | dependencies: 2614 | flatted: 3.3.3 2615 | keyv: 4.5.4 2616 | 2617 | flat@5.0.2: {} 2618 | 2619 | flatted@3.3.3: {} 2620 | 2621 | foreground-child@3.3.1: 2622 | dependencies: 2623 | cross-spawn: 7.0.6 2624 | signal-exit: 4.1.0 2625 | 2626 | function-bind@1.1.2: {} 2627 | 2628 | get-caller-file@2.0.5: {} 2629 | 2630 | git-raw-commits@4.0.0: 2631 | dependencies: 2632 | dargs: 8.1.0 2633 | meow: 12.1.1 2634 | split2: 4.2.0 2635 | 2636 | glob-parent@5.1.2: 2637 | dependencies: 2638 | is-glob: 4.0.3 2639 | 2640 | glob-parent@6.0.2: 2641 | dependencies: 2642 | is-glob: 4.0.3 2643 | 2644 | glob-to-regexp@0.4.1: {} 2645 | 2646 | glob@11.0.1: 2647 | dependencies: 2648 | foreground-child: 3.3.1 2649 | jackspeak: 4.1.0 2650 | minimatch: 10.0.1 2651 | minipass: 7.1.2 2652 | package-json-from-dist: 1.0.1 2653 | path-scurry: 2.0.0 2654 | 2655 | global-directory@4.0.1: 2656 | dependencies: 2657 | ini: 4.1.1 2658 | 2659 | globals@14.0.0: {} 2660 | 2661 | graceful-fs@4.2.11: {} 2662 | 2663 | graphemer@1.4.0: {} 2664 | 2665 | has-flag@4.0.0: {} 2666 | 2667 | hasown@2.0.2: 2668 | dependencies: 2669 | function-bind: 1.1.2 2670 | 2671 | husky@9.1.7: {} 2672 | 2673 | icss-utils@5.1.0(postcss@8.5.3): 2674 | dependencies: 2675 | postcss: 8.5.3 2676 | 2677 | ignore@5.3.2: {} 2678 | 2679 | ignore@7.0.5: {} 2680 | 2681 | immutable@5.1.2: {} 2682 | 2683 | import-fresh@3.3.1: 2684 | dependencies: 2685 | parent-module: 1.0.1 2686 | resolve-from: 4.0.0 2687 | 2688 | import-local@3.2.0: 2689 | dependencies: 2690 | pkg-dir: 4.2.0 2691 | resolve-cwd: 3.0.0 2692 | 2693 | import-meta-resolve@4.1.0: {} 2694 | 2695 | imurmurhash@0.1.4: {} 2696 | 2697 | ini@4.1.1: {} 2698 | 2699 | interpret@3.1.1: {} 2700 | 2701 | is-arrayish@0.2.1: {} 2702 | 2703 | is-core-module@2.16.1: 2704 | dependencies: 2705 | hasown: 2.0.2 2706 | 2707 | is-extglob@2.1.1: {} 2708 | 2709 | is-fullwidth-code-point@3.0.0: {} 2710 | 2711 | is-glob@4.0.3: 2712 | dependencies: 2713 | is-extglob: 2.1.1 2714 | 2715 | is-number@7.0.0: {} 2716 | 2717 | is-obj@2.0.0: {} 2718 | 2719 | is-plain-object@2.0.4: 2720 | dependencies: 2721 | isobject: 3.0.1 2722 | 2723 | is-text-path@2.0.0: 2724 | dependencies: 2725 | text-extensions: 2.4.0 2726 | 2727 | isexe@2.0.0: {} 2728 | 2729 | isobject@3.0.1: {} 2730 | 2731 | jackspeak@4.1.0: 2732 | dependencies: 2733 | '@isaacs/cliui': 8.0.2 2734 | 2735 | jest-worker@27.5.1: 2736 | dependencies: 2737 | '@types/node': 22.13.10 2738 | merge-stream: 2.0.0 2739 | supports-color: 8.1.1 2740 | 2741 | jiti@2.4.2: {} 2742 | 2743 | js-tokens@4.0.0: {} 2744 | 2745 | js-yaml@4.1.0: 2746 | dependencies: 2747 | argparse: 2.0.1 2748 | 2749 | json-buffer@3.0.1: {} 2750 | 2751 | json-parse-even-better-errors@2.3.1: {} 2752 | 2753 | json-schema-traverse@0.4.1: {} 2754 | 2755 | json-schema-traverse@1.0.0: {} 2756 | 2757 | json-stable-stringify-without-jsonify@1.0.1: {} 2758 | 2759 | json5@2.2.3: {} 2760 | 2761 | jsonparse@1.3.1: {} 2762 | 2763 | keyv@4.5.4: 2764 | dependencies: 2765 | json-buffer: 3.0.1 2766 | 2767 | kind-of@6.0.3: {} 2768 | 2769 | levn@0.4.1: 2770 | dependencies: 2771 | prelude-ls: 1.2.1 2772 | type-check: 0.4.0 2773 | 2774 | lines-and-columns@1.2.4: {} 2775 | 2776 | loader-runner@4.3.0: {} 2777 | 2778 | loader-utils@2.0.4: 2779 | dependencies: 2780 | big.js: 5.2.2 2781 | emojis-list: 3.0.0 2782 | json5: 2.2.3 2783 | 2784 | locate-path@5.0.0: 2785 | dependencies: 2786 | p-locate: 4.1.0 2787 | 2788 | locate-path@6.0.0: 2789 | dependencies: 2790 | p-locate: 5.0.0 2791 | 2792 | locate-path@7.2.0: 2793 | dependencies: 2794 | p-locate: 6.0.0 2795 | 2796 | lodash.camelcase@4.3.0: {} 2797 | 2798 | lodash.isplainobject@4.0.6: {} 2799 | 2800 | lodash.kebabcase@4.1.1: {} 2801 | 2802 | lodash.merge@4.6.2: {} 2803 | 2804 | lodash.mergewith@4.6.2: {} 2805 | 2806 | lodash.snakecase@4.1.1: {} 2807 | 2808 | lodash.startcase@4.4.0: {} 2809 | 2810 | lodash.uniq@4.5.0: {} 2811 | 2812 | lodash.upperfirst@4.3.1: {} 2813 | 2814 | lru-cache@11.0.2: {} 2815 | 2816 | meow@12.1.1: {} 2817 | 2818 | merge-stream@2.0.0: {} 2819 | 2820 | merge2@1.4.1: {} 2821 | 2822 | micromatch@4.0.8: 2823 | dependencies: 2824 | braces: 3.0.3 2825 | picomatch: 2.3.1 2826 | 2827 | mime-db@1.52.0: {} 2828 | 2829 | mime-types@2.1.35: 2830 | dependencies: 2831 | mime-db: 1.52.0 2832 | 2833 | mini-css-extract-plugin@2.9.2(webpack@5.99.9): 2834 | dependencies: 2835 | schema-utils: 4.3.0 2836 | tapable: 2.2.1 2837 | webpack: 5.99.9(webpack-cli@6.0.1) 2838 | 2839 | minimatch@10.0.1: 2840 | dependencies: 2841 | brace-expansion: 2.0.1 2842 | 2843 | minimatch@3.1.2: 2844 | dependencies: 2845 | brace-expansion: 1.1.11 2846 | 2847 | minimatch@9.0.5: 2848 | dependencies: 2849 | brace-expansion: 2.0.1 2850 | 2851 | minimist@1.2.8: {} 2852 | 2853 | minipass@7.1.2: {} 2854 | 2855 | ms@2.1.3: {} 2856 | 2857 | nanoid@3.3.9: {} 2858 | 2859 | natural-compare@1.4.0: {} 2860 | 2861 | neo-async@2.6.2: {} 2862 | 2863 | node-addon-api@7.1.1: 2864 | optional: true 2865 | 2866 | node-releases@2.0.19: {} 2867 | 2868 | normalize-path@3.0.0: {} 2869 | 2870 | optionator@0.9.4: 2871 | dependencies: 2872 | deep-is: 0.1.4 2873 | fast-levenshtein: 2.0.6 2874 | levn: 0.4.1 2875 | prelude-ls: 1.2.1 2876 | type-check: 0.4.0 2877 | word-wrap: 1.2.5 2878 | 2879 | p-limit@2.3.0: 2880 | dependencies: 2881 | p-try: 2.2.0 2882 | 2883 | p-limit@3.1.0: 2884 | dependencies: 2885 | yocto-queue: 0.1.0 2886 | 2887 | p-limit@4.0.0: 2888 | dependencies: 2889 | yocto-queue: 1.2.1 2890 | 2891 | p-locate@4.1.0: 2892 | dependencies: 2893 | p-limit: 2.3.0 2894 | 2895 | p-locate@5.0.0: 2896 | dependencies: 2897 | p-limit: 3.1.0 2898 | 2899 | p-locate@6.0.0: 2900 | dependencies: 2901 | p-limit: 4.0.0 2902 | 2903 | p-try@2.2.0: {} 2904 | 2905 | package-json-from-dist@1.0.1: {} 2906 | 2907 | parent-module@1.0.1: 2908 | dependencies: 2909 | callsites: 3.1.0 2910 | 2911 | parse-json@5.2.0: 2912 | dependencies: 2913 | '@babel/code-frame': 7.27.1 2914 | error-ex: 1.3.2 2915 | json-parse-even-better-errors: 2.3.1 2916 | lines-and-columns: 1.2.4 2917 | 2918 | path-exists@4.0.0: {} 2919 | 2920 | path-exists@5.0.0: {} 2921 | 2922 | path-key@3.1.1: {} 2923 | 2924 | path-parse@1.0.7: {} 2925 | 2926 | path-scurry@2.0.0: 2927 | dependencies: 2928 | lru-cache: 11.0.2 2929 | minipass: 7.1.2 2930 | 2931 | picocolors@1.1.1: {} 2932 | 2933 | picomatch@2.3.1: {} 2934 | 2935 | picomatch@4.0.2: {} 2936 | 2937 | pkg-dir@4.2.0: 2938 | dependencies: 2939 | find-up: 4.1.0 2940 | 2941 | postcss-modules-extract-imports@3.1.0(postcss@8.5.3): 2942 | dependencies: 2943 | postcss: 8.5.3 2944 | 2945 | postcss-modules-local-by-default@4.2.0(postcss@8.5.3): 2946 | dependencies: 2947 | icss-utils: 5.1.0(postcss@8.5.3) 2948 | postcss: 8.5.3 2949 | postcss-selector-parser: 7.1.0 2950 | postcss-value-parser: 4.2.0 2951 | 2952 | postcss-modules-scope@3.2.1(postcss@8.5.3): 2953 | dependencies: 2954 | postcss: 8.5.3 2955 | postcss-selector-parser: 7.1.0 2956 | 2957 | postcss-modules-values@4.0.0(postcss@8.5.3): 2958 | dependencies: 2959 | icss-utils: 5.1.0(postcss@8.5.3) 2960 | postcss: 8.5.3 2961 | 2962 | postcss-selector-parser@7.1.0: 2963 | dependencies: 2964 | cssesc: 3.0.0 2965 | util-deprecate: 1.0.2 2966 | 2967 | postcss-value-parser@4.2.0: {} 2968 | 2969 | postcss@8.5.3: 2970 | dependencies: 2971 | nanoid: 3.3.9 2972 | picocolors: 1.1.1 2973 | source-map-js: 1.2.1 2974 | 2975 | prelude-ls@1.2.1: {} 2976 | 2977 | prettier-linter-helpers@1.0.0: 2978 | dependencies: 2979 | fast-diff: 1.3.0 2980 | 2981 | prettier@3.5.3: {} 2982 | 2983 | punycode@2.3.1: {} 2984 | 2985 | queue-microtask@1.2.3: {} 2986 | 2987 | randombytes@2.1.0: 2988 | dependencies: 2989 | safe-buffer: 5.2.1 2990 | 2991 | readdirp@4.1.2: {} 2992 | 2993 | rechoir@0.8.0: 2994 | dependencies: 2995 | resolve: 1.22.10 2996 | 2997 | require-directory@2.1.1: {} 2998 | 2999 | require-from-string@2.0.2: {} 3000 | 3001 | resolve-cwd@3.0.0: 3002 | dependencies: 3003 | resolve-from: 5.0.0 3004 | 3005 | resolve-from@4.0.0: {} 3006 | 3007 | resolve-from@5.0.0: {} 3008 | 3009 | resolve@1.22.10: 3010 | dependencies: 3011 | is-core-module: 2.16.1 3012 | path-parse: 1.0.7 3013 | supports-preserve-symlinks-flag: 1.0.0 3014 | 3015 | reusify@1.1.0: {} 3016 | 3017 | rimraf@6.0.1: 3018 | dependencies: 3019 | glob: 11.0.1 3020 | package-json-from-dist: 1.0.1 3021 | 3022 | run-parallel@1.2.0: 3023 | dependencies: 3024 | queue-microtask: 1.2.3 3025 | 3026 | safe-buffer@5.2.1: {} 3027 | 3028 | sass-loader@16.0.5(sass@1.89.1)(webpack@5.99.9): 3029 | dependencies: 3030 | neo-async: 2.6.2 3031 | optionalDependencies: 3032 | sass: 1.89.1 3033 | webpack: 5.99.9(webpack-cli@6.0.1) 3034 | 3035 | sass@1.89.1: 3036 | dependencies: 3037 | chokidar: 4.0.3 3038 | immutable: 5.1.2 3039 | source-map-js: 1.2.1 3040 | optionalDependencies: 3041 | '@parcel/watcher': 2.5.1 3042 | 3043 | schema-utils@3.3.0: 3044 | dependencies: 3045 | '@types/json-schema': 7.0.15 3046 | ajv: 6.12.6 3047 | ajv-keywords: 3.5.2(ajv@6.12.6) 3048 | 3049 | schema-utils@4.3.0: 3050 | dependencies: 3051 | '@types/json-schema': 7.0.15 3052 | ajv: 8.17.1 3053 | ajv-formats: 2.1.1(ajv@8.17.1) 3054 | ajv-keywords: 5.1.0(ajv@8.17.1) 3055 | 3056 | schema-utils@4.3.2: 3057 | dependencies: 3058 | '@types/json-schema': 7.0.15 3059 | ajv: 8.17.1 3060 | ajv-formats: 2.1.1(ajv@8.17.1) 3061 | ajv-keywords: 5.1.0(ajv@8.17.1) 3062 | 3063 | semver@7.7.1: {} 3064 | 3065 | semver@7.7.2: {} 3066 | 3067 | serialize-javascript@6.0.2: 3068 | dependencies: 3069 | randombytes: 2.1.0 3070 | 3071 | shallow-clone@3.0.1: 3072 | dependencies: 3073 | kind-of: 6.0.3 3074 | 3075 | shebang-command@2.0.0: 3076 | dependencies: 3077 | shebang-regex: 3.0.0 3078 | 3079 | shebang-regex@3.0.0: {} 3080 | 3081 | signal-exit@4.1.0: {} 3082 | 3083 | source-map-js@1.2.1: {} 3084 | 3085 | source-map-support@0.5.21: 3086 | dependencies: 3087 | buffer-from: 1.1.2 3088 | source-map: 0.6.1 3089 | 3090 | source-map@0.6.1: {} 3091 | 3092 | source-map@0.7.4: {} 3093 | 3094 | split2@4.2.0: {} 3095 | 3096 | string-width@4.2.3: 3097 | dependencies: 3098 | emoji-regex: 8.0.0 3099 | is-fullwidth-code-point: 3.0.0 3100 | strip-ansi: 6.0.1 3101 | 3102 | string-width@5.1.2: 3103 | dependencies: 3104 | eastasianwidth: 0.2.0 3105 | emoji-regex: 9.2.2 3106 | strip-ansi: 7.1.0 3107 | 3108 | strip-ansi@6.0.1: 3109 | dependencies: 3110 | ansi-regex: 5.0.1 3111 | 3112 | strip-ansi@7.1.0: 3113 | dependencies: 3114 | ansi-regex: 6.1.0 3115 | 3116 | strip-json-comments@3.1.1: {} 3117 | 3118 | supports-color@7.2.0: 3119 | dependencies: 3120 | has-flag: 4.0.0 3121 | 3122 | supports-color@8.1.1: 3123 | dependencies: 3124 | has-flag: 4.0.0 3125 | 3126 | supports-preserve-symlinks-flag@1.0.0: {} 3127 | 3128 | synckit@0.11.8: 3129 | dependencies: 3130 | '@pkgr/core': 0.2.4 3131 | 3132 | tapable@2.2.1: {} 3133 | 3134 | tapable@2.2.2: {} 3135 | 3136 | terser-webpack-plugin@5.3.14(webpack@5.99.9): 3137 | dependencies: 3138 | '@jridgewell/trace-mapping': 0.3.25 3139 | jest-worker: 27.5.1 3140 | schema-utils: 4.3.0 3141 | serialize-javascript: 6.0.2 3142 | terser: 5.39.0 3143 | webpack: 5.99.9(webpack-cli@6.0.1) 3144 | 3145 | terser@5.39.0: 3146 | dependencies: 3147 | '@jridgewell/source-map': 0.3.6 3148 | acorn: 8.14.1 3149 | commander: 2.20.3 3150 | source-map-support: 0.5.21 3151 | 3152 | text-extensions@2.4.0: {} 3153 | 3154 | through@2.3.8: {} 3155 | 3156 | tinyexec@1.0.1: {} 3157 | 3158 | tinyglobby@0.2.12: 3159 | dependencies: 3160 | fdir: 6.4.3(picomatch@4.0.2) 3161 | picomatch: 4.0.2 3162 | 3163 | to-regex-range@5.0.1: 3164 | dependencies: 3165 | is-number: 7.0.0 3166 | 3167 | ts-api-utils@2.1.0(typescript@5.8.3): 3168 | dependencies: 3169 | typescript: 5.8.3 3170 | 3171 | ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.9): 3172 | dependencies: 3173 | chalk: 4.1.2 3174 | enhanced-resolve: 5.18.1 3175 | micromatch: 4.0.8 3176 | semver: 7.7.1 3177 | source-map: 0.7.4 3178 | typescript: 5.8.3 3179 | webpack: 5.99.9(webpack-cli@6.0.1) 3180 | 3181 | type-check@0.4.0: 3182 | dependencies: 3183 | prelude-ls: 1.2.1 3184 | 3185 | typescript-eslint@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3): 3186 | dependencies: 3187 | '@typescript-eslint/eslint-plugin': 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 3188 | '@typescript-eslint/parser': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 3189 | '@typescript-eslint/utils': 8.33.1(eslint@9.28.0(jiti@2.4.2))(typescript@5.8.3) 3190 | eslint: 9.28.0(jiti@2.4.2) 3191 | typescript: 5.8.3 3192 | transitivePeerDependencies: 3193 | - supports-color 3194 | 3195 | typescript@5.8.3: {} 3196 | 3197 | undici-types@6.20.0: {} 3198 | 3199 | unicorn-magic@0.1.0: {} 3200 | 3201 | update-browserslist-db@1.1.3(browserslist@4.24.5): 3202 | dependencies: 3203 | browserslist: 4.24.5 3204 | escalade: 3.2.0 3205 | picocolors: 1.1.1 3206 | 3207 | uri-js@4.4.1: 3208 | dependencies: 3209 | punycode: 2.3.1 3210 | 3211 | util-deprecate@1.0.2: {} 3212 | 3213 | watchpack@2.4.3: 3214 | dependencies: 3215 | glob-to-regexp: 0.4.1 3216 | graceful-fs: 4.2.11 3217 | 3218 | webpack-cli@6.0.1(webpack@5.99.9): 3219 | dependencies: 3220 | '@discoveryjs/json-ext': 0.6.3 3221 | '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 3222 | '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 3223 | '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 3224 | colorette: 2.0.20 3225 | commander: 12.1.0 3226 | cross-spawn: 7.0.6 3227 | envinfo: 7.14.0 3228 | fastest-levenshtein: 1.0.16 3229 | import-local: 3.2.0 3230 | interpret: 3.1.1 3231 | rechoir: 0.8.0 3232 | webpack: 5.99.9(webpack-cli@6.0.1) 3233 | webpack-merge: 6.0.1 3234 | 3235 | webpack-merge@6.0.1: 3236 | dependencies: 3237 | clone-deep: 4.0.1 3238 | flat: 5.0.2 3239 | wildcard: 2.0.1 3240 | 3241 | webpack-sources@3.2.3: {} 3242 | 3243 | webpack@5.99.9(webpack-cli@6.0.1): 3244 | dependencies: 3245 | '@types/eslint-scope': 3.7.7 3246 | '@types/estree': 1.0.7 3247 | '@types/json-schema': 7.0.15 3248 | '@webassemblyjs/ast': 1.14.1 3249 | '@webassemblyjs/wasm-edit': 1.14.1 3250 | '@webassemblyjs/wasm-parser': 1.14.1 3251 | acorn: 8.14.1 3252 | browserslist: 4.24.5 3253 | chrome-trace-event: 1.0.4 3254 | enhanced-resolve: 5.18.1 3255 | es-module-lexer: 1.7.0 3256 | eslint-scope: 5.1.1 3257 | events: 3.3.0 3258 | glob-to-regexp: 0.4.1 3259 | graceful-fs: 4.2.11 3260 | json-parse-even-better-errors: 2.3.1 3261 | loader-runner: 4.3.0 3262 | mime-types: 2.1.35 3263 | neo-async: 2.6.2 3264 | schema-utils: 4.3.2 3265 | tapable: 2.2.2 3266 | terser-webpack-plugin: 5.3.14(webpack@5.99.9) 3267 | watchpack: 2.4.3 3268 | webpack-sources: 3.2.3 3269 | optionalDependencies: 3270 | webpack-cli: 6.0.1(webpack@5.99.9) 3271 | transitivePeerDependencies: 3272 | - '@swc/core' 3273 | - esbuild 3274 | - uglify-js 3275 | 3276 | which@2.0.2: 3277 | dependencies: 3278 | isexe: 2.0.0 3279 | 3280 | wildcard@2.0.1: {} 3281 | 3282 | word-wrap@1.2.5: {} 3283 | 3284 | wrap-ansi@7.0.0: 3285 | dependencies: 3286 | ansi-styles: 4.3.0 3287 | string-width: 4.2.3 3288 | strip-ansi: 6.0.1 3289 | 3290 | wrap-ansi@8.1.0: 3291 | dependencies: 3292 | ansi-styles: 6.2.1 3293 | string-width: 5.1.2 3294 | strip-ansi: 7.1.0 3295 | 3296 | y18n@5.0.8: {} 3297 | 3298 | yargs-parser@21.1.1: {} 3299 | 3300 | yargs@17.7.2: 3301 | dependencies: 3302 | cliui: 8.0.1 3303 | escalade: 3.2.0 3304 | get-caller-file: 2.0.5 3305 | require-directory: 2.1.1 3306 | string-width: 4.2.3 3307 | y18n: 5.0.8 3308 | yargs-parser: 21.1.1 3309 | 3310 | yocto-queue@0.1.0: {} 3311 | 3312 | yocto-queue@1.2.1: {} 3313 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "packages/*" 3 | -------------------------------------------------------------------------------- /public/chrome-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Vue Devtools Unlocker", 4 | "version": "1.1.0", 5 | "description": "Enable Vue DevTools in production environments", 6 | "icons": { 7 | "16": "icons/icon_16.png", 8 | "32": "icons/icon_32.png", 9 | "48": "icons/icon_48.png", 10 | "128": "icons/icon_128.png" 11 | }, 12 | "web_accessible_resources": [ 13 | { 14 | "resources": ["injectedScript.js"], 15 | "matches": [""], 16 | "extension_ids": [] 17 | } 18 | ], 19 | "background": { 20 | "service_worker": "background.js" 21 | }, 22 | "options_ui": { 23 | "page": "options.html", 24 | "open_in_tab": false 25 | }, 26 | "action": { 27 | "default_title": "Vue Devtools Unlocker", 28 | "default_popup": "popup.html" 29 | }, 30 | "permissions": [ 31 | "tabs", 32 | "storage" 33 | ], 34 | "content_scripts": [ 35 | { 36 | "matches": [ 37 | "" 38 | ], 39 | "run_at": "document_idle", 40 | "js": [ 41 | "contentScript.js" 42 | ] 43 | } 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /public/firefox-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Vue Devtools Unlocker", 4 | "version": "1.1.0", 5 | "description": "Enable Vue DevTools in production environments", 6 | "icons": { 7 | "16": "icons/icon_16.png", 8 | "32": "icons/icon_32.png", 9 | "48": "icons/icon_48.png", 10 | "128": "icons/icon_128.png" 11 | }, 12 | "browser_specific_settings": { 13 | "gecko": { 14 | "id": "vue-devtools-unlocker@huayi-data.com", 15 | "strict_min_version": "109.0" 16 | } 17 | }, 18 | "web_accessible_resources": [ 19 | { 20 | "resources": ["injectedScript.js"], 21 | "matches": [""] 22 | } 23 | ], 24 | "background": { 25 | "scripts": ["background.js"] 26 | }, 27 | "options_ui": { 28 | "page": "options.html", 29 | "open_in_tab": false 30 | }, 31 | "action": { 32 | "default_title": "Vue Devtools Unlocker", 33 | "default_popup": "popup.html" 34 | }, 35 | "permissions": [ 36 | "tabs", 37 | "storage" 38 | ], 39 | "content_scripts": [ 40 | { 41 | "matches": [ 42 | "" 43 | ], 44 | "run_at": "document_idle", 45 | "js": [ 46 | "contentScript.js" 47 | ] 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /public/icons/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhensherlock/vue-devtools-unlocker/0a7f880ecf216cd2e42a9a0371364c67227b4b82/public/icons/icon_128.png -------------------------------------------------------------------------------- /public/icons/icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhensherlock/vue-devtools-unlocker/0a7f880ecf216cd2e42a9a0371364c67227b4b82/public/icons/icon_16.png -------------------------------------------------------------------------------- /public/icons/icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhensherlock/vue-devtools-unlocker/0a7f880ecf216cd2e42a9a0371364c67227b4b82/public/icons/icon_32.png -------------------------------------------------------------------------------- /public/icons/icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhensherlock/vue-devtools-unlocker/0a7f880ecf216cd2e42a9a0371364c67227b4b82/public/icons/icon_48.png -------------------------------------------------------------------------------- /public/options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vue Devtools Unlocker Settings 6 | 7 | 8 | 9 |
10 |
11 |

Settings

12 |
13 |
14 | 15 | 16 |

Enter the URLs or patterns where you want to enable Vue Devtools. Use * for wildcards. Example: *.example.com

17 |
18 |
19 | 20 |
21 |
22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /public/popup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Vue Devtools Unlocker 6 | 7 | 8 | 9 |
10 |
11 | 12 |

Vue Devtools Unlocker

13 |
14 |
15 |
16 |
17 |
18 | Checking Vue DevTools status... 19 |
20 |
21 |
22 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ], 6 | "baseBranches": ["dev"], 7 | "prConcurrentLimit": 0 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.root.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "target": "es6", 5 | "module": "commonjs", 6 | "esModuleInterop": true, 7 | "strict": true, 8 | "paths": { 9 | "@/*": ["./src/*"], 10 | }, 11 | "typeRoots": ["./node_modules/@types", "./src/types"] 12 | }, 13 | "exclude": [] 14 | } 15 | --------------------------------------------------------------------------------