├── .github ├── FUNDING.yml └── workflows │ └── tests.yaml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src ├── exporter.ts ├── index.ts ├── pluralizer.ts ├── translator.ts ├── vite.ts └── vue.ts ├── tests ├── exporter.test.ts ├── fixtures │ ├── lang │ │ ├── de.json │ │ ├── en.json │ │ ├── en │ │ │ ├── auth.php │ │ │ ├── domain │ │ │ │ ├── car.php │ │ │ │ └── user.php │ │ │ └── nested │ │ │ │ └── cars │ │ │ │ └── car.php │ │ ├── es.json │ │ ├── fr │ │ │ └── auth.php │ │ ├── pt.json │ │ ├── pt │ │ │ ├── auth.php │ │ │ └── nested │ │ │ │ └── cars │ │ │ │ └── car.php │ │ ├── wrongfolder │ │ │ └── random.php │ │ └── zh_TW.json │ └── locales │ │ └── en │ │ ├── auth.php │ │ └── domain │ │ └── user.php └── trans.test.ts ├── tsconfig.json └── vite.config.ts /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: sergix44 4 | -------------------------------------------------------------------------------- /.github/workflows/tests.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: [ master ] 4 | pull_request: 5 | branches: [ master ] 6 | 7 | jobs: 8 | tests: 9 | runs-on: ubuntu-latest 10 | 11 | strategy: 12 | matrix: 13 | node-version: [ 18.x ] 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | - name: Use Node.js ${{ matrix.node-version }} 18 | uses: actions/setup-node@v3 19 | with: 20 | node-version: ${{ matrix.node-version }} 21 | cache: "npm" 22 | 23 | - name: Npm install 24 | run: npm ci 25 | 26 | - name: Execute tests 27 | run: npm run tests -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | sergio@brighenti.me. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Sergio Brighenti 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 | > Laravel Translator for Frontend 4 | 5 | Laravel Translator is a package that allows you to use Laravel's localization features in your frontend code, with 6 | the same syntax you would use in your backend code and zero configuration. 7 | 8 | This package was inspired by [laravel-vue-i18n](https://github.com/xiCO2k/laravel-vue-i18n) 9 | and [lingua](https://github.com/cyberwolf-studio/lingua). 10 | 11 | ## 🧩 Features 12 | 13 | - Frontend framework-agnostic, works with any framework or even plain javascript (and even without Laravel) 14 | - Use the same translation files you use in your backend code (both php and json files are supported) 15 | - No extra configuration required: install, register and use 16 | - Zero SSR configuration required 17 | - No export step required, translations are parsed and bundled directly from your backend code by Vite 18 | - Support for hot reloading 19 | - Minimal and lightweight 20 | 21 | ## 🚀 Installation 22 | 23 | *ViteJS is required to use this package.* 24 | Install the package via npm or yarn: 25 | 26 | ```bash 27 | npm install -D laravel-translator 28 | ``` 29 | 30 | In your `vite.config.js` file, register the plugin: 31 | 32 | ```js 33 | import {defineConfig} from 'vite' 34 | import laravelTranslator from 'laravel-translator/vite' 35 | 36 | export default defineConfig({ 37 | plugins: [ 38 | // ... 39 | laravelTranslator() 40 | ] 41 | }) 42 | ``` 43 | 44 | Run `npm run dev` to start the development server, or `npm run build` to build your assets for production. 45 | 46 | Remember to set the language in your `html`, for example in your `app.blade.php` file: 47 | 48 | ```html 49 | 50 | 51 | ``` 52 | 53 | If you want to also pass the fallback locale to your frontend code, you can do so by adding the following line to your 54 | `app.blade.php` file: 55 | 56 | ```html 57 | 58 | 61 | ``` 62 | 63 | ## 🧑‍💻Usage 64 | 65 | You can import the usual Laravel translation functions from the `laravel-translator` package: 66 | 67 | ```js 68 | import {__, trans, t, trans_choice} from 'laravel-translator' 69 | 70 | __('user.welcome', {name: 'John'}) // Welcome, John! 71 | trans('auth.failed') // These credentials do not match our records. 72 | t('auth.failed') // ... 73 | 74 | trans_choice('user.count', 1) // User 75 | trans_choice('user.count', 2) // Users 76 | ``` 77 | 78 | #### Svelte 79 | 80 | ```html 81 | 82 | 85 | 86 |

{__('page.title')}

87 | 88 |

{__('page.content')}

89 | ``` 90 | 91 | #### Vue 92 | 93 | Register the plugin: 94 | ```js 95 | ... 96 | .use(LaravelTranslatorVue, { 97 | locale: 'it' 98 | // fallbackLocale: 'en', optional 99 | }) 100 | ... 101 | ``` 102 | 103 | Use the functions function in your components: 104 | 105 | ```html 106 | 116 | ``` 117 | 118 | ### Advanced usage 119 | 120 | It's possible to set the locale and the fallback locale manually, by using the `setLocale` function: 121 | 122 | ```js 123 | import {setLocale} from "laravel-translator" 124 | 125 | setLocale('it') // Set the locale to 'it' 126 | setLocale('it', 'en') // Set the locale to 'it' and the fallback locale to 'en' 127 | ``` 128 | 129 | You can add additional path where to look for translation files on the Vite plugin options: 130 | 131 | ```js 132 | import {defineConfig} from 'vite' 133 | import laravelTranslator from 'laravel-translator/vite' 134 | 135 | export default defineConfig({ 136 | plugins: [ 137 | // ... 138 | laravelTranslator({ 139 | langPath: 'resources/js/translations', // By default, the package looks for translations in the 'lang' folder 140 | additionalLangPaths: ['vendor/my-package/lang'] // You can add additional paths where to look for translations 141 | }) 142 | ] 143 | }) 144 | ``` 145 | 146 | ## ⚙️ How it works 147 | 148 | This package uses [Vite](https://vitejs.dev/) Virtual Modules feature to parse your translations files and make them 149 | available in your frontend code, without the need to export them to a separate file. 150 | 151 | In development mode, the translations are parsed and bundled on the fly, and hot reloaded when the files change. 152 | 153 | In production mode, the translations are parsed and bundled automatically when you run `npm run build`. 154 | 155 | ## ⚖️ License 156 | 157 | The MIT License (MIT). Please see [License File](LICENSE) for more information. 158 | 159 | ## 🏅 Credits 160 | 161 | - [Sergio Brighenti](https://github.com/sergix44/) 162 | - [All Contributors](https://github.com/sergix44/laravel-translator-js/contributors) -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel-translator", 3 | "version": "1.0.5", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "laravel-translator", 9 | "version": "1.0.5", 10 | "license": "MIT", 11 | "dependencies": { 12 | "glob": "^10.3.10", 13 | "php-parser": "^3.1.5" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "^20.10.4", 17 | "@vitest/coverage-v8": "^1.0.4", 18 | "tsup": "^8.0.1", 19 | "typescript": "^5.3.3", 20 | "vite": "^5.2.8", 21 | "vitest": "^1.0.0", 22 | "vue": "^3.4.27" 23 | } 24 | }, 25 | "node_modules/@ampproject/remapping": { 26 | "version": "2.2.1", 27 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", 28 | "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", 29 | "dev": true, 30 | "dependencies": { 31 | "@jridgewell/gen-mapping": "^0.3.0", 32 | "@jridgewell/trace-mapping": "^0.3.9" 33 | }, 34 | "engines": { 35 | "node": ">=6.0.0" 36 | } 37 | }, 38 | "node_modules/@babel/helper-string-parser": { 39 | "version": "7.23.4", 40 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", 41 | "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", 42 | "dev": true, 43 | "engines": { 44 | "node": ">=6.9.0" 45 | } 46 | }, 47 | "node_modules/@babel/helper-validator-identifier": { 48 | "version": "7.22.20", 49 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 50 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 51 | "dev": true, 52 | "engines": { 53 | "node": ">=6.9.0" 54 | } 55 | }, 56 | "node_modules/@babel/parser": { 57 | "version": "7.24.5", 58 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 59 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", 60 | "dev": true, 61 | "bin": { 62 | "parser": "bin/babel-parser.js" 63 | }, 64 | "engines": { 65 | "node": ">=6.0.0" 66 | } 67 | }, 68 | "node_modules/@babel/types": { 69 | "version": "7.23.6", 70 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", 71 | "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", 72 | "dev": true, 73 | "dependencies": { 74 | "@babel/helper-string-parser": "^7.23.4", 75 | "@babel/helper-validator-identifier": "^7.22.20", 76 | "to-fast-properties": "^2.0.0" 77 | }, 78 | "engines": { 79 | "node": ">=6.9.0" 80 | } 81 | }, 82 | "node_modules/@bcoe/v8-coverage": { 83 | "version": "0.2.3", 84 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 85 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 86 | "dev": true 87 | }, 88 | "node_modules/@esbuild/aix-ppc64": { 89 | "version": "0.19.10", 90 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", 91 | "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", 92 | "cpu": [ 93 | "ppc64" 94 | ], 95 | "dev": true, 96 | "optional": true, 97 | "os": [ 98 | "aix" 99 | ], 100 | "engines": { 101 | "node": ">=12" 102 | } 103 | }, 104 | "node_modules/@esbuild/android-arm": { 105 | "version": "0.19.10", 106 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", 107 | "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", 108 | "cpu": [ 109 | "arm" 110 | ], 111 | "dev": true, 112 | "optional": true, 113 | "os": [ 114 | "android" 115 | ], 116 | "engines": { 117 | "node": ">=12" 118 | } 119 | }, 120 | "node_modules/@esbuild/android-arm64": { 121 | "version": "0.19.10", 122 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz", 123 | "integrity": "sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==", 124 | "cpu": [ 125 | "arm64" 126 | ], 127 | "dev": true, 128 | "optional": true, 129 | "os": [ 130 | "android" 131 | ], 132 | "engines": { 133 | "node": ">=12" 134 | } 135 | }, 136 | "node_modules/@esbuild/android-x64": { 137 | "version": "0.19.10", 138 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.10.tgz", 139 | "integrity": "sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==", 140 | "cpu": [ 141 | "x64" 142 | ], 143 | "dev": true, 144 | "optional": true, 145 | "os": [ 146 | "android" 147 | ], 148 | "engines": { 149 | "node": ">=12" 150 | } 151 | }, 152 | "node_modules/@esbuild/darwin-arm64": { 153 | "version": "0.19.10", 154 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz", 155 | "integrity": "sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==", 156 | "cpu": [ 157 | "arm64" 158 | ], 159 | "dev": true, 160 | "optional": true, 161 | "os": [ 162 | "darwin" 163 | ], 164 | "engines": { 165 | "node": ">=12" 166 | } 167 | }, 168 | "node_modules/@esbuild/darwin-x64": { 169 | "version": "0.19.10", 170 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz", 171 | "integrity": "sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==", 172 | "cpu": [ 173 | "x64" 174 | ], 175 | "dev": true, 176 | "optional": true, 177 | "os": [ 178 | "darwin" 179 | ], 180 | "engines": { 181 | "node": ">=12" 182 | } 183 | }, 184 | "node_modules/@esbuild/freebsd-arm64": { 185 | "version": "0.19.10", 186 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz", 187 | "integrity": "sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==", 188 | "cpu": [ 189 | "arm64" 190 | ], 191 | "dev": true, 192 | "optional": true, 193 | "os": [ 194 | "freebsd" 195 | ], 196 | "engines": { 197 | "node": ">=12" 198 | } 199 | }, 200 | "node_modules/@esbuild/freebsd-x64": { 201 | "version": "0.19.10", 202 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz", 203 | "integrity": "sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==", 204 | "cpu": [ 205 | "x64" 206 | ], 207 | "dev": true, 208 | "optional": true, 209 | "os": [ 210 | "freebsd" 211 | ], 212 | "engines": { 213 | "node": ">=12" 214 | } 215 | }, 216 | "node_modules/@esbuild/linux-arm": { 217 | "version": "0.19.10", 218 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", 219 | "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", 220 | "cpu": [ 221 | "arm" 222 | ], 223 | "dev": true, 224 | "optional": true, 225 | "os": [ 226 | "linux" 227 | ], 228 | "engines": { 229 | "node": ">=12" 230 | } 231 | }, 232 | "node_modules/@esbuild/linux-arm64": { 233 | "version": "0.19.10", 234 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", 235 | "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", 236 | "cpu": [ 237 | "arm64" 238 | ], 239 | "dev": true, 240 | "optional": true, 241 | "os": [ 242 | "linux" 243 | ], 244 | "engines": { 245 | "node": ">=12" 246 | } 247 | }, 248 | "node_modules/@esbuild/linux-ia32": { 249 | "version": "0.19.10", 250 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", 251 | "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", 252 | "cpu": [ 253 | "ia32" 254 | ], 255 | "dev": true, 256 | "optional": true, 257 | "os": [ 258 | "linux" 259 | ], 260 | "engines": { 261 | "node": ">=12" 262 | } 263 | }, 264 | "node_modules/@esbuild/linux-loong64": { 265 | "version": "0.19.10", 266 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", 267 | "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", 268 | "cpu": [ 269 | "loong64" 270 | ], 271 | "dev": true, 272 | "optional": true, 273 | "os": [ 274 | "linux" 275 | ], 276 | "engines": { 277 | "node": ">=12" 278 | } 279 | }, 280 | "node_modules/@esbuild/linux-mips64el": { 281 | "version": "0.19.10", 282 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", 283 | "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", 284 | "cpu": [ 285 | "mips64el" 286 | ], 287 | "dev": true, 288 | "optional": true, 289 | "os": [ 290 | "linux" 291 | ], 292 | "engines": { 293 | "node": ">=12" 294 | } 295 | }, 296 | "node_modules/@esbuild/linux-ppc64": { 297 | "version": "0.19.10", 298 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", 299 | "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", 300 | "cpu": [ 301 | "ppc64" 302 | ], 303 | "dev": true, 304 | "optional": true, 305 | "os": [ 306 | "linux" 307 | ], 308 | "engines": { 309 | "node": ">=12" 310 | } 311 | }, 312 | "node_modules/@esbuild/linux-riscv64": { 313 | "version": "0.19.10", 314 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", 315 | "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", 316 | "cpu": [ 317 | "riscv64" 318 | ], 319 | "dev": true, 320 | "optional": true, 321 | "os": [ 322 | "linux" 323 | ], 324 | "engines": { 325 | "node": ">=12" 326 | } 327 | }, 328 | "node_modules/@esbuild/linux-s390x": { 329 | "version": "0.19.10", 330 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", 331 | "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", 332 | "cpu": [ 333 | "s390x" 334 | ], 335 | "dev": true, 336 | "optional": true, 337 | "os": [ 338 | "linux" 339 | ], 340 | "engines": { 341 | "node": ">=12" 342 | } 343 | }, 344 | "node_modules/@esbuild/linux-x64": { 345 | "version": "0.19.10", 346 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", 347 | "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", 348 | "cpu": [ 349 | "x64" 350 | ], 351 | "dev": true, 352 | "optional": true, 353 | "os": [ 354 | "linux" 355 | ], 356 | "engines": { 357 | "node": ">=12" 358 | } 359 | }, 360 | "node_modules/@esbuild/netbsd-x64": { 361 | "version": "0.19.10", 362 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", 363 | "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", 364 | "cpu": [ 365 | "x64" 366 | ], 367 | "dev": true, 368 | "optional": true, 369 | "os": [ 370 | "netbsd" 371 | ], 372 | "engines": { 373 | "node": ">=12" 374 | } 375 | }, 376 | "node_modules/@esbuild/openbsd-x64": { 377 | "version": "0.19.10", 378 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", 379 | "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", 380 | "cpu": [ 381 | "x64" 382 | ], 383 | "dev": true, 384 | "optional": true, 385 | "os": [ 386 | "openbsd" 387 | ], 388 | "engines": { 389 | "node": ">=12" 390 | } 391 | }, 392 | "node_modules/@esbuild/sunos-x64": { 393 | "version": "0.19.10", 394 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", 395 | "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", 396 | "cpu": [ 397 | "x64" 398 | ], 399 | "dev": true, 400 | "optional": true, 401 | "os": [ 402 | "sunos" 403 | ], 404 | "engines": { 405 | "node": ">=12" 406 | } 407 | }, 408 | "node_modules/@esbuild/win32-arm64": { 409 | "version": "0.19.10", 410 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", 411 | "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", 412 | "cpu": [ 413 | "arm64" 414 | ], 415 | "dev": true, 416 | "optional": true, 417 | "os": [ 418 | "win32" 419 | ], 420 | "engines": { 421 | "node": ">=12" 422 | } 423 | }, 424 | "node_modules/@esbuild/win32-ia32": { 425 | "version": "0.19.10", 426 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", 427 | "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", 428 | "cpu": [ 429 | "ia32" 430 | ], 431 | "dev": true, 432 | "optional": true, 433 | "os": [ 434 | "win32" 435 | ], 436 | "engines": { 437 | "node": ">=12" 438 | } 439 | }, 440 | "node_modules/@esbuild/win32-x64": { 441 | "version": "0.19.10", 442 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", 443 | "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", 444 | "cpu": [ 445 | "x64" 446 | ], 447 | "dev": true, 448 | "optional": true, 449 | "os": [ 450 | "win32" 451 | ], 452 | "engines": { 453 | "node": ">=12" 454 | } 455 | }, 456 | "node_modules/@isaacs/cliui": { 457 | "version": "8.0.2", 458 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 459 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 460 | "dependencies": { 461 | "string-width": "^5.1.2", 462 | "string-width-cjs": "npm:string-width@^4.2.0", 463 | "strip-ansi": "^7.0.1", 464 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 465 | "wrap-ansi": "^8.1.0", 466 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 467 | }, 468 | "engines": { 469 | "node": ">=12" 470 | } 471 | }, 472 | "node_modules/@istanbuljs/schema": { 473 | "version": "0.1.3", 474 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 475 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 476 | "dev": true, 477 | "engines": { 478 | "node": ">=8" 479 | } 480 | }, 481 | "node_modules/@jest/schemas": { 482 | "version": "29.6.3", 483 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", 484 | "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", 485 | "dev": true, 486 | "dependencies": { 487 | "@sinclair/typebox": "^0.27.8" 488 | }, 489 | "engines": { 490 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 491 | } 492 | }, 493 | "node_modules/@jridgewell/gen-mapping": { 494 | "version": "0.3.3", 495 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 496 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 497 | "dev": true, 498 | "dependencies": { 499 | "@jridgewell/set-array": "^1.0.1", 500 | "@jridgewell/sourcemap-codec": "^1.4.10", 501 | "@jridgewell/trace-mapping": "^0.3.9" 502 | }, 503 | "engines": { 504 | "node": ">=6.0.0" 505 | } 506 | }, 507 | "node_modules/@jridgewell/resolve-uri": { 508 | "version": "3.1.1", 509 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 510 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 511 | "dev": true, 512 | "engines": { 513 | "node": ">=6.0.0" 514 | } 515 | }, 516 | "node_modules/@jridgewell/set-array": { 517 | "version": "1.1.2", 518 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 519 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 520 | "dev": true, 521 | "engines": { 522 | "node": ">=6.0.0" 523 | } 524 | }, 525 | "node_modules/@jridgewell/sourcemap-codec": { 526 | "version": "1.4.15", 527 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 528 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 529 | "dev": true 530 | }, 531 | "node_modules/@jridgewell/trace-mapping": { 532 | "version": "0.3.20", 533 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 534 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 535 | "dev": true, 536 | "dependencies": { 537 | "@jridgewell/resolve-uri": "^3.1.0", 538 | "@jridgewell/sourcemap-codec": "^1.4.14" 539 | } 540 | }, 541 | "node_modules/@nodelib/fs.scandir": { 542 | "version": "2.1.5", 543 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 544 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 545 | "dev": true, 546 | "dependencies": { 547 | "@nodelib/fs.stat": "2.0.5", 548 | "run-parallel": "^1.1.9" 549 | }, 550 | "engines": { 551 | "node": ">= 8" 552 | } 553 | }, 554 | "node_modules/@nodelib/fs.stat": { 555 | "version": "2.0.5", 556 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 557 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 558 | "dev": true, 559 | "engines": { 560 | "node": ">= 8" 561 | } 562 | }, 563 | "node_modules/@nodelib/fs.walk": { 564 | "version": "1.2.8", 565 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 566 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 567 | "dev": true, 568 | "dependencies": { 569 | "@nodelib/fs.scandir": "2.1.5", 570 | "fastq": "^1.6.0" 571 | }, 572 | "engines": { 573 | "node": ">= 8" 574 | } 575 | }, 576 | "node_modules/@pkgjs/parseargs": { 577 | "version": "0.11.0", 578 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 579 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 580 | "optional": true, 581 | "engines": { 582 | "node": ">=14" 583 | } 584 | }, 585 | "node_modules/@rollup/rollup-android-arm-eabi": { 586 | "version": "4.14.2", 587 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.2.tgz", 588 | "integrity": "sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==", 589 | "cpu": [ 590 | "arm" 591 | ], 592 | "dev": true, 593 | "optional": true, 594 | "os": [ 595 | "android" 596 | ] 597 | }, 598 | "node_modules/@rollup/rollup-android-arm64": { 599 | "version": "4.14.2", 600 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.2.tgz", 601 | "integrity": "sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==", 602 | "cpu": [ 603 | "arm64" 604 | ], 605 | "dev": true, 606 | "optional": true, 607 | "os": [ 608 | "android" 609 | ] 610 | }, 611 | "node_modules/@rollup/rollup-darwin-arm64": { 612 | "version": "4.14.2", 613 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.2.tgz", 614 | "integrity": "sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==", 615 | "cpu": [ 616 | "arm64" 617 | ], 618 | "dev": true, 619 | "optional": true, 620 | "os": [ 621 | "darwin" 622 | ] 623 | }, 624 | "node_modules/@rollup/rollup-darwin-x64": { 625 | "version": "4.14.2", 626 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.2.tgz", 627 | "integrity": "sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==", 628 | "cpu": [ 629 | "x64" 630 | ], 631 | "dev": true, 632 | "optional": true, 633 | "os": [ 634 | "darwin" 635 | ] 636 | }, 637 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 638 | "version": "4.14.2", 639 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.2.tgz", 640 | "integrity": "sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==", 641 | "cpu": [ 642 | "arm" 643 | ], 644 | "dev": true, 645 | "optional": true, 646 | "os": [ 647 | "linux" 648 | ] 649 | }, 650 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 651 | "version": "4.14.2", 652 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.2.tgz", 653 | "integrity": "sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==", 654 | "cpu": [ 655 | "arm64" 656 | ], 657 | "dev": true, 658 | "optional": true, 659 | "os": [ 660 | "linux" 661 | ] 662 | }, 663 | "node_modules/@rollup/rollup-linux-arm64-musl": { 664 | "version": "4.14.2", 665 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.2.tgz", 666 | "integrity": "sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==", 667 | "cpu": [ 668 | "arm64" 669 | ], 670 | "dev": true, 671 | "optional": true, 672 | "os": [ 673 | "linux" 674 | ] 675 | }, 676 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 677 | "version": "4.14.2", 678 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.2.tgz", 679 | "integrity": "sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==", 680 | "cpu": [ 681 | "ppc64" 682 | ], 683 | "dev": true, 684 | "optional": true, 685 | "os": [ 686 | "linux" 687 | ] 688 | }, 689 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 690 | "version": "4.14.2", 691 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.2.tgz", 692 | "integrity": "sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==", 693 | "cpu": [ 694 | "riscv64" 695 | ], 696 | "dev": true, 697 | "optional": true, 698 | "os": [ 699 | "linux" 700 | ] 701 | }, 702 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 703 | "version": "4.14.2", 704 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.2.tgz", 705 | "integrity": "sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==", 706 | "cpu": [ 707 | "s390x" 708 | ], 709 | "dev": true, 710 | "optional": true, 711 | "os": [ 712 | "linux" 713 | ] 714 | }, 715 | "node_modules/@rollup/rollup-linux-x64-gnu": { 716 | "version": "4.14.2", 717 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.2.tgz", 718 | "integrity": "sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==", 719 | "cpu": [ 720 | "x64" 721 | ], 722 | "dev": true, 723 | "optional": true, 724 | "os": [ 725 | "linux" 726 | ] 727 | }, 728 | "node_modules/@rollup/rollup-linux-x64-musl": { 729 | "version": "4.14.2", 730 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.2.tgz", 731 | "integrity": "sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==", 732 | "cpu": [ 733 | "x64" 734 | ], 735 | "dev": true, 736 | "optional": true, 737 | "os": [ 738 | "linux" 739 | ] 740 | }, 741 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 742 | "version": "4.14.2", 743 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.2.tgz", 744 | "integrity": "sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==", 745 | "cpu": [ 746 | "arm64" 747 | ], 748 | "dev": true, 749 | "optional": true, 750 | "os": [ 751 | "win32" 752 | ] 753 | }, 754 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 755 | "version": "4.14.2", 756 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.2.tgz", 757 | "integrity": "sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==", 758 | "cpu": [ 759 | "ia32" 760 | ], 761 | "dev": true, 762 | "optional": true, 763 | "os": [ 764 | "win32" 765 | ] 766 | }, 767 | "node_modules/@rollup/rollup-win32-x64-msvc": { 768 | "version": "4.14.2", 769 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.2.tgz", 770 | "integrity": "sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==", 771 | "cpu": [ 772 | "x64" 773 | ], 774 | "dev": true, 775 | "optional": true, 776 | "os": [ 777 | "win32" 778 | ] 779 | }, 780 | "node_modules/@sinclair/typebox": { 781 | "version": "0.27.8", 782 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", 783 | "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", 784 | "dev": true 785 | }, 786 | "node_modules/@types/estree": { 787 | "version": "1.0.5", 788 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 789 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 790 | "dev": true 791 | }, 792 | "node_modules/@types/istanbul-lib-coverage": { 793 | "version": "2.0.6", 794 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", 795 | "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", 796 | "dev": true 797 | }, 798 | "node_modules/@types/node": { 799 | "version": "20.10.5", 800 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", 801 | "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", 802 | "dev": true, 803 | "dependencies": { 804 | "undici-types": "~5.26.4" 805 | } 806 | }, 807 | "node_modules/@vitest/coverage-v8": { 808 | "version": "1.1.0", 809 | "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.1.0.tgz", 810 | "integrity": "sha512-kHQRk70vTdXAyQY2C0vKOHPyQD/R6IUzcGdO4vCuyr4alE5Yg1+Sk2jSdjlIrTTXdcNEs+ReWVM09mmSFJpzyQ==", 811 | "dev": true, 812 | "dependencies": { 813 | "@ampproject/remapping": "^2.2.1", 814 | "@bcoe/v8-coverage": "^0.2.3", 815 | "debug": "^4.3.4", 816 | "istanbul-lib-coverage": "^3.2.2", 817 | "istanbul-lib-report": "^3.0.1", 818 | "istanbul-lib-source-maps": "^4.0.1", 819 | "istanbul-reports": "^3.1.6", 820 | "magic-string": "^0.30.5", 821 | "magicast": "^0.3.2", 822 | "picocolors": "^1.0.0", 823 | "std-env": "^3.5.0", 824 | "test-exclude": "^6.0.0", 825 | "v8-to-istanbul": "^9.2.0" 826 | }, 827 | "funding": { 828 | "url": "https://opencollective.com/vitest" 829 | }, 830 | "peerDependencies": { 831 | "vitest": "^1.0.0" 832 | } 833 | }, 834 | "node_modules/@vitest/expect": { 835 | "version": "1.1.0", 836 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.0.tgz", 837 | "integrity": "sha512-9IE2WWkcJo2BR9eqtY5MIo3TPmS50Pnwpm66A6neb2hvk/QSLfPXBz2qdiwUOQkwyFuuXEUj5380CbwfzW4+/w==", 838 | "dev": true, 839 | "dependencies": { 840 | "@vitest/spy": "1.1.0", 841 | "@vitest/utils": "1.1.0", 842 | "chai": "^4.3.10" 843 | }, 844 | "funding": { 845 | "url": "https://opencollective.com/vitest" 846 | } 847 | }, 848 | "node_modules/@vitest/runner": { 849 | "version": "1.1.0", 850 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.0.tgz", 851 | "integrity": "sha512-zdNLJ00pm5z/uhbWF6aeIJCGMSyTyWImy3Fcp9piRGvueERFlQFbUwCpzVce79OLm2UHk9iwaMSOaU9jVHgNVw==", 852 | "dev": true, 853 | "dependencies": { 854 | "@vitest/utils": "1.1.0", 855 | "p-limit": "^5.0.0", 856 | "pathe": "^1.1.1" 857 | }, 858 | "funding": { 859 | "url": "https://opencollective.com/vitest" 860 | } 861 | }, 862 | "node_modules/@vitest/snapshot": { 863 | "version": "1.1.0", 864 | "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.0.tgz", 865 | "integrity": "sha512-5O/wyZg09V5qmNmAlUgCBqflvn2ylgsWJRRuPrnHEfDNT6tQpQ8O1isNGgo+VxofISHqz961SG3iVvt3SPK/QQ==", 866 | "dev": true, 867 | "dependencies": { 868 | "magic-string": "^0.30.5", 869 | "pathe": "^1.1.1", 870 | "pretty-format": "^29.7.0" 871 | }, 872 | "funding": { 873 | "url": "https://opencollective.com/vitest" 874 | } 875 | }, 876 | "node_modules/@vitest/spy": { 877 | "version": "1.1.0", 878 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.0.tgz", 879 | "integrity": "sha512-sNOVSU/GE+7+P76qYo+VXdXhXffzWZcYIPQfmkiRxaNCSPiLANvQx5Mx6ZURJ/ndtEkUJEpvKLXqAYTKEY+lTg==", 880 | "dev": true, 881 | "dependencies": { 882 | "tinyspy": "^2.2.0" 883 | }, 884 | "funding": { 885 | "url": "https://opencollective.com/vitest" 886 | } 887 | }, 888 | "node_modules/@vitest/utils": { 889 | "version": "1.1.0", 890 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.0.tgz", 891 | "integrity": "sha512-z+s510fKmYz4Y41XhNs3vcuFTFhcij2YF7F8VQfMEYAAUfqQh0Zfg7+w9xdgFGhPf3tX3TicAe+8BDITk6ampQ==", 892 | "dev": true, 893 | "dependencies": { 894 | "diff-sequences": "^29.6.3", 895 | "loupe": "^2.3.7", 896 | "pretty-format": "^29.7.0" 897 | }, 898 | "funding": { 899 | "url": "https://opencollective.com/vitest" 900 | } 901 | }, 902 | "node_modules/@vue/compiler-core": { 903 | "version": "3.4.27", 904 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", 905 | "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", 906 | "dev": true, 907 | "dependencies": { 908 | "@babel/parser": "^7.24.4", 909 | "@vue/shared": "3.4.27", 910 | "entities": "^4.5.0", 911 | "estree-walker": "^2.0.2", 912 | "source-map-js": "^1.2.0" 913 | } 914 | }, 915 | "node_modules/@vue/compiler-dom": { 916 | "version": "3.4.27", 917 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", 918 | "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", 919 | "dev": true, 920 | "dependencies": { 921 | "@vue/compiler-core": "3.4.27", 922 | "@vue/shared": "3.4.27" 923 | } 924 | }, 925 | "node_modules/@vue/compiler-sfc": { 926 | "version": "3.4.27", 927 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", 928 | "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", 929 | "dev": true, 930 | "dependencies": { 931 | "@babel/parser": "^7.24.4", 932 | "@vue/compiler-core": "3.4.27", 933 | "@vue/compiler-dom": "3.4.27", 934 | "@vue/compiler-ssr": "3.4.27", 935 | "@vue/shared": "3.4.27", 936 | "estree-walker": "^2.0.2", 937 | "magic-string": "^0.30.10", 938 | "postcss": "^8.4.38", 939 | "source-map-js": "^1.2.0" 940 | } 941 | }, 942 | "node_modules/@vue/compiler-ssr": { 943 | "version": "3.4.27", 944 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", 945 | "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", 946 | "dev": true, 947 | "dependencies": { 948 | "@vue/compiler-dom": "3.4.27", 949 | "@vue/shared": "3.4.27" 950 | } 951 | }, 952 | "node_modules/@vue/reactivity": { 953 | "version": "3.4.27", 954 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", 955 | "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", 956 | "dev": true, 957 | "dependencies": { 958 | "@vue/shared": "3.4.27" 959 | } 960 | }, 961 | "node_modules/@vue/runtime-core": { 962 | "version": "3.4.27", 963 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", 964 | "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", 965 | "dev": true, 966 | "dependencies": { 967 | "@vue/reactivity": "3.4.27", 968 | "@vue/shared": "3.4.27" 969 | } 970 | }, 971 | "node_modules/@vue/runtime-dom": { 972 | "version": "3.4.27", 973 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", 974 | "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", 975 | "dev": true, 976 | "dependencies": { 977 | "@vue/runtime-core": "3.4.27", 978 | "@vue/shared": "3.4.27", 979 | "csstype": "^3.1.3" 980 | } 981 | }, 982 | "node_modules/@vue/server-renderer": { 983 | "version": "3.4.27", 984 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", 985 | "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", 986 | "dev": true, 987 | "dependencies": { 988 | "@vue/compiler-ssr": "3.4.27", 989 | "@vue/shared": "3.4.27" 990 | }, 991 | "peerDependencies": { 992 | "vue": "3.4.27" 993 | } 994 | }, 995 | "node_modules/@vue/shared": { 996 | "version": "3.4.27", 997 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", 998 | "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==", 999 | "dev": true 1000 | }, 1001 | "node_modules/acorn": { 1002 | "version": "8.11.2", 1003 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 1004 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 1005 | "dev": true, 1006 | "bin": { 1007 | "acorn": "bin/acorn" 1008 | }, 1009 | "engines": { 1010 | "node": ">=0.4.0" 1011 | } 1012 | }, 1013 | "node_modules/acorn-walk": { 1014 | "version": "8.3.1", 1015 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", 1016 | "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", 1017 | "dev": true, 1018 | "engines": { 1019 | "node": ">=0.4.0" 1020 | } 1021 | }, 1022 | "node_modules/ansi-regex": { 1023 | "version": "6.0.1", 1024 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 1025 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 1026 | "engines": { 1027 | "node": ">=12" 1028 | }, 1029 | "funding": { 1030 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1031 | } 1032 | }, 1033 | "node_modules/ansi-styles": { 1034 | "version": "5.2.0", 1035 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 1036 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 1037 | "dev": true, 1038 | "engines": { 1039 | "node": ">=10" 1040 | }, 1041 | "funding": { 1042 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1043 | } 1044 | }, 1045 | "node_modules/any-promise": { 1046 | "version": "1.3.0", 1047 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1048 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1049 | "dev": true 1050 | }, 1051 | "node_modules/anymatch": { 1052 | "version": "3.1.3", 1053 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1054 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1055 | "dev": true, 1056 | "dependencies": { 1057 | "normalize-path": "^3.0.0", 1058 | "picomatch": "^2.0.4" 1059 | }, 1060 | "engines": { 1061 | "node": ">= 8" 1062 | } 1063 | }, 1064 | "node_modules/array-union": { 1065 | "version": "2.1.0", 1066 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 1067 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 1068 | "dev": true, 1069 | "engines": { 1070 | "node": ">=8" 1071 | } 1072 | }, 1073 | "node_modules/assertion-error": { 1074 | "version": "1.1.0", 1075 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1076 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1077 | "dev": true, 1078 | "engines": { 1079 | "node": "*" 1080 | } 1081 | }, 1082 | "node_modules/balanced-match": { 1083 | "version": "1.0.2", 1084 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1085 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 1086 | }, 1087 | "node_modules/binary-extensions": { 1088 | "version": "2.2.0", 1089 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 1090 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 1091 | "dev": true, 1092 | "engines": { 1093 | "node": ">=8" 1094 | } 1095 | }, 1096 | "node_modules/brace-expansion": { 1097 | "version": "2.0.1", 1098 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1099 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1100 | "dependencies": { 1101 | "balanced-match": "^1.0.0" 1102 | } 1103 | }, 1104 | "node_modules/braces": { 1105 | "version": "3.0.2", 1106 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1107 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1108 | "dev": true, 1109 | "dependencies": { 1110 | "fill-range": "^7.0.1" 1111 | }, 1112 | "engines": { 1113 | "node": ">=8" 1114 | } 1115 | }, 1116 | "node_modules/bundle-require": { 1117 | "version": "4.0.2", 1118 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.2.tgz", 1119 | "integrity": "sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==", 1120 | "dev": true, 1121 | "dependencies": { 1122 | "load-tsconfig": "^0.2.3" 1123 | }, 1124 | "engines": { 1125 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1126 | }, 1127 | "peerDependencies": { 1128 | "esbuild": ">=0.17" 1129 | } 1130 | }, 1131 | "node_modules/cac": { 1132 | "version": "6.7.14", 1133 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1134 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1135 | "dev": true, 1136 | "engines": { 1137 | "node": ">=8" 1138 | } 1139 | }, 1140 | "node_modules/chai": { 1141 | "version": "4.3.10", 1142 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", 1143 | "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", 1144 | "dev": true, 1145 | "dependencies": { 1146 | "assertion-error": "^1.1.0", 1147 | "check-error": "^1.0.3", 1148 | "deep-eql": "^4.1.3", 1149 | "get-func-name": "^2.0.2", 1150 | "loupe": "^2.3.6", 1151 | "pathval": "^1.1.1", 1152 | "type-detect": "^4.0.8" 1153 | }, 1154 | "engines": { 1155 | "node": ">=4" 1156 | } 1157 | }, 1158 | "node_modules/check-error": { 1159 | "version": "1.0.3", 1160 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", 1161 | "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", 1162 | "dev": true, 1163 | "dependencies": { 1164 | "get-func-name": "^2.0.2" 1165 | }, 1166 | "engines": { 1167 | "node": "*" 1168 | } 1169 | }, 1170 | "node_modules/chokidar": { 1171 | "version": "3.5.3", 1172 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 1173 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 1174 | "dev": true, 1175 | "funding": [ 1176 | { 1177 | "type": "individual", 1178 | "url": "https://paulmillr.com/funding/" 1179 | } 1180 | ], 1181 | "dependencies": { 1182 | "anymatch": "~3.1.2", 1183 | "braces": "~3.0.2", 1184 | "glob-parent": "~5.1.2", 1185 | "is-binary-path": "~2.1.0", 1186 | "is-glob": "~4.0.1", 1187 | "normalize-path": "~3.0.0", 1188 | "readdirp": "~3.6.0" 1189 | }, 1190 | "engines": { 1191 | "node": ">= 8.10.0" 1192 | }, 1193 | "optionalDependencies": { 1194 | "fsevents": "~2.3.2" 1195 | } 1196 | }, 1197 | "node_modules/color-convert": { 1198 | "version": "2.0.1", 1199 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1200 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1201 | "dependencies": { 1202 | "color-name": "~1.1.4" 1203 | }, 1204 | "engines": { 1205 | "node": ">=7.0.0" 1206 | } 1207 | }, 1208 | "node_modules/color-name": { 1209 | "version": "1.1.4", 1210 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1211 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1212 | }, 1213 | "node_modules/commander": { 1214 | "version": "4.1.1", 1215 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1216 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1217 | "dev": true, 1218 | "engines": { 1219 | "node": ">= 6" 1220 | } 1221 | }, 1222 | "node_modules/concat-map": { 1223 | "version": "0.0.1", 1224 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1225 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1226 | "dev": true 1227 | }, 1228 | "node_modules/convert-source-map": { 1229 | "version": "2.0.0", 1230 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1231 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1232 | "dev": true 1233 | }, 1234 | "node_modules/cross-spawn": { 1235 | "version": "7.0.3", 1236 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1237 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1238 | "dependencies": { 1239 | "path-key": "^3.1.0", 1240 | "shebang-command": "^2.0.0", 1241 | "which": "^2.0.1" 1242 | }, 1243 | "engines": { 1244 | "node": ">= 8" 1245 | } 1246 | }, 1247 | "node_modules/csstype": { 1248 | "version": "3.1.3", 1249 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1250 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1251 | "dev": true 1252 | }, 1253 | "node_modules/debug": { 1254 | "version": "4.3.4", 1255 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1256 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1257 | "dev": true, 1258 | "dependencies": { 1259 | "ms": "2.1.2" 1260 | }, 1261 | "engines": { 1262 | "node": ">=6.0" 1263 | }, 1264 | "peerDependenciesMeta": { 1265 | "supports-color": { 1266 | "optional": true 1267 | } 1268 | } 1269 | }, 1270 | "node_modules/deep-eql": { 1271 | "version": "4.1.3", 1272 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1273 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1274 | "dev": true, 1275 | "dependencies": { 1276 | "type-detect": "^4.0.0" 1277 | }, 1278 | "engines": { 1279 | "node": ">=6" 1280 | } 1281 | }, 1282 | "node_modules/diff-sequences": { 1283 | "version": "29.6.3", 1284 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", 1285 | "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", 1286 | "dev": true, 1287 | "engines": { 1288 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1289 | } 1290 | }, 1291 | "node_modules/dir-glob": { 1292 | "version": "3.0.1", 1293 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 1294 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 1295 | "dev": true, 1296 | "dependencies": { 1297 | "path-type": "^4.0.0" 1298 | }, 1299 | "engines": { 1300 | "node": ">=8" 1301 | } 1302 | }, 1303 | "node_modules/eastasianwidth": { 1304 | "version": "0.2.0", 1305 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1306 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" 1307 | }, 1308 | "node_modules/emoji-regex": { 1309 | "version": "9.2.2", 1310 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1311 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" 1312 | }, 1313 | "node_modules/entities": { 1314 | "version": "4.5.0", 1315 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1316 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1317 | "dev": true, 1318 | "engines": { 1319 | "node": ">=0.12" 1320 | }, 1321 | "funding": { 1322 | "url": "https://github.com/fb55/entities?sponsor=1" 1323 | } 1324 | }, 1325 | "node_modules/esbuild": { 1326 | "version": "0.19.10", 1327 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.10.tgz", 1328 | "integrity": "sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==", 1329 | "dev": true, 1330 | "hasInstallScript": true, 1331 | "bin": { 1332 | "esbuild": "bin/esbuild" 1333 | }, 1334 | "engines": { 1335 | "node": ">=12" 1336 | }, 1337 | "optionalDependencies": { 1338 | "@esbuild/aix-ppc64": "0.19.10", 1339 | "@esbuild/android-arm": "0.19.10", 1340 | "@esbuild/android-arm64": "0.19.10", 1341 | "@esbuild/android-x64": "0.19.10", 1342 | "@esbuild/darwin-arm64": "0.19.10", 1343 | "@esbuild/darwin-x64": "0.19.10", 1344 | "@esbuild/freebsd-arm64": "0.19.10", 1345 | "@esbuild/freebsd-x64": "0.19.10", 1346 | "@esbuild/linux-arm": "0.19.10", 1347 | "@esbuild/linux-arm64": "0.19.10", 1348 | "@esbuild/linux-ia32": "0.19.10", 1349 | "@esbuild/linux-loong64": "0.19.10", 1350 | "@esbuild/linux-mips64el": "0.19.10", 1351 | "@esbuild/linux-ppc64": "0.19.10", 1352 | "@esbuild/linux-riscv64": "0.19.10", 1353 | "@esbuild/linux-s390x": "0.19.10", 1354 | "@esbuild/linux-x64": "0.19.10", 1355 | "@esbuild/netbsd-x64": "0.19.10", 1356 | "@esbuild/openbsd-x64": "0.19.10", 1357 | "@esbuild/sunos-x64": "0.19.10", 1358 | "@esbuild/win32-arm64": "0.19.10", 1359 | "@esbuild/win32-ia32": "0.19.10", 1360 | "@esbuild/win32-x64": "0.19.10" 1361 | } 1362 | }, 1363 | "node_modules/estree-walker": { 1364 | "version": "2.0.2", 1365 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1366 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1367 | "dev": true 1368 | }, 1369 | "node_modules/execa": { 1370 | "version": "5.1.1", 1371 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1372 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1373 | "dev": true, 1374 | "dependencies": { 1375 | "cross-spawn": "^7.0.3", 1376 | "get-stream": "^6.0.0", 1377 | "human-signals": "^2.1.0", 1378 | "is-stream": "^2.0.0", 1379 | "merge-stream": "^2.0.0", 1380 | "npm-run-path": "^4.0.1", 1381 | "onetime": "^5.1.2", 1382 | "signal-exit": "^3.0.3", 1383 | "strip-final-newline": "^2.0.0" 1384 | }, 1385 | "engines": { 1386 | "node": ">=10" 1387 | }, 1388 | "funding": { 1389 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1390 | } 1391 | }, 1392 | "node_modules/execa/node_modules/signal-exit": { 1393 | "version": "3.0.7", 1394 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1395 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1396 | "dev": true 1397 | }, 1398 | "node_modules/fast-glob": { 1399 | "version": "3.3.2", 1400 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 1401 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 1402 | "dev": true, 1403 | "dependencies": { 1404 | "@nodelib/fs.stat": "^2.0.2", 1405 | "@nodelib/fs.walk": "^1.2.3", 1406 | "glob-parent": "^5.1.2", 1407 | "merge2": "^1.3.0", 1408 | "micromatch": "^4.0.4" 1409 | }, 1410 | "engines": { 1411 | "node": ">=8.6.0" 1412 | } 1413 | }, 1414 | "node_modules/fastq": { 1415 | "version": "1.16.0", 1416 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", 1417 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 1418 | "dev": true, 1419 | "dependencies": { 1420 | "reusify": "^1.0.4" 1421 | } 1422 | }, 1423 | "node_modules/fill-range": { 1424 | "version": "7.0.1", 1425 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1426 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1427 | "dev": true, 1428 | "dependencies": { 1429 | "to-regex-range": "^5.0.1" 1430 | }, 1431 | "engines": { 1432 | "node": ">=8" 1433 | } 1434 | }, 1435 | "node_modules/foreground-child": { 1436 | "version": "3.1.1", 1437 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 1438 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 1439 | "dependencies": { 1440 | "cross-spawn": "^7.0.0", 1441 | "signal-exit": "^4.0.1" 1442 | }, 1443 | "engines": { 1444 | "node": ">=14" 1445 | }, 1446 | "funding": { 1447 | "url": "https://github.com/sponsors/isaacs" 1448 | } 1449 | }, 1450 | "node_modules/fs.realpath": { 1451 | "version": "1.0.0", 1452 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1453 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1454 | "dev": true 1455 | }, 1456 | "node_modules/fsevents": { 1457 | "version": "2.3.3", 1458 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1459 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1460 | "dev": true, 1461 | "hasInstallScript": true, 1462 | "optional": true, 1463 | "os": [ 1464 | "darwin" 1465 | ], 1466 | "engines": { 1467 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1468 | } 1469 | }, 1470 | "node_modules/get-func-name": { 1471 | "version": "2.0.2", 1472 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 1473 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 1474 | "dev": true, 1475 | "engines": { 1476 | "node": "*" 1477 | } 1478 | }, 1479 | "node_modules/get-stream": { 1480 | "version": "6.0.1", 1481 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1482 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1483 | "dev": true, 1484 | "engines": { 1485 | "node": ">=10" 1486 | }, 1487 | "funding": { 1488 | "url": "https://github.com/sponsors/sindresorhus" 1489 | } 1490 | }, 1491 | "node_modules/glob": { 1492 | "version": "10.3.10", 1493 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", 1494 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", 1495 | "dependencies": { 1496 | "foreground-child": "^3.1.0", 1497 | "jackspeak": "^2.3.5", 1498 | "minimatch": "^9.0.1", 1499 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", 1500 | "path-scurry": "^1.10.1" 1501 | }, 1502 | "bin": { 1503 | "glob": "dist/esm/bin.mjs" 1504 | }, 1505 | "engines": { 1506 | "node": ">=16 || 14 >=14.17" 1507 | }, 1508 | "funding": { 1509 | "url": "https://github.com/sponsors/isaacs" 1510 | } 1511 | }, 1512 | "node_modules/glob-parent": { 1513 | "version": "5.1.2", 1514 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1515 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1516 | "dev": true, 1517 | "dependencies": { 1518 | "is-glob": "^4.0.1" 1519 | }, 1520 | "engines": { 1521 | "node": ">= 6" 1522 | } 1523 | }, 1524 | "node_modules/globby": { 1525 | "version": "11.1.0", 1526 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 1527 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 1528 | "dev": true, 1529 | "dependencies": { 1530 | "array-union": "^2.1.0", 1531 | "dir-glob": "^3.0.1", 1532 | "fast-glob": "^3.2.9", 1533 | "ignore": "^5.2.0", 1534 | "merge2": "^1.4.1", 1535 | "slash": "^3.0.0" 1536 | }, 1537 | "engines": { 1538 | "node": ">=10" 1539 | }, 1540 | "funding": { 1541 | "url": "https://github.com/sponsors/sindresorhus" 1542 | } 1543 | }, 1544 | "node_modules/has-flag": { 1545 | "version": "4.0.0", 1546 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1547 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1548 | "dev": true, 1549 | "engines": { 1550 | "node": ">=8" 1551 | } 1552 | }, 1553 | "node_modules/html-escaper": { 1554 | "version": "2.0.2", 1555 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1556 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1557 | "dev": true 1558 | }, 1559 | "node_modules/human-signals": { 1560 | "version": "2.1.0", 1561 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1562 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1563 | "dev": true, 1564 | "engines": { 1565 | "node": ">=10.17.0" 1566 | } 1567 | }, 1568 | "node_modules/ignore": { 1569 | "version": "5.3.0", 1570 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", 1571 | "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", 1572 | "dev": true, 1573 | "engines": { 1574 | "node": ">= 4" 1575 | } 1576 | }, 1577 | "node_modules/inflight": { 1578 | "version": "1.0.6", 1579 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1580 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1581 | "dev": true, 1582 | "dependencies": { 1583 | "once": "^1.3.0", 1584 | "wrappy": "1" 1585 | } 1586 | }, 1587 | "node_modules/inherits": { 1588 | "version": "2.0.4", 1589 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1590 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1591 | "dev": true 1592 | }, 1593 | "node_modules/is-binary-path": { 1594 | "version": "2.1.0", 1595 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1596 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1597 | "dev": true, 1598 | "dependencies": { 1599 | "binary-extensions": "^2.0.0" 1600 | }, 1601 | "engines": { 1602 | "node": ">=8" 1603 | } 1604 | }, 1605 | "node_modules/is-extglob": { 1606 | "version": "2.1.1", 1607 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1608 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1609 | "dev": true, 1610 | "engines": { 1611 | "node": ">=0.10.0" 1612 | } 1613 | }, 1614 | "node_modules/is-fullwidth-code-point": { 1615 | "version": "3.0.0", 1616 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1617 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1618 | "engines": { 1619 | "node": ">=8" 1620 | } 1621 | }, 1622 | "node_modules/is-glob": { 1623 | "version": "4.0.3", 1624 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1625 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1626 | "dev": true, 1627 | "dependencies": { 1628 | "is-extglob": "^2.1.1" 1629 | }, 1630 | "engines": { 1631 | "node": ">=0.10.0" 1632 | } 1633 | }, 1634 | "node_modules/is-number": { 1635 | "version": "7.0.0", 1636 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1637 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1638 | "dev": true, 1639 | "engines": { 1640 | "node": ">=0.12.0" 1641 | } 1642 | }, 1643 | "node_modules/is-stream": { 1644 | "version": "2.0.1", 1645 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1646 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1647 | "dev": true, 1648 | "engines": { 1649 | "node": ">=8" 1650 | }, 1651 | "funding": { 1652 | "url": "https://github.com/sponsors/sindresorhus" 1653 | } 1654 | }, 1655 | "node_modules/isexe": { 1656 | "version": "2.0.0", 1657 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1658 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 1659 | }, 1660 | "node_modules/istanbul-lib-coverage": { 1661 | "version": "3.2.2", 1662 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1663 | "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1664 | "dev": true, 1665 | "engines": { 1666 | "node": ">=8" 1667 | } 1668 | }, 1669 | "node_modules/istanbul-lib-report": { 1670 | "version": "3.0.1", 1671 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1672 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 1673 | "dev": true, 1674 | "dependencies": { 1675 | "istanbul-lib-coverage": "^3.0.0", 1676 | "make-dir": "^4.0.0", 1677 | "supports-color": "^7.1.0" 1678 | }, 1679 | "engines": { 1680 | "node": ">=10" 1681 | } 1682 | }, 1683 | "node_modules/istanbul-lib-source-maps": { 1684 | "version": "4.0.1", 1685 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", 1686 | "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", 1687 | "dev": true, 1688 | "dependencies": { 1689 | "debug": "^4.1.1", 1690 | "istanbul-lib-coverage": "^3.0.0", 1691 | "source-map": "^0.6.1" 1692 | }, 1693 | "engines": { 1694 | "node": ">=10" 1695 | } 1696 | }, 1697 | "node_modules/istanbul-reports": { 1698 | "version": "3.1.6", 1699 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", 1700 | "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", 1701 | "dev": true, 1702 | "dependencies": { 1703 | "html-escaper": "^2.0.0", 1704 | "istanbul-lib-report": "^3.0.0" 1705 | }, 1706 | "engines": { 1707 | "node": ">=8" 1708 | } 1709 | }, 1710 | "node_modules/jackspeak": { 1711 | "version": "2.3.6", 1712 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 1713 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 1714 | "dependencies": { 1715 | "@isaacs/cliui": "^8.0.2" 1716 | }, 1717 | "engines": { 1718 | "node": ">=14" 1719 | }, 1720 | "funding": { 1721 | "url": "https://github.com/sponsors/isaacs" 1722 | }, 1723 | "optionalDependencies": { 1724 | "@pkgjs/parseargs": "^0.11.0" 1725 | } 1726 | }, 1727 | "node_modules/joycon": { 1728 | "version": "3.1.1", 1729 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1730 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1731 | "dev": true, 1732 | "engines": { 1733 | "node": ">=10" 1734 | } 1735 | }, 1736 | "node_modules/jsonc-parser": { 1737 | "version": "3.2.0", 1738 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 1739 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 1740 | "dev": true 1741 | }, 1742 | "node_modules/lilconfig": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", 1745 | "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", 1746 | "dev": true, 1747 | "engines": { 1748 | "node": ">=14" 1749 | } 1750 | }, 1751 | "node_modules/lines-and-columns": { 1752 | "version": "1.2.4", 1753 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1754 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1755 | "dev": true 1756 | }, 1757 | "node_modules/load-tsconfig": { 1758 | "version": "0.2.5", 1759 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 1760 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 1761 | "dev": true, 1762 | "engines": { 1763 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1764 | } 1765 | }, 1766 | "node_modules/local-pkg": { 1767 | "version": "0.5.0", 1768 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", 1769 | "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", 1770 | "dev": true, 1771 | "dependencies": { 1772 | "mlly": "^1.4.2", 1773 | "pkg-types": "^1.0.3" 1774 | }, 1775 | "engines": { 1776 | "node": ">=14" 1777 | }, 1778 | "funding": { 1779 | "url": "https://github.com/sponsors/antfu" 1780 | } 1781 | }, 1782 | "node_modules/lodash.sortby": { 1783 | "version": "4.7.0", 1784 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 1785 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 1786 | "dev": true 1787 | }, 1788 | "node_modules/loupe": { 1789 | "version": "2.3.7", 1790 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", 1791 | "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", 1792 | "dev": true, 1793 | "dependencies": { 1794 | "get-func-name": "^2.0.1" 1795 | } 1796 | }, 1797 | "node_modules/lru-cache": { 1798 | "version": "10.1.0", 1799 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", 1800 | "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", 1801 | "engines": { 1802 | "node": "14 || >=16.14" 1803 | } 1804 | }, 1805 | "node_modules/magic-string": { 1806 | "version": "0.30.10", 1807 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1808 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1809 | "dev": true, 1810 | "dependencies": { 1811 | "@jridgewell/sourcemap-codec": "^1.4.15" 1812 | } 1813 | }, 1814 | "node_modules/magicast": { 1815 | "version": "0.3.2", 1816 | "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.2.tgz", 1817 | "integrity": "sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==", 1818 | "dev": true, 1819 | "dependencies": { 1820 | "@babel/parser": "^7.23.3", 1821 | "@babel/types": "^7.23.3", 1822 | "source-map-js": "^1.0.2" 1823 | } 1824 | }, 1825 | "node_modules/make-dir": { 1826 | "version": "4.0.0", 1827 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 1828 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 1829 | "dev": true, 1830 | "dependencies": { 1831 | "semver": "^7.5.3" 1832 | }, 1833 | "engines": { 1834 | "node": ">=10" 1835 | }, 1836 | "funding": { 1837 | "url": "https://github.com/sponsors/sindresorhus" 1838 | } 1839 | }, 1840 | "node_modules/merge-stream": { 1841 | "version": "2.0.0", 1842 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1843 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1844 | "dev": true 1845 | }, 1846 | "node_modules/merge2": { 1847 | "version": "1.4.1", 1848 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1849 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1850 | "dev": true, 1851 | "engines": { 1852 | "node": ">= 8" 1853 | } 1854 | }, 1855 | "node_modules/micromatch": { 1856 | "version": "4.0.5", 1857 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1858 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1859 | "dev": true, 1860 | "dependencies": { 1861 | "braces": "^3.0.2", 1862 | "picomatch": "^2.3.1" 1863 | }, 1864 | "engines": { 1865 | "node": ">=8.6" 1866 | } 1867 | }, 1868 | "node_modules/mimic-fn": { 1869 | "version": "2.1.0", 1870 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1871 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1872 | "dev": true, 1873 | "engines": { 1874 | "node": ">=6" 1875 | } 1876 | }, 1877 | "node_modules/minimatch": { 1878 | "version": "9.0.3", 1879 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 1880 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 1881 | "dependencies": { 1882 | "brace-expansion": "^2.0.1" 1883 | }, 1884 | "engines": { 1885 | "node": ">=16 || 14 >=14.17" 1886 | }, 1887 | "funding": { 1888 | "url": "https://github.com/sponsors/isaacs" 1889 | } 1890 | }, 1891 | "node_modules/minipass": { 1892 | "version": "7.0.4", 1893 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 1894 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 1895 | "engines": { 1896 | "node": ">=16 || 14 >=14.17" 1897 | } 1898 | }, 1899 | "node_modules/mlly": { 1900 | "version": "1.4.2", 1901 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", 1902 | "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", 1903 | "dev": true, 1904 | "dependencies": { 1905 | "acorn": "^8.10.0", 1906 | "pathe": "^1.1.1", 1907 | "pkg-types": "^1.0.3", 1908 | "ufo": "^1.3.0" 1909 | } 1910 | }, 1911 | "node_modules/ms": { 1912 | "version": "2.1.2", 1913 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1914 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1915 | "dev": true 1916 | }, 1917 | "node_modules/mz": { 1918 | "version": "2.7.0", 1919 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1920 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1921 | "dev": true, 1922 | "dependencies": { 1923 | "any-promise": "^1.0.0", 1924 | "object-assign": "^4.0.1", 1925 | "thenify-all": "^1.0.0" 1926 | } 1927 | }, 1928 | "node_modules/nanoid": { 1929 | "version": "3.3.7", 1930 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1931 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1932 | "dev": true, 1933 | "funding": [ 1934 | { 1935 | "type": "github", 1936 | "url": "https://github.com/sponsors/ai" 1937 | } 1938 | ], 1939 | "bin": { 1940 | "nanoid": "bin/nanoid.cjs" 1941 | }, 1942 | "engines": { 1943 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1944 | } 1945 | }, 1946 | "node_modules/normalize-path": { 1947 | "version": "3.0.0", 1948 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1949 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1950 | "dev": true, 1951 | "engines": { 1952 | "node": ">=0.10.0" 1953 | } 1954 | }, 1955 | "node_modules/npm-run-path": { 1956 | "version": "4.0.1", 1957 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 1958 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 1959 | "dev": true, 1960 | "dependencies": { 1961 | "path-key": "^3.0.0" 1962 | }, 1963 | "engines": { 1964 | "node": ">=8" 1965 | } 1966 | }, 1967 | "node_modules/object-assign": { 1968 | "version": "4.1.1", 1969 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1970 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1971 | "dev": true, 1972 | "engines": { 1973 | "node": ">=0.10.0" 1974 | } 1975 | }, 1976 | "node_modules/once": { 1977 | "version": "1.4.0", 1978 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1979 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1980 | "dev": true, 1981 | "dependencies": { 1982 | "wrappy": "1" 1983 | } 1984 | }, 1985 | "node_modules/onetime": { 1986 | "version": "5.1.2", 1987 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1988 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1989 | "dev": true, 1990 | "dependencies": { 1991 | "mimic-fn": "^2.1.0" 1992 | }, 1993 | "engines": { 1994 | "node": ">=6" 1995 | }, 1996 | "funding": { 1997 | "url": "https://github.com/sponsors/sindresorhus" 1998 | } 1999 | }, 2000 | "node_modules/p-limit": { 2001 | "version": "5.0.0", 2002 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", 2003 | "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", 2004 | "dev": true, 2005 | "dependencies": { 2006 | "yocto-queue": "^1.0.0" 2007 | }, 2008 | "engines": { 2009 | "node": ">=18" 2010 | }, 2011 | "funding": { 2012 | "url": "https://github.com/sponsors/sindresorhus" 2013 | } 2014 | }, 2015 | "node_modules/path-is-absolute": { 2016 | "version": "1.0.1", 2017 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2018 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2019 | "dev": true, 2020 | "engines": { 2021 | "node": ">=0.10.0" 2022 | } 2023 | }, 2024 | "node_modules/path-key": { 2025 | "version": "3.1.1", 2026 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2027 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2028 | "engines": { 2029 | "node": ">=8" 2030 | } 2031 | }, 2032 | "node_modules/path-scurry": { 2033 | "version": "1.10.1", 2034 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", 2035 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", 2036 | "dependencies": { 2037 | "lru-cache": "^9.1.1 || ^10.0.0", 2038 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2039 | }, 2040 | "engines": { 2041 | "node": ">=16 || 14 >=14.17" 2042 | }, 2043 | "funding": { 2044 | "url": "https://github.com/sponsors/isaacs" 2045 | } 2046 | }, 2047 | "node_modules/path-type": { 2048 | "version": "4.0.0", 2049 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2050 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2051 | "dev": true, 2052 | "engines": { 2053 | "node": ">=8" 2054 | } 2055 | }, 2056 | "node_modules/pathe": { 2057 | "version": "1.1.1", 2058 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", 2059 | "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", 2060 | "dev": true 2061 | }, 2062 | "node_modules/pathval": { 2063 | "version": "1.1.1", 2064 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 2065 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 2066 | "dev": true, 2067 | "engines": { 2068 | "node": "*" 2069 | } 2070 | }, 2071 | "node_modules/php-parser": { 2072 | "version": "3.1.5", 2073 | "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.1.5.tgz", 2074 | "integrity": "sha512-jEY2DcbgCm5aclzBdfW86GM6VEIWcSlhTBSHN1qhJguVePlYe28GhwS0yoeLYXpM2K8y6wzLwrbq814n2PHSoQ==" 2075 | }, 2076 | "node_modules/picocolors": { 2077 | "version": "1.0.0", 2078 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2079 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2080 | "dev": true 2081 | }, 2082 | "node_modules/picomatch": { 2083 | "version": "2.3.1", 2084 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2085 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2086 | "dev": true, 2087 | "engines": { 2088 | "node": ">=8.6" 2089 | }, 2090 | "funding": { 2091 | "url": "https://github.com/sponsors/jonschlinkert" 2092 | } 2093 | }, 2094 | "node_modules/pirates": { 2095 | "version": "4.0.6", 2096 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2097 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2098 | "dev": true, 2099 | "engines": { 2100 | "node": ">= 6" 2101 | } 2102 | }, 2103 | "node_modules/pkg-types": { 2104 | "version": "1.0.3", 2105 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", 2106 | "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", 2107 | "dev": true, 2108 | "dependencies": { 2109 | "jsonc-parser": "^3.2.0", 2110 | "mlly": "^1.2.0", 2111 | "pathe": "^1.1.0" 2112 | } 2113 | }, 2114 | "node_modules/postcss": { 2115 | "version": "8.4.38", 2116 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 2117 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 2118 | "dev": true, 2119 | "funding": [ 2120 | { 2121 | "type": "opencollective", 2122 | "url": "https://opencollective.com/postcss/" 2123 | }, 2124 | { 2125 | "type": "tidelift", 2126 | "url": "https://tidelift.com/funding/github/npm/postcss" 2127 | }, 2128 | { 2129 | "type": "github", 2130 | "url": "https://github.com/sponsors/ai" 2131 | } 2132 | ], 2133 | "dependencies": { 2134 | "nanoid": "^3.3.7", 2135 | "picocolors": "^1.0.0", 2136 | "source-map-js": "^1.2.0" 2137 | }, 2138 | "engines": { 2139 | "node": "^10 || ^12 || >=14" 2140 | } 2141 | }, 2142 | "node_modules/postcss-load-config": { 2143 | "version": "4.0.2", 2144 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 2145 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 2146 | "dev": true, 2147 | "funding": [ 2148 | { 2149 | "type": "opencollective", 2150 | "url": "https://opencollective.com/postcss/" 2151 | }, 2152 | { 2153 | "type": "github", 2154 | "url": "https://github.com/sponsors/ai" 2155 | } 2156 | ], 2157 | "dependencies": { 2158 | "lilconfig": "^3.0.0", 2159 | "yaml": "^2.3.4" 2160 | }, 2161 | "engines": { 2162 | "node": ">= 14" 2163 | }, 2164 | "peerDependencies": { 2165 | "postcss": ">=8.0.9", 2166 | "ts-node": ">=9.0.0" 2167 | }, 2168 | "peerDependenciesMeta": { 2169 | "postcss": { 2170 | "optional": true 2171 | }, 2172 | "ts-node": { 2173 | "optional": true 2174 | } 2175 | } 2176 | }, 2177 | "node_modules/pretty-format": { 2178 | "version": "29.7.0", 2179 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", 2180 | "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", 2181 | "dev": true, 2182 | "dependencies": { 2183 | "@jest/schemas": "^29.6.3", 2184 | "ansi-styles": "^5.0.0", 2185 | "react-is": "^18.0.0" 2186 | }, 2187 | "engines": { 2188 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2189 | } 2190 | }, 2191 | "node_modules/punycode": { 2192 | "version": "2.3.1", 2193 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 2194 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 2195 | "dev": true, 2196 | "engines": { 2197 | "node": ">=6" 2198 | } 2199 | }, 2200 | "node_modules/queue-microtask": { 2201 | "version": "1.2.3", 2202 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2203 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2204 | "dev": true, 2205 | "funding": [ 2206 | { 2207 | "type": "github", 2208 | "url": "https://github.com/sponsors/feross" 2209 | }, 2210 | { 2211 | "type": "patreon", 2212 | "url": "https://www.patreon.com/feross" 2213 | }, 2214 | { 2215 | "type": "consulting", 2216 | "url": "https://feross.org/support" 2217 | } 2218 | ] 2219 | }, 2220 | "node_modules/react-is": { 2221 | "version": "18.2.0", 2222 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", 2223 | "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", 2224 | "dev": true 2225 | }, 2226 | "node_modules/readdirp": { 2227 | "version": "3.6.0", 2228 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2229 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2230 | "dev": true, 2231 | "dependencies": { 2232 | "picomatch": "^2.2.1" 2233 | }, 2234 | "engines": { 2235 | "node": ">=8.10.0" 2236 | } 2237 | }, 2238 | "node_modules/resolve-from": { 2239 | "version": "5.0.0", 2240 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 2241 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 2242 | "dev": true, 2243 | "engines": { 2244 | "node": ">=8" 2245 | } 2246 | }, 2247 | "node_modules/reusify": { 2248 | "version": "1.0.4", 2249 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2250 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2251 | "dev": true, 2252 | "engines": { 2253 | "iojs": ">=1.0.0", 2254 | "node": ">=0.10.0" 2255 | } 2256 | }, 2257 | "node_modules/rollup": { 2258 | "version": "4.14.2", 2259 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.2.tgz", 2260 | "integrity": "sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==", 2261 | "dev": true, 2262 | "dependencies": { 2263 | "@types/estree": "1.0.5" 2264 | }, 2265 | "bin": { 2266 | "rollup": "dist/bin/rollup" 2267 | }, 2268 | "engines": { 2269 | "node": ">=18.0.0", 2270 | "npm": ">=8.0.0" 2271 | }, 2272 | "optionalDependencies": { 2273 | "@rollup/rollup-android-arm-eabi": "4.14.2", 2274 | "@rollup/rollup-android-arm64": "4.14.2", 2275 | "@rollup/rollup-darwin-arm64": "4.14.2", 2276 | "@rollup/rollup-darwin-x64": "4.14.2", 2277 | "@rollup/rollup-linux-arm-gnueabihf": "4.14.2", 2278 | "@rollup/rollup-linux-arm64-gnu": "4.14.2", 2279 | "@rollup/rollup-linux-arm64-musl": "4.14.2", 2280 | "@rollup/rollup-linux-powerpc64le-gnu": "4.14.2", 2281 | "@rollup/rollup-linux-riscv64-gnu": "4.14.2", 2282 | "@rollup/rollup-linux-s390x-gnu": "4.14.2", 2283 | "@rollup/rollup-linux-x64-gnu": "4.14.2", 2284 | "@rollup/rollup-linux-x64-musl": "4.14.2", 2285 | "@rollup/rollup-win32-arm64-msvc": "4.14.2", 2286 | "@rollup/rollup-win32-ia32-msvc": "4.14.2", 2287 | "@rollup/rollup-win32-x64-msvc": "4.14.2", 2288 | "fsevents": "~2.3.2" 2289 | } 2290 | }, 2291 | "node_modules/run-parallel": { 2292 | "version": "1.2.0", 2293 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2294 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2295 | "dev": true, 2296 | "funding": [ 2297 | { 2298 | "type": "github", 2299 | "url": "https://github.com/sponsors/feross" 2300 | }, 2301 | { 2302 | "type": "patreon", 2303 | "url": "https://www.patreon.com/feross" 2304 | }, 2305 | { 2306 | "type": "consulting", 2307 | "url": "https://feross.org/support" 2308 | } 2309 | ], 2310 | "dependencies": { 2311 | "queue-microtask": "^1.2.2" 2312 | } 2313 | }, 2314 | "node_modules/semver": { 2315 | "version": "7.5.4", 2316 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 2317 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 2318 | "dev": true, 2319 | "dependencies": { 2320 | "lru-cache": "^6.0.0" 2321 | }, 2322 | "bin": { 2323 | "semver": "bin/semver.js" 2324 | }, 2325 | "engines": { 2326 | "node": ">=10" 2327 | } 2328 | }, 2329 | "node_modules/semver/node_modules/lru-cache": { 2330 | "version": "6.0.0", 2331 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2332 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2333 | "dev": true, 2334 | "dependencies": { 2335 | "yallist": "^4.0.0" 2336 | }, 2337 | "engines": { 2338 | "node": ">=10" 2339 | } 2340 | }, 2341 | "node_modules/shebang-command": { 2342 | "version": "2.0.0", 2343 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2344 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2345 | "dependencies": { 2346 | "shebang-regex": "^3.0.0" 2347 | }, 2348 | "engines": { 2349 | "node": ">=8" 2350 | } 2351 | }, 2352 | "node_modules/shebang-regex": { 2353 | "version": "3.0.0", 2354 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2355 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2356 | "engines": { 2357 | "node": ">=8" 2358 | } 2359 | }, 2360 | "node_modules/siginfo": { 2361 | "version": "2.0.0", 2362 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 2363 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 2364 | "dev": true 2365 | }, 2366 | "node_modules/signal-exit": { 2367 | "version": "4.1.0", 2368 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2369 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2370 | "engines": { 2371 | "node": ">=14" 2372 | }, 2373 | "funding": { 2374 | "url": "https://github.com/sponsors/isaacs" 2375 | } 2376 | }, 2377 | "node_modules/slash": { 2378 | "version": "3.0.0", 2379 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 2380 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 2381 | "dev": true, 2382 | "engines": { 2383 | "node": ">=8" 2384 | } 2385 | }, 2386 | "node_modules/source-map": { 2387 | "version": "0.6.1", 2388 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2389 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 2390 | "dev": true, 2391 | "engines": { 2392 | "node": ">=0.10.0" 2393 | } 2394 | }, 2395 | "node_modules/source-map-js": { 2396 | "version": "1.2.0", 2397 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 2398 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 2399 | "dev": true, 2400 | "engines": { 2401 | "node": ">=0.10.0" 2402 | } 2403 | }, 2404 | "node_modules/stackback": { 2405 | "version": "0.0.2", 2406 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 2407 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 2408 | "dev": true 2409 | }, 2410 | "node_modules/std-env": { 2411 | "version": "3.6.0", 2412 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", 2413 | "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==", 2414 | "dev": true 2415 | }, 2416 | "node_modules/string-width": { 2417 | "version": "5.1.2", 2418 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2419 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2420 | "dependencies": { 2421 | "eastasianwidth": "^0.2.0", 2422 | "emoji-regex": "^9.2.2", 2423 | "strip-ansi": "^7.0.1" 2424 | }, 2425 | "engines": { 2426 | "node": ">=12" 2427 | }, 2428 | "funding": { 2429 | "url": "https://github.com/sponsors/sindresorhus" 2430 | } 2431 | }, 2432 | "node_modules/string-width-cjs": { 2433 | "name": "string-width", 2434 | "version": "4.2.3", 2435 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2436 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2437 | "dependencies": { 2438 | "emoji-regex": "^8.0.0", 2439 | "is-fullwidth-code-point": "^3.0.0", 2440 | "strip-ansi": "^6.0.1" 2441 | }, 2442 | "engines": { 2443 | "node": ">=8" 2444 | } 2445 | }, 2446 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2447 | "version": "5.0.1", 2448 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2449 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2450 | "engines": { 2451 | "node": ">=8" 2452 | } 2453 | }, 2454 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2455 | "version": "8.0.0", 2456 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2457 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 2458 | }, 2459 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2460 | "version": "6.0.1", 2461 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2462 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2463 | "dependencies": { 2464 | "ansi-regex": "^5.0.1" 2465 | }, 2466 | "engines": { 2467 | "node": ">=8" 2468 | } 2469 | }, 2470 | "node_modules/strip-ansi": { 2471 | "version": "7.1.0", 2472 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2473 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2474 | "dependencies": { 2475 | "ansi-regex": "^6.0.1" 2476 | }, 2477 | "engines": { 2478 | "node": ">=12" 2479 | }, 2480 | "funding": { 2481 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2482 | } 2483 | }, 2484 | "node_modules/strip-ansi-cjs": { 2485 | "name": "strip-ansi", 2486 | "version": "6.0.1", 2487 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2488 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2489 | "dependencies": { 2490 | "ansi-regex": "^5.0.1" 2491 | }, 2492 | "engines": { 2493 | "node": ">=8" 2494 | } 2495 | }, 2496 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2497 | "version": "5.0.1", 2498 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2499 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2500 | "engines": { 2501 | "node": ">=8" 2502 | } 2503 | }, 2504 | "node_modules/strip-final-newline": { 2505 | "version": "2.0.0", 2506 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 2507 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 2508 | "dev": true, 2509 | "engines": { 2510 | "node": ">=6" 2511 | } 2512 | }, 2513 | "node_modules/strip-literal": { 2514 | "version": "1.3.0", 2515 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", 2516 | "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", 2517 | "dev": true, 2518 | "dependencies": { 2519 | "acorn": "^8.10.0" 2520 | }, 2521 | "funding": { 2522 | "url": "https://github.com/sponsors/antfu" 2523 | } 2524 | }, 2525 | "node_modules/sucrase": { 2526 | "version": "3.34.0", 2527 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", 2528 | "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", 2529 | "dev": true, 2530 | "dependencies": { 2531 | "@jridgewell/gen-mapping": "^0.3.2", 2532 | "commander": "^4.0.0", 2533 | "glob": "7.1.6", 2534 | "lines-and-columns": "^1.1.6", 2535 | "mz": "^2.7.0", 2536 | "pirates": "^4.0.1", 2537 | "ts-interface-checker": "^0.1.9" 2538 | }, 2539 | "bin": { 2540 | "sucrase": "bin/sucrase", 2541 | "sucrase-node": "bin/sucrase-node" 2542 | }, 2543 | "engines": { 2544 | "node": ">=8" 2545 | } 2546 | }, 2547 | "node_modules/sucrase/node_modules/brace-expansion": { 2548 | "version": "1.1.11", 2549 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2550 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2551 | "dev": true, 2552 | "dependencies": { 2553 | "balanced-match": "^1.0.0", 2554 | "concat-map": "0.0.1" 2555 | } 2556 | }, 2557 | "node_modules/sucrase/node_modules/glob": { 2558 | "version": "7.1.6", 2559 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 2560 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 2561 | "dev": true, 2562 | "dependencies": { 2563 | "fs.realpath": "^1.0.0", 2564 | "inflight": "^1.0.4", 2565 | "inherits": "2", 2566 | "minimatch": "^3.0.4", 2567 | "once": "^1.3.0", 2568 | "path-is-absolute": "^1.0.0" 2569 | }, 2570 | "engines": { 2571 | "node": "*" 2572 | }, 2573 | "funding": { 2574 | "url": "https://github.com/sponsors/isaacs" 2575 | } 2576 | }, 2577 | "node_modules/sucrase/node_modules/minimatch": { 2578 | "version": "3.1.2", 2579 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2580 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2581 | "dev": true, 2582 | "dependencies": { 2583 | "brace-expansion": "^1.1.7" 2584 | }, 2585 | "engines": { 2586 | "node": "*" 2587 | } 2588 | }, 2589 | "node_modules/supports-color": { 2590 | "version": "7.2.0", 2591 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2592 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2593 | "dev": true, 2594 | "dependencies": { 2595 | "has-flag": "^4.0.0" 2596 | }, 2597 | "engines": { 2598 | "node": ">=8" 2599 | } 2600 | }, 2601 | "node_modules/test-exclude": { 2602 | "version": "6.0.0", 2603 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 2604 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 2605 | "dev": true, 2606 | "dependencies": { 2607 | "@istanbuljs/schema": "^0.1.2", 2608 | "glob": "^7.1.4", 2609 | "minimatch": "^3.0.4" 2610 | }, 2611 | "engines": { 2612 | "node": ">=8" 2613 | } 2614 | }, 2615 | "node_modules/test-exclude/node_modules/brace-expansion": { 2616 | "version": "1.1.11", 2617 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2618 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2619 | "dev": true, 2620 | "dependencies": { 2621 | "balanced-match": "^1.0.0", 2622 | "concat-map": "0.0.1" 2623 | } 2624 | }, 2625 | "node_modules/test-exclude/node_modules/glob": { 2626 | "version": "7.2.3", 2627 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 2628 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 2629 | "dev": true, 2630 | "dependencies": { 2631 | "fs.realpath": "^1.0.0", 2632 | "inflight": "^1.0.4", 2633 | "inherits": "2", 2634 | "minimatch": "^3.1.1", 2635 | "once": "^1.3.0", 2636 | "path-is-absolute": "^1.0.0" 2637 | }, 2638 | "engines": { 2639 | "node": "*" 2640 | }, 2641 | "funding": { 2642 | "url": "https://github.com/sponsors/isaacs" 2643 | } 2644 | }, 2645 | "node_modules/test-exclude/node_modules/minimatch": { 2646 | "version": "3.1.2", 2647 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2648 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2649 | "dev": true, 2650 | "dependencies": { 2651 | "brace-expansion": "^1.1.7" 2652 | }, 2653 | "engines": { 2654 | "node": "*" 2655 | } 2656 | }, 2657 | "node_modules/thenify": { 2658 | "version": "3.3.1", 2659 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2660 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2661 | "dev": true, 2662 | "dependencies": { 2663 | "any-promise": "^1.0.0" 2664 | } 2665 | }, 2666 | "node_modules/thenify-all": { 2667 | "version": "1.6.0", 2668 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2669 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2670 | "dev": true, 2671 | "dependencies": { 2672 | "thenify": ">= 3.1.0 < 4" 2673 | }, 2674 | "engines": { 2675 | "node": ">=0.8" 2676 | } 2677 | }, 2678 | "node_modules/tinybench": { 2679 | "version": "2.5.1", 2680 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", 2681 | "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", 2682 | "dev": true 2683 | }, 2684 | "node_modules/tinypool": { 2685 | "version": "0.8.1", 2686 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz", 2687 | "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==", 2688 | "dev": true, 2689 | "engines": { 2690 | "node": ">=14.0.0" 2691 | } 2692 | }, 2693 | "node_modules/tinyspy": { 2694 | "version": "2.2.0", 2695 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", 2696 | "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", 2697 | "dev": true, 2698 | "engines": { 2699 | "node": ">=14.0.0" 2700 | } 2701 | }, 2702 | "node_modules/to-fast-properties": { 2703 | "version": "2.0.0", 2704 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2705 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2706 | "dev": true, 2707 | "engines": { 2708 | "node": ">=4" 2709 | } 2710 | }, 2711 | "node_modules/to-regex-range": { 2712 | "version": "5.0.1", 2713 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2714 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2715 | "dev": true, 2716 | "dependencies": { 2717 | "is-number": "^7.0.0" 2718 | }, 2719 | "engines": { 2720 | "node": ">=8.0" 2721 | } 2722 | }, 2723 | "node_modules/tr46": { 2724 | "version": "1.0.1", 2725 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 2726 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 2727 | "dev": true, 2728 | "dependencies": { 2729 | "punycode": "^2.1.0" 2730 | } 2731 | }, 2732 | "node_modules/tree-kill": { 2733 | "version": "1.2.2", 2734 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 2735 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 2736 | "dev": true, 2737 | "bin": { 2738 | "tree-kill": "cli.js" 2739 | } 2740 | }, 2741 | "node_modules/ts-interface-checker": { 2742 | "version": "0.1.13", 2743 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 2744 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 2745 | "dev": true 2746 | }, 2747 | "node_modules/tsup": { 2748 | "version": "8.0.1", 2749 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.0.1.tgz", 2750 | "integrity": "sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==", 2751 | "dev": true, 2752 | "dependencies": { 2753 | "bundle-require": "^4.0.0", 2754 | "cac": "^6.7.12", 2755 | "chokidar": "^3.5.1", 2756 | "debug": "^4.3.1", 2757 | "esbuild": "^0.19.2", 2758 | "execa": "^5.0.0", 2759 | "globby": "^11.0.3", 2760 | "joycon": "^3.0.1", 2761 | "postcss-load-config": "^4.0.1", 2762 | "resolve-from": "^5.0.0", 2763 | "rollup": "^4.0.2", 2764 | "source-map": "0.8.0-beta.0", 2765 | "sucrase": "^3.20.3", 2766 | "tree-kill": "^1.2.2" 2767 | }, 2768 | "bin": { 2769 | "tsup": "dist/cli-default.js", 2770 | "tsup-node": "dist/cli-node.js" 2771 | }, 2772 | "engines": { 2773 | "node": ">=18" 2774 | }, 2775 | "peerDependencies": { 2776 | "@microsoft/api-extractor": "^7.36.0", 2777 | "@swc/core": "^1", 2778 | "postcss": "^8.4.12", 2779 | "typescript": ">=4.5.0" 2780 | }, 2781 | "peerDependenciesMeta": { 2782 | "@microsoft/api-extractor": { 2783 | "optional": true 2784 | }, 2785 | "@swc/core": { 2786 | "optional": true 2787 | }, 2788 | "postcss": { 2789 | "optional": true 2790 | }, 2791 | "typescript": { 2792 | "optional": true 2793 | } 2794 | } 2795 | }, 2796 | "node_modules/tsup/node_modules/source-map": { 2797 | "version": "0.8.0-beta.0", 2798 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 2799 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 2800 | "dev": true, 2801 | "dependencies": { 2802 | "whatwg-url": "^7.0.0" 2803 | }, 2804 | "engines": { 2805 | "node": ">= 8" 2806 | } 2807 | }, 2808 | "node_modules/type-detect": { 2809 | "version": "4.0.8", 2810 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 2811 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 2812 | "dev": true, 2813 | "engines": { 2814 | "node": ">=4" 2815 | } 2816 | }, 2817 | "node_modules/typescript": { 2818 | "version": "5.3.3", 2819 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 2820 | "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 2821 | "dev": true, 2822 | "bin": { 2823 | "tsc": "bin/tsc", 2824 | "tsserver": "bin/tsserver" 2825 | }, 2826 | "engines": { 2827 | "node": ">=14.17" 2828 | } 2829 | }, 2830 | "node_modules/ufo": { 2831 | "version": "1.3.2", 2832 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz", 2833 | "integrity": "sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==", 2834 | "dev": true 2835 | }, 2836 | "node_modules/undici-types": { 2837 | "version": "5.26.5", 2838 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2839 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2840 | "dev": true 2841 | }, 2842 | "node_modules/v8-to-istanbul": { 2843 | "version": "9.2.0", 2844 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", 2845 | "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", 2846 | "dev": true, 2847 | "dependencies": { 2848 | "@jridgewell/trace-mapping": "^0.3.12", 2849 | "@types/istanbul-lib-coverage": "^2.0.1", 2850 | "convert-source-map": "^2.0.0" 2851 | }, 2852 | "engines": { 2853 | "node": ">=10.12.0" 2854 | } 2855 | }, 2856 | "node_modules/vite": { 2857 | "version": "5.2.8", 2858 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", 2859 | "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", 2860 | "dev": true, 2861 | "dependencies": { 2862 | "esbuild": "^0.20.1", 2863 | "postcss": "^8.4.38", 2864 | "rollup": "^4.13.0" 2865 | }, 2866 | "bin": { 2867 | "vite": "bin/vite.js" 2868 | }, 2869 | "engines": { 2870 | "node": "^18.0.0 || >=20.0.0" 2871 | }, 2872 | "funding": { 2873 | "url": "https://github.com/vitejs/vite?sponsor=1" 2874 | }, 2875 | "optionalDependencies": { 2876 | "fsevents": "~2.3.3" 2877 | }, 2878 | "peerDependencies": { 2879 | "@types/node": "^18.0.0 || >=20.0.0", 2880 | "less": "*", 2881 | "lightningcss": "^1.21.0", 2882 | "sass": "*", 2883 | "stylus": "*", 2884 | "sugarss": "*", 2885 | "terser": "^5.4.0" 2886 | }, 2887 | "peerDependenciesMeta": { 2888 | "@types/node": { 2889 | "optional": true 2890 | }, 2891 | "less": { 2892 | "optional": true 2893 | }, 2894 | "lightningcss": { 2895 | "optional": true 2896 | }, 2897 | "sass": { 2898 | "optional": true 2899 | }, 2900 | "stylus": { 2901 | "optional": true 2902 | }, 2903 | "sugarss": { 2904 | "optional": true 2905 | }, 2906 | "terser": { 2907 | "optional": true 2908 | } 2909 | } 2910 | }, 2911 | "node_modules/vite-node": { 2912 | "version": "1.1.0", 2913 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.0.tgz", 2914 | "integrity": "sha512-jV48DDUxGLEBdHCQvxL1mEh7+naVy+nhUUUaPAZLd3FJgXuxQiewHcfeZebbJ6onDqNGkP4r3MhQ342PRlG81Q==", 2915 | "dev": true, 2916 | "dependencies": { 2917 | "cac": "^6.7.14", 2918 | "debug": "^4.3.4", 2919 | "pathe": "^1.1.1", 2920 | "picocolors": "^1.0.0", 2921 | "vite": "^5.0.0" 2922 | }, 2923 | "bin": { 2924 | "vite-node": "vite-node.mjs" 2925 | }, 2926 | "engines": { 2927 | "node": "^18.0.0 || >=20.0.0" 2928 | }, 2929 | "funding": { 2930 | "url": "https://opencollective.com/vitest" 2931 | } 2932 | }, 2933 | "node_modules/vite/node_modules/@esbuild/aix-ppc64": { 2934 | "version": "0.20.2", 2935 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", 2936 | "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", 2937 | "cpu": [ 2938 | "ppc64" 2939 | ], 2940 | "dev": true, 2941 | "optional": true, 2942 | "os": [ 2943 | "aix" 2944 | ], 2945 | "engines": { 2946 | "node": ">=12" 2947 | } 2948 | }, 2949 | "node_modules/vite/node_modules/@esbuild/android-arm": { 2950 | "version": "0.20.2", 2951 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 2952 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 2953 | "cpu": [ 2954 | "arm" 2955 | ], 2956 | "dev": true, 2957 | "optional": true, 2958 | "os": [ 2959 | "android" 2960 | ], 2961 | "engines": { 2962 | "node": ">=12" 2963 | } 2964 | }, 2965 | "node_modules/vite/node_modules/@esbuild/android-arm64": { 2966 | "version": "0.20.2", 2967 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 2968 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 2969 | "cpu": [ 2970 | "arm64" 2971 | ], 2972 | "dev": true, 2973 | "optional": true, 2974 | "os": [ 2975 | "android" 2976 | ], 2977 | "engines": { 2978 | "node": ">=12" 2979 | } 2980 | }, 2981 | "node_modules/vite/node_modules/@esbuild/android-x64": { 2982 | "version": "0.20.2", 2983 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 2984 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 2985 | "cpu": [ 2986 | "x64" 2987 | ], 2988 | "dev": true, 2989 | "optional": true, 2990 | "os": [ 2991 | "android" 2992 | ], 2993 | "engines": { 2994 | "node": ">=12" 2995 | } 2996 | }, 2997 | "node_modules/vite/node_modules/@esbuild/darwin-arm64": { 2998 | "version": "0.20.2", 2999 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 3000 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 3001 | "cpu": [ 3002 | "arm64" 3003 | ], 3004 | "dev": true, 3005 | "optional": true, 3006 | "os": [ 3007 | "darwin" 3008 | ], 3009 | "engines": { 3010 | "node": ">=12" 3011 | } 3012 | }, 3013 | "node_modules/vite/node_modules/@esbuild/darwin-x64": { 3014 | "version": "0.20.2", 3015 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 3016 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 3017 | "cpu": [ 3018 | "x64" 3019 | ], 3020 | "dev": true, 3021 | "optional": true, 3022 | "os": [ 3023 | "darwin" 3024 | ], 3025 | "engines": { 3026 | "node": ">=12" 3027 | } 3028 | }, 3029 | "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { 3030 | "version": "0.20.2", 3031 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 3032 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 3033 | "cpu": [ 3034 | "arm64" 3035 | ], 3036 | "dev": true, 3037 | "optional": true, 3038 | "os": [ 3039 | "freebsd" 3040 | ], 3041 | "engines": { 3042 | "node": ">=12" 3043 | } 3044 | }, 3045 | "node_modules/vite/node_modules/@esbuild/freebsd-x64": { 3046 | "version": "0.20.2", 3047 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 3048 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 3049 | "cpu": [ 3050 | "x64" 3051 | ], 3052 | "dev": true, 3053 | "optional": true, 3054 | "os": [ 3055 | "freebsd" 3056 | ], 3057 | "engines": { 3058 | "node": ">=12" 3059 | } 3060 | }, 3061 | "node_modules/vite/node_modules/@esbuild/linux-arm": { 3062 | "version": "0.20.2", 3063 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 3064 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 3065 | "cpu": [ 3066 | "arm" 3067 | ], 3068 | "dev": true, 3069 | "optional": true, 3070 | "os": [ 3071 | "linux" 3072 | ], 3073 | "engines": { 3074 | "node": ">=12" 3075 | } 3076 | }, 3077 | "node_modules/vite/node_modules/@esbuild/linux-arm64": { 3078 | "version": "0.20.2", 3079 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 3080 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 3081 | "cpu": [ 3082 | "arm64" 3083 | ], 3084 | "dev": true, 3085 | "optional": true, 3086 | "os": [ 3087 | "linux" 3088 | ], 3089 | "engines": { 3090 | "node": ">=12" 3091 | } 3092 | }, 3093 | "node_modules/vite/node_modules/@esbuild/linux-ia32": { 3094 | "version": "0.20.2", 3095 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 3096 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 3097 | "cpu": [ 3098 | "ia32" 3099 | ], 3100 | "dev": true, 3101 | "optional": true, 3102 | "os": [ 3103 | "linux" 3104 | ], 3105 | "engines": { 3106 | "node": ">=12" 3107 | } 3108 | }, 3109 | "node_modules/vite/node_modules/@esbuild/linux-loong64": { 3110 | "version": "0.20.2", 3111 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 3112 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 3113 | "cpu": [ 3114 | "loong64" 3115 | ], 3116 | "dev": true, 3117 | "optional": true, 3118 | "os": [ 3119 | "linux" 3120 | ], 3121 | "engines": { 3122 | "node": ">=12" 3123 | } 3124 | }, 3125 | "node_modules/vite/node_modules/@esbuild/linux-mips64el": { 3126 | "version": "0.20.2", 3127 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 3128 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 3129 | "cpu": [ 3130 | "mips64el" 3131 | ], 3132 | "dev": true, 3133 | "optional": true, 3134 | "os": [ 3135 | "linux" 3136 | ], 3137 | "engines": { 3138 | "node": ">=12" 3139 | } 3140 | }, 3141 | "node_modules/vite/node_modules/@esbuild/linux-ppc64": { 3142 | "version": "0.20.2", 3143 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 3144 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 3145 | "cpu": [ 3146 | "ppc64" 3147 | ], 3148 | "dev": true, 3149 | "optional": true, 3150 | "os": [ 3151 | "linux" 3152 | ], 3153 | "engines": { 3154 | "node": ">=12" 3155 | } 3156 | }, 3157 | "node_modules/vite/node_modules/@esbuild/linux-riscv64": { 3158 | "version": "0.20.2", 3159 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 3160 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 3161 | "cpu": [ 3162 | "riscv64" 3163 | ], 3164 | "dev": true, 3165 | "optional": true, 3166 | "os": [ 3167 | "linux" 3168 | ], 3169 | "engines": { 3170 | "node": ">=12" 3171 | } 3172 | }, 3173 | "node_modules/vite/node_modules/@esbuild/linux-s390x": { 3174 | "version": "0.20.2", 3175 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 3176 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 3177 | "cpu": [ 3178 | "s390x" 3179 | ], 3180 | "dev": true, 3181 | "optional": true, 3182 | "os": [ 3183 | "linux" 3184 | ], 3185 | "engines": { 3186 | "node": ">=12" 3187 | } 3188 | }, 3189 | "node_modules/vite/node_modules/@esbuild/linux-x64": { 3190 | "version": "0.20.2", 3191 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 3192 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 3193 | "cpu": [ 3194 | "x64" 3195 | ], 3196 | "dev": true, 3197 | "optional": true, 3198 | "os": [ 3199 | "linux" 3200 | ], 3201 | "engines": { 3202 | "node": ">=12" 3203 | } 3204 | }, 3205 | "node_modules/vite/node_modules/@esbuild/netbsd-x64": { 3206 | "version": "0.20.2", 3207 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 3208 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 3209 | "cpu": [ 3210 | "x64" 3211 | ], 3212 | "dev": true, 3213 | "optional": true, 3214 | "os": [ 3215 | "netbsd" 3216 | ], 3217 | "engines": { 3218 | "node": ">=12" 3219 | } 3220 | }, 3221 | "node_modules/vite/node_modules/@esbuild/openbsd-x64": { 3222 | "version": "0.20.2", 3223 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 3224 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 3225 | "cpu": [ 3226 | "x64" 3227 | ], 3228 | "dev": true, 3229 | "optional": true, 3230 | "os": [ 3231 | "openbsd" 3232 | ], 3233 | "engines": { 3234 | "node": ">=12" 3235 | } 3236 | }, 3237 | "node_modules/vite/node_modules/@esbuild/sunos-x64": { 3238 | "version": "0.20.2", 3239 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 3240 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 3241 | "cpu": [ 3242 | "x64" 3243 | ], 3244 | "dev": true, 3245 | "optional": true, 3246 | "os": [ 3247 | "sunos" 3248 | ], 3249 | "engines": { 3250 | "node": ">=12" 3251 | } 3252 | }, 3253 | "node_modules/vite/node_modules/@esbuild/win32-arm64": { 3254 | "version": "0.20.2", 3255 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 3256 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 3257 | "cpu": [ 3258 | "arm64" 3259 | ], 3260 | "dev": true, 3261 | "optional": true, 3262 | "os": [ 3263 | "win32" 3264 | ], 3265 | "engines": { 3266 | "node": ">=12" 3267 | } 3268 | }, 3269 | "node_modules/vite/node_modules/@esbuild/win32-ia32": { 3270 | "version": "0.20.2", 3271 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 3272 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 3273 | "cpu": [ 3274 | "ia32" 3275 | ], 3276 | "dev": true, 3277 | "optional": true, 3278 | "os": [ 3279 | "win32" 3280 | ], 3281 | "engines": { 3282 | "node": ">=12" 3283 | } 3284 | }, 3285 | "node_modules/vite/node_modules/@esbuild/win32-x64": { 3286 | "version": "0.20.2", 3287 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 3288 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 3289 | "cpu": [ 3290 | "x64" 3291 | ], 3292 | "dev": true, 3293 | "optional": true, 3294 | "os": [ 3295 | "win32" 3296 | ], 3297 | "engines": { 3298 | "node": ">=12" 3299 | } 3300 | }, 3301 | "node_modules/vite/node_modules/esbuild": { 3302 | "version": "0.20.2", 3303 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 3304 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 3305 | "dev": true, 3306 | "hasInstallScript": true, 3307 | "bin": { 3308 | "esbuild": "bin/esbuild" 3309 | }, 3310 | "engines": { 3311 | "node": ">=12" 3312 | }, 3313 | "optionalDependencies": { 3314 | "@esbuild/aix-ppc64": "0.20.2", 3315 | "@esbuild/android-arm": "0.20.2", 3316 | "@esbuild/android-arm64": "0.20.2", 3317 | "@esbuild/android-x64": "0.20.2", 3318 | "@esbuild/darwin-arm64": "0.20.2", 3319 | "@esbuild/darwin-x64": "0.20.2", 3320 | "@esbuild/freebsd-arm64": "0.20.2", 3321 | "@esbuild/freebsd-x64": "0.20.2", 3322 | "@esbuild/linux-arm": "0.20.2", 3323 | "@esbuild/linux-arm64": "0.20.2", 3324 | "@esbuild/linux-ia32": "0.20.2", 3325 | "@esbuild/linux-loong64": "0.20.2", 3326 | "@esbuild/linux-mips64el": "0.20.2", 3327 | "@esbuild/linux-ppc64": "0.20.2", 3328 | "@esbuild/linux-riscv64": "0.20.2", 3329 | "@esbuild/linux-s390x": "0.20.2", 3330 | "@esbuild/linux-x64": "0.20.2", 3331 | "@esbuild/netbsd-x64": "0.20.2", 3332 | "@esbuild/openbsd-x64": "0.20.2", 3333 | "@esbuild/sunos-x64": "0.20.2", 3334 | "@esbuild/win32-arm64": "0.20.2", 3335 | "@esbuild/win32-ia32": "0.20.2", 3336 | "@esbuild/win32-x64": "0.20.2" 3337 | } 3338 | }, 3339 | "node_modules/vitest": { 3340 | "version": "1.1.0", 3341 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.0.tgz", 3342 | "integrity": "sha512-oDFiCrw7dd3Jf06HoMtSRARivvyjHJaTxikFxuqJjO76U436PqlVw1uLn7a8OSPrhSfMGVaRakKpA2lePdw79A==", 3343 | "dev": true, 3344 | "dependencies": { 3345 | "@vitest/expect": "1.1.0", 3346 | "@vitest/runner": "1.1.0", 3347 | "@vitest/snapshot": "1.1.0", 3348 | "@vitest/spy": "1.1.0", 3349 | "@vitest/utils": "1.1.0", 3350 | "acorn-walk": "^8.3.0", 3351 | "cac": "^6.7.14", 3352 | "chai": "^4.3.10", 3353 | "debug": "^4.3.4", 3354 | "execa": "^8.0.1", 3355 | "local-pkg": "^0.5.0", 3356 | "magic-string": "^0.30.5", 3357 | "pathe": "^1.1.1", 3358 | "picocolors": "^1.0.0", 3359 | "std-env": "^3.5.0", 3360 | "strip-literal": "^1.3.0", 3361 | "tinybench": "^2.5.1", 3362 | "tinypool": "^0.8.1", 3363 | "vite": "^5.0.0", 3364 | "vite-node": "1.1.0", 3365 | "why-is-node-running": "^2.2.2" 3366 | }, 3367 | "bin": { 3368 | "vitest": "vitest.mjs" 3369 | }, 3370 | "engines": { 3371 | "node": "^18.0.0 || >=20.0.0" 3372 | }, 3373 | "funding": { 3374 | "url": "https://opencollective.com/vitest" 3375 | }, 3376 | "peerDependencies": { 3377 | "@edge-runtime/vm": "*", 3378 | "@types/node": "^18.0.0 || >=20.0.0", 3379 | "@vitest/browser": "^1.0.0", 3380 | "@vitest/ui": "^1.0.0", 3381 | "happy-dom": "*", 3382 | "jsdom": "*" 3383 | }, 3384 | "peerDependenciesMeta": { 3385 | "@edge-runtime/vm": { 3386 | "optional": true 3387 | }, 3388 | "@types/node": { 3389 | "optional": true 3390 | }, 3391 | "@vitest/browser": { 3392 | "optional": true 3393 | }, 3394 | "@vitest/ui": { 3395 | "optional": true 3396 | }, 3397 | "happy-dom": { 3398 | "optional": true 3399 | }, 3400 | "jsdom": { 3401 | "optional": true 3402 | } 3403 | } 3404 | }, 3405 | "node_modules/vitest/node_modules/execa": { 3406 | "version": "8.0.1", 3407 | "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", 3408 | "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", 3409 | "dev": true, 3410 | "dependencies": { 3411 | "cross-spawn": "^7.0.3", 3412 | "get-stream": "^8.0.1", 3413 | "human-signals": "^5.0.0", 3414 | "is-stream": "^3.0.0", 3415 | "merge-stream": "^2.0.0", 3416 | "npm-run-path": "^5.1.0", 3417 | "onetime": "^6.0.0", 3418 | "signal-exit": "^4.1.0", 3419 | "strip-final-newline": "^3.0.0" 3420 | }, 3421 | "engines": { 3422 | "node": ">=16.17" 3423 | }, 3424 | "funding": { 3425 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 3426 | } 3427 | }, 3428 | "node_modules/vitest/node_modules/get-stream": { 3429 | "version": "8.0.1", 3430 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", 3431 | "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", 3432 | "dev": true, 3433 | "engines": { 3434 | "node": ">=16" 3435 | }, 3436 | "funding": { 3437 | "url": "https://github.com/sponsors/sindresorhus" 3438 | } 3439 | }, 3440 | "node_modules/vitest/node_modules/human-signals": { 3441 | "version": "5.0.0", 3442 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", 3443 | "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", 3444 | "dev": true, 3445 | "engines": { 3446 | "node": ">=16.17.0" 3447 | } 3448 | }, 3449 | "node_modules/vitest/node_modules/is-stream": { 3450 | "version": "3.0.0", 3451 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", 3452 | "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", 3453 | "dev": true, 3454 | "engines": { 3455 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3456 | }, 3457 | "funding": { 3458 | "url": "https://github.com/sponsors/sindresorhus" 3459 | } 3460 | }, 3461 | "node_modules/vitest/node_modules/mimic-fn": { 3462 | "version": "4.0.0", 3463 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", 3464 | "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", 3465 | "dev": true, 3466 | "engines": { 3467 | "node": ">=12" 3468 | }, 3469 | "funding": { 3470 | "url": "https://github.com/sponsors/sindresorhus" 3471 | } 3472 | }, 3473 | "node_modules/vitest/node_modules/npm-run-path": { 3474 | "version": "5.1.0", 3475 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", 3476 | "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", 3477 | "dev": true, 3478 | "dependencies": { 3479 | "path-key": "^4.0.0" 3480 | }, 3481 | "engines": { 3482 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 3483 | }, 3484 | "funding": { 3485 | "url": "https://github.com/sponsors/sindresorhus" 3486 | } 3487 | }, 3488 | "node_modules/vitest/node_modules/onetime": { 3489 | "version": "6.0.0", 3490 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", 3491 | "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", 3492 | "dev": true, 3493 | "dependencies": { 3494 | "mimic-fn": "^4.0.0" 3495 | }, 3496 | "engines": { 3497 | "node": ">=12" 3498 | }, 3499 | "funding": { 3500 | "url": "https://github.com/sponsors/sindresorhus" 3501 | } 3502 | }, 3503 | "node_modules/vitest/node_modules/path-key": { 3504 | "version": "4.0.0", 3505 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", 3506 | "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", 3507 | "dev": true, 3508 | "engines": { 3509 | "node": ">=12" 3510 | }, 3511 | "funding": { 3512 | "url": "https://github.com/sponsors/sindresorhus" 3513 | } 3514 | }, 3515 | "node_modules/vitest/node_modules/strip-final-newline": { 3516 | "version": "3.0.0", 3517 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", 3518 | "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", 3519 | "dev": true, 3520 | "engines": { 3521 | "node": ">=12" 3522 | }, 3523 | "funding": { 3524 | "url": "https://github.com/sponsors/sindresorhus" 3525 | } 3526 | }, 3527 | "node_modules/vue": { 3528 | "version": "3.4.27", 3529 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", 3530 | "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", 3531 | "dev": true, 3532 | "dependencies": { 3533 | "@vue/compiler-dom": "3.4.27", 3534 | "@vue/compiler-sfc": "3.4.27", 3535 | "@vue/runtime-dom": "3.4.27", 3536 | "@vue/server-renderer": "3.4.27", 3537 | "@vue/shared": "3.4.27" 3538 | }, 3539 | "peerDependencies": { 3540 | "typescript": "*" 3541 | }, 3542 | "peerDependenciesMeta": { 3543 | "typescript": { 3544 | "optional": true 3545 | } 3546 | } 3547 | }, 3548 | "node_modules/webidl-conversions": { 3549 | "version": "4.0.2", 3550 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 3551 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 3552 | "dev": true 3553 | }, 3554 | "node_modules/whatwg-url": { 3555 | "version": "7.1.0", 3556 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 3557 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 3558 | "dev": true, 3559 | "dependencies": { 3560 | "lodash.sortby": "^4.7.0", 3561 | "tr46": "^1.0.1", 3562 | "webidl-conversions": "^4.0.2" 3563 | } 3564 | }, 3565 | "node_modules/which": { 3566 | "version": "2.0.2", 3567 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3568 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3569 | "dependencies": { 3570 | "isexe": "^2.0.0" 3571 | }, 3572 | "bin": { 3573 | "node-which": "bin/node-which" 3574 | }, 3575 | "engines": { 3576 | "node": ">= 8" 3577 | } 3578 | }, 3579 | "node_modules/why-is-node-running": { 3580 | "version": "2.2.2", 3581 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", 3582 | "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", 3583 | "dev": true, 3584 | "dependencies": { 3585 | "siginfo": "^2.0.0", 3586 | "stackback": "0.0.2" 3587 | }, 3588 | "bin": { 3589 | "why-is-node-running": "cli.js" 3590 | }, 3591 | "engines": { 3592 | "node": ">=8" 3593 | } 3594 | }, 3595 | "node_modules/wrap-ansi": { 3596 | "version": "8.1.0", 3597 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3598 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3599 | "dependencies": { 3600 | "ansi-styles": "^6.1.0", 3601 | "string-width": "^5.0.1", 3602 | "strip-ansi": "^7.0.1" 3603 | }, 3604 | "engines": { 3605 | "node": ">=12" 3606 | }, 3607 | "funding": { 3608 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3609 | } 3610 | }, 3611 | "node_modules/wrap-ansi-cjs": { 3612 | "name": "wrap-ansi", 3613 | "version": "7.0.0", 3614 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3615 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3616 | "dependencies": { 3617 | "ansi-styles": "^4.0.0", 3618 | "string-width": "^4.1.0", 3619 | "strip-ansi": "^6.0.0" 3620 | }, 3621 | "engines": { 3622 | "node": ">=10" 3623 | }, 3624 | "funding": { 3625 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3626 | } 3627 | }, 3628 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3629 | "version": "5.0.1", 3630 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3631 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3632 | "engines": { 3633 | "node": ">=8" 3634 | } 3635 | }, 3636 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3637 | "version": "4.3.0", 3638 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3639 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3640 | "dependencies": { 3641 | "color-convert": "^2.0.1" 3642 | }, 3643 | "engines": { 3644 | "node": ">=8" 3645 | }, 3646 | "funding": { 3647 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3648 | } 3649 | }, 3650 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3651 | "version": "8.0.0", 3652 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3653 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 3654 | }, 3655 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3656 | "version": "4.2.3", 3657 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3658 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3659 | "dependencies": { 3660 | "emoji-regex": "^8.0.0", 3661 | "is-fullwidth-code-point": "^3.0.0", 3662 | "strip-ansi": "^6.0.1" 3663 | }, 3664 | "engines": { 3665 | "node": ">=8" 3666 | } 3667 | }, 3668 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3669 | "version": "6.0.1", 3670 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3671 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3672 | "dependencies": { 3673 | "ansi-regex": "^5.0.1" 3674 | }, 3675 | "engines": { 3676 | "node": ">=8" 3677 | } 3678 | }, 3679 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 3680 | "version": "6.2.1", 3681 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 3682 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 3683 | "engines": { 3684 | "node": ">=12" 3685 | }, 3686 | "funding": { 3687 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3688 | } 3689 | }, 3690 | "node_modules/wrappy": { 3691 | "version": "1.0.2", 3692 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3693 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3694 | "dev": true 3695 | }, 3696 | "node_modules/yallist": { 3697 | "version": "4.0.0", 3698 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3699 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 3700 | "dev": true 3701 | }, 3702 | "node_modules/yaml": { 3703 | "version": "2.3.4", 3704 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", 3705 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", 3706 | "dev": true, 3707 | "engines": { 3708 | "node": ">= 14" 3709 | } 3710 | }, 3711 | "node_modules/yocto-queue": { 3712 | "version": "1.0.0", 3713 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 3714 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 3715 | "dev": true, 3716 | "engines": { 3717 | "node": ">=12.20" 3718 | }, 3719 | "funding": { 3720 | "url": "https://github.com/sponsors/sindresorhus" 3721 | } 3722 | } 3723 | } 3724 | } 3725 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel-translator", 3 | "type": "module", 4 | "version": "1.1.1", 5 | "description": "Laravel localization bridge for your frontend.", 6 | "main": "dist/index.cjs", 7 | "module": "dist/index.js", 8 | "types": "dist/index.d.ts", 9 | "files": [ 10 | "dist/" 11 | ], 12 | "exports": { 13 | ".": { 14 | "types": "./dist/index.d.ts", 15 | "import": "./dist/index.js", 16 | "require": "./dist/index.cjs" 17 | }, 18 | "./*": { 19 | "types": "./dist/*.d.ts", 20 | "import": "./dist/*.js", 21 | "require": "./dist/*.cjs" 22 | } 23 | }, 24 | "typesVersions": { 25 | "*": { 26 | "*": [ 27 | "dist/index.d.ts" 28 | ], 29 | "vite": [ 30 | "dist/vite.d.ts" 31 | ] 32 | } 33 | }, 34 | "scripts": { 35 | "tests": "vitest --run", 36 | "prepublishOnly": "tsup ./src --external virtual-laravel-translations,vue --format cjs,esm --dts" 37 | }, 38 | "repository": { 39 | "type": "git", 40 | "url": "https://github.com/sergix44/laravel-translator-js.git" 41 | }, 42 | "author": "Sergio Brighenti", 43 | "license": "MIT", 44 | "bugs": { 45 | "url": "https://github.com/sergix44/laravel-translator-js/issues" 46 | }, 47 | "homepage": "https://github.com/sergix44/laravel-translator-js#readme", 48 | "devDependencies": { 49 | "@types/node": "^20.10.4", 50 | "@vitest/coverage-v8": "^1.0.4", 51 | "tsup": "^8.0.1", 52 | "typescript": "^5.3.3", 53 | "vite": "^5.2.8", 54 | "vitest": "^1.0.0", 55 | "vue": "^3.4.27" 56 | }, 57 | "dependencies": { 58 | "glob": "^10.3.10", 59 | "php-parser": "^3.1.5" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/exporter.ts: -------------------------------------------------------------------------------- 1 | import {glob} from "glob"; 2 | import {basename, sep, join} from "path"; 3 | import {Engine, Return} from 'php-parser' 4 | import {writeFileSync, readFileSync} from "fs"; 5 | 6 | interface CandidateTranslation { 7 | type: 'php' | 'json' 8 | basePath: string 9 | path: string 10 | name: string | null 11 | nesting: string[] 12 | locale: string 13 | } 14 | 15 | const engine = new Engine({}) 16 | 17 | export const exportTranslations = (...paths: string[]) => { 18 | const translationFiles: CandidateTranslation[] = [] 19 | 20 | paths.forEach((path) => { 21 | translationFiles.push(...getTranslationCandidates(`./**/*.php`, path, 'php')) 22 | translationFiles.push(...getTranslationCandidates(`*.json`, path, 'json')) 23 | }) 24 | 25 | const translations = {} 26 | 27 | translationFiles.forEach((candidate) => { 28 | let content: null | object 29 | if (candidate.type === 'php') { 30 | content = importPhpFile(candidate.basePath, candidate); 31 | } else { 32 | content = importJsonFile(candidate.basePath, candidate); 33 | } 34 | 35 | if (!content) { 36 | return 37 | } 38 | 39 | if (!translations[candidate.locale]) { 40 | translations[candidate.locale] = {} 41 | } 42 | 43 | if (!translations[candidate.locale][candidate.type]) { 44 | translations[candidate.locale][candidate.type] = {} 45 | } 46 | 47 | let current = translations[candidate.locale][candidate.type] 48 | candidate.nesting.forEach((nest) => { 49 | if (!current[nest]) { 50 | current[nest] = {} 51 | } 52 | 53 | current = current[nest] 54 | }) 55 | 56 | if (candidate.name) { 57 | current[candidate.name] = content 58 | } else { 59 | translations[candidate.locale][candidate.type] = {...current, ...content} 60 | } 61 | }) 62 | 63 | return translations 64 | } 65 | 66 | const getTranslationCandidates = (pattern: string, path: string, type: 'php' | 'json'): CandidateTranslation[] => { 67 | return glob.sync(pattern, {cwd: path}).map((transPath) => { 68 | const withoutExtension = transPath.split('.').shift() 69 | const name = type === 'php' ? basename(withoutExtension).toLocaleLowerCase() : null 70 | const locale = withoutExtension.split(sep).shift().toLocaleLowerCase() 71 | const nesting = withoutExtension.split(sep).slice(1, -1) 72 | return { 73 | type, 74 | basePath: path, 75 | path: transPath, 76 | name, 77 | nesting, 78 | locale, 79 | } 80 | }) 81 | } 82 | 83 | const importJsonFile = (basePath: string, file: CandidateTranslation): object => { 84 | const content = readFileSync(join(basePath, file.path)).toString() 85 | return JSON.parse(content) 86 | } 87 | 88 | const importPhpFile = (basePath: string, file: CandidateTranslation): object | null => { 89 | const content = readFileSync(join(basePath, file.path)).toString() 90 | const phpArray = engine.parseCode(content, basename(file.path)) 91 | .children.filter((child) => child.kind === 'return')[0] as Return 92 | 93 | if (phpArray?.expr?.kind !== 'array') { 94 | return null 95 | } 96 | 97 | return parseExpr(phpArray.expr) 98 | } 99 | 100 | const parseExpr = (expr) => { 101 | if (expr.kind === 'string') { 102 | return expr.value 103 | } 104 | 105 | if (expr.kind === 'array') { 106 | let items = expr.items.map((item) => parseExpr(item)) 107 | 108 | if (expr.items.every((item) => item.key !== null)) { 109 | items = items.reduce((acc, val) => Object.assign({}, acc, val), {}) 110 | } 111 | 112 | return items 113 | } 114 | 115 | if (expr.kind === 'bin') { 116 | return parseExpr(expr.left) + parseExpr(expr.right) 117 | } 118 | 119 | if (expr.key) { 120 | return {[expr.key.value]: parseExpr(expr.value)} 121 | } 122 | 123 | return parseExpr(expr.value) 124 | } 125 | 126 | export const saveJsonFile = (path: string, content: object) => { 127 | writeFileSync(join(path, 'translations.json'), JSON.stringify(content)) 128 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import {Config, translator} from './translator' 2 | // @ts-ignore 3 | import translations from 'virtual-laravel-translations' 4 | 5 | declare global { 6 | interface Window { 7 | locale?: string; 8 | fallbackLocale?: string; 9 | } 10 | } 11 | 12 | const isServer = typeof window === 'undefined' 13 | 14 | const defaultConfig: Config = { 15 | locale: !isServer && document.documentElement.lang ? document.documentElement.lang.replace('-', '_') : 'en', 16 | fallbackLocale: !isServer && window ? window?.fallbackLocale?.replace('-', '_') : null, 17 | translations: translations, 18 | } 19 | 20 | const trans = (key: string, replace: object = {}, locale: string = null, config: Config = null) => { 21 | if (locale) { 22 | if (!config) { 23 | config = {...defaultConfig} 24 | } 25 | config.locale = locale 26 | } 27 | 28 | return translator(key, replace, false, config ?? defaultConfig) 29 | } 30 | 31 | const transChoice = (key: string, number: number, replace: Object = {}, locale: string = null, config: Config = null) => { 32 | if (locale) { 33 | if (!config) { 34 | config = {...defaultConfig} 35 | } 36 | config.locale = locale 37 | } 38 | 39 | return translator(key, {...replace, count: number}, true, config ?? defaultConfig) 40 | } 41 | 42 | const setLocale = (locale: string, fallbackLocale: string | null = null) => { 43 | defaultConfig.locale = locale?.replace('-', '_') ?? 'en' 44 | defaultConfig.fallbackLocale = fallbackLocale?.replace('-', '_') ?? null 45 | } 46 | 47 | const __ = trans; 48 | const t = trans; 49 | const trans_choice = transChoice; 50 | 51 | export {trans, __, t, transChoice, trans_choice, setLocale} -------------------------------------------------------------------------------- /src/pluralizer.ts: -------------------------------------------------------------------------------- 1 | export function choose(message: string, number: number, lang: string): string { 2 | let segments = message.split('|') 3 | const extracted = extract(segments, number) 4 | 5 | if (extracted !== null) { 6 | return extracted.trim() 7 | } 8 | 9 | segments = stripConditions(segments) 10 | const pluralIndex = getPluralIndex(lang, number) 11 | 12 | if (segments.length === 1 || !segments[pluralIndex]) { 13 | return segments[0] 14 | } 15 | 16 | return segments[pluralIndex] 17 | } 18 | 19 | /** 20 | * Extract a translation string using inline conditions. 21 | */ 22 | function extract(segments: string[], number: number): string | null { 23 | for (const part of segments) { 24 | let line = extractFromString(part, number) 25 | 26 | if (line !== null) { 27 | return line 28 | } 29 | } 30 | 31 | return null 32 | } 33 | 34 | /** 35 | * Get the translation string if the condition matches. 36 | */ 37 | function extractFromString(part: string, number: number): string | null { 38 | const matches = part.match(/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s) || [] 39 | if (matches.length !== 3) { 40 | return null 41 | } 42 | 43 | const condition = matches[1] 44 | const value = matches[2] 45 | 46 | if (condition.includes(',')) { 47 | let [from, to] = condition.split(',') 48 | 49 | if (to === '*' && number >= parseFloat(from)) { 50 | return value 51 | } else if (from === '*' && number <= parseFloat(to)) { 52 | return value 53 | } else if (number >= parseFloat(from) && number <= parseFloat(to)) { 54 | return value 55 | } 56 | } 57 | 58 | return parseFloat(condition) === number ? value : null 59 | } 60 | 61 | /** 62 | * Strip the inline conditions from each segment, just leaving the text. 63 | */ 64 | function stripConditions(segments: string[]): string[] { 65 | return segments.map((part) => part.replace(/^[\{\[]([^\[\]\{\}]*)[\}\]]/, '')) 66 | } 67 | 68 | function getPluralIndex(lang: string, number: number): number { 69 | switch (lang.replace('_', '-')) { 70 | case 'af': 71 | case 'af-ZA': 72 | case 'bn': 73 | case 'bn-BD': 74 | case 'bn-IN': 75 | case 'bg': 76 | case 'bg-BG': 77 | case 'ca': 78 | case 'ca-AD': 79 | case 'ca-ES': 80 | case 'ca-FR': 81 | case 'ca-IT': 82 | case 'da': 83 | case 'da-DK': 84 | case 'de': 85 | case 'de-AT': 86 | case 'de-BE': 87 | case 'de-CH': 88 | case 'de-DE': 89 | case 'de-LI': 90 | case 'de-LU': 91 | case 'el': 92 | case 'el-CY': 93 | case 'el-GR': 94 | case 'en': 95 | case 'en-AG': 96 | case 'en-AU': 97 | case 'en-BW': 98 | case 'en-CA': 99 | case 'en-DK': 100 | case 'en-GB': 101 | case 'en-HK': 102 | case 'en-IE': 103 | case 'en-IN': 104 | case 'en-NG': 105 | case 'en-NZ': 106 | case 'en-PH': 107 | case 'en-SG': 108 | case 'en-US': 109 | case 'en-ZA': 110 | case 'en-ZM': 111 | case 'en-ZW': 112 | case 'eo': 113 | case 'eo-US': 114 | case 'es': 115 | case 'es-AR': 116 | case 'es-BO': 117 | case 'es-CL': 118 | case 'es-CO': 119 | case 'es-CR': 120 | case 'es-CU': 121 | case 'es-DO': 122 | case 'es-EC': 123 | case 'es-ES': 124 | case 'es-GT': 125 | case 'es-HN': 126 | case 'es-MX': 127 | case 'es-NI': 128 | case 'es-PA': 129 | case 'es-PE': 130 | case 'es-PR': 131 | case 'es-PY': 132 | case 'es-SV': 133 | case 'es-US': 134 | case 'es-UY': 135 | case 'es-VE': 136 | case 'et': 137 | case 'et-EE': 138 | case 'eu': 139 | case 'eu-ES': 140 | case 'eu-FR': 141 | case 'fa': 142 | case 'fa-IR': 143 | case 'fi': 144 | case 'fi-FI': 145 | case 'fo': 146 | case 'fo-FO': 147 | case 'fur': 148 | case 'fur-IT': 149 | case 'fy': 150 | case 'fy-DE': 151 | case 'fy-NL': 152 | case 'gl': 153 | case 'gl-ES': 154 | case 'gu': 155 | case 'gu-IN': 156 | case 'ha': 157 | case 'ha-NG': 158 | case 'he': 159 | case 'he-IL': 160 | case 'hu': 161 | case 'hu-HU': 162 | case 'is': 163 | case 'is-IS': 164 | case 'it': 165 | case 'it-CH': 166 | case 'it-IT': 167 | case 'ku': 168 | case 'ku-TR': 169 | case 'lb': 170 | case 'lb-LU': 171 | case 'ml': 172 | case 'ml-IN': 173 | case 'mn': 174 | case 'mn-MN': 175 | case 'mr': 176 | case 'mr-IN': 177 | case 'nah': 178 | case 'nb': 179 | case 'nb-NO': 180 | case 'ne': 181 | case 'ne-NP': 182 | case 'nl': 183 | case 'nl-AW': 184 | case 'nl-BE': 185 | case 'nl-NL': 186 | case 'nn': 187 | case 'nn-NO': 188 | case 'no': 189 | case 'om': 190 | case 'om-ET': 191 | case 'om-KE': 192 | case 'or': 193 | case 'or-IN': 194 | case 'pa': 195 | case 'pa-IN': 196 | case 'pa-PK': 197 | case 'pap': 198 | case 'pap-AN': 199 | case 'pap-AW': 200 | case 'pap-CW': 201 | case 'ps': 202 | case 'ps-AF': 203 | case 'pt': 204 | case 'pt-BR': 205 | case 'pt-PT': 206 | case 'so': 207 | case 'so-DJ': 208 | case 'so-ET': 209 | case 'so-KE': 210 | case 'so-SO': 211 | case 'sq': 212 | case 'sq-AL': 213 | case 'sq-MK': 214 | case 'sv': 215 | case 'sv-FI': 216 | case 'sv-SE': 217 | case 'sw': 218 | case 'sw-KE': 219 | case 'sw-TZ': 220 | case 'ta': 221 | case 'ta-IN': 222 | case 'ta-LK': 223 | case 'te': 224 | case 'te-IN': 225 | case 'tk': 226 | case 'tk-TM': 227 | case 'ur': 228 | case 'ur-IN': 229 | case 'ur-PK': 230 | case 'zu': 231 | case 'zu-ZA': 232 | return number === 1 ? 0 : 1 233 | case 'am': 234 | case 'am-ET': 235 | case 'bh': 236 | case 'fil': 237 | case 'fil-PH': 238 | case 'fr': 239 | case 'fr-BE': 240 | case 'fr-CA': 241 | case 'fr-CH': 242 | case 'fr-FR': 243 | case 'fr-LU': 244 | case 'gun': 245 | case 'hi': 246 | case 'hi-IN': 247 | case 'hy': 248 | case 'hy-AM': 249 | case 'ln': 250 | case 'ln-CD': 251 | case 'mg': 252 | case 'mg-MG': 253 | case 'nso': 254 | case 'nso-ZA': 255 | case 'ti': 256 | case 'ti-ER': 257 | case 'ti-ET': 258 | case 'wa': 259 | case 'wa-BE': 260 | case 'xbr': 261 | return number === 0 || number === 1 ? 0 : 1 262 | case 'be': 263 | case 'be-BY': 264 | case 'bs': 265 | case 'bs-BA': 266 | case 'hr': 267 | case 'hr-HR': 268 | case 'ru': 269 | case 'ru-RU': 270 | case 'ru-UA': 271 | case 'sr': 272 | case 'sr-ME': 273 | case 'sr-RS': 274 | case 'uk': 275 | case 'uk-UA': 276 | return number % 10 == 1 && number % 100 != 11 277 | ? 0 278 | : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 10 || number % 100 >= 20) 279 | ? 1 280 | : 2 281 | case 'cs': 282 | case 'cs-CZ': 283 | case 'sk': 284 | case 'sk-SK': 285 | return number == 1 ? 0 : number >= 2 && number <= 4 ? 1 : 2 286 | case 'ga': 287 | case 'ga-IE': 288 | return number == 1 ? 0 : number == 2 ? 1 : 2 289 | case 'lt': 290 | case 'lt-LT': 291 | return number % 10 == 1 && number % 100 != 11 292 | ? 0 293 | : number % 10 >= 2 && (number % 100 < 10 || number % 100 >= 20) 294 | ? 1 295 | : 2 296 | case 'sl': 297 | case 'sl-SI': 298 | return number % 100 == 1 ? 0 : number % 100 == 2 ? 1 : number % 100 == 3 || number % 100 == 4 ? 2 : 3 299 | case 'mk': 300 | case 'mk-MK': 301 | return number % 10 == 1 ? 0 : 1 302 | case 'mt': 303 | case 'mt-MT': 304 | return number == 1 305 | ? 0 306 | : number == 0 || (number % 100 > 1 && number % 100 < 11) 307 | ? 1 308 | : number % 100 > 10 && number % 100 < 20 309 | ? 2 310 | : 3 311 | case 'lv': 312 | case 'lv-LV': 313 | return number == 0 ? 0 : number % 10 == 1 && number % 100 != 11 ? 1 : 2 314 | case 'pl': 315 | case 'pl-PL': 316 | return number == 1 ? 0 : number % 10 >= 2 && number % 10 <= 4 && (number % 100 < 12 || number % 100 > 14) ? 1 : 2 317 | case 'cy': 318 | case 'cy-GB': 319 | return number == 1 ? 0 : number == 2 ? 1 : number == 8 || number == 11 ? 2 : 3 320 | case 'ro': 321 | case 'ro-RO': 322 | return number == 1 ? 0 : number == 0 || (number % 100 > 0 && number % 100 < 20) ? 1 : 2 323 | case 'ar': 324 | case 'ar-AE': 325 | case 'ar-BH': 326 | case 'ar-DZ': 327 | case 'ar-EG': 328 | case 'ar-IN': 329 | case 'ar-IQ': 330 | case 'ar-JO': 331 | case 'ar-KW': 332 | case 'ar-LB': 333 | case 'ar-LY': 334 | case 'ar-MA': 335 | case 'ar-OM': 336 | case 'ar-QA': 337 | case 'ar-SA': 338 | case 'ar-SD': 339 | case 'ar-SS': 340 | case 'ar-SY': 341 | case 'ar-TN': 342 | case 'ar-YE': 343 | return number == 0 344 | ? 0 345 | : number == 1 346 | ? 1 347 | : number == 2 348 | ? 2 349 | : number % 100 >= 3 && number % 100 <= 10 350 | ? 3 351 | : number % 100 >= 11 && number % 100 <= 99 352 | ? 4 353 | : 5 354 | default: 355 | return 0 356 | } 357 | } -------------------------------------------------------------------------------- /src/translator.ts: -------------------------------------------------------------------------------- 1 | import {choose} from "./pluralizer"; 2 | 3 | export interface Config { 4 | locale: string 5 | fallbackLocale: string 6 | translations: object 7 | } 8 | 9 | export const translator = (key: string, replace: object, pluralize: boolean, config: Config) => { 10 | const locale = config?.locale?.toLowerCase() ?? 'en' 11 | const fallbackLocale = config?.fallbackLocale?.toLowerCase() 12 | 13 | // Check if the key is a translation key 14 | let translation = getTranslation(key, locale, config.translations) 15 | 16 | // If not, check if the key is a translation key in the fallback locale 17 | if (!translation && fallbackLocale) { 18 | translation = getTranslation(key, fallbackLocale, config.translations) 19 | } 20 | 21 | return translate(translation ?? key, replace, locale, pluralize) as string 22 | } 23 | 24 | const getTranslation = (key: string, locale: string, translations: object) => { 25 | let translation = null 26 | 27 | // Try to get the translation from the php array 28 | try { 29 | translation = key 30 | .split('.') 31 | .reduce((t, i) => t[i] || null, translations[locale].php) 32 | } catch (e) { 33 | } 34 | 35 | if (translation) { 36 | return translation 37 | } 38 | 39 | // Try to get the translation from the json array 40 | try { 41 | return key 42 | .split('.') 43 | .reduce((t, i) => t[i] || null, translations[locale].json) 44 | } catch (e) { 45 | } 46 | 47 | return translation 48 | } 49 | 50 | const translate = (translation: string | object, replace: object = {}, locale: string, shouldPluralize: boolean = false) => { 51 | if (shouldPluralize && typeof translation === 'string') { 52 | translation = choose(translation, replace['count'], locale); 53 | } 54 | 55 | Object.keys(replace).forEach(key => { 56 | const value = replace[key]?.toString() 57 | 58 | translation = translation.toString() 59 | .replace(':' + key, value) 60 | .replace(':' + key.charAt(0).toUpperCase() + key.slice(1), value.charAt(0).toUpperCase() + value.slice(1)) 61 | .replace(':' + key.toUpperCase(), value.toUpperCase()) 62 | }) 63 | 64 | return translation 65 | } 66 | -------------------------------------------------------------------------------- /src/vite.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path' 2 | import {Plugin} from 'vite' 3 | import {exportTranslations} from "./exporter"; 4 | 5 | export interface VitePluginOptionsInterface { 6 | langPath?: string 7 | additionalLangPaths?: string[] 8 | } 9 | 10 | export default function laravelTranslator(options: string | VitePluginOptionsInterface = 'lang'): Plugin { 11 | let langPath = typeof options === 'string' ? options : options.langPath ?? 'lang' 12 | langPath = langPath.replace(/[\\/]$/, '') + path.sep 13 | const additionalLangPaths = typeof options === 'string' ? [] : options.additionalLangPaths ?? [] 14 | const frameworkLangPath = 'vendor/laravel/framework/src/Illuminate/Translation/lang/'.replace('/', path.sep) 15 | 16 | const virtualModuleId = 'virtual-laravel-translations' 17 | const resolvedVirtualModuleId = '\0' + virtualModuleId 18 | 19 | const paths = [frameworkLangPath, langPath, ...additionalLangPaths] 20 | return { 21 | name: 'laravel-translator', 22 | config: () => ({ 23 | optimizeDeps: { 24 | exclude: [virtualModuleId] 25 | }, 26 | ssr: { 27 | noExternal: ['laravel-translator'] 28 | }, 29 | }), 30 | resolveId(id) { 31 | if (id === virtualModuleId) { 32 | return resolvedVirtualModuleId 33 | } 34 | return null 35 | }, 36 | load(id) { 37 | if (id === resolvedVirtualModuleId) { 38 | return `export default ${JSON.stringify(exportTranslations(...paths))}` 39 | } 40 | return null 41 | }, 42 | handleHotUpdate(ctx) { 43 | for (const lp of paths) { 44 | const relative = path.relative(lp, ctx.file); 45 | const isSub = relative && !relative.startsWith('..') && !path.isAbsolute(relative); 46 | if (isSub) { 47 | const virtualModule = ctx.server.moduleGraph.getModuleById(resolvedVirtualModuleId)!; 48 | ctx.server.moduleGraph.invalidateModule(virtualModule) 49 | ctx.server.ws.send({ 50 | type: 'full-reload', 51 | path: '*' 52 | }); 53 | return 54 | } 55 | } 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /src/vue.ts: -------------------------------------------------------------------------------- 1 | import {trans, trans_choice} from "./index"; 2 | import {App, computed, Ref} from "vue"; 3 | import {Config} from "./translator"; 4 | 5 | // @ts-ignore 6 | import translations from 'virtual-laravel-translations'; 7 | 8 | export const LaravelTranslatorVue = { 9 | install: (app: App, options: ConfigVue) => { 10 | const locale = options.locale || ''; 11 | const fallbackLocale = options.fallbackLocale || ''; 12 | 13 | const configuration = computed(() => ({ 14 | locale: (typeof locale === 'string') ? locale : locale?.value, 15 | fallbackLocale: (typeof fallbackLocale === 'string') ? fallbackLocale : fallbackLocale?.value, 16 | translations: translations, 17 | })); 18 | 19 | const translationCallback = (key: string, replace?: object, locale?: string) => trans(key, replace, undefined, { 20 | locale: locale || configuration.value.locale, 21 | fallbackLocale: configuration.value.fallbackLocale, 22 | translations: configuration.value.translations, 23 | }); 24 | 25 | const translationWithPluralizationCallback = (key: string, number: number, replace?: Object, locale?: string) => trans_choice(key, number, replace, undefined, { 26 | locale: locale || configuration.value.locale, 27 | fallbackLocale: configuration.value.fallbackLocale, 28 | translations: configuration.value.translations, 29 | }); 30 | 31 | if (parseInt(app.version) > 2) { 32 | app.provide('__', translationCallback); 33 | app.provide('t', translationCallback); 34 | app.provide('trans', translationCallback); 35 | app.provide('trans_choice', translationWithPluralizationCallback); 36 | app.provide('transChoice', translationWithPluralizationCallback); 37 | 38 | app.config.globalProperties.__ = translationCallback; 39 | app.config.globalProperties.t = translationCallback; 40 | app.config.globalProperties.trans = translationCallback; 41 | app.config.globalProperties.trans_choice = translationWithPluralizationCallback; 42 | app.config.globalProperties.transChoice = translationWithPluralizationCallback; 43 | } else { 44 | app.mixin({ 45 | methods: { 46 | __: translationCallback, 47 | t: translationCallback, 48 | trans: translationCallback, 49 | trans_choice: translationWithPluralizationCallback, 50 | transChoice: translationWithPluralizationCallback, 51 | }, 52 | }); 53 | } 54 | 55 | return app; 56 | } 57 | }; 58 | 59 | declare module '@vue/runtime-core' { 60 | export interface ComponentCustomProperties { 61 | trans: (key: string, replace?: object, locale?: string, config?: Config) => string; 62 | transChoice: (key: string, number: number, replace?: Object, locale?: string, config?: Config) => string; 63 | __: (key: string, replace?: object, locale?: string, config?: Config) => string; 64 | t: (key: string, replace?: object, locale?: string, config?: Config) => string; 65 | trans_choice: (key: string, number: number, replace?: Object, locale?: string, config?: Config) => string; 66 | } 67 | } 68 | 69 | interface ConfigVue { 70 | locale: string | Ref; 71 | fallbackLocale?: string | Ref; 72 | } 73 | -------------------------------------------------------------------------------- /tests/exporter.test.ts: -------------------------------------------------------------------------------- 1 | import {expect, test} from "vitest"; 2 | import {exportTranslations} from "../src/exporter"; 3 | 4 | 5 | test('exports simple locale', async () => { 6 | const trans = exportTranslations('./tests/fixtures/locales') 7 | 8 | expect(trans).toEqual({ 9 | "en": { 10 | "php": { 11 | "auth": { 12 | "failed": "These credentials are incorrect.", 13 | "throttle": "Too many login attempts. Please try again in :seconds seconds." 14 | }, "domain": {"user": {"sub_dir_support_is_amazing": "Subdirectory override is amazing"}} 15 | } 16 | } 17 | }) 18 | }) 19 | 20 | test('exports complex locale', async () => { 21 | const trans = exportTranslations('./tests/fixtures/lang') 22 | 23 | expect(trans).toEqual({ 24 | "pt": { 25 | "php": { 26 | "auth": { 27 | "failed": "As credenciais indicadas não coincidem com as registadas no sistema.", 28 | "password": "A palavra-passe indicada está incorreta.", 29 | "foo": {"level1": {"level2": "barpt"}} 30 | }, "nested": {"cars": {"car": {"is_electric": "É elétrico?", "foo": {"level1": {"level2": "barpt"}}}}} 31 | }, 32 | "json": { 33 | "Welcome!": "Bem-vindo!", 34 | "Welcome, :name!": "Bem-vindo, :name!", 35 | "hi :name, hi :name": "olá :name, olá :name", 36 | "{1} :count minute ago|[2,*] :count minutes ago": "{1} há :count minuto|[2,*] há :count minutos", 37 | "foo.bar": "baz", 38 | "Start/end": "Início/Fim", 39 | "Get started.": "Comece.", 40 | "
Welcome
": "
Bem-vindo
" 41 | 42 | } 43 | }, 44 | "fr": {"php": {"auth": {"failed": "Ces identifiants ne correspondent pas à nos enregistrements."}}}, 45 | "en": { 46 | "php": { 47 | "auth": { 48 | "failed": "These credentials do not match our records.", 49 | "password": "The provided password is incorrect.", 50 | "foo": {"level1": {"level2": "baren"}}, 51 | "arr": ["foo", "bar"], 52 | "multiline": "Lorem ipsum dolor sit amet.", 53 | "accepted_1": "The :attribute must be accepted.", 54 | "accepted_2": "The :Attribute must be accepted.", 55 | "accepted_3": "The :ATTRIBUTE must be accepted.", 56 | }, 57 | "nested": {"cars": {"car": {"is_electric": "Electric", "foo": {"level1": {"level2": "barpt"}}}}}, 58 | "domain": { 59 | "user": { 60 | "user": "User|Users", 61 | "first_name": "First name", 62 | "sub_dir_support_is_amazing": "Subdirectory support is amazing" 63 | }, 64 | "car": { 65 | "car": "Car|Cars", 66 | "is_electric": "Electric", 67 | "charge_speed": "Charge speed", 68 | "foo": {"level1": {"level2": "barpt"}} 69 | } 70 | } 71 | }, 72 | "json": { 73 | "Welcome!": "Wecome!", 74 | "Welcome, :name!": "Welcome, :name!", 75 | "Only Available on EN": "Only Available on EN", 76 | "{1} :count minute ago|[2,*] :count minutes ago": "{1} :count minute ago|[2,*] :count minutes ago", 77 | "Start/end": "Start/End", 78 | "Get started.": "Get started.", 79 | "English only.": "English only." 80 | 81 | } 82 | }, 83 | "zh_tw": {"json": {"Welcome!": "歡迎"}}, 84 | "es": {"json": {"Welcome!": "Bienvenido!"}}, 85 | "de": {"json": {"auth.arr.0": "foo", "auth.arr.1": "bar"}} 86 | } 87 | ) 88 | }) -------------------------------------------------------------------------------- /tests/fixtures/lang/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "auth.arr.0": "foo", 3 | "auth.arr.1": "bar" 4 | } 5 | -------------------------------------------------------------------------------- /tests/fixtures/lang/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "Welcome!": "Wecome!", 3 | "Welcome, :name!": "Welcome, :name!", 4 | "Only Available on EN": "Only Available on EN", 5 | "{1} :count minute ago|[2,*] :count minutes ago": "{1} :count minute ago|[2,*] :count minutes ago", 6 | "Start/end": "Start/End", 7 | "Get started.": "Get started.", 8 | "English only.": "English only." 9 | } 10 | -------------------------------------------------------------------------------- /tests/fixtures/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 5 | 'password' => 'The provided password is incorrect.', 6 | 'foo' => [ 7 | 'level1' => [ 8 | 'level2' => 'baren', 9 | ], 10 | ], 11 | 'arr' => ['foo', 'bar'], 12 | 'multiline' => 'Lorem '. 13 | 'ipsum '. 14 | 'dolor '. 15 | 'sit '. 16 | 'amet.', 17 | 'accepted_1' => 'The :attribute must be accepted.', 18 | 'accepted_2' => 'The :Attribute must be accepted.', 19 | 'accepted_3' => 'The :ATTRIBUTE must be accepted.', 20 | ]; 21 | -------------------------------------------------------------------------------- /tests/fixtures/lang/en/domain/car.php: -------------------------------------------------------------------------------- 1 | 'Car|Cars', 5 | 'is_electric' => 'Electric', 6 | 'charge_speed' => 'Charge speed', 7 | 'foo' => [ 8 | 'level1' => [ 9 | 'level2' => 'barpt' 10 | ] 11 | ], 12 | ]; 13 | -------------------------------------------------------------------------------- /tests/fixtures/lang/en/domain/user.php: -------------------------------------------------------------------------------- 1 | 'User|Users', 5 | 'first_name' => 'First name', 6 | 'sub_dir_support_is_amazing' => 'Subdirectory support is amazing', 7 | ]; 8 | -------------------------------------------------------------------------------- /tests/fixtures/lang/en/nested/cars/car.php: -------------------------------------------------------------------------------- 1 | 'Electric', 5 | 'foo' => [ 6 | 'level1' => [ 7 | 'level2' => 'barpt', 8 | ] 9 | ] 10 | ]; -------------------------------------------------------------------------------- /tests/fixtures/lang/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "Welcome!": "Bienvenido!" 3 | } 4 | -------------------------------------------------------------------------------- /tests/fixtures/lang/fr/auth.php: -------------------------------------------------------------------------------- 1 | 'Ces identifiants ne correspondent pas à nos enregistrements.', 5 | ]; 6 | -------------------------------------------------------------------------------- /tests/fixtures/lang/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "Welcome!": "Bem-vindo!", 3 | "Welcome, :name!": "Bem-vindo, :name!", 4 | "hi :name, hi :name": "olá :name, olá :name", 5 | "{1} :count minute ago|[2,*] :count minutes ago": "{1} há :count minuto|[2,*] há :count minutos", 6 | "foo.bar": "baz", 7 | "Start/end": "Início/Fim", 8 | "Get started.": "Comece.", 9 | "
Welcome
": "
Bem-vindo
" 10 | } 11 | -------------------------------------------------------------------------------- /tests/fixtures/lang/pt/auth.php: -------------------------------------------------------------------------------- 1 | 'As credenciais indicadas não coincidem com as registadas no sistema.', 5 | 'password' => 'A palavra-passe indicada está incorreta.', 6 | 'foo' => [ 7 | 'level1' => [ 8 | 'level2' => 'barpt' 9 | ] 10 | ], 11 | ]; 12 | -------------------------------------------------------------------------------- /tests/fixtures/lang/pt/nested/cars/car.php: -------------------------------------------------------------------------------- 1 | 'É elétrico?', 5 | 'foo' => [ 6 | 'level1' => [ 7 | 'level2' => 'barpt', 8 | ] 9 | ] 10 | ]; -------------------------------------------------------------------------------- /tests/fixtures/lang/wrongfolder/random.php: -------------------------------------------------------------------------------- 1 | 'These credentials are incorrect.', 5 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.' 6 | ]; -------------------------------------------------------------------------------- /tests/fixtures/locales/en/domain/user.php: -------------------------------------------------------------------------------- 1 | 'Subdirectory override is amazing', 5 | ]; 6 | -------------------------------------------------------------------------------- /tests/trans.test.ts: -------------------------------------------------------------------------------- 1 | import {beforeEach, expect, test} from "vitest"; 2 | import {setLocale, trans, trans_choice} from "../src"; 3 | 4 | beforeEach(() => { 5 | setLocale('en', null) 6 | }); 7 | 8 | test('trans works with random key', async () => { 9 | const r = trans('random.key') 10 | 11 | expect(r).toBe('random.key') 12 | }) 13 | 14 | test('trans works with a key that exists', async () => { 15 | const r = trans('auth.failed') 16 | 17 | expect(r).toBe('These credentials do not match our records.') 18 | }) 19 | 20 | test('trans works with a key that exists nested', async () => { 21 | const r = trans('domain.car.is_electric') 22 | 23 | expect(r).toBe('Electric') 24 | }) 25 | 26 | test('trans works with parameters', async () => { 27 | const r = trans('Welcome, :name!', {name: 'John'}) 28 | 29 | expect(r).toBe('Welcome, John!') 30 | }) 31 | 32 | test('trans works specifying locale', async () => { 33 | const r = trans('Welcome, :name!', {name: 'John'}, 'pt') 34 | 35 | expect(r).toBe('Bem-vindo, John!') 36 | }) 37 | 38 | test('trans choice works with solo', async () => { 39 | const r = trans_choice('domain.car.car', 1) 40 | 41 | expect(r).toBe('Car') 42 | }) 43 | 44 | test('trans choice works with multi', async () => { 45 | const r = trans_choice('domain.car.car', 2) 46 | 47 | expect(r).toBe('Cars') 48 | }) 49 | 50 | test('setLocale works', async () => { 51 | setLocale('pt') 52 | 53 | expect(trans('Welcome, :name!', {name: 'John'})).toBe('Bem-vindo, John!') 54 | expect(trans('nested.cars.car.is_electric')).toBe('É elétrico?') 55 | }) 56 | 57 | test('setLocale with fallback works', async () => { 58 | setLocale('fr', 'pt') 59 | 60 | expect(trans('auth.failed')).toBe('Ces identifiants ne correspondent pas à nos enregistrements.') 61 | expect(trans('nested.cars.car.is_electric')).toBe('É elétrico?') 62 | }) 63 | 64 | test('specifying locale works', async () => { 65 | expect(trans('auth.failed', {}, 'fr')).toBe('Ces identifiants ne correspondent pas à nos enregistrements.') 66 | expect(trans('auth.failed', {}, 'en')).toBe('These credentials do not match our records.') 67 | expect(trans('auth.failed', {}, 'pt')).toBe('As credenciais indicadas não coincidem com as registadas no sistema.') 68 | }) 69 | 70 | test('trans return object for partial translation paths', async () => { 71 | const r = trans('domain.car.foo.level1') as Object 72 | 73 | expect(r).toEqual({level2: 'barpt'}) 74 | }) 75 | 76 | test('trans works with capitalization lowercase', async () => { 77 | const r = trans('auth.accepted_1', {'attribute': 'email'}) 78 | 79 | expect(r).toBe('The email must be accepted.') 80 | }) 81 | 82 | test('trans works with capitalization ucfirst', async () => { 83 | const r = trans('auth.accepted_2', {'attribute': 'email'}) 84 | 85 | expect(r).toBe('The Email must be accepted.') 86 | }) 87 | 88 | test('trans works with capitalization uppercase', async () => { 89 | const r = trans('auth.accepted_3', {'attribute': 'email'}) 90 | 91 | expect(r).toBe('The EMAIL must be accepted.') 92 | }) -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "outDir": "dist", 6 | "declaration": true, 7 | "esModuleInterop": true, 8 | "sourceMap": true 9 | }, 10 | "include": [ 11 | "src/**/*.ts" 12 | ], 13 | "exclude": [ 14 | "node_modules", 15 | "tests" 16 | ] 17 | } -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import {defineConfig} from 'vite' 3 | import laravelTranslator from "./src/vite"; 4 | 5 | export default defineConfig({ 6 | plugins: [laravelTranslator({ 7 | langPath: 'tests/fixtures/lang', 8 | })], 9 | test: { 10 | coverage: { 11 | provider: 'v8', 12 | }, 13 | }, 14 | }) --------------------------------------------------------------------------------