pax_global_header00006660000000000000000000000064147374623550014532gustar00rootroot0000000000000052 comment=ae1e1b394308f58a8fbd7ac3b19a94218311f951 browserslist-4.24.4/000077500000000000000000000000001473746235500143675ustar00rootroot00000000000000browserslist-4.24.4/.editorconfig000066400000000000000000000002231473746235500170410ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true browserslist-4.24.4/.github/000077500000000000000000000000001473746235500157275ustar00rootroot00000000000000browserslist-4.24.4/.github/FUNDING.yml000066400000000000000000000001041473746235500175370ustar00rootroot00000000000000open_collective: browserslist tidelift: npm/browserslist github: ai browserslist-4.24.4/.github/workflows/000077500000000000000000000000001473746235500177645ustar00rootroot00000000000000browserslist-4.24.4/.github/workflows/release.yml000066400000000000000000000025511473746235500221320ustar00rootroot00000000000000name: Release on: push: tags: - '*' permissions: contents: write jobs: release: name: Release On Tag if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: - name: Checkout the repository uses: actions/checkout@v4 - name: Extract the changelog id: changelog run: | TAG_NAME=${GITHUB_REF/refs\/tags\//} READ_SECTION=false CHANGELOG="" while IFS= read -r line; do if [[ "$line" =~ ^#+\ +(.*) ]]; then if [[ "${BASH_REMATCH[1]}" == "$TAG_NAME" ]]; then READ_SECTION=true elif [[ "$READ_SECTION" == true ]]; then break fi elif [[ "$READ_SECTION" == true ]]; then CHANGELOG+="$line"$'\n' fi done < "CHANGELOG.md" CHANGELOG=$(echo "$CHANGELOG" | awk '/./ {$1=$1;print}') echo "changelog_content<> $GITHUB_OUTPUT echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Create the release if: steps.changelog.outputs.changelog_content != '' uses: softprops/action-gh-release@v2 with: name: ${{ github.ref_name }} body: '${{ steps.changelog.outputs.changelog_content }}' draft: false prerelease: false browserslist-4.24.4/.github/workflows/test.yml000066400000000000000000000037621473746235500214760ustar00rootroot00000000000000name: Test on: push: branches: - main pull_request: permissions: contents: read jobs: full: name: Node.js Latest Full runs-on: ubuntu-latest steps: - name: Checkout the repository uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 10 - name: Install Node.js uses: actions/setup-node@v4 with: node-version: 23 cache: pnpm - name: Install dependencies run: pnpm install --ignore-scripts - name: Run tests run: pnpm test short: runs-on: ubuntu-latest strategy: matrix: node-version: - 22 - 20 - 18 name: Node.js ${{ matrix.node-version }} Quick steps: - name: Checkout the repository uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v4 with: version: 10 - name: Install Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install --ignore-scripts - name: Run unit tests run: pnpm unit old: runs-on: ubuntu-latest strategy: matrix: node-version: - 16 - 14 - 12 - 10 - 8 name: Node.js ${{ matrix.node-version }} Quick steps: - name: Checkout the repository uses: actions/checkout@v4 - name: Install pnpm uses: pnpm/action-setup@v1 with: version: 3 env: ACTIONS_ALLOW_UNSECURE_COMMANDS: true - name: Install Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install dependencies run: pnpm install --no-frozen-lockfile --ignore-scripts - name: Run unit tests run: pnpm unit browserslist-4.24.4/.gitignore000066400000000000000000000000311473746235500163510ustar00rootroot00000000000000node_modules/ coverage/ browserslist-4.24.4/.npmignore000066400000000000000000000000651473746235500163670ustar00rootroot00000000000000test/ coverage/ img/ tsconfig.json grammar.w3c-ebnf browserslist-4.24.4/CHANGELOG.md000066400000000000000000000373531473746235500162130ustar00rootroot00000000000000# Change Log This project adheres to [Semantic Versioning](http://semver.org/). ## 4.24.4 * Improved performance by using caching better (by @thoughtspile). ## 4.24.3 * Updated Firefox ESR (by @fpapado). ## 4.24.2 * Clarify outdated `caniuse-lite` warning text. ## 4.24.1 * Added months since last `caniuse-lite` update to the warning (by @mezhnin). ## 4.24.0 * Added `browserslist.findConfigFile()` helper (by @JLHwung). ## 4.23.3 * Fixed `>=` query for `ios` (by @syi0808). ## 4.23.2 * Updated Firefox ESR. ## 4.23.1 * Fixed feature query with mobile to desktop when caniuse lags (by @steverep). ## 4.23.0 * Added `BROWSERSLIST_ROOT_PATH` (by @teleclimber). ## 4.22.3 * Fixed white spaces support in `supports` query (@g-plane). * Fixed shared config like `@company/package/browserslist-config` (@boucodes). ## 4.22.2 * Fixed idempotency in time queries with `mobileToDesktop` (by Aliaksei Sapach). ## 4.22.1 * Updated Firefox ESR (by @lerkor). ## 4.22 * Added `fully supports` query (by Ben Scott). * Added `partially supports` alias for `supports` query (by Ben Scott). ## 4.21.11 * Added warning to `--update-db` to move to new CLI (by Ivan Vasilev). * Fixed docs (by Tatsunori Uchino). ## 4.21.10 * Updated Firefox ESR. ## 4.21.9 * Fixed Opera Mobile edge cases (by Steve Repsher). ## 4.21.8 * Fixed `supports` query and `mobileToDesktop` (by Steve Repsher). ## 4.21.7 * Fixed last queries for Android (by Steve Repsher). ## 4.21.6 * Fixed time queries with `mobileToDesktop` (by Steve Repsher). * Fixed docs (by Tatsunori Uchino, Will Stone, and Dominik Pschenitschni). ## 4.21.5 * Fixed running Browserslist in browser environment. ## 4.21.4 * Updated Firefox ESR. ## 4.21.3 * Improved unknown region and unknown feature error (by Alexander Chabin). ## 4.21.2 * Updated Firefox ESR. ## 4.21.1 * Fixed parsing days in `since` query. ## 4.21 * IE 11 was added to `dead` and removed from `defaults` (by Albert Portnoy). * Added `browserslist.parse()` to get config AST for analysis. * Moved `--update-db` script to `update-browserslist-db` tool. * Fixed Unicode BOM support in `package.json`. ## 4.20.4 * Fixed Opera in `mobileToDesktop` (by Pig Fang). ## 4.20.3 * Added `Baidu` to `dead` browsers (by Igor Lukanin). ## 4.20.2 * Fixed `package.funding` URL format. ## 4.20.1 * Fixed `package.funding`. * Fixed docs (by Michael Lohmann). ## 4.20 * Added `last 2 node versions` and `last 2 node major versions` (by @g-plane). ## 4.19.3 * Updated Firefox ESR (by Christophe Coevoet). ## 4.19.2 * Fixed `--help` output. ## 4.19.1 * Fixed `throwOnMissing` types (by Øyvind Saltvik). ## 4.19 * Added queries grammar definition (by Pig Fang). * Added `throwOnMissing` option (by Øyvind Saltvik). * Fixed `null` data ignoring in `< 50% in CN` (byPig Fang). * Fixed data parsing in `in my stats` (by Sun Xiaoran). * Fixed `yarn.lock` support with `integrity` (by Alexey Berezin). * Fixed Yarn Berry error message in `--update-db`. ## 4.18.1 * Fixed case inventiveness for `cover` queries (by Pig Fang). * Fixed `since 1970` query for `null` in release date (by Pig Fang). ## 4.18 * Added `--ignore-unknown-versions` CLI option (by Pig Fang). ## 4.17.6 * Fixed sharable config resolution (by Adaline Valentina Simonian). ## 4.17.5 * Fixed `--update-db` for some `pnpm` cases. ## 4.17.4 * Reduced package size. ## 4.17.3 * Use `picocolors` for color output in `--update-db`. ## 4.17.2 * Reduced package size. ## 4.17.1 * Use Nano Colors for color output in `--update-db`. ## 4.17 * Added `yarn` 3 support to `--update-db` (by Himank Pathak). ## 4.16.8 * Updated Firefox ESR. ## 4.16.7 * Fixed `oudated caniuse-lite` warning text (by Paul Verest). * Fixed docs (by Alexander Belov). ## 4.16.6 * Fixed `npm-shrinkwrap.json` support in `--update-db` (by Geoff Newman). ## 4.16.5 * Fixed unsafe RegExp (by Yeting Li). ## 4.16.4 * Fixed unsafe RegExp. * Added artifactory support to `--update-db` (by Ittai Baratz). ## 4.16.3 * Fixed `--update-db`. ## 4.16.2 * Fixed `--update-db` (by @ialarmedalien). ## 4.16.1 * Fixed Chrome 4 with `mobileToDesktop` (by Aron Woost). ## 4.16 * Add `browserslist config` query. ## 4.15 * Add TypeScript types (by Dmitry Semigradsky). ## 4.14.7 * Fixed Yarn Workspaces support to `--update-db` (by Fausto Núñez Alberro). * Added browser changes to `--update-db` (by @AleksandrSl). * Added color output to `--update-db`. * Updated `package.funding` to have link to our Open Collective. ## 4.14.6 * Fixed Yarn support in `--update-db` (by Ivan Storck). * Fixed npm 7 support in `--update-db`. ## 4.14.5 * Fixed `last 2 electron versions` query (by Sergey Melyukov). ## 4.14.4 * Fixed `Unknown version 59 of op_mob` error. ## 4.14.3 * Update Firefox ESR. ## 4.14.2 * Fixed `--update-db` on Windows (by James Ross). * Improved `--update-db` output. ## 4.14.1 * Added `--update-db` explanation (by Justin Zelinsky). ## 4.14 * Add `BROWSERSLIST_DANGEROUS_EXTEND` support (by Timo Mayer). ## 4.13 * Added `supports` query to select browsers (by Jesús Leganés-Combarro). ## 4.12.2 * Update Firefox ESR. ## 4.12.1 * Update `package.json` scanning tool for `--update-db` (by Luke Edwards). * Improve docs (by Mukundan Senthil). * Drop Node.js 13.0-13.6 support because of ES modules bug in that versions. ## 4.12 * Add environments to shared configs (by Yevgeny Petukhov). * Fix docs (by Dmitry Statsenko and Thomas Pozzo di Borgo). ## 4.11.1 * Fix Node.js 6 support. ## 4.11 * Add `npx browserslist --mobile-to-desktop` (by James Ross). ## 4.10 * Add `npx browserslist --update-db` (by Ivan Solovev). ## 4.9.1 * Normalize incorrect Can I Use regional data (by Huáng Jùnliàng). ## 4.9 * Add `node X-Y` query support (by Yuping Zuo). ## 4.8.7 * Fix `last N major versions` (by Valeriy Trubachev). ## 4.8.6 * Fix `Unknown version 10 of op_mob` error in `mobileToDesktop` option. ## 4.8.5 * Fix `last N browsers` again after new `caniuse-db` API changes. ## 4.8.4 * Fix released versions detection for queries like `last N browsers`. * Add IE 11 Mobile to `dead` browsers. ## 4.8.3 * Fix warning message (by Anton Ivanov). ## 4.8.2 * Fix `Cannot convert undefined or null to object` (by Antoine Clausse). * Fix `mobileToDesktop` in `defaults` (by Huáng Jùnliàng). ## 4.8.1 * Fix Chrome and `mobileToDesktop` (by Huáng Jùnliàng). ## 4.8 * Add `> 5% in browserslist-config-my stats` query (by Andrew Leedham). * Improve docs (by Danny van Kooten). ## 4.7.3 * Add funding link for `npm fund`. ## 4.7.2 * Add cache for query parsing. * Improve config caching (by Kārlis Gaņģis). * Update Firefox ESR. ## 4.7.1 * Improve caching. ## 4.7 * Add PhantomJS queries. * Improve docs (by Dorian Koehring). ## 4.6.6 * Remove Safari from `dead` query. ## 4.6.5 * Add Samsung 4 browser to `dead` query. * Remove dirty fix for `android all` error. ## 4.6.4 * Add Firefox 68 to `Firefox ESR` query. ## 4.6.3 * Dirty fix for `android all` error. ## 4.6.2 * Fix `last x version` and similar queries for Android (by Tony Ross). ## 4.6.1 * Fix patch version support for Electron (by Kilian Valkhof). ## 4.6 * Add `mobileToDesktop` option (by Nicolò Ribaudo). ## 4.5.6 * Make `Node > 5` and `node > 5` queries case insensitive. ## 4.5.5 * Fix CLI help (by Marcel Gerber). * Add KaiOS browser to docs. ## 4.5.4 * Update docs (by Andrew Leedham and Dan Onoshko). ## 4.5.3 * Fix splitting string to queries. ## 4.5.2 * Show default browsers in CLI on project without config. ## 4.5.1 * Improve text for the warning about outdated `caniuse-lite`. ## 4.5 * Add `>=`, `>`, and `<=` support for Node.js version (by Mathspy Terabithian). ## 4.4.2 * Allow to have string in `package.json` (by @dmarkhas). ## 4.4.1 * Allow to use `.` in scope name of shareable config (by Gustav Nikolaj). ## 4.4 * Added `and` and `or` keywords to combine queries (by Jon Ege Ronnenberg). ## 4.3.7 * Fix fraction years support in `last 1.5 years` (by Clément P). * Fix version-less browser support. ## 4.3.6 * Fix version-less browser support in custom statistics (by Alex Walter). ## 4.3.5 * Fix `not` query for wrong Can I Use data. ## 4.3.4 * Allow to update `node-releases` without new Browserslist releases. ## 4.3.3 * Fix Node.js 11 support. ## 4.3.2 * Fix `Unknown version 11 of Node.js` error (by Dan Onoshko). ## 4.3.1 * Fix conflict between `caniuse-lite` and custom browsers statistics. ## 4.3 * Allow to use `extends browserslist-config-a/file` (by @Schweinepriester). ## 4.2.1 * Use new `node-releases` support (by Sergey Rubanov). ## 4.2 * Add `--json` argument for CLI. * Allow to pass multiple areas in CLI by `--coverage=US,alt-AS,global`. ## 4.1.2 * Better `unknow query` error message. * Use latest `node-releases`. ## 4.1.1 * Update Firefox ESR versions. ## 4.1 * Add `current node` query. * Add contributors widget to docs (by Sergey Surkov). ## 4.0.2 * Fix new `node-releases` support (by Sergey Rubanov). * Fix error text (by Josh Smith). ## 4.0.1 * Reduce npm package size. * Fix docs. ## 4.0.0 “Erinaceus amurensis” * Add `node X` and `maintained node versions` queries (by Pavel Vostrikov). * Remove Node.js 4 support. * Show warning if `caniuse-lite` is old (by Anton Tuzhik). * Add comma support in config file. ## 3.2.8 * Add IE 9-5.5 to dead browsers. * Remove development configs from npm package. ## 3.2.7 * Add Firefox 60 as Firefox ESR. ## 3.2.6 * Add Opera Mini 12 to dead browsers. * Update docs (by Jamie Kyle). ## 3.2.5 * Fix excluding Opera Mini and other browsers with `all` version. ## 3.2.4 * Resolve shareable config from current working directory. ## 3.2.3 * Fix `package.json` config validation for single string case. * Fix CLI error reporting. ## 3.2.2 * Add `package.json` config validation. * Move project to `browserlist` GitHub organization. ## 3.2.1 * Fix error text (by Steve Schrab). ## 3.2 * Add `cover 99%` query (by Vasily Fedoseyev). * Add `cover 99% in US` query (by Vasily Fedoseyev). * Add `cover 99% in my stats` query (by Vasily Fedoseyev). * Add `"my stats"` support to `browserlist.coverage()` (by Vasily Fedoseyev). ## 3.1.2 * Add more clear error on missed browser version. ## 3.1.1 * Fix JSDoc (by Sylvain Pollet-Villard). ## 3.1 * Add `ignoreUnknownVersions` option. * Fix docs (by Pascal Duez). ## 3.0 “Atelerix sclateri” * Remove country statistics from client-side build of Browserslist. * Change `> 1%` to `> 0.5%` in default query. * Add `not dead` to default query. * Change default environment to `production` (by Marco Fugaro). * Add `dead` query support with IE 10 and BlackBerry browser. * Add multiple environments in one section support (by Evilebot Tnawi). * Add custom statistics support to `browserlist.coverage()`. * Fix `path` option check. ## 2.11.3 * Fix for `path: undefined` option. ## 2.11.2 * Remove Node.js specific code from webpack build. ## 2.11.1 * Fix using Browserslist in browser with `path` but without `fs`. ## 2.11 * Add `last 2 years` query support (by James Harris). ## 2.10.2 * Fix Browserify support. ## 2.10.1 * Fix using Browserslist without `process` (by Andrew Patton). ## 2.10 * Add `< 1%` and `<= 1%` queries support (by August Kaiser). ## 2.9.1 * Fix unknown query on trailing spaces in query. ## 2.9 * Add `last Electron versions` and `last Electron major versions` queries (by Louis Mouhat). ## 2.8 * Add `since 2016-03` and `since 2016-03-20` queries support (by Andrew Blick). ## 2.7 * Add `since 2016` queries support (by Igor Deryabin). ## 2.6.1 * Fix `Path must be a string` error. ## 2.6 * By default load config from current directory in CLI tool. ## 2.5.1 * Allow `@scope/browserlist-config` config name (by Jamie Connolly). ## 2.5 * Add `extends` query (by YellowKirby). ## 2.4.1 * Throw error if `package.json` contain `browserlist` instead of `browserslist`. ## 2.4 * Add `last n major versions` query (by John Sanders). ## 2.3.3 * Fix browsers support. ## 2.3.2 * Fix `> 0` query for browsers with one version (by Nikolay Solovyov). ## 2.3.1 * Reduce library size. ## 2.3 * Add `unreleased versions` and `unreleased Chrome versions` queries. ## 2.2.2 * Fix `Path must be a string` error (by Pieter Beulque). ## 2.2.1 * Fix security issue with regions dynamic `require`. ## 2.2 * Add region usage statistics support (by Clément P). ## 2.1.5 * Remove Firefox 45 from Firefox ESR. ## 2.1.4 * Use both ESR versions when they actual. ## 2.1.3 * Add warning on first exclude query. ## 2.1.2 * Fix non-Node.js environments support. ## 2.1.1 * Fix CLI arguments parsing. ## 2.1 * Add `>= 5%`, `>= 5% in US` and `>= 5% in my stats` queries. ## 2.0 “Atelerix frontalis” * `last n versions` returns versions for all browsers, not only main browsers. * Cache file system operations (by Aarni Koskela). * Use `caniuse-lite` 1 MB instead of `caniuse-db` 7 MB (by Ben Briggs). * Add `.browserslistrc` config support. * Add QQ Browser for Android support. * Add tests for CLI (by Zhulduz Zhankenova). ## 1.7.7 * Update Firefox ESR. ## 1.7.6 * Fix Android Chrome selection. ## 1.7.5 * Fix combining `not` query with country based statistics. * Fix `--env` argument in CLI (by Tuure Savuoja). ## 1.7.4 * Speed up browser sorting (by Aarni Koskela). ## 1.7.3 * Fix config finding when directory was passed to `path` (by Aarni Koskela). ## 1.7.2 * Fix config finding algorithm (by Aarni Koskela). ## 1.7.1 * Fix unreleased browsers version detection. ## 1.7 * Add `--config` and `--env` arguments to CLI (by Jarek Rencz). ## 1.6 * Convert Electron version to Chrome (by Kilian Valkhof). * Fix `0` version mistake in Can I Use data. ## 1.5.2 * Fix browser versions ordering (by Marco Massarotto). ## 1.5.1 * Fix error on `package.json` and `browserslist` in same directory. ## 1.5 * Add `package.json` support (by Stepan Kuzmin). * Add environments support (by Maksim Semenov and openlibser). * Add `browserslist-stats.json` file support (by Oleh Aloshkin). * Add `config` option to CLI (by Evilebot Tnawi). * Add JSDoc. * Fix tests on Windows (by Anna Stoliar). * Don’t set custom usage statistics globally. ## 1.4 * Add `defaults` keyword. ## 1.3.6 * Add `UCAndroid` alias to `and_uc` (by Evilebot Tnawi). ## 1.3.5 * Fix Opera Mini support. Use `op_mini all`. ## 1.3.4 * Add space-less `>1%` and `>.5%` syntax support (by Andreas Lind). ## 1.3.3 * Clean `0` versions in some country-based requests. ## 1.3.2 * Update Firefox ESR. ## 1.3.1 * Add Safari TP support. ## 1.3 * Add coverage for specific country (by Joshua Wise). ## 1.2 * Add `browserslist.coverage()` method. * Add `--coverage` and `-c` argument to CLI. * Add `-v` argument support to CLI. * Better error handling in CLI. ## 1.1.3 * Fix jspm support (by Sean Anderson). ## 1.1.2 * Fix jspm support (by Sean Anderson). ## 1.1.1 * Fix space-less `>10%` and `>10% in my stats` queries. * Normalize error messages. * Remove development files from npm package. ## 1.1 * Added query against custom browser usage data (by Daniel Rey). ## 1.0.1 * Update Firefox ESR (by Rouven Weßling). ## 1.0 “Atelerix algirus” * Remove Opera 12.1 from default query. * Add `not` keyword and exclude browsers by query. * Add Microsoft Edge support (by Andrey Polischuk). * Add CLI for debug and non-JS usage (by Luke Horvat). * Use own class in Browserslist errors. ## 0.5 * Add version ranges `IE 6-9` (by Ben Briggs). ## 0.4 * Add `config` option and `BROWSERSLIST_CONFIG` environment variable support. * Add symlink config support. ## 0.3.3 * Fix DynJS compatibility (by Nick Howes). ## 0.3.2 * Fix joined versions on versions query (by Vincent De Oliveira). ## 0.3.1 * Fix global variable leak (by Peter Müller). ## 0.3 * Takes queries from `BROWSERSLIST` environment variable. ## 0.2 * Return Can I Use joined versions as `ios_saf 7.0-7.1`. ## 0.1.3 * Better work with Can I Use joined versions like `ios_saf 7.0-7.1`. * Browserslist now understands `ios_saf 7.0` or `ios_saf 7`. ## 0.1.2 * Do not create global `browserslist` var (by Maxime Thirouin). ## 0.1.1 * Sort browsers by name and version. ## 0.1 “Atelerix albiventris” * Initial release. browserslist-4.24.4/LICENSE000066400000000000000000000021361473746235500153760ustar00rootroot00000000000000The MIT License (MIT) Copyright 2014 Andrey Sitnik and other contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. browserslist-4.24.4/README.md000066400000000000000000000645171473746235500156630ustar00rootroot00000000000000# Browserslist [![Cult Of Martians][cult-img]][cult] Browserslist logo by Anton Popov The config to share target browsers and Node.js versions between different front-end tools. It is used in: * [Autoprefixer] * [Babel] * [postcss-preset-env] * [eslint-plugin-compat] * [stylelint-no-unsupported-browser-features] * [postcss-normalize] * [obsolete-webpack-plugin] All tools will find target browsers automatically, when you add the following to `package.json`: ```json "browserslist": [ "defaults and fully supports es6-module", "maintained node versions" ] ``` Or in `.browserslistrc` config: ```yaml # Browsers that we support defaults and fully supports es6-module maintained node versions ``` Developers set their version lists using queries like `last 2 versions` to be free from updating versions manually. Browserslist will use [`caniuse-lite`] with [Can I Use] data for this queries. You can check how config works at our playground: [`browsersl.ist`](https://browsersl.ist/) browsersl.ist website

Sponsored by Evil Martians  Supported by Cube
[stylelint-no-unsupported-browser-features]: https://github.com/ismay/stylelint-no-unsupported-browser-features [obsolete-webpack-plugin]: https://github.com/ElemeFE/obsolete-webpack-plugin [eslint-plugin-compat]: https://github.com/amilajack/eslint-plugin-compat [Browserslist Example]: https://github.com/browserslist/browserslist-example [postcss-preset-env]: https://github.com/csstools/postcss-plugins/tree/main/plugin-packs/postcss-preset-env [postcss-normalize]: https://github.com/csstools/postcss-normalize [`browsersl.ist`]: https://browsersl.ist/ [`caniuse-lite`]: https://github.com/ben-eb/caniuse-lite [Autoprefixer]: https://github.com/postcss/autoprefixer [Can I Use]: https://caniuse.com/ [Babel]: https://github.com/babel/babel/tree/master/packages/babel-preset-env [cult-img]: https://cultofmartians.com/assets/badges/badge.svg [cult]: https://cultofmartians.com/done.html ## Table of Contents * [Tools](#tools) * [Best Practices](#best-practices) * [Queries](#queries) * [Config File](#config-file) * [Shareable Configs](#shareable-configs) * [Configuring for Different Environments](#configuring-for-different-environments) * [Custom Usage Data](#custom-usage-data) * [JS API](#js-api) * [Environment Variables](#environment-variables) * [Cache](#cache) * [Security Contact](#security-contact) * [For Enterprise](#for-enterprise) ## Sponsors Browserslist needs your support. We are accepting donations [at Open Collective](https://opencollective.com/browserslist). Sponsored by Springer Nature Technology      Sponsored by Workleap ## Tools ### Analyze your Browserslist Config * Run `npx browserslist` in your project directory to see project’s target browsers. This CLI tool is built-in and available in any project with Autoprefixer. * [`browserslist-lint`] checks your config for popular mistakes. ### Update `caniuse-lite` * [`update-browserslist-db`] is a CLI tool to update browsers DB for queries like `last 2 version` or `>1%`. * [`browserslist-update-action`] is a GitHub Action to automatically run `update-browserslist-db` and proposes a pull request to merge updates. ### Show “We do not support your browser” Banner * [`browserslist-useragent-regexp`] compiles Browserslist query to a RegExp to test browser useragent. * [`browserslist-useragent-ruby`] is a Ruby library to check browser by user agent string to match Browserslist. ### Get Statistics for `>5% in my stats`: * [`browserslist-ga`] and [`browserslist-ga-export`] download your website browsers statistics to use it in `> 0.5% in my stats` query. * [`browserslist-new-relic`] generates a custom usage data file for Browserslist * [`browserslist-adobe-analytics`] uses Adobe Analytics data to target browsers from your New Relic Browser data. ### Others * [`browserslist-rs`] is a Browserslist port to Rust. * [`browserslist-browserstack`] runs BrowserStack tests for all browsers in Browserslist config. [`browserslist-useragent-regexp`]: https://github.com/browserslist/browserslist-useragent-regexp [`browserslist-adobe-analytics`]: https://github.com/xeroxinteractive/browserslist-adobe-analytics [`browserslist-useragent-ruby`]: https://github.com/browserslist/browserslist-useragent-ruby [`browserslist-update-action`]: https://github.com/c2corg/browserslist-update-action [`browserslist-browserstack`]: https://github.com/xeroxinteractive/browserslist-browserstack [`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export [`browserslist-useragent`]: https://github.com/pastelsky/browserslist-useragent [`update-browserslist-db`]: https://github.com/browserslist/update-db [`browserslist-new-relic`]: https://github.com/syntactic-salt/browserslist-new-relic [`browserslist-lint`]: https://github.com/browserslist/lint/ [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga [`browserslist-rs`]: https://github.com/g-plane/browserslist-rs [`caniuse-api`]: https://github.com/Nyalab/caniuse-api ### Text Editors These extensions will add syntax highlighting for `.browserslistrc` files. * [VS Code](https://marketplace.visualstudio.com/items?itemName=webben.browserslist) * [Vim](https://github.com/browserslist/vim-browserslist) * [WebStorm](https://plugins.jetbrains.com/plugin/16139-browserslist) ## Best Practices * There is a `defaults` query, which gives a reasonable configuration for most users: ```json "browserslist": [ "defaults" ] ``` * If you want to change the default set of browsers, we recommend including `last 2 versions, not dead, > 0.2%`. This is because `last n versions` on its own does not add popular old versions, while only using a percentage of usage numbers above `0.2%` will in the long run make popular browsers even more popular. We might run into a monopoly and stagnation situation, as we had with Internet Explorer 6. Please use this setting with caution. * Select browsers directly (`last 2 Chrome versions`) only if you are making a web app for a kiosk with one browser. There are a lot of browsers on the market. If you are making general web app you should respect browsers diversity. * Don’t remove browsers just because you don’t know them. Opera Mini has 100 million users in Africa and it is more popular in the global market than Microsoft Edge. Chinese QQ Browsers has more market share than Firefox and desktop Safari combined. ## Queries Browserslist will use browsers and Node.js versions query from one of these sources: 1. `.browserslistrc` config file in current or parent directories. 2. `browserslist` key in `package.json` file in current or parent directories. 3. `browserslist` config file in current or parent directories. 4. `BROWSERSLIST` environment variable. 5. If the above methods did not produce a valid result Browserslist will use defaults: `> 0.5%, last 2 versions, Firefox ESR, not dead`. ### Query Composition An `or` combiner can use the keyword `or` as well as `,`. `last 1 version or > 1%` is equal to `last 1 version, > 1%`. `and` query combinations are also supported to perform an intersection of all the previous queries: `last 1 version or chrome > 75 and > 1%` will select (`browser last version` or `Chrome since 76`) and `more than 1% marketshare`. There are 3 different ways to combine queries as depicted below. First you start with a single query and then we combine the queries to get our final list. Obviously you can *not* start with a `not` combiner, since there is no left-hand side query to combine it with. The left-hand is always resolved as `and` combiner even if `or` is used (this is an API implementation specificity). | Query combiner type | Illustration | Example | | ------------------- | :----------: | ------- | |`or`/`,` combiner
(union) | ![Union of queries](img/union.svg) | `> .5% or last 2 versions`
`> .5%, last 2 versions` | | `and` combiner
(intersection) | ![intersection of queries](img/intersection.svg) | `> .5% and last 2 versions` | | `not` combiner
(relative complement) | ![Relative complement of queries](img/complement.svg) | These three are equivalent to one another:
`> .5% and not last 2 versions`
`> .5% or not last 2 versions`
`> .5%, not last 2 versions` | _A quick way to test your query is to do `npx browserslist '> 0.3%, not dead'` in your terminal._ ### Full List You can specify the browser and Node.js versions by queries (case insensitive): * `defaults`: Browserslist’s default browsers (`> 0.5%, last 2 versions, Firefox ESR, not dead`). * By usage statistics: * `> 5%`: browsers versions selected by global usage statistics. `>=`, `<` and `<=` work too. * `> 5% in US`: uses USA usage statistics. It accepts [two-letter country code]. * `> 5% in alt-AS`: uses Asia region usage statistics. List of all region codes can be found at [`caniuse-lite/data/regions`]. * `> 5% in my stats`: uses [custom usage data]. * `> 5% in browserslist-config-mycompany stats`: uses [custom usage data] from `browserslist-config-mycompany/browserslist-stats.json`. * `cover 99.5%`: most popular browsers that provide coverage. * `cover 99.5% in US`: same as above, with [two-letter country code]. * `cover 99.5% in my stats`: uses [custom usage data]. * Last versions: * `last 2 versions`: the last 2 versions for *each* browser. * `last 2 Chrome versions`: the last 2 versions of Chrome browser. * `last 2 major versions` or `last 2 iOS major versions`: all minor/patch releases of last 2 major versions. * `dead`: browsers without official support or updates for 24 months. Right now it is `IE 11`, `IE_Mob 11`, `BlackBerry 10`, `BlackBerry 7`, `Samsung 4`, `OperaMobile 12.1` and all versions of `Baidu`. * Node.js versions: * `node 10` and `node 10.4`: selects latest Node.js `10.x.x` or `10.4.x` release. * `last 2 node versions`: select 2 latest Node.js releases. * `last 2 node major versions`: select 2 latest major-version Node.js releases. * `current node`: Node.js version used by Browserslist right now. * `maintained node versions`: all Node.js versions, which are [still maintained] by Node.js Foundation. * Browsers versions: * `iOS 7`: the iOS browser version 7 directly. Note, that `op_mini` has special version `all`. * `Firefox > 20`: versions of Firefox newer than 20. `>=`, `<` and `<=` work too. It also works with Node.js. * `ie 6-8`: selects an inclusive range of versions. * `Firefox ESR`: the latest [Firefox Extended Support Release]. * `PhantomJS 2.1` and `PhantomJS 1.9`: selects Safari versions similar to PhantomJS runtime. * `extends browserslist-config-mycompany`: take queries from `browserslist-config-mycompany` npm package. * By browser support:
In these example queries `es6` and `es6-module` are the the `feat` parameter from the URL of the [Can I Use] page. A list of all available features can be found at [`caniuse-lite/data/features`]. * `fully supports es6`: browsers with full support for specific features. For example, `fully supports css-grid` will omit Edge 12-15, as those browser versions are marked as [having partial support]. * `partially supports es6-module` or `supports es6-module`: browsers with full or partial support for specific features. For example, `partially supports css-grid` will include Edge 12-15 support, as those browser versions are marked as [having partial support]. * `browserslist config`: the browsers defined in Browserslist config. Useful in Differential Serving to modify user’s config like `browserslist config and fully supports es6-module`. * `since 2015` or `last 2 years`: all versions released since year 2015 (also `since 2015-03` and `since 2015-03-10`). * `unreleased versions` or `unreleased Chrome versions`: alpha and beta versions. * `not ie <= 8`: exclude IE 8 and lower from previous queries. You can add `not ` to any query. [`caniuse-lite/data/regions`]: https://github.com/ben-eb/caniuse-lite/tree/main/data/regions [`caniuse-lite/data/features`]: https://github.com/ben-eb/caniuse-lite/tree/main/data/features [two-letter country code]: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements [custom usage data]: #custom-usage-data [still maintained]: https://github.com/nodejs/Release [Can I Use]: https://caniuse.com/ [Firefox Extended Support Release]: https://support.mozilla.org/en-US/kb/choosing-firefox-update-channel [having partial support]: https://caniuse.com/css-grid ### Grammar Definition There is a [grammar specification](./grammar.w3c-ebnf) about the query syntax, which may be helpful if you're implementing a parser or something else. ### Debug Run `npx browserslist` in a project directory to see which browsers were selected by your queries. ```sh $ npx browserslist and_chr 61 and_ff 56 and_qq 1.2 and_uc 11.4 android 56 baidu 7.12 bb 10 chrome 62 edge 16 firefox 56 ios_saf 11 opera 48 safari 11 samsung 5 ``` ### Browsers The following table maps browser names & their target devices into identifiers used by browserslist. | Browser Name | Desktop | Android | iOS | Other Mobile | | ------------------------ | --------------- | ------------------------- | ------------------------ | ----------------- | | Android (WebView) | | `Android` | | | | Baidu | `Baidu` | | | | | BlackBerry | | | | `BlackBerry` `bb` | | Chrome | `Chrome` | `ChromeAndroid` `and_chr` | ↪︎ `ios_saf`2 | | | Edge | `Edge` | ↪︎ `and_chr` | ↪︎ `ios_saf`2 | | | Electron | `Electron` | | | | | Firefox | `Firefox` `ff` | `FirefoxAndroid` `and_ff` | ↪︎ `ios_saf`2 | | | Internet Explorer | `Explorer` `ie` | | | `ie_mob` | | Node.js | `Node` | | | | | [KaiOS Browser] | | | | `kaios` | | Opera | `Opera` | `op_mob` 1 | ↪︎ `ios_saf`2 | | | [Opera Mini]3 | | `OperaMini` `op_mini` | | | | [QQ browser] | | `and_qq` | | | | Safari | `Safari` | | `iOS` `ios_saf` | | | Samsung Internet | | `Samsung` | | | | [UC Browser] | | `UCAndroid` `and_uc` | | | - `↪︎ name` implies that the browser uses the same engine captured by `name` - 1 [Opera Mobile ≈ Chrome Android](https://github.com/Fyrd/caniuse/issues/5602#issuecomment-792385127) - 2 [All iOS browsers use WebKit](https://en.wikipedia.org/wiki/WebKit) - 3 Opera Mini has 2 modes “Extreme” and “High” for data saving. `op_mini` targets at the “Extreme” one. “High” is compatible with the normal Opera Mobile. [KaiOS Browser]: https://medium.com/design-at-kai/what-you-didnt-know-about-kaios-browser-53937ea1636 [QQ browser]: https://en.wikipedia.org/wiki/QQ_browser [Opera Mini]: https://en.wikipedia.org/wiki/Opera_Mini [UC Browser]: https://en.wikipedia.org/wiki/UC_Browser ## Config File ### `package.json` If you want to reduce config files in project root, you can specify browsers in `package.json` with `browserslist` key: ```json { "private": true, "dependencies": { "autoprefixer": "^6.5.4" }, "browserslist": [ "last 1 version", "> 1%", "not dead" ] } ``` ### `.browserslistrc` Separated Browserslist config should be named `.browserslistrc` and have browsers queries split by a new line. Each line is combined with the `or` combiner. Comments starts with `#` symbol: ```yaml # Browsers that we support last 1 version > 1% not dead # no browsers without security updates ``` Browserslist will check config in every directory in `path`. So, if tool process `app/styles/main.css`, you can put config to root, `app/` or `app/styles`. You can specify direct path in `BROWSERSLIST_CONFIG` environment variables. ## Shareable Configs You can use the following query to reference an exported Browserslist config from another package: ```json "browserslist": [ "extends browserslist-config-mycompany" ] ``` For security reasons, external configuration only supports packages that have the `browserslist-config-` prefix. npm scoped packages are also supported, by naming or prefixing the module with `@scope/browserslist-config`, such as `@scope/browserslist-config` or `@scope/browserslist-config-mycompany`. If you don’t accept Browserslist queries from users, you can disable the validation by using the or `BROWSERSLIST_DANGEROUS_EXTEND` environment variable. ```sh BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack ``` Because this uses `npm`'s resolution, you can also reference specific files in a package: ```json "browserslist": [ "extends browserslist-config-mycompany/desktop", "extends browserslist-config-mycompany/mobile" ] ``` When writing a shared Browserslist package, just export an array. `browserslist-config-mycompany/index.js`: ```js module.exports = [ 'last 1 version', '> 1%', 'not dead' ] ``` You can also include a `browserslist-stats.json` file as part of your shareable config at the root and query it using `> 5% in browserslist-config-mycompany stats`. It uses the same format as `extends` and the `dangerousExtend` property as above. You can export configs for different environments and select environment by `BROWSERSLIST_ENV` or `env` option in your tool: ```js module.exports = { development: [ 'last 1 version' ], production: [ 'last 1 version', '> 1%', 'not dead' ] } ``` ## Configuring for Different Environments You can also specify different browser queries for various environments. Browserslist will choose query according to `BROWSERSLIST_ENV` or `NODE_ENV` variables. If none of them is declared, Browserslist will firstly look for `production` queries and then use defaults. In `package.json`: ```js "browserslist": { "production": [ "> 1%", "not dead" ], "modern": [ "last 1 chrome version", "last 1 firefox version" ], "ssr": [ "node 12" ] } ``` In `.browserslistrc` config: ```ini [production] > 1% not dead [modern] last 1 chrome version last 1 firefox version [ssr] node 12 ``` ## Custom Usage Data If you have a website, you can query against the usage statistics of your site. [`browserslist-ga`] will ask access to Google Analytics and then generate `browserslist-stats.json`: ``` npx browserslist-ga ``` Or you can use [`browserslist-ga-export`] to convert Google Analytics data without giving a password for Google account. You can generate usage statistics file by any other method. File format should be like: ```js { "ie": { "6": 0.01, "7": 0.4, "8": 1.5 }, "chrome": { … }, … } ``` Note that you can query against your custom usage data while also querying against global or regional data. For example, the query `> 1% in my stats, > 5% in US, 10%` is permitted. [`browserslist-ga-export`]: https://github.com/browserslist/browserslist-ga-export [`browserslist-ga`]: https://github.com/browserslist/browserslist-ga [Can I Use]: https://caniuse.com/ ## JS API ```js const browserslist = require('browserslist') // Your CSS/JS build tool code function process (source, opts) { const browsers = browserslist(opts.overrideBrowserslist, { stats: opts.stats, path: opts.file, env: opts.env }) // Your code to add features for selected browsers } ``` Queries can be a string `"> 1%, not dead"` or an array `['> 1%', 'not dead']`. If a query is missing, Browserslist will look for a config file. You can provide a `path` option (that can be a file) to find the config file relatively to it. Options: * `path`: file or a directory path to look for config file. Default is `.`. * `env`: what environment section use from config. Default is `production`. * `stats`: custom usage statistics data. * `config`: path to config if you want to set it manually. * `ignoreUnknownVersions`: do not throw on direct query (like `ie 12`). Default is `false`. * `dangerousExtend`: Disable security checks for `extend` query. Default is `false`. * `throwOnMissing`: throw an error if env is not found. Default is `false`. * `mobileToDesktop`: Use desktop browsers if Can I Use doesn’t have data about this mobile version. Can I Use has only data about latest versions of mobile browsers. By default, `last 2 and_ff versions` returns `and_ff 90` and with this option it returns `and_ff 91, and_ff 90`. This option may lead to unknown browser version error (in example Can I Use doesn’t have data for `and_ff 91` yet). Default is `false`. For non-JS environment and debug purpose you can use CLI tool: ```sh browserslist "> 1%, not dead" ``` You can get total users coverage for selected browsers by JS API: ```js browserslist.coverage(browserslist('> 1%')) //=> 81.4 ``` ```js browserslist.coverage(browserslist('> 1% in US'), 'US') //=> 83.1 ``` ```js browserslist.coverage(browserslist('> 1% in my stats'), 'my stats') //=> 83.1 ``` ```js browserslist.coverage(browserslist('> 1% in my stats', { stats }), stats) //=> 82.2 ``` Or by CLI: ```sh $ browserslist --coverage "> 1%" These browsers account for 81.4% of all users globally ``` ```sh $ browserslist --coverage=US "> 1% in US" These browsers account for 83.1% of all users in the US ``` ```sh $ browserslist --coverage "> 1% in my stats" These browsers account for 83.1% of all users in custom statistics ``` ```sh $ browserslist --coverage "> 1% in my stats" --stats=./stats.json These browsers account for 83.1% of all users in custom statistics ``` ## Environment Variables If a tool uses Browserslist inside, you can change the Browserslist settings with [environment variables]: * `BROWSERSLIST` with browsers queries. ```sh BROWSERSLIST="> 5%" npx webpack ``` * `BROWSERSLIST_CONFIG` with path to config file. ```sh BROWSERSLIST_CONFIG=./config/browserslist npx webpack ``` * `BROWSERSLIST_ENV` with environments string. ```sh BROWSERSLIST_ENV="development" npx webpack ``` * `BROWSERSLIST_STATS` with path to the custom usage data for `> 1% in my stats` query. ```sh BROWSERSLIST_STATS=./config/usage_data.json npx webpack ``` * `BROWSERSLIST_DISABLE_CACHE` if you want to disable config reading cache. ```sh BROWSERSLIST_DISABLE_CACHE=1 npx webpack ``` * `BROWSERSLIST_DANGEROUS_EXTEND` to disable security shareable config name check. ```sh BROWSERSLIST_DANGEROUS_EXTEND=1 npx webpack ``` * `BROWSERSLIST_ROOT_PATH` to prevent reading files above this path. ```sh BROWSERSLIST_ROOT_PATH=. npx webpack ``` [environment variables]: https://en.wikipedia.org/wiki/Environment_variable ### `browserslist.coverage()` Return browsers market coverage. ```js const browsers = browserslist('> 1% in US') browserslist.coverage(browsers, 'US') //=> 83.1 ``` ### `browserslist.loadConfig()` It is like calling `browserslist()`, but it returns config’s queries, not browsers. ```js browserslist.loadConfig({ path: process.cwd() }) ?? browserslist.defaults ``` ### `browserslist.defaults` An array with default queries. ## Cache Browserslist caches the configuration it reads from `package.json` and `browserslist` files, as well as knowledge about the existence of files, for the duration of the hosting process. To clear these caches, use: ```js browserslist.clearCaches() ``` To disable the caching altogether, set the `BROWSERSLIST_DISABLE_CACHE` environment variable. ## Security Contact To report a security vulnerability, please use the [Tidelift security contact]. Tidelift will coordinate the fix and disclosure. [Tidelift security contact]: https://tidelift.com/security ## For Enterprise Available as part of the Tidelift Subscription. The maintainers of `browserslist` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-browserslist?utm_source=npm-browserslist&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) ## Browsers Data Updating See [`update-browserslist-db` docs](https://github.com/browserslist/update-db#readme) browserslist-4.24.4/browser.js000066400000000000000000000021351473746235500164110ustar00rootroot00000000000000var BrowserslistError = require('./error') function noop() {} module.exports = { loadQueries: function loadQueries() { throw new BrowserslistError( 'Sharable configs are not supported in client-side build of Browserslist' ) }, getStat: function getStat(opts) { return opts.stats }, loadConfig: function loadConfig(opts) { if (opts.config) { throw new BrowserslistError( 'Browserslist config are not supported in client-side build' ) } }, loadCountry: function loadCountry() { throw new BrowserslistError( 'Country statistics are not supported ' + 'in client-side build of Browserslist' ) }, loadFeature: function loadFeature() { throw new BrowserslistError( 'Supports queries are not available in client-side build of Browserslist' ) }, currentNode: function currentNode(resolve, context) { return resolve(['maintained node versions'], context)[0] }, parseConfig: noop, readConfig: noop, findConfig: noop, findConfigFile: noop, clearCaches: noop, oldDataWarning: noop, env: {} } browserslist-4.24.4/cli.js000077500000000000000000000103731473746235500155030ustar00rootroot00000000000000#!/usr/bin/env node var fs = require('fs') var updateDb = require('update-browserslist-db') var browserslist = require('./') var pkg = require('./package.json') var args = process.argv.slice(2) var USAGE = 'Usage:\n' + ' npx browserslist\n' + ' npx browserslist "QUERIES"\n' + ' npx browserslist --json "QUERIES"\n' + ' npx browserslist --config="path/to/browserlist/file"\n' + ' npx browserslist --coverage "QUERIES"\n' + ' npx browserslist --coverage=US "QUERIES"\n' + ' npx browserslist --coverage=US,RU,global "QUERIES"\n' + ' npx browserslist --env="environment name defined in config"\n' + ' npx browserslist --stats="path/to/browserlist/stats/file"\n' + ' npx browserslist --mobile-to-desktop\n' + ' npx browserslist --ignore-unknown-versions\n' function isArg(arg) { return args.some(function (str) { return str === arg || str.indexOf(arg + '=') === 0 }) } function error(msg) { process.stderr.write('browserslist: ' + msg + '\n') process.exit(1) } if (isArg('--help') || isArg('-h')) { process.stdout.write(pkg.description + '.\n\n' + USAGE + '\n') } else if (isArg('--version') || isArg('-v')) { process.stdout.write('browserslist ' + pkg.version + '\n') } else if (isArg('--update-db')) { /* c8 ignore next 8 */ process.stdout.write( 'The --update-db command is deprecated.\n' + 'Please use npx update-browserslist-db@latest instead.\n' ) process.stdout.write('Browserslist DB update will still be made.\n') updateDb(function (str) { process.stdout.write(str) }) } else { var mode = 'browsers' var opts = {} var queries var areas for (var i = 0; i < args.length; i++) { if (args[i][0] !== '-') { queries = args[i].replace(/^["']|["']$/g, '') continue } var arg = args[i].split('=') var name = arg[0] var value = arg[1] if (value) value = value.replace(/^["']|["']$/g, '') if (name === '--config' || name === '-b') { opts.config = value } else if (name === '--env' || name === '-e') { opts.env = value } else if (name === '--stats' || name === '-s') { opts.stats = value } else if (name === '--coverage' || name === '-c') { if (mode !== 'json') mode = 'coverage' if (value) { areas = value.split(',') } else { areas = ['global'] } } else if (name === '--json') { mode = 'json' } else if (name === '--mobile-to-desktop') { /* c8 ignore next */ opts.mobileToDesktop = true } else if (name === '--ignore-unknown-versions') { /* c8 ignore next */ opts.ignoreUnknownVersions = true } else { error('Unknown arguments ' + args[i] + '.\n\n' + USAGE) } } var browsers try { browsers = browserslist(queries, opts) } catch (e) { if (e.name === 'BrowserslistError') { error(e.message) } /* c8 ignore start */ else { throw e } /* c8 ignore end */ } var coverage if (mode === 'browsers') { browsers.forEach(function (browser) { process.stdout.write(browser + '\n') }) } else if (areas) { coverage = areas.map(function (area) { var stats if (area !== 'global') { stats = area } else if (opts.stats) { stats = JSON.parse(fs.readFileSync(opts.stats)) } var result = browserslist.coverage(browsers, stats) var round = Math.round(result * 100) / 100.0 return [area, round] }) if (mode === 'coverage') { var prefix = 'These browsers account for ' process.stdout.write(prefix) coverage.forEach(function (data, index) { var area = data[0] var round = data[1] var end = 'globally' if (area && area !== 'global') { end = 'in the ' + area.toUpperCase() } else if (opts.stats) { end = 'in custom statistics' } if (index !== 0) { process.stdout.write(prefix.replace(/./g, ' ')) } process.stdout.write(round + '% of all users ' + end + '\n') }) } } if (mode === 'json') { var data = { browsers: browsers } if (coverage) { data.coverage = coverage.reduce(function (object, j) { object[j[0]] = j[1] return object }, {}) } process.stdout.write(JSON.stringify(data, null, ' ') + '\n') } } browserslist-4.24.4/error.d.ts000066400000000000000000000002331473746235500163100ustar00rootroot00000000000000declare class BrowserslistError extends Error { constructor(message: any) name: 'BrowserslistError' browserslist: true } export = BrowserslistError browserslist-4.24.4/error.js000066400000000000000000000004531473746235500160600ustar00rootroot00000000000000function BrowserslistError(message) { this.name = 'BrowserslistError' this.message = message this.browserslist = true if (Error.captureStackTrace) { Error.captureStackTrace(this, BrowserslistError) } } BrowserslistError.prototype = Error.prototype module.exports = BrowserslistError browserslist-4.24.4/eslint.config.mjs000066400000000000000000000031071473746235500176450ustar00rootroot00000000000000import { FlatCompat } from '@eslint/eslintrc' import loguxConfig from '@logux/eslint-config' import es5Plugin from 'eslint-plugin-es5' let compat = new FlatCompat({ baseDirectory: import.meta.dirname }) let es5 = compat.extends('plugin:es5/no-es2015') /** @type {import('eslint').Linter.Config[]} */ export default [ { ignores: ['coverage'] }, ...loguxConfig, ...es5, { plugins: { es5: es5Plugin }, rules: { 'node-import/prefer-node-protocol': 'off', 'perfectionist/sort-objects': 'off', 'n/prefer-node-protocol': 'off', 'prefer-let/prefer-let': 'off', 'prefer-arrow-callback': 'off', 'no-unused-vars': ['error', { caughtErrors: 'none' }], 'n/global-require': 'off', 'object-shorthand': 'off', 'no-console': 'off', 'no-var': 'off' } }, { files: ['cli.js'], rules: { 'n/no-unsupported-features/es-syntax': [ 'error', { version: '>=12.5.0', ignores: [] } ] } }, { files: ['test/**/*', 'eslint.config.mjs'], rules: { 'n/no-unsupported-features/es-syntax': 'off', 'es5/no-shorthand-properties': 'off', 'es5/no-template-literals': 'off', 'es5/no-rest-parameters': 'off', 'es5/no-arrow-functions': 'off', 'es5/no-destructuring': 'off', 'es5/no-block-scoping': 'off', 'es5/no-es6-methods': 'off', 'es5/no-spread': 'off', 'es5/no-for-of': 'off', 'no-console': 'off' } }, { files: ['eslint.config.mjs'], rules: { 'es5/no-modules': 'off' } } ] browserslist-4.24.4/grammar.w3c-ebnf000066400000000000000000000053751473746235500173550ustar00rootroot00000000000000NonSpaceChar ::= [#x21-#xD7FF] | [#xE000-#xFFFD] Digit ::= [0-9] Space ::= ' ' | '\t' Numeric ::= (Digit* '.')? Digit+ BrowserName ::= 'ie' | 'edge' | 'firefox' | 'chrome' | 'safari' | 'opera' | 'ios_saf' | 'op_mini' | 'android' | 'bb' | 'op_mob' | 'and_chr' | 'and_ff' | 'ie_mob' | 'and_uc' | 'samsung' | 'and_qq' | 'baidu' | 'kaios' | 'fx' | 'ff' | 'ios' | 'explorer' | 'blackberry' | 'explorermobile' | 'operamini' | 'operamobile' | 'chromeandroid' | 'firefoxandroid' | 'ucandroid' | 'qqandroid' CompareOperator ::= ('>' | '<') '='? VersionKeyword ::= 'version' 's'? LastBrowsers ::= 'last' Space+ Digit+ Space+ (BrowserName Space+)? ('major' Space+)? VersionKeyword LastElectron ::= 'last' Space+ Digit+ Space+ 'electron' Space+ ('major' Space+)? VersionKeyword LastNode ::= 'last' Space+ Digit+ Space+ 'node' Space+ ('major' Space+)? VersionKeyword Unreleased ::= 'unreleased' Space+ ((BrowserName | 'electron') Space+)? VersionKeyword Years ::= 'last' Space+ Numeric Space+ 'year' 's'? Since ::= 'since' Space Digit+ ('-' Digit+ ('-' Digit+)?)? Region ::= ('alt-' [a-z][a-z] | [A-Z][A-Z]) MyStats ::= 'my' Space+ 'stats' CustomStats ::= NonSpaceChar+ Space+ 'stats' Percentage ::= CompareOperator Space* Numeric '%' (Space+ 'in' Space+ (MyStats | CustomStats | Region))? Cover ::= 'cover' Space+ Numeric '%' (Space+ 'in' Space+ (MyStats | Region))? FeatureSupport ::= (('fully' | 'partially') Space+)? 'supports' Space+ ([a-z0-9] | '-')+ Version ::= (Digit | '.')+ BoundedRange ::= Version Space* '-' Space* Version UnboundedRange ::= CompareOperator Space* Version Electron ::= 'electron' Space+ (BoundedRange | UnboundedRange | Version) Node ::= 'node' Space+ (BoundedRange | UnboundedRange | Version) Browser ::= BrowserName Space+ (BoundedRange | UnboundedRange | Version | 'tp') FirefoxESR ::= ('firefox' | 'fx' | 'ff') Space+ 'esr' OperaMini ::= ('operamini' | 'op_mini') Space+ 'all' CurrentNode ::= 'current' Space+ 'node' MaintainedNode ::= 'maintained' Space+ 'node' Space+ 'versions' Phantom ::= 'phantomjs' Space+ ('1.9' | '2.1') BrowserslistConfig ::= 'browserslist config' Extending ::= 'extends' Space NonSpaceChar+ Defaults ::= 'defaults' Dead ::= 'dead' QueryAtom ::= LastBrowsers | LastElectron | LastNode | Unreleased | Years | Since | Percentage | Cover | FeatureSupport | Electron | Node | Browser | FirefoxESR | OperaMini | CurrentNode | MaintainedNode | Phantom | BrowserslistConfig | Extending | Defaults | Dead SingleQuery ::= ('not' Space)? QueryAtom OrOperator ::= Space+ 'or' Space+ | Space* ',' Space* AndOperator ::= Space+ 'and' Space+ BrowserslistQuery ::= QueryAtom ((OrOperator | AndOperator) SingleQuery)* Root ::= BrowserslistQuery browserslist-4.24.4/img/000077500000000000000000000000001473746235500151435ustar00rootroot00000000000000browserslist-4.24.4/img/complement.svg000066400000000000000000000011421473746235500200250ustar00rootroot00000000000000browserslist-4.24.4/img/icon.svg000066400000000000000000000021471473746235500166200ustar00rootroot00000000000000Browserslist iconbrowserslist-4.24.4/img/intersection.svg000066400000000000000000000011421473746235500203700ustar00rootroot00000000000000browserslist-4.24.4/img/logo.svg000066400000000000000000000037741473746235500166370ustar00rootroot00000000000000browserslist-4.24.4/img/screenshot.webp000066400000000000000000001654101473746235500202060ustar00rootroot00000000000000RIFFWEBPVP8L/{F@lH^pϷ3@D''Lꕂfޡјgq4n@@Q_\-tktN4MunE5)h:A\PSSV41r{9c-?F51'c_{rW(5n(?WjGsVfN/* hqь&j\Yb!۩ӣ N;{qg}{vRrM55/(NkgDfDƍRfRVnŅi1wU3jKY}yeϏaǔv6$xAŅPfy9m(&Y^\9nI<#ԁzDH4`/%ŴkДˆ#k!5{TsPv"T{|~8_c|k*y]Ŭ EkT8N*jiB~(E\J 4s3 `gc(븮jRRLM-MÝK*mν~[3+Gs\Tyo_cuyM`o#Ke?UTĻ=7?_:vKD T@@4B\.7}?MM2,2n@-@\8qH)M9Fl#ޟ HE8#Feƃ/fGSr7?IwXD[/(̗p-O^7R񴉖m䝜(%*GF" @@[shRh(h1mo!243\$.R);Pöm$)sOv* cW3TqyU̓דƧ< (ϾBP^ЫVnwTq^r\U_l*7TOS]ȹ!j [>ʯ{|Y ߸B7Gh{SLg vq1IRѮ;>yxrAA@#אijy@$, ڔy.%/...%/A/Sf3kv6b_A{cXS,= d -y舙 1 +XXFK,9:rĸZ(A,u' n1%)Snoj2Y(13/Xk +Ӭ%X6d)LEhܿ-ld3 &Bcw-2Č![^Yjq{ed^ƊYkPκdǶH]T#,ϔ4%MISҔ4dնZ&g(PPRJJI@BI7we+Z7 Pv0! ~V?Z{k-{>V`ooDE'c}2&\Ġi$Au8֠6-I2@L>/ۧf.\:pǝ <-H@zAqqIR۶DJy#dRHm69ÕpAƗ$ I{: m۵I$kb Lʀ S BC?"b/ `2 dnTwwGģDD$ /<&D8d3(_T xC`vO{~$ R B#?b!,GLIr ;iNuwMM7ae$+^cfN4L$d̤pGcsQЁ6?_$[r*G|P$bا Y?,rkBᰕɧ*>ArXuye$)nX6,a{!&@$INL]>BaG#Q(uRGYkʪ|(b=jX@[kš5P6ʧ*`O@9M"S xW%ZH /5Xi[~Q (r@Ex 4V]*+rEFFłXȢIsBQ( CP. I}qgW9 B B B!! C:Qwֶmoms\y2G#UO`R7s Z<1(\C\VqvҶ<|h۶cNI=cT_#;*2DS)m3LHD۽y妥tԎ+e2GP\+P\҇-Rʤ@^-٤2*$Hm@Φ=m@PmO<&h©2!YNpӎ"zԫd˙V<ٗ#2"qcS p NcvEF~<)W"nbvM))'iHypKC #`ݝkC@ (7ts6 tnй :vbkघ*LG!y0j+ʶ$L]4MTnz~2{=/L$|Lcg\tH!R;ٮ$l ~n%/43]5V9' #&Uܤ@mTI7{S|Z#o񿡮=~<-CqGN zl[ νX[RMFR##aB3lVS`Eѷ=u&oKk>NMv0N}<wPx\½a<πP%9|͇~ӎjHS)2E{/p) 6oOѩ fΣ|#.hVǯ% 0慥Nv0I5< Us˰PRlaB'3]xhzj;=5Vayn?4vb8u#^>i8WnĚsx-Tuʟ?olbyh_5F=1[ZηN9(cNr|`C+b%9+q7P#Ovyɧ&yMA7݋V45eE 9YI4 X fFb`0Ѯ:`<59,{Էİ*2r\I#D8~b{ʌ 6 *Pvr0SWOK K ZOGJ OOLWY4i1~Ȝ bp_~`Ӟ 63EB5P(E1?ni@}_Ioڷ?OkOͅM{ƙqtjĎ''3[ B7 -ߧPJby ,h,3@FU8HT-Si|bg` Ծm~̦Uhtr֎Jeɯ10W3ϪI Sdc\. ye"}-f 3i*).zN/ĔoxaɌ ju Vc}S-ߧϳjRS[4uO!XS61՘hJUs 2תT64+jœȚdBHRW3ə lhoT(bGSơ)RPaѿHH!C~Rm(BF-.*'vňdo\$`?ծI ;R@_ Nj%Ct rwk܆?4Qxl"N2K`` VCE63<oIDKL9/%9nM%W1-%bǑС*\pZ=%(|MEkjz 58$[ 3%)j>6 :?ϧ;! A4_@IBQdvqNENp>ֵ6WQ!]$k]3s‘x;;zz̭Hx2 AQ"CX !g4y,p ;[J FQ+yB A=dqS0hW4&vHטw(Aǥ|qjt&y~C2`u"[JP@"V24)JH[xDdK%dP Y8}dŴAk2a-I?SɾJ"yOÚ #A`W  唽P@8`V s{ #v v(Ev؛uEY@@E(Y7شr^ y>-|ı+/~_gzQ/Lށr{|xh!9V(ꏢxQ7#{V.}???Vҥy~}y="_x( 0[DVp0'ɩT[+kN{|M*RwWsyʱaZܣ+:Qv [\ /ȸ; I.qXqfsNѕɆ.Qs1|ovla=#FU50}|.-) l #[@wkf- C5౻A1wq;u Z*|akSimxNA\qMZJ &#<ASpZ ܣE)P=^ܝ 9K@f,܌艸N0#hҖxz ق^Xd I8/D74%>0%"I *gĎsխ}-Rolsj~N%;BVlG*$+j?YSྗ\^Ɉb1dʩ^(^Cu9oElz<oڵo5ZB;D KrWR5-I5@œd?*^%K!LvC8'NqeTP"#CT8,SNj6K b l@ u@H@5ˀPc@b5[$@{[Ah+֢l@Z@wzQ qAe9$$@B6DnK,m@ֶA}V@P2 <EZQ4HjRbbAbiĺ Ū H,P@?}/j_Uwk]sjvXUqZ_ܱP|aUµo;jvŁ]NbT`;(68,6ž@'.kM_xU wޟ;ϝ,wV+߁b;:,wNݕ;pg켓;;}q ܦڂ1Fnߘ|w ~"w=uw]ΩfΟޝ; /2'i"TI5r_/gް@7WpOv+>[*sr@ @(TdJ}xՅǙ~'VyRiby y"Trj 5fgocNgET.@(m*@^\%UGy*V;!qv։lj8|;Ϝ\zy[83l`ɩj`=>͕;A,b)@|1Ω3ccEq]J;nYz%<Ң%b\Ԙ]_&A/ x)'̙v  ` 8 Tde]N]yfUpl)yno| ]T&[" x zQy ]bl괳W*ʹrmGy4PQpN>ld9L.P"_SkphH yEvt =qM*pgA=ߑ!׶st/,+1m;2iwG-D Pi;WPt $x@kFU^K4ᕙ -Ts{5@ITTUFn1s{Z)^oo=b_ rWVQ],_oVrj27.׹Qp1۲ꏼ_N:U̙XyeXbU1y,Cq{p{^o9x0`7d`a֌` ȈArHl+`f`ఆuj@F`Vź`9,,` g bijf)K+:dF dtV0G@IJ`foxOi :p{Rqwrw=l=.WK}^0^qw şcwn6~~b}yp#{|y8[{L(#>~#;|P o\iv\O;"=diڏ<.r#y2  TsFtf>{Fqb[VͨY2_G.~+DPuH9g׊f< dzNz%J-ۓaC{=ym;^16`/l 3%Sh !ڀY[ iҙiۆw= VKL˖%E;ɒ4D);ӋL>̩Ґi!4Nq ke堔 [ RKD,=45"!U =m@8q7n ^Ӑk8E,"$R^ ׆͕*JlUASeUBUDI%Bt7,mF')߲9g[$ԸE %I*B&JZ%Tժ1;kh0)PJR WVـj+HPp)N货M%49g2|;'pg; g24 ]wH`zIO*~|bn`f#HrH^gfNň#ˉ6]UdWkFUbM-JsYl$9UE6,}2S\I[8)FsE:d_A;aNiAF@wH}bh\!{k5W^CJXOq*x,eeEy زdSH`s&d~2Hn;;X9blZ'bIW%%MRR8}FiT6Oۅ%r>T4[YQQBJp O^]`-)Ss\x)"ز12Άgg[_o}o}o}e|+K>7WV|+|+|+|++o>^ ʋ1`ȉ1/vlh#y$o}[_W>)o}k޽❵߮IM/)B㑗iL0-bVo}Z]>?+%%w?;j[;l'XaBCYtPкLϖ^?g{Zu ֨^ VlDېE?zb}+uHkc#gK''ث=ZwsɩuF59-~^?h 8saL/``ۙ^3)$|79k%j,x=yzmp߾FpCv=܎5WI_B μS9Cv眹 ߽Њs$Ɔ ꬗Zk4 5[VuJ?E“pk":S 9=xw9w1q^IZ $(^rŭ3 nFDHZYxR`" 0aDUZy oX)jaƊz3ov[^CK_Hhl8Wv6fU+ -0v\^ZYH@ᴪ m,8Bmd:5bzGuIqx!cKH.J/8~bk'r7'bi7ml v޺8(E9NiEL# -EO ѹM5Q`zҮ2ZTPDYX-2PEU8*"G*G w־hb5S@|a}WO j&*XNP="J+iU@& RU+ Ib$uv="`W5ۈb&j?@ vDGD``}/ `nY;þslAv؁}g;x_ o{= PU?ށK7YoK\oP;w;֛SC! E:TkC;833ۜCLl6osEk9Pk$1hr^E軂祳u@簟"% y}n?D{jκ:$+~;w4''7$ [ Iv8Wj!1axΒzz39m=iL8g&L{74LI$U )M.r x> '}K/6 C(bCmocj^uA' i[=}1pt 0yj~~?{ExY-* !gZ~:rlH l>:Uv@zy@`AԱI LߓOZY:ԝdL理~|3fB<>S!Is6o4%:*O <%@:,R:c;کMgm@ȬAq;U*^*9D7hMrXe:¾~}&xݜ֖2 "2(zȬhDFONxr S.%HiA Puo܌RUެHR#Tq S)ܡ9 "MRb!Af@Z$GwzS( ޓ6`̶xI|tȌ̺%QLYs 0LA*qU?>WA]n,aXdJJE~4%}y%=5o- 'ks Z Luh2 lYzy = ׬SAB Ծ-gŷ󖎮ň)Kb o>ٲ&\]+T盨V0`JܔAJJCz4׮ߩI CG [;bՓ ON@?Ӥ[HGW|_P,V:c%I|;AKuY\J>YJ%$ R1 OESynL馗 E'г-#Rr|נ Y &Rҋ8Z!W] ql6qr^+ "hS%L S: %,*4LPi2 D%Xf IS5 5 hTkJ;TOhK B ̪TbpWǺqH~6e---7A^ Oꆭp Fz>b; ؀{l.ilK`Xk43큝 638i8ۙLl$l$l g;+LN8 80F6B# - #𾃍 `#q6>hROtU ʻ9+Fzb]5lo8v3>P8<:pJQ` z ƻW!X*f򼵂r7fLGB zڐZdwj3Ipt  c tzr- vq4]&nô^lgO{0dU[(dHhcBOwdA[N`Fn!O]=;ME>`;k1*~g+æ N"8Ir&@I%`I=\*B7xF(FDCVDiP\l<̈!"$J F;\QZ4YE6î"{ <;<ց&K;]Eg|wƜ8?[t~;ԩ *Ć4r MDix6DqB??Q%$ m .SB: bl9-0N`ZpA΀9lBklSxN3 )!eH2T<5 szQ_`ňQo@@N5X<]Rx纂J?TH5v~O YŃ pd bq*"ĥK=pb n N̦9QRqo@>Ail,^3<3] uEh2S RE[*B~CR`o 0d,UW,`l-U aaPZxERY-XZ_A{%~ ܡ^# mv># SJ!0I˱qWxV'Z8PڠX%"d]Y_/@F|^5 tw=9xPWݹR:jzI³H@O\l2dFN ;ua!Pjyai(m`*PrG8 W)VX_mvbxQۛcH棣/A퍃h߹BQU+a@ohj@4DFh4qќPu=Gx.s B0;_ ̳ VB@s@< (voN@ N 0 0v:B(bgw4;ԼNU B|,@:.-{YJ Yp@Z &A*@"]; @5@ߔ4@$}"E$ˎ!"- vqP_ha  b] @+u]Xa>a(z÷Ha1 _YѡC Cܔ;{l;y;KlM[-3^(TPZFnG?_!/WtB> : HR!R!R!Rvn5tt k~(띧nܐ[/Pg>W'U2 e(C7f<{ymm5=_eA ޿a+ {|WmʚdM&YI$k5ɚdMϹ>sϹ>sϹ>I$k5ɚdM&YI$;sϹ>sϹ>sp 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p 7p nOPb"`']cYeCYM!:vqa8,aVDkŲuVUo[VUo[VUo[VUo[VUo[VUo[f.1;R|eg 0vszkws Ɵ$rZ4DDZ/T]_\|XibmX[-kbmX[-kbmX[-kbq:.h#7Yo$ttHp+Q [fkmm hy \^)qh{t^QF5jԨQF5jԨQF5jԨQFZOTٕ7*mJ}Q;ȣ2s-9Ǚs;8<웼yHJ fRr'YfEDZutA)3i1;G;~~Bgy~R +FWn@^nmUж!ٛlr~sn?ѷ__ 'W}N񜝨;zN.^`pMRCh_ws\.LlFa.}^`EhE#Еٚ3L=p{+It&GU!+MQ,*{RW!t|ݪڧAy!<*C$YXs~KT2VUa`$0&t33nItF&Ȳșe*t.bw؁y W3ȴ@t]$U!n٣uӅ>'QZiip0ʋZ9ԪH=r{Q*@;v)F]Rv"v/zy@'mh:{{g7t ni9 < 3 / *+:=c<39@fOoișm3=cɅ{==@6LW4n E&U w g 14V@ОEOg~Q zGr"-wiO߃ӣhzGѿ֫Ta '~#O.cf=2eKp}󔞹#f.$tԛA+AZDdFbTSQe_yG)6mUi3(RtƐ^狇rsY7U7E6ܐ] \&Qy G[QM2蹢YV7JwU綨y()nMyC )22aj& lȮ QpdWMt)[*gȡ.:]jY/T_czw]Nt~|G2ރ%t >:,C*=]VL\3Z__Z@AIkO*4/ViGw١]=-(:瑅,ZGz̊8FZq{t.U4)RIr SaTl vD¤*~ˊJV^j"X*lzƬINQQઊK Ԃ`JD2wQM*|Ȏ TIYQ#&T—PQĔ J,sVԵ J *X`Ƣ4U8*;i;UI}}1cEPEz Z6\e^o"4 6"# s@ltq BYg_+׍\Zf'TCUc.U iZ:"ÅNDPEzhH)aW{@(Gp"d/ްљl3'G ؘ`s ,Ng&>N/H@b+kX:3V㝙fii`Ut2ۀ ʹAWˆa3ͺbNl@l2F,?gsz|Hʾ9Xu9S@̰Ո8]>T8QH[AUy=dɀ\Ca8~8*:[+oy KQk\$ՈU)] UUP<7`5aQA:%6Anj* ?# )2]#*!  @7TU@h4[[看#ADqXRJRrF6eZq%%5 hKmWTGVFE*LͅH[`7=Ikv\GH ^ހ4@I(I^AҊQ.aù( K{E҆=J'R 88k j@a$$C!i z uY$mI%9e^S,nbVZkZaH C8o8x#)0"-JQ}QG9P£dX>H]u*hf|7jdLjEJyLE m!$f(fR uO\LrRHj9 'U=-Pu<źPLI ͖L>>$$(W =g̙@uˡ 'Ak0B;hKL[zqˢZ00 pO_xr 뚥rDV0/ Zdaw #q`>AF`X'p=]  #L/?XDK0~#ϩbu F! o# 0  `~a,?] i6gSS]; װN7ыZxZk?bQ7N{ҷ9C~sCr|ʕ++;ȓ *ý{lomma;"X[%t!_/ 5_/ 5_/ 5_>C:85'al߿\\.?/=F@ Z J~ O]Y?B~5@s >U/` uݵCh &eaD5K# /cVxM l OA^e2 dʎ˯0Uc'FhJ;<-(VGVG/".,hl6 Tȫ Y.nʀZEpZaʱ$2!ITLQ)EpNK YUNKg@:ZE8)DR- rW+I8E$_MjPZ5b-NlqANEbB8p*U0U8}_Z(dJ.)QЮ"/ rZp:%ܢy|M]>S"XVu64!pSmɁӒ%jAfUR0!ܢV Af(]rZ_Vᮂ. @pUr L*pC\>+8|b]8TQ ]ES;J 5dɲXGOO+x؁; NY@- /|םʑMp8w\Ϟ[km5 JR)X;DxpeN/m_|5FFO~X7}i'tYOU\C7d ;~9{ۅ(3$:Emh.mN|<&HB-lCm+yGbJ kޮOEvmj%-lv ).|Qn RHэp.^s&@ 0m8u*4UIAl oTrrTtUee+U//EMA)谒&BTG h:6 IKUb*Qdܪ > <|IuAV60CrWxN ~aİ:iHX!6_ #6-ta')ZAKD~;營6бsGJ+'k59K~SUslQZ/fGDBOךt)MF"UJTu#JEMPPib鋨7UTUs%lQHguGA/6l p5>wz|MddZ!7PS5BltUI*jZ\K9U':9koOmCOyGFq-ϮEV\ed@؇+ #'،]Qjo#Ma可RX݊1Jx\Q($խ폒57vr>1'Iotlۼ6f̈axi~㿠ilGp.̌ӓ泞G"[kAKk>(Ay> Žw؟=:'?h:@ =h[VUo[VUo[VUo[VUo[uFsWW5}A%(^R@p Ş~ pWI>d>A*C|Ё1M~YtzΆ|"OtR$sS* ĶYuN@- . q^GٹeImRC,PI63#p)^ɍHhM>}fdtoʝ%kO'p穝i?NMrpE!2$)1* xZ'1>>u&Am.])@̘:$ĪM.6e'=5Qnʁuj/sn$b$)) C Tho emJX vYuH l \C[I3A*=$7mx@86ʫQ(8_]!wA_9*Esz%0>X sڭ/N @ *T=)q >' SS9xD]jutt%"Ay RDMuؽҭ&ުlZW#OqwA7 c= l|%?8By h@M'"[\Cj^`gLy(" 5{Sv({U `bc.0(2AZؠ7I7M] _9خj'*BZ1~f8#h.Ø%z+PWӻ]5ؑ7dh%crM4AG01^e+X\a3}cOӳP0uu@Pq=pR){=UuPcֈ3WӦi\5Ϛg3 44 gMy ={e\x1|7x1U.Qn>??}]|ㅿdaLrӪ:#%ܴuPQn: J_T TwI["ДP_uB`=Kw1L$xIBhv|DuWzm)=n=4.fDbr&.ppfpn[H%.JL;ubM+KPj ܡ )\pfzBaq1i (pd+h zd&0ZvXԓ\)ϲuojS0uh߹ Al6UY!j:AMյL=1L=ɀ:d@CJLL0L| SA)4 {&Ms˂rV I vi{VB``@BU\Q~ H@lc7lO#OS/DM@pDR!a1!ys_AȦ`Z+w0m3ZxK yj?kFx9EX?!ElyS%xptg y6syro3&޶/UBNN  vJҠ={yuA[UKW/7/eӥ&·H1ۈ@n ú,wkԦ oTٴhǔT6Pnzݘ<.u)'bֺ7UrrR4 J.D;0 NS<}杛QAMM@싉q $ /gEAj`3^dA'UdL#<Ͽ(:}Xi3Il#):IOLSy+ Kz'L6ҏ1LVpbڬ:訚Bm7J' @7_2dIzBV3#&l3m :CA@f:f #]GHel95aXZ Knj5LGg A.N;IH7;B2}dΐ{ԗdm8 Q,\pqg.ȳitz6.S\W( \id`S@wt'MR\\XH$ 5IoYMl8M"-i:WTMQU%#1au *EQ ޚ_lsG$~7oG%:!m ^ `mh: IBQJ ;v^v(~Wv' EqBao~s^`bhܜ|H dmGT0^K2jdCdΰc ހM0iA}0P\"讨LLhLx]ȦU+) M߭.ppf.23.VIӸqU@`/jao]X(Z@3"Ӏ4\|-b|\9~XOds@no|BMGGKw 6=不O1X*Fr9r xn@@ǝsR co4=dC,,\.эFb乞\3b;, UA&m8Ӑr*e TTv FCO  :2vfm+VW.ŀs/]%wU"<76zV-U4,)|4@C=UR$ 8:T$PpS:U# ic#8%Obʖļz*(n3s bBl:V \휀3n37nsFR!YOB̶E#UF<͌);ǫF8hIn:(7MT*p$B+zުzުG!ȩp]aANU*MSaW>NZKS5Ʒ)sYק*MI kf FC3fcyk6-4ʄ 43} sfǾ-(.!f43M~s>'&.hfVف͛7V썙bM?1klڨfhf7ӟ5ܴ$kfVb͌lNorT4ރUHg2SD{9^yܴ C , U";@n-ڨ TF('o#n~+nIsft#ZrncqB[A4*q0>OOr0R !#BbSЖ<+p07` İ-8|= ]׈>zqb+hw'o!Ԗ<+^TjjǛxaC.Dm5Z8xz7 7mlV* XHima Z gh*VCl < UA$sAJ.X!g;0eA#@xu6U5؎sg^ rS9 €=-'o%ܠIW`ۓ !D/B;%@`&)(O5͸x,RR*XtO|"%@8U+Dak.|p>^291UH#=5z4xdtSU( SAf1z%B MVtR^aWc9kb)!n oKPpp<&._2Sj%S,'2#Vk>3Rr.4!X&@@>EYʽ%p$JGO.LV*S߿̬ެYmf5놃Y!، }|%O!K&¹d{Cf@CUP<׸r?"LC{1~b*Hk[rE͞?&VczjyЉ=;ݛTZ{xsBk89~31sxeG,]۶;AEP-j{tcpeV7Kϵ=;4q8V s_<'b)=\bk;]xuR^І2h|>RzB)1Shp^,`?Oih4b=)(wv $P u`V:S1SHR UkGmha5 EunW~<܈n>.,U]#7L@@JD#kFD4U۴qer."[`-{Tk7\YBTDy''/bi=4}u|H-{.ȴ(^+ ᰓXɥH+HPI IH )+H/t׺_+Hf6pYma  B(2 h Q@WNWZA TlT*J i*I\+$P/N]*AJ֭*(U,UUUU1A%@Uz}+fGhzp%r' %r˝iiL l0ƀ3 8}3Avnv_"$o8q!bv0o$`}v~8bV=@Jr4ecvz(`t"(@ v dT;ܵ M5$91$:!Vǖy-UzC*D 3gtd F1Ͽ 2 QhMPbiB T;nSLTΡE6A#glՏ襰 J"$A]CC%0'V{Zu Tlm'V! ^#|>޴px!BCjMlm>xTUy op} !ĺAXюVps;Iqϋxe9]6x#$J<>a%HCs*bSoj⥱ N7n Ju"YV9@$O{?t Ahv6sp@T/[: ̲R}+WbP!V'qdicHˀ7 }'-e7OfpÕn# 1o%aڣ:yGZ70\us*]EU[EfeKGX迄t&bYb+gMsનs!~Ϻ܄kǘh;X6`!Ҋ, UqK#:>@8C#*>bѦǡsAW*[3sB'p.j~9;z`5'{3Y0 I}A#|pm{~Wɶ+v.ʠ{2[2C RS,<@ 8#P~8b"NC66J!UT8U:gSxc$6O DUЖW6wby{ABCOĩTv\X:3b&+8\GSbՋݦUTTembPd341 [҃8e^x;%wՐǫ2",RyێLHxyev<TyAsUS~gՠU'U٫>Y_9D.3\&ezUgjJHD.l H xg5%l  90 'zPPePj+|,5IMѤ"JXZi(e/mg'KlhAQ>?A"uS(+ e7ᖲ7 }Ś 'DTm mWP95#J8\C9wbei*uj^jE8`sP@*¢<%b% ,Mq2 <„fu͓u3'ۻ[MPkXm˗λzGé ۣ3By9m"*ޛ + 7! $5f% N 01tH,2,NK^/bUf>:Rŧ~8c:Bf< n{qQ8 +AJIUdA,t^`}w[4S=ݷ$]XBǛ^2蒰MwIlZH34˲Ȣ"Pf)O2![Ԭ@7u(*y+K4` w[Z)Cx ޵˱69-w( WZeóWZYɏjWO4$Z->(V,|hsRO-OTςڠ딀SF5 hQo|SM|Z[^ɹmB&& .^ %‰5aᤊ588|rUvżY Me*u*fRPٻB3MAi$sF@3 Lf.havog.AՁu* fD_?Wt&|.V|e^x (b\,q-(Q0 ((^m+g+x_ēzWLAUTt~GӸ߿D닗~+@9ARNwOScRϧN9QI~XkYYp?)TvGQU֦8O^ϴ?H~Umg 7r.[faSt=ؾ8 g`^>`p /l/l/ll6%3`c~70?y2rqܻNp4֐sG$h7/[gF]U$8aWc}HG=fmu~LtB96y{_LJW. @w')u[@4#PWB*^ xxO妕_XUjwMW8|}REMa(?= wLDF2"@S'1χ+RSNUfTF$TML% `24Z. V%& 112*U SݪT]i`"7vM<>wHA MGh'9V11-#7 A&\]d\]{z&U QmNpʴv@H7AFC =#wqݩZ)`1k~j9$o8q_&"5~(JxtdkKOwOy.`whoMJ݋ 5@?Mҡ#@oז?!]΀|@)Hv}Ji'pBl36IiХ^%FS(2{CoI1BGL&%9;)pN0])^`#teH~ Z\P1> SNѲ6Z Ckrip9綵!4js79yIw_J[Or=\]6gcA^ z;2 QZoX c+E^IpeW0c={  `G7x!`a@`D( Bh\_:Ce[)2ML $y>Ld }̭H+ZY'%ҋ2XTR]WWǓhxh0Xfp dVmRPp\(؇FG |9%eJX5y7|i!ܮ# %|kYU1tbBWBo)tȝ ;6e۴thӆg⽪HLJ6nqme Q cH 1SU5c1mM/> 6(Rc| %$U&l@ ЉeJU)4lv,ߋ|(A eݘGhfn 7APB Jm9E:Z9q8.ހE_P̾pwlwMi]+l!MJ/S(-]]RB5|HkEZkS5>5n\Ņ*w9jDsY|&A?Y5Ñ}K*>j2*>2 Qb5AMP@QZAx*wWE$ǚ&ŞXfM`'*% NZ=@B P0RUڶ[wƀ ,T~E**>RdA<k|*_"*I3%@$b(XJsKch b)@,R,X P,P%.?#"%A*H#~M=AT~&Z*Aмrh|G†Iᾌ>\ڳ_[u蠇e;!Z>-?UϡƾЫӃ)rP[g.s0^[wz^4Aﵼ͌f24J5=h! ~i=O<Vh͌ ?X-=9țg7{c?Фq^ ǒ-naH%ӹ>Vӟuy 40~|A^^m B3#kZjD޺ iA#Za@'1&V z:iNjxѹ-P{'yGngJ vZԴX-8!2W -Nlܯy>9}b!`i8w|?bȼEfo { !}Q M[6΃R+ & j KJP?htjEfI20K,#<߾M LQg ~6:\pOa * *AޢBuXɢ7ϥ |"ƍs ]iT pnW!lvR,WV:4&hu,N\ S J'++*_C^+J5f$kԴ1̩==>KS8_Tt5biA UY:pB/s|o1е!]z)<r\1f@fd%AoRYT2t1iu79y(k!#<0uj"U[Q_&RF䠪 Bn+UMoو""T8TLݲ(@]JXY~ob ]RFftГE* 6WqJRurhʆ=uHmu  jJL[Ge"y'UWVd2NGD'CxEcw1K)UL`U)n~VAVsZh$ (A%ag R-lA,9b!߲A,F| H|3r0XekH7ʀ9ǁ3 ] "j.qX@$B WjJ AS4*x *8\:Fvqd&TU@;Un P 2nb4 wQ6 4iPz lT|(y'f7ln\w_չ$D=EǞ|c'BT42_!w7 2ϋ[q U Opbۣ[sjqDy *4 n,V׍@|}} ō>=,a~.~@fo|V (>/wENbMbk{N. ( X1VX(n,c YҶ`+׼`:*Xj@p|@;bޮJ_K;t!QQ͇sNTўE0% RAi[0!FBaK(7WX6BV AC/ qgX{#ea`Ͼ|۹# FԶ'O7xi׶wx܁ &+%</ i)Rı|\P*@bM*\P"XCm*Q?XWH=Զ)eYG glYG?Zk~_%Ž{'$[*}<x|\__~?_D|>u#w>lf јVvuz+uzq-|GS^)z 8h1##AF>=pZo5o؟.3}g9_۳ׄ^z:-ݡ+~ RZd=I֊]Wfש wCe_:Q*7ufcs{+l{ُ=|ICϋ:?} xܐJ"Nh > 9sٳ!^HW gR%[!M,BLنg<3GoJ[=r}&s΄=ϙ %3<gR%pH*ȄvSÿBӼ9q׉>0g<,ܲH: D(pzG0:(w:pfRp6λƓTkkC>Mb:nIFLjW R1tER {ZR:HIQ]QwqS(@e"3H13zb:څ8ȞtM:) ̚@ `.ט]=o`EuN1 ntBL>3ICtGz#BȪ* M=F3mpAUT(DL@u TUCI*II AV*|MҨ}R풄)IIeYEv~UbCHAHDiP H&(^.1% KRARdIbM(#+K$ߟsҡE )'F.MeA %tIu2ɂSdNwd I-/䱤$QM s %G#ʆ3]\`HAuTzi=0.vW~4 sҪ5TI3D-sNY:<~0! .W}Ħ_a6Ĭ랳yX͞ ~ ʘqϾ;0 ax $X?5gfE~s@n- pJZLtR`o4rSU-Wij29V L`MAݓ5Kݳ fE7ewf%U'p;e6DZu=b1u6N@NS*;8+km'Rd](]~62KUgO+ f(efI.ED€uf#eaDd;E9Z;}'K5vvԇYo/S ( O%2;[|Ȧ2UROdr~S :3.]6(3T]$(fȒW&pOjUZcT Rز VqM:= nm^X%afkӈjCMpGI鉒F fb@SV P-45E>.m*62SPe`W? S k:D)P  'K-1 `hD:p@!P&pPPHiTd C:(**(x*@+R*Ft PBK-QE:7yI4;\:GI4i( IHJ4i T8 S: ͸tp ҡi *-AT +` J2G_J̒8TD驪A &47d:Kx HNt9m |Xf΁#<>(F!Id4k2ˢ"bfQ6hbJZKQPLPZ3* jΊBS P{@!(BUv 6bY(nQ(P8@YXL[VTTMƲ&d3 Qv +B3"uc`n!P(^hD&Xj5bc-@1bP PPԌ*&ú(ml 3$$+`4"L&`C'N|vF [΂ g^0W&OEquY2Kb>=~Ϧ=۹sY=g}c|)^汋SUH>=. 6 cVh \w+QF.$q]"UZ\g]xҩpV_/'T{_ڤbz6~d8N[z|L9l,Q(4XZ Cȟ Z`;Ӏxeֶ=xyGR)ӇvA?61Fԁ0]o|ʄMB d(TbV?D/~GP*뚭PZQ).,y( Rz@G@FԩC8N+*Oly_/Εwh$,J"kdk뮕pY"u"oyf Hd[7Iв >6 ψ $WD7)dN+zBgaP3FeLЫFEOxжQ_q8!ɾ{dI1  h`YxoL(Bcu = ك0 6 {#0B W c1GW;~ 0⵱߂Mx;i}I'&` =b) ^ 3)s_癏)s޲fmr=n?6?6?S@ӽQ)29go6G9xoaִ6!Œhy (6rT=Zr_qUuִG4cmj^ϒ@, ؀mۀh! ؆Wl{a{`s*gk c{6`ۤ푪B ^0hah`^w,m/l6wx9%0ha{`{a4`l Q&z?~ћMd:V̊E = =qlȄ9:2̄oNCw{݀ ܻ(2dLJ"{o huvwܠ5 E# = ;0;{@{6 O%ۇ29xm} W(p N7~B= gw{8˯~ϓlEh儾_gx$z9Ք*y0NMwt^Jj34u"yˤ/s4(f8^ =B3&ylgb7>nj(hp% P!5' #ۜ5>s0<Ĝi35yv4y3^.1]Y  > =(C܇ .Q 1S /poQ`xKpKOvF>ˍX]@c:5y.Zj@9(óGb9i)Q$@"02`0x8lK (K.4 ) FTyRd/dtɚ:2)𛏕/5@mjb,ZQU%Mm%*Bţq5&iCD+PTN)wo4Z/Jxl*tN?d=ƼCV%p,r3WDU-k+i͏_ց @ 4@+8 Vg*6PQ(I Fi] Qp#ۙ:l%3Ӥ5ipv=wv ig{P[,.u@*Iiʒ)ʳԢpڠ(;m-yNQN Y.;Yҵ YX Hg^uvo2{aCqmvF#Ф)CCQdS\  tV DE@U@qVEA0mfeų)/aHSNZP:tE6PQJy YTtV $KGA(@dH(HŰ" $8-ľTC6ᄢ@WnFsE@@1o!Aբ2A(f &͹B5g@LU D AY[@MR<`}A1CDbPbb9+@9+&K͹b,kNY(@ TAMWP &P*@1 j4 kg>N ͣ=⋻F?Xk}*A~H$G_cv*E3dR^^孳װrd=<; m5YJk~$=ޏ|VHl@tؼx?鞋́goev~=9𽧡skU,5뽽LphVyuݏWNJL nC&5%^P$~#Oh̖k3朙bIb׶X^~pv9m(x95_fxq02}mQJh?bd] 9ʱ7ֱ"i"ɆN6Hv|;D)tlY@-d%:\8%bf؀6H$P HH W ®Qj9I aTPJUht2*>Zl_gąOrSFB t.2 $E*ȬWuŖ@Wp6gd;"GF@9s.~aǬb)_! +fkYoz%ipYz7uGI<t ݱk#Ip QU$Y1+~`Mwh*^TAJ*!%uA)*ҢԴ; 1E]7bxW wG,^3,7(Qr x0H/W0 $P5/Sު NW$QA„  fe/M,eBHG?W6JuѢcq2my"CbY|,s<ٹMM9Q#PجZA`*cb,PhT+@MK' M#RP3t\>Z(>t*C*-#1~@&]m2? sNllH4t5Dԩ P3%8Y|]\0ѫgEnzpBIZ`2Gnd|Ο@uPjH+%JSV{& ϸ{6{ΌZPVJ'2lrOEFuj}1n '˚q@蕄l`,WBTg6ZLG=ϦJ sAT/@ W@<)5O8 9 QsYzmp7>!JjE<k&P jЍWp/bLec;O}Rگxҫ^ Ч8S# ڛ-ݣ+Oto Q6!M-lRq<춘EJ5 ho,E K,q 3pv4`ligG6`2=\8ӌyg;%.{"s *N ؀ HЙ`# l l$0Np;8 Mul g-en!%[Z8ppz[ ;xgg4dzHSl l$غ]&qҫf7c@ǪE0WOUUIډ$H^Y_)ػ2!=s&t{h(Ӹg=B/pN0{@ґـg4Ʉ:0$DO QwΆ! ۆr=sd ;gx! nT_աf;Y]VQ" mpCF4LUn6f>'홣90쏟 Gq~#\x6t9p!O80;̜ ~}8 < :mZ$4xӁ H&}tzEQ@%A EK=xP(=3b֢TD9hZsOԼMyB{5gYs*q"|f\mqDX՜3sJnݦMzFG*9g[Wc.ƅwISu3(U-| HST94hjœsF UQ~B&Ğhv&_!n3(4ySŽ1gTVZ@& f1眆ؓL|3NE#?oyn-jP QaTfS]P pUb C8cA4KĚ H-I&D')!sNJprKZ%u5}$X^GC̡xpaLf#04+-(, @dh6CAJlxĆ$mg~J#D23%i^dzLoߟ+lӀ1X$C[~ 1p"U]fKia#l 5Eu/:znQn7PCYI vG*-.) C-bB^ln@t$QxZ)M** HjZ{x:9zTSkpbsIJ# q| mf'z2#μ7dgs~~ZḫІSrƙdGlt'+^Y*-2FmL Ȅ /CY+  aTe >4BTRl9_r/V$4B-֚052pF`X4WP%Ճb۝e45ܵ_%UY7%v=9 JfHkP YapH=3hvm9CtAhf^ ճG :vU U/N \^euMHt}Qn!8u0ŠܝYʔV.u%} D߻KC| Tv;PݻsUԒsݳ 4ff$viT=Ͻ.EyEqliܙ"s@Zա@ey#ek ۋ*fflosVj)*@7[ B K]@ݰʨ@aK‡ ۔o2`gi? ՝6g4M\Ux#훌 Ɛ!+peO*2*QW*o>);73s7 ԜjKP?.+z(xbӒ86b[`hRڄY Mi,+@gCig0g`=sWEUYS*USx6cw>Eo8C%*e!ުXy,_䁧p K2:"E*wF< c1^z*BPLMMPܐ !@gQߨ}c*D}r}% bl`K#VcR)–03>o~   @@ R4bb,tK rhNE4S "%ts@ >nx2x#%HlnAe7俳~{_\C0x62 x#Oǀ[ A 39qKDii}@ٍ;)rr gBVYxEOdqbONAk y|?9TdU?d9t}!UxN5E!" =5Cd΁ϩ&PHq9z/`;O hOhSM9V !Usf QmҷgՏ f TfS|e=ۋ =*YwfWX7_cU p<"",& /fWdNc9U0hOL*ζoV /M DbW] }FԁkA/ix T! (k娔kޮ.1^ʺ% ʘG)EiD#A:}ir)*j ė.I >oĊ`8,j)qKHP99 = FIRUKD1[DX4H'.f_Pb)I[BT b)4zKm~>yt = Hp~9W8sӠ7gz3_ NyTy_y%|9K)?-79=kFχk<)y^Ccu3tNn˿ RW>~W_ _.un7#!g'33rǐCN ;=q/**@PdԠi60\A' {ZVa3yw|؁#4A ܯ342+b=o{l@w???z{Vd^'|})$:Nu<7un־^I Yj#GޓnL󘝵q|!5h wGdA;Xc;+&93œt(tE[{(BK<omkmn; =p/4d'̆om2:+{v߾%dw{ ڸl\q:2-<y7{|~3}oR)SZq>^JxKv'~<mȾ![Np$ 6MfkeKhn9myٝ; nߺ dw;p܆4Qv''ྷF:ݹci}yUs& Gܕ!7eNx{471C%z Kk!盚rrD@_9QZJb RA=!Z.jMLE**waI!xӱ!:M9Ŭ]dUfTM>H+N`EfATTttnqrƢ Mdh -|?EOoZ:3v:ٳ<Sn iQK0s1iFUAf9hF Ɏ^඘^Y whɞt3ND|9rF{B#v, |"8z.$sVR&KdK*d'bs pfLh?3 HBT p5@zBg]q~33C]1N Z3PU;&xsj `WUxZ &2@b9 H71/NYE:<"s*2'Mn9]!wx:4CMdhaZVUhJL&(tءoo&^KfϋnI1Wp8-*  ^tKH1 b(ib( +ţcxb(c-R5 @hХ=K1 o`[PÞ?z/w:V=-h#x{rrtL\Ky \Ń{Ү[;Y$zǒA&L4*״xpjTk4hM!wZNxXUUŰVZ`%zl ̋VT 7BE&I5Bנ%HoEpYKljOyN/qBZ02C+uT)a6BT24:,W$ISdCAel|,` QiFNQi@.Ǜ|+Ka_?CZh PS"'*Ts6+D6hAeχ ׅ|BUHR#W)5`*9-=\ _ ]W TyrTg BHPu9'IJBH(r ;і]V7~ V8 1#}jbVn,SkL# 0 uAfEE >@Ѐ*@b7uQ,0ߵn؏Q FTD(C Y @AaTPhk^HBP%i^J cXj$V=$VJ⁥=Z@c b bbHZHb)RH bX @GA>^+M|*@6ݝ ;#'@3iF4  IdKjr~t* :?J^8$ $q $ ;xgJb($,cس4Fh@b .dm]vv%3KSFpUDK]kkAʒu #)4.-`֖*pJ%˒]"|'{6Td3p3.lZA֞I) R€Zh.t%Zd@R.8 T,oYt؅]t@_X[a rAR©.g))Nti%%Y.9e)3eb%g))[kxWQ!CՖAREjkOA)@pE.*llVllᲁ"Z6H瓰y"- 'AmPD"Rxr_ ӂ<^HB 2Ar ,3HA"Zs Bk A 2F8A" ݢ7c,:b`1^F0/,F#:P@@^@򳅖|W bl``yPIfLju } ,1TA,0(#@__wOA/H6&ɺ%gb;50hCa.\5\,uJJ >i@$qBF@oRT0*Ztjx+ؽ@N duڐvA"5kԢNqԝYZGPfn >t!2%r:U]w T="yFL:ܐlYdA%B)vEKH7#lg&K;A6I%` F`#cKwΑ6H #a#[~H6B`#6BX` lF ,#0lF¾/|gqDŁC/+r^)cn)r3g kkkk.>[ɭg3Xbrowserslist-4.24.4/img/union.svg000066400000000000000000000011501473746235500170110ustar00rootroot00000000000000browserslist-4.24.4/index.d.ts000066400000000000000000000115411473746235500162720ustar00rootroot00000000000000/** * Return array of browsers by selection queries. * * ```js * browserslist('IE >= 10, IE 8') //=> ['ie 11', 'ie 10', 'ie 8'] * ``` * * @param queries Browser queries. * @param opts Options. * @returns Array with browser names in Can I Use. */ declare function browserslist( queries?: string | readonly string[] | null, opts?: browserslist.Options ): string[] declare namespace browserslist { interface Query { compose: 'or' | 'and' type: string query: string not?: true } interface Options { /** * Path to processed file. It will be used to find config files. */ path?: string | false /** * Processing environment. It will be used to take right queries * from config file. */ env?: string /** * Custom browser usage statistics for "> 1% in my stats" query. */ stats?: Stats | string /** * Path to config file with queries. */ config?: string /** * Do not throw on unknown version in direct query. */ ignoreUnknownVersions?: boolean /** * Throw an error if env is not found. */ throwOnMissing?: boolean /** * Disable security checks for extend query. */ dangerousExtend?: boolean /** * Alias mobile browsers to the desktop version when Can I Use * doesn’t have data about the specified version. */ mobileToDesktop?: boolean } type Config = { defaults: string[] [section: string]: string[] | undefined } interface Stats { [browser: string]: { [version: string]: number } } /** * Browser names aliases. */ let aliases: { [alias: string]: string | undefined } /** * Aliases to work with joined versions like `ios_saf 7.0-7.1`. */ let versionAliases: { [browser: string]: | { [version: string]: string | undefined } | undefined } /** * Can I Use only provides a few versions for some browsers (e.g. `and_chr`). * * Fallback to a similar browser for unknown versions. */ let desktopNames: { [browser: string]: string | undefined } let data: { [browser: string]: | { name: string versions: string[] released: string[] releaseDate: { [version: string]: number | undefined | null } } | undefined } let nodeVersions: string[] interface Usage { [version: string]: number } let usage: { global?: Usage custom?: Usage | null [country: string]: Usage | undefined | null } let cache: { [feature: string]: { [name: string]: { [version: string]: string } } } /** * Default browsers query */ let defaults: readonly string[] /** * Which statistics should be used. Country code or custom statistics. * Pass `"my stats"` to load statistics from `Browserslist` files. */ type StatsOptions = string | 'my stats' | Stats | { dataByBrowser: Stats } /** * Return browsers market coverage. * * ```js * browserslist.coverage(browserslist('> 1% in US'), 'US') //=> 83.1 * ``` * * @param browsers Browsers names in Can I Use. * @param stats Which statistics should be used. * @returns Total market coverage for all selected browsers. */ function coverage(browsers: readonly string[], stats?: StatsOptions): number /** * Get queries AST to analyze the config content. * * @param queries Browser queries. * @param opts Options. * @returns An array of the data of each query in the config. */ function parse( queries?: string | readonly string[] | null, opts?: browserslist.Options ): Query[] /** * Return queries for specific file inside the project. * * ```js * browserslist.loadConfig({ * file: process.cwd() * }) ?? browserslist.defaults * ``` */ function loadConfig(options: LoadConfigOptions): string[] | undefined function clearCaches(): void function parseConfig(string: string): Config function readConfig(file: string): Config function findConfig(...pathSegments: string[]): Config | undefined function findConfigFile(...pathSegments: string[]): string | undefined interface LoadConfigOptions { /** * Path to config file * */ config?: string /** * Path to file inside the project to find Browserslist config * in closest folder */ path?: string /** * Environment to choose part of config. */ env?: string } } declare global { namespace NodeJS { interface ProcessEnv { BROWSERSLIST?: string BROWSERSLIST_CONFIG?: string BROWSERSLIST_DANGEROUS_EXTEND?: string BROWSERSLIST_DISABLE_CACHE?: string BROWSERSLIST_ENV?: string BROWSERSLIST_IGNORE_OLD_DATA?: string BROWSERSLIST_STATS?: string BROWSERSLIST_ROOT_PATH?: string } } } export = browserslist browserslist-4.24.4/index.js000066400000000000000000001025201473746235500160340ustar00rootroot00000000000000var jsReleases = require('node-releases/data/processed/envs.json') var agents = require('caniuse-lite/dist/unpacker/agents').agents var e2c = require('electron-to-chromium/versions') var jsEOL = require('node-releases/data/release-schedule/release-schedule.json') var path = require('path') var BrowserslistError = require('./error') var env = require('./node') var parse = require('./parse') // Will load browser.js in webpack var YEAR = 365.259641 * 24 * 60 * 60 * 1000 var ANDROID_EVERGREEN_FIRST = '37' var OP_MOB_BLINK_FIRST = 14 // Helpers function isVersionsMatch(versionA, versionB) { return (versionA + '.').indexOf(versionB + '.') === 0 } function isEolReleased(name) { var version = name.slice(1) return browserslist.nodeVersions.some(function (i) { return isVersionsMatch(i, version) }) } function normalize(versions) { return versions.filter(function (version) { return typeof version === 'string' }) } function normalizeElectron(version) { var versionToUse = version if (version.split('.').length === 3) { versionToUse = version.split('.').slice(0, -1).join('.') } return versionToUse } function nameMapper(name) { return function mapName(version) { return name + ' ' + version } } function getMajor(version) { return parseInt(version.split('.')[0]) } function getMajorVersions(released, number) { if (released.length === 0) return [] var majorVersions = uniq(released.map(getMajor)) var minimum = majorVersions[majorVersions.length - number] if (!minimum) { return released } var selected = [] for (var i = released.length - 1; i >= 0; i--) { if (minimum > getMajor(released[i])) break selected.unshift(released[i]) } return selected } function uniq(array) { var filtered = [] for (var i = 0; i < array.length; i++) { if (filtered.indexOf(array[i]) === -1) filtered.push(array[i]) } return filtered } function fillUsage(result, name, data) { for (var i in data) { result[name + ' ' + i] = data[i] } } function generateFilter(sign, version) { version = parseFloat(version) if (sign === '>') { return function (v) { return parseLatestFloat(v) > version } } else if (sign === '>=') { return function (v) { return parseLatestFloat(v) >= version } } else if (sign === '<') { return function (v) { return parseFloat(v) < version } } else { return function (v) { return parseFloat(v) <= version } } function parseLatestFloat(v) { return parseFloat(v.split('-')[1] || v) } } function generateSemverFilter(sign, version) { version = version.split('.').map(parseSimpleInt) version[1] = version[1] || 0 version[2] = version[2] || 0 if (sign === '>') { return function (v) { v = v.split('.').map(parseSimpleInt) return compareSemver(v, version) > 0 } } else if (sign === '>=') { return function (v) { v = v.split('.').map(parseSimpleInt) return compareSemver(v, version) >= 0 } } else if (sign === '<') { return function (v) { v = v.split('.').map(parseSimpleInt) return compareSemver(version, v) > 0 } } else { return function (v) { v = v.split('.').map(parseSimpleInt) return compareSemver(version, v) >= 0 } } } function parseSimpleInt(x) { return parseInt(x) } function compare(a, b) { if (a < b) return -1 if (a > b) return +1 return 0 } function compareSemver(a, b) { return ( compare(parseInt(a[0]), parseInt(b[0])) || compare(parseInt(a[1] || '0'), parseInt(b[1] || '0')) || compare(parseInt(a[2] || '0'), parseInt(b[2] || '0')) ) } // this follows the npm-like semver behavior function semverFilterLoose(operator, range) { range = range.split('.').map(parseSimpleInt) if (typeof range[1] === 'undefined') { range[1] = 'x' } // ignore any patch version because we only return minor versions // range[2] = 'x' switch (operator) { case '<=': return function (version) { version = version.split('.').map(parseSimpleInt) return compareSemverLoose(version, range) <= 0 } case '>=': default: return function (version) { version = version.split('.').map(parseSimpleInt) return compareSemverLoose(version, range) >= 0 } } } // this follows the npm-like semver behavior function compareSemverLoose(version, range) { if (version[0] !== range[0]) { return version[0] < range[0] ? -1 : +1 } if (range[1] === 'x') { return 0 } if (version[1] !== range[1]) { return version[1] < range[1] ? -1 : +1 } return 0 } function resolveVersion(data, version) { if (data.versions.indexOf(version) !== -1) { return version } else if (browserslist.versionAliases[data.name][version]) { return browserslist.versionAliases[data.name][version] } else { return false } } function normalizeVersion(data, version) { var resolved = resolveVersion(data, version) if (resolved) { return resolved } else if (data.versions.length === 1) { return data.versions[0] } else { return false } } function filterByYear(since, context) { since = since / 1000 return Object.keys(agents).reduce(function (selected, name) { var data = byName(name, context) if (!data) return selected var versions = Object.keys(data.releaseDate).filter(function (v) { var date = data.releaseDate[v] return date !== null && date >= since }) return selected.concat(versions.map(nameMapper(data.name))) }, []) } function cloneData(data) { return { name: data.name, versions: data.versions, released: data.released, releaseDate: data.releaseDate } } function byName(name, context) { name = name.toLowerCase() name = browserslist.aliases[name] || name if (context.mobileToDesktop && browserslist.desktopNames[name]) { var desktop = browserslist.data[browserslist.desktopNames[name]] if (name === 'android') { return normalizeAndroidData(cloneData(browserslist.data[name]), desktop) } else { var cloned = cloneData(desktop) cloned.name = name return cloned } } return browserslist.data[name] } function normalizeAndroidVersions(androidVersions, chromeVersions) { var iFirstEvergreen = chromeVersions.indexOf(ANDROID_EVERGREEN_FIRST) return androidVersions .filter(function (version) { return /^(?:[2-4]\.|[34]$)/.test(version) }) .concat(chromeVersions.slice(iFirstEvergreen)) } function copyObject(obj) { var copy = {} for (var key in obj) { copy[key] = obj[key] } return copy } function normalizeAndroidData(android, chrome) { android.released = normalizeAndroidVersions(android.released, chrome.released) android.versions = normalizeAndroidVersions(android.versions, chrome.versions) android.releaseDate = copyObject(android.releaseDate) android.released.forEach(function (v) { if (android.releaseDate[v] === undefined) { android.releaseDate[v] = chrome.releaseDate[v] } }) return android } function checkName(name, context) { var data = byName(name, context) if (!data) throw new BrowserslistError('Unknown browser ' + name) return data } function unknownQuery(query) { return new BrowserslistError( 'Unknown browser query `' + query + '`. ' + 'Maybe you are using old Browserslist or made typo in query.' ) } // Adjusts last X versions queries for some mobile browsers, // where caniuse data jumps from a legacy version to the latest function filterJumps(list, name, nVersions, context) { var jump = 1 switch (name) { case 'android': if (context.mobileToDesktop) return list var released = browserslist.data.chrome.released jump = released.length - released.indexOf(ANDROID_EVERGREEN_FIRST) break case 'op_mob': var latest = browserslist.data.op_mob.released.slice(-1)[0] jump = getMajor(latest) - OP_MOB_BLINK_FIRST + 1 break default: return list } if (nVersions <= jump) { return list.slice(-1) } return list.slice(jump - 1 - nVersions) } function isSupported(flags, withPartial) { return ( typeof flags === 'string' && (flags.indexOf('y') >= 0 || (withPartial && flags.indexOf('a') >= 0)) ) } function resolve(queries, context) { return parse(QUERIES, queries).reduce(function (result, node, index) { if (node.not && index === 0) { throw new BrowserslistError( 'Write any browsers query (for instance, `defaults`) ' + 'before `' + node.query + '`' ) } var type = QUERIES[node.type] var array = type.select.call(browserslist, context, node).map(function (j) { var parts = j.split(' ') if (parts[1] === '0') { return parts[0] + ' ' + byName(parts[0], context).versions[0] } else { return j } }) if (node.compose === 'and') { if (node.not) { return result.filter(function (j) { return array.indexOf(j) === -1 }) } else { return result.filter(function (j) { return array.indexOf(j) !== -1 }) } } else { if (node.not) { var filter = {} array.forEach(function (j) { filter[j] = true }) return result.filter(function (j) { return !filter[j] }) } return result.concat(array) } }, []) } function prepareOpts(opts) { if (typeof opts === 'undefined') opts = {} if (typeof opts.path === 'undefined') { opts.path = path.resolve ? path.resolve('.') : '.' } return opts } function prepareQueries(queries, opts) { if (typeof queries === 'undefined' || queries === null) { var config = browserslist.loadConfig(opts) if (config) { queries = config } else { queries = browserslist.defaults } } return queries } function checkQueries(queries) { if (!(typeof queries === 'string' || Array.isArray(queries))) { throw new BrowserslistError( 'Browser queries must be an array or string. Got ' + typeof queries + '.' ) } } var cache = {} function browserslist(queries, opts) { opts = prepareOpts(opts) queries = prepareQueries(queries, opts) checkQueries(queries) var context = { ignoreUnknownVersions: opts.ignoreUnknownVersions, dangerousExtend: opts.dangerousExtend, mobileToDesktop: opts.mobileToDesktop, path: opts.path, env: opts.env } env.oldDataWarning(browserslist.data) var stats = env.getStat(opts, browserslist.data) if (stats) { context.customUsage = {} for (var browser in stats) { fillUsage(context.customUsage, browser, stats[browser]) } } var cacheKey = JSON.stringify([queries, context]) if (cache[cacheKey]) return cache[cacheKey] var result = uniq(resolve(queries, context)).sort(function (name1, name2) { name1 = name1.split(' ') name2 = name2.split(' ') if (name1[0] === name2[0]) { // assumptions on caniuse data // 1) version ranges never overlaps // 2) if version is not a range, it never contains `-` var version1 = name1[1].split('-')[0] var version2 = name2[1].split('-')[0] return compareSemver(version2.split('.'), version1.split('.')) } else { return compare(name1[0], name2[0]) } }) if (!env.env.BROWSERSLIST_DISABLE_CACHE) { cache[cacheKey] = result } return result } browserslist.parse = function (queries, opts) { opts = prepareOpts(opts) queries = prepareQueries(queries, opts) checkQueries(queries) return parse(QUERIES, queries) } // Will be filled by Can I Use data below browserslist.cache = {} browserslist.data = {} browserslist.usage = { global: {}, custom: null } // Default browsers query browserslist.defaults = ['> 0.5%', 'last 2 versions', 'Firefox ESR', 'not dead'] // Browser names aliases browserslist.aliases = { fx: 'firefox', ff: 'firefox', ios: 'ios_saf', explorer: 'ie', blackberry: 'bb', explorermobile: 'ie_mob', operamini: 'op_mini', operamobile: 'op_mob', chromeandroid: 'and_chr', firefoxandroid: 'and_ff', ucandroid: 'and_uc', qqandroid: 'and_qq' } // Can I Use only provides a few versions for some browsers (e.g. and_chr). // Fallback to a similar browser for unknown versions // Note op_mob is not included as its chromium versions are not in sync with Opera desktop browserslist.desktopNames = { and_chr: 'chrome', and_ff: 'firefox', ie_mob: 'ie', android: 'chrome' // has extra processing logic } // Aliases to work with joined versions like `ios_saf 7.0-7.1` browserslist.versionAliases = {} browserslist.clearCaches = env.clearCaches browserslist.parseConfig = env.parseConfig browserslist.readConfig = env.readConfig browserslist.findConfigFile = env.findConfigFile browserslist.findConfig = env.findConfig browserslist.loadConfig = env.loadConfig browserslist.coverage = function (browsers, stats) { var data if (typeof stats === 'undefined') { data = browserslist.usage.global } else if (stats === 'my stats') { var opts = {} opts.path = path.resolve ? path.resolve('.') : '.' var customStats = env.getStat(opts) if (!customStats) { throw new BrowserslistError('Custom usage statistics was not provided') } data = {} for (var browser in customStats) { fillUsage(data, browser, customStats[browser]) } } else if (typeof stats === 'string') { if (stats.length > 2) { stats = stats.toLowerCase() } else { stats = stats.toUpperCase() } env.loadCountry(browserslist.usage, stats, browserslist.data) data = browserslist.usage[stats] } else { if ('dataByBrowser' in stats) { stats = stats.dataByBrowser } data = {} for (var name in stats) { for (var version in stats[name]) { data[name + ' ' + version] = stats[name][version] } } } return browsers.reduce(function (all, i) { var usage = data[i] if (usage === undefined) { usage = data[i.replace(/ \S+$/, ' 0')] } return all + (usage || 0) }, 0) } function nodeQuery(context, node) { var matched = browserslist.nodeVersions.filter(function (i) { return isVersionsMatch(i, node.version) }) if (matched.length === 0) { if (context.ignoreUnknownVersions) { return [] } else { throw new BrowserslistError( 'Unknown version ' + node.version + ' of Node.js' ) } } return ['node ' + matched[matched.length - 1]] } function sinceQuery(context, node) { var year = parseInt(node.year) var month = parseInt(node.month || '01') - 1 var day = parseInt(node.day || '01') return filterByYear(Date.UTC(year, month, day, 0, 0, 0), context) } function coverQuery(context, node) { var coverage = parseFloat(node.coverage) var usage = browserslist.usage.global if (node.place) { if (node.place.match(/^my\s+stats$/i)) { if (!context.customUsage) { throw new BrowserslistError('Custom usage statistics was not provided') } usage = context.customUsage } else { var place if (node.place.length === 2) { place = node.place.toUpperCase() } else { place = node.place.toLowerCase() } env.loadCountry(browserslist.usage, place, browserslist.data) usage = browserslist.usage[place] } } var versions = Object.keys(usage).sort(function (a, b) { return usage[b] - usage[a] }) var coveraged = 0 var result = [] var version for (var i = 0; i < versions.length; i++) { version = versions[i] if (usage[version] === 0) break coveraged += usage[version] result.push(version) if (coveraged >= coverage) break } return result } var QUERIES = { last_major_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+major\s+versions?$/i, select: function (context, node) { return Object.keys(agents).reduce(function (selected, name) { var data = byName(name, context) if (!data) return selected var list = getMajorVersions(data.released, node.versions) list = list.map(nameMapper(data.name)) list = filterJumps(list, data.name, node.versions, context) return selected.concat(list) }, []) } }, last_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+versions?$/i, select: function (context, node) { return Object.keys(agents).reduce(function (selected, name) { var data = byName(name, context) if (!data) return selected var list = data.released.slice(-node.versions) list = list.map(nameMapper(data.name)) list = filterJumps(list, data.name, node.versions, context) return selected.concat(list) }, []) } }, last_electron_major_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+electron\s+major\s+versions?$/i, select: function (context, node) { var validVersions = getMajorVersions(Object.keys(e2c), node.versions) return validVersions.map(function (i) { return 'chrome ' + e2c[i] }) } }, last_node_major_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+node\s+major\s+versions?$/i, select: function (context, node) { return getMajorVersions(browserslist.nodeVersions, node.versions).map( function (version) { return 'node ' + version } ) } }, last_browser_major_versions: { matches: ['versions', 'browser'], regexp: /^last\s+(\d+)\s+(\w+)\s+major\s+versions?$/i, select: function (context, node) { var data = checkName(node.browser, context) var validVersions = getMajorVersions(data.released, node.versions) var list = validVersions.map(nameMapper(data.name)) list = filterJumps(list, data.name, node.versions, context) return list } }, last_electron_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+electron\s+versions?$/i, select: function (context, node) { return Object.keys(e2c) .slice(-node.versions) .map(function (i) { return 'chrome ' + e2c[i] }) } }, last_node_versions: { matches: ['versions'], regexp: /^last\s+(\d+)\s+node\s+versions?$/i, select: function (context, node) { return browserslist.nodeVersions .slice(-node.versions) .map(function (version) { return 'node ' + version }) } }, last_browser_versions: { matches: ['versions', 'browser'], regexp: /^last\s+(\d+)\s+(\w+)\s+versions?$/i, select: function (context, node) { var data = checkName(node.browser, context) var list = data.released.slice(-node.versions).map(nameMapper(data.name)) list = filterJumps(list, data.name, node.versions, context) return list } }, unreleased_versions: { matches: [], regexp: /^unreleased\s+versions$/i, select: function (context) { return Object.keys(agents).reduce(function (selected, name) { var data = byName(name, context) if (!data) return selected var list = data.versions.filter(function (v) { return data.released.indexOf(v) === -1 }) list = list.map(nameMapper(data.name)) return selected.concat(list) }, []) } }, unreleased_electron_versions: { matches: [], regexp: /^unreleased\s+electron\s+versions?$/i, select: function () { return [] } }, unreleased_browser_versions: { matches: ['browser'], regexp: /^unreleased\s+(\w+)\s+versions?$/i, select: function (context, node) { var data = checkName(node.browser, context) return data.versions .filter(function (v) { return data.released.indexOf(v) === -1 }) .map(nameMapper(data.name)) } }, last_years: { matches: ['years'], regexp: /^last\s+(\d*.?\d+)\s+years?$/i, select: function (context, node) { return filterByYear(Date.now() - YEAR * node.years, context) } }, since_y: { matches: ['year'], regexp: /^since (\d+)$/i, select: sinceQuery }, since_y_m: { matches: ['year', 'month'], regexp: /^since (\d+)-(\d+)$/i, select: sinceQuery }, since_y_m_d: { matches: ['year', 'month', 'day'], regexp: /^since (\d+)-(\d+)-(\d+)$/i, select: sinceQuery }, popularity: { matches: ['sign', 'popularity'], regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%$/, select: function (context, node) { var popularity = parseFloat(node.popularity) var usage = browserslist.usage.global return Object.keys(usage).reduce(function (result, version) { if (node.sign === '>') { if (usage[version] > popularity) { result.push(version) } } else if (node.sign === '<') { if (usage[version] < popularity) { result.push(version) } } else if (node.sign === '<=') { if (usage[version] <= popularity) { result.push(version) } } else if (usage[version] >= popularity) { result.push(version) } return result }, []) } }, popularity_in_my_stats: { matches: ['sign', 'popularity'], regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%\s+in\s+my\s+stats$/, select: function (context, node) { var popularity = parseFloat(node.popularity) if (!context.customUsage) { throw new BrowserslistError('Custom usage statistics was not provided') } var usage = context.customUsage return Object.keys(usage).reduce(function (result, version) { var percentage = usage[version] if (percentage == null) { return result } if (node.sign === '>') { if (percentage > popularity) { result.push(version) } } else if (node.sign === '<') { if (percentage < popularity) { result.push(version) } } else if (node.sign === '<=') { if (percentage <= popularity) { result.push(version) } } else if (percentage >= popularity) { result.push(version) } return result }, []) } }, popularity_in_config_stats: { matches: ['sign', 'popularity', 'config'], regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%\s+in\s+(\S+)\s+stats$/, select: function (context, node) { var popularity = parseFloat(node.popularity) var stats = env.loadStat(context, node.config, browserslist.data) if (stats) { context.customUsage = {} for (var browser in stats) { fillUsage(context.customUsage, browser, stats[browser]) } } if (!context.customUsage) { throw new BrowserslistError('Custom usage statistics was not provided') } var usage = context.customUsage return Object.keys(usage).reduce(function (result, version) { var percentage = usage[version] if (percentage == null) { return result } if (node.sign === '>') { if (percentage > popularity) { result.push(version) } } else if (node.sign === '<') { if (percentage < popularity) { result.push(version) } } else if (node.sign === '<=') { if (percentage <= popularity) { result.push(version) } } else if (percentage >= popularity) { result.push(version) } return result }, []) } }, popularity_in_place: { matches: ['sign', 'popularity', 'place'], regexp: /^(>=?|<=?)\s*(\d+|\d+\.\d+|\.\d+)%\s+in\s+((alt-)?\w\w)$/, select: function (context, node) { var popularity = parseFloat(node.popularity) var place = node.place if (place.length === 2) { place = place.toUpperCase() } else { place = place.toLowerCase() } env.loadCountry(browserslist.usage, place, browserslist.data) var usage = browserslist.usage[place] return Object.keys(usage).reduce(function (result, version) { var percentage = usage[version] if (percentage == null) { return result } if (node.sign === '>') { if (percentage > popularity) { result.push(version) } } else if (node.sign === '<') { if (percentage < popularity) { result.push(version) } } else if (node.sign === '<=') { if (percentage <= popularity) { result.push(version) } } else if (percentage >= popularity) { result.push(version) } return result }, []) } }, cover: { matches: ['coverage'], regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%$/i, select: coverQuery }, cover_in: { matches: ['coverage', 'place'], regexp: /^cover\s+(\d+|\d+\.\d+|\.\d+)%\s+in\s+(my\s+stats|(alt-)?\w\w)$/i, select: coverQuery }, supports: { matches: ['supportType', 'feature'], regexp: /^(?:(fully|partially)\s+)?supports\s+([\w-]+)$/, select: function (context, node) { env.loadFeature(browserslist.cache, node.feature) var withPartial = node.supportType !== 'fully' var features = browserslist.cache[node.feature] var result = [] for (var name in features) { var data = byName(name, context) // Only check desktop when latest released mobile has support var iMax = data.released.length - 1 while (iMax >= 0) { if (data.released[iMax] in features[name]) break iMax-- } var checkDesktop = context.mobileToDesktop && name in browserslist.desktopNames && isSupported(features[name][data.released[iMax]], withPartial) data.versions.forEach(function (version) { var flags = features[name][version] if (flags === undefined && checkDesktop) { flags = features[browserslist.desktopNames[name]][version] } if (isSupported(flags, withPartial)) { result.push(name + ' ' + version) } }) } return result } }, electron_range: { matches: ['from', 'to'], regexp: /^electron\s+([\d.]+)\s*-\s*([\d.]+)$/i, select: function (context, node) { var fromToUse = normalizeElectron(node.from) var toToUse = normalizeElectron(node.to) var from = parseFloat(node.from) var to = parseFloat(node.to) if (!e2c[fromToUse]) { throw new BrowserslistError('Unknown version ' + from + ' of electron') } if (!e2c[toToUse]) { throw new BrowserslistError('Unknown version ' + to + ' of electron') } return Object.keys(e2c) .filter(function (i) { var parsed = parseFloat(i) return parsed >= from && parsed <= to }) .map(function (i) { return 'chrome ' + e2c[i] }) } }, node_range: { matches: ['from', 'to'], regexp: /^node\s+([\d.]+)\s*-\s*([\d.]+)$/i, select: function (context, node) { return browserslist.nodeVersions .filter(semverFilterLoose('>=', node.from)) .filter(semverFilterLoose('<=', node.to)) .map(function (v) { return 'node ' + v }) } }, browser_range: { matches: ['browser', 'from', 'to'], regexp: /^(\w+)\s+([\d.]+)\s*-\s*([\d.]+)$/i, select: function (context, node) { var data = checkName(node.browser, context) var from = parseFloat(normalizeVersion(data, node.from) || node.from) var to = parseFloat(normalizeVersion(data, node.to) || node.to) function filter(v) { var parsed = parseFloat(v) return parsed >= from && parsed <= to } return data.released.filter(filter).map(nameMapper(data.name)) } }, electron_ray: { matches: ['sign', 'version'], regexp: /^electron\s*(>=?|<=?)\s*([\d.]+)$/i, select: function (context, node) { var versionToUse = normalizeElectron(node.version) return Object.keys(e2c) .filter(generateFilter(node.sign, versionToUse)) .map(function (i) { return 'chrome ' + e2c[i] }) } }, node_ray: { matches: ['sign', 'version'], regexp: /^node\s*(>=?|<=?)\s*([\d.]+)$/i, select: function (context, node) { return browserslist.nodeVersions .filter(generateSemverFilter(node.sign, node.version)) .map(function (v) { return 'node ' + v }) } }, browser_ray: { matches: ['browser', 'sign', 'version'], regexp: /^(\w+)\s*(>=?|<=?)\s*([\d.]+)$/, select: function (context, node) { var version = node.version var data = checkName(node.browser, context) var alias = browserslist.versionAliases[data.name][version] if (alias) version = alias return data.released .filter(generateFilter(node.sign, version)) .map(function (v) { return data.name + ' ' + v }) } }, firefox_esr: { matches: [], regexp: /^(firefox|ff|fx)\s+esr$/i, select: function () { return ['firefox 128'] } }, opera_mini_all: { matches: [], regexp: /(operamini|op_mini)\s+all/i, select: function () { return ['op_mini all'] } }, electron_version: { matches: ['version'], regexp: /^electron\s+([\d.]+)$/i, select: function (context, node) { var versionToUse = normalizeElectron(node.version) var chrome = e2c[versionToUse] if (!chrome) { throw new BrowserslistError( 'Unknown version ' + node.version + ' of electron' ) } return ['chrome ' + chrome] } }, node_major_version: { matches: ['version'], regexp: /^node\s+(\d+)$/i, select: nodeQuery }, node_minor_version: { matches: ['version'], regexp: /^node\s+(\d+\.\d+)$/i, select: nodeQuery }, node_patch_version: { matches: ['version'], regexp: /^node\s+(\d+\.\d+\.\d+)$/i, select: nodeQuery }, current_node: { matches: [], regexp: /^current\s+node$/i, select: function (context) { return [env.currentNode(resolve, context)] } }, maintained_node: { matches: [], regexp: /^maintained\s+node\s+versions$/i, select: function (context) { var now = Date.now() var queries = Object.keys(jsEOL) .filter(function (key) { return ( now < Date.parse(jsEOL[key].end) && now > Date.parse(jsEOL[key].start) && isEolReleased(key) ) }) .map(function (key) { return 'node ' + key.slice(1) }) return resolve(queries, context) } }, phantomjs_1_9: { matches: [], regexp: /^phantomjs\s+1.9$/i, select: function () { return ['safari 5'] } }, phantomjs_2_1: { matches: [], regexp: /^phantomjs\s+2.1$/i, select: function () { return ['safari 6'] } }, browser_version: { matches: ['browser', 'version'], regexp: /^(\w+)\s+(tp|[\d.]+)$/i, select: function (context, node) { var version = node.version if (/^tp$/i.test(version)) version = 'TP' var data = checkName(node.browser, context) var alias = normalizeVersion(data, version) if (alias) { version = alias } else { if (version.indexOf('.') === -1) { alias = version + '.0' } else { alias = version.replace(/\.0$/, '') } alias = normalizeVersion(data, alias) if (alias) { version = alias } else if (context.ignoreUnknownVersions) { return [] } else { throw new BrowserslistError( 'Unknown version ' + version + ' of ' + node.browser ) } } return [data.name + ' ' + version] } }, browserslist_config: { matches: [], regexp: /^browserslist config$/i, select: function (context) { return browserslist(undefined, context) } }, extends: { matches: ['config'], regexp: /^extends (.+)$/i, select: function (context, node) { return resolve(env.loadQueries(context, node.config), context) } }, defaults: { matches: [], regexp: /^defaults$/i, select: function (context) { return resolve(browserslist.defaults, context) } }, dead: { matches: [], regexp: /^dead$/i, select: function (context) { var dead = [ 'Baidu >= 0', 'ie <= 11', 'ie_mob <= 11', 'bb <= 10', 'op_mob <= 12.1', 'samsung 4' ] return resolve(dead, context) } }, unknown: { matches: [], regexp: /^(\w+)$/i, select: function (context, node) { if (byName(node.query, context)) { throw new BrowserslistError( 'Specify versions in Browserslist query for browser ' + node.query ) } else { throw unknownQuery(node.query) } } } } // Get and convert Can I Use data ;(function () { for (var name in agents) { var browser = agents[name] browserslist.data[name] = { name: name, versions: normalize(agents[name].versions), released: normalize(agents[name].versions.slice(0, -3)), releaseDate: agents[name].release_date } fillUsage(browserslist.usage.global, name, browser.usage_global) browserslist.versionAliases[name] = {} for (var i = 0; i < browser.versions.length; i++) { var full = browser.versions[i] if (!full) continue if (full.indexOf('-') !== -1) { var interval = full.split('-') for (var j = 0; j < interval.length; j++) { browserslist.versionAliases[name][interval[j]] = full } } } } browserslist.nodeVersions = jsReleases.map(function (release) { return release.version }) })() module.exports = browserslist browserslist-4.24.4/node.js000066400000000000000000000302631473746235500156560ustar00rootroot00000000000000var feature = require('caniuse-lite/dist/unpacker/feature').default var region = require('caniuse-lite/dist/unpacker/region').default var fs = require('fs') var path = require('path') var BrowserslistError = require('./error') var IS_SECTION = /^\s*\[(.+)]\s*$/ var CONFIG_PATTERN = /^browserslist-config-/ var SCOPED_CONFIG__PATTERN = /@[^/]+(?:\/[^/]+)?\/browserslist-config(?:-|$|\/)/ var FORMAT = 'Browserslist config should be a string or an array ' + 'of strings with browser queries' var dataTimeChecked = false var statCache = {} var configPathCache = {} var parseConfigCache = {} function checkExtend(name) { var use = ' Use `dangerousExtend` option to disable.' if (!CONFIG_PATTERN.test(name) && !SCOPED_CONFIG__PATTERN.test(name)) { throw new BrowserslistError( 'Browserslist config needs `browserslist-config-` prefix. ' + use ) } if (name.replace(/^@[^/]+\//, '').indexOf('.') !== -1) { throw new BrowserslistError( '`.` not allowed in Browserslist config name. ' + use ) } if (name.indexOf('node_modules') !== -1) { throw new BrowserslistError( '`node_modules` not allowed in Browserslist config.' + use ) } } function isFile(file) { return fs.existsSync(file) && fs.statSync(file).isFile() } function isDirectory(dir) { return fs.existsSync(dir) && fs.statSync(dir).isDirectory() } function eachParent(file, callback, cache) { var loc = path.resolve(file) var pathsForCacheResult = [] var result do { if (!pathInRoot(loc)) { break } if (cache && (loc in cache)) { result = cache[loc] break } pathsForCacheResult.push(loc) if (!isDirectory(loc)) { continue } var locResult = callback(loc) if (typeof locResult !== 'undefined') { result = locResult break } } while (loc !== (loc = path.dirname(loc))) if (cache && !process.env.BROWSERSLIST_DISABLE_CACHE) { pathsForCacheResult.forEach(function (cachePath) { cache[cachePath] = result }) } return result } function pathInRoot(p) { if (!process.env.BROWSERSLIST_ROOT_PATH) return true var rootPath = path.resolve(process.env.BROWSERSLIST_ROOT_PATH) if (path.relative(rootPath, p).substring(0, 2) === '..') { return false } return true } function check(section) { if (Array.isArray(section)) { for (var i = 0; i < section.length; i++) { if (typeof section[i] !== 'string') { throw new BrowserslistError(FORMAT) } } } else if (typeof section !== 'string') { throw new BrowserslistError(FORMAT) } } function pickEnv(config, opts) { if (typeof config !== 'object') return config var name if (typeof opts.env === 'string') { name = opts.env } else if (process.env.BROWSERSLIST_ENV) { name = process.env.BROWSERSLIST_ENV } else if (process.env.NODE_ENV) { name = process.env.NODE_ENV } else { name = 'production' } if (opts.throwOnMissing) { if (name && name !== 'defaults' && !config[name]) { throw new BrowserslistError( 'Missing config for Browserslist environment `' + name + '`' ) } } return config[name] || config.defaults } function parsePackage(file) { var text = fs .readFileSync(file) .toString() .replace(/^\uFEFF/m, '') var list if (text.indexOf('"browserslist"') >= 0) { list = JSON.parse(text).browserslist } else if (text.indexOf('"browserlist"') >= 0) { var config = JSON.parse(text) if (config.browserlist && !config.browserslist) { throw new BrowserslistError( '`browserlist` key instead of `browserslist` in ' + file ) } } if (Array.isArray(list) || typeof list === 'string') { list = { defaults: list } } for (var i in list) { check(list[i]) } return list } function parsePackageOrReadConfig(file) { if (file in parseConfigCache) { return parseConfigCache[file] } var isPackage = path.basename(file) === 'package.json' var result = isPackage ? parsePackage(file) : module.exports.readConfig(file) if (!process.env.BROWSERSLIST_DISABLE_CACHE) { parseConfigCache[file] = result } return result } function latestReleaseTime(agents) { var latest = 0 for (var name in agents) { var dates = agents[name].releaseDate || {} for (var key in dates) { if (latest < dates[key]) { latest = dates[key] } } } return latest * 1000 } function getMonthsPassed(date) { var now = new Date() var past = new Date(date) var years = now.getFullYear() - past.getFullYear() var months = now.getMonth() - past.getMonth() return years * 12 + months } function normalizeStats(data, stats) { if (!data) { data = {} } if (stats && 'dataByBrowser' in stats) { stats = stats.dataByBrowser } if (typeof stats !== 'object') return undefined var normalized = {} for (var i in stats) { var versions = Object.keys(stats[i]) if (versions.length === 1 && data[i] && data[i].versions.length === 1) { var normal = data[i].versions[0] normalized[i] = {} normalized[i][normal] = stats[i][versions[0]] } else { normalized[i] = stats[i] } } return normalized } function normalizeUsageData(usageData, data) { for (var browser in usageData) { var browserUsage = usageData[browser] // https://github.com/browserslist/browserslist/issues/431#issuecomment-565230615 // caniuse-db returns { 0: "percentage" } for `and_*` regional stats if ('0' in browserUsage) { var versions = data[browser].versions browserUsage[versions[versions.length - 1]] = browserUsage[0] delete browserUsage[0] } } } module.exports = { loadQueries: function loadQueries(ctx, name) { if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) { checkExtend(name) } var queries = require(require.resolve(name, { paths: ['.', ctx.path] })) if (queries) { if (Array.isArray(queries)) { return queries } else if (typeof queries === 'object') { if (!queries.defaults) queries.defaults = [] return pickEnv(queries, ctx, name) } } throw new BrowserslistError( '`' + name + '` config exports not an array of queries' + ' or an object of envs' ) }, loadStat: function loadStat(ctx, name, data) { if (!ctx.dangerousExtend && !process.env.BROWSERSLIST_DANGEROUS_EXTEND) { checkExtend(name) } var stats = require(require.resolve( path.join(name, 'browserslist-stats.json'), { paths: ['.'] } )) return normalizeStats(data, stats) }, getStat: function getStat(opts, data) { var stats if (opts.stats) { stats = opts.stats } else if (process.env.BROWSERSLIST_STATS) { stats = process.env.BROWSERSLIST_STATS } else if (opts.path && path.resolve && fs.existsSync) { stats = eachParent(opts.path, function (dir) { var file = path.join(dir, 'browserslist-stats.json') return isFile(file) ? file : undefined }, statCache) } if (typeof stats === 'string') { try { stats = JSON.parse(fs.readFileSync(stats)) } catch (e) { throw new BrowserslistError("Can't read " + stats) } } return normalizeStats(data, stats) }, loadConfig: function loadConfig(opts) { if (process.env.BROWSERSLIST) { return process.env.BROWSERSLIST } else if (opts.config || process.env.BROWSERSLIST_CONFIG) { var file = opts.config || process.env.BROWSERSLIST_CONFIG return pickEnv(parsePackageOrReadConfig(file), opts) } else if (opts.path) { return pickEnv(module.exports.findConfig(opts.path), opts) } else { return undefined } }, loadCountry: function loadCountry(usage, country, data) { var code = country.replace(/[^\w-]/g, '') if (!usage[code]) { var compressed try { compressed = require('caniuse-lite/data/regions/' + code + '.js') } catch (e) { throw new BrowserslistError('Unknown region name `' + code + '`.') } var usageData = region(compressed) normalizeUsageData(usageData, data) usage[country] = {} for (var i in usageData) { for (var j in usageData[i]) { usage[country][i + ' ' + j] = usageData[i][j] } } } }, loadFeature: function loadFeature(features, name) { name = name.replace(/[^\w-]/g, '') if (features[name]) return var compressed try { compressed = require('caniuse-lite/data/features/' + name + '.js') } catch (e) { throw new BrowserslistError('Unknown feature name `' + name + '`.') } var stats = feature(compressed).stats features[name] = {} for (var i in stats) { features[name][i] = {} for (var j in stats[i]) { features[name][i][j] = stats[i][j] } } }, parseConfig: function parseConfig(string) { var result = { defaults: [] } var sections = ['defaults'] string .toString() .replace(/#[^\n]*/g, '') .split(/\n|,/) .map(function (line) { return line.trim() }) .filter(function (line) { return line !== '' }) .forEach(function (line) { if (IS_SECTION.test(line)) { sections = line.match(IS_SECTION)[1].trim().split(' ') sections.forEach(function (section) { if (result[section]) { throw new BrowserslistError( 'Duplicate section ' + section + ' in Browserslist config' ) } result[section] = [] }) } else { sections.forEach(function (section) { result[section].push(line) }) } }) return result }, readConfig: function readConfig(file) { if (!isFile(file)) { throw new BrowserslistError("Can't read " + file + ' config') } return module.exports.parseConfig(fs.readFileSync(file)) }, findConfigFile: function findConfigFile(from) { return eachParent(from, function (dir) { var config = path.join(dir, 'browserslist') var pkg = path.join(dir, 'package.json') var rc = path.join(dir, '.browserslistrc') var pkgBrowserslist if (isFile(pkg)) { try { pkgBrowserslist = parsePackage(pkg) } catch (e) { if (e.name === 'BrowserslistError') throw e console.warn( '[Browserslist] Could not parse ' + pkg + '. Ignoring it.' ) } } if (isFile(config) && pkgBrowserslist) { throw new BrowserslistError( dir + ' contains both browserslist and package.json with browsers' ) } else if (isFile(rc) && pkgBrowserslist) { throw new BrowserslistError( dir + ' contains both .browserslistrc and package.json with browsers' ) } else if (isFile(config) && isFile(rc)) { throw new BrowserslistError( dir + ' contains both .browserslistrc and browserslist' ) } else if (isFile(config)) { return config } else if (isFile(rc)) { return rc } else if (pkgBrowserslist) { return pkg } }, configPathCache) }, findConfig: function findConfig(from) { var configFile = this.findConfigFile(from) return configFile ? parsePackageOrReadConfig(configFile) : undefined }, clearCaches: function clearCaches() { dataTimeChecked = false statCache = {} configPathCache = {} parseConfigCache = {} this.cache = {} }, oldDataWarning: function oldDataWarning(agentsObj) { if (dataTimeChecked) return dataTimeChecked = true if (process.env.BROWSERSLIST_IGNORE_OLD_DATA) return var latest = latestReleaseTime(agentsObj) var monthsPassed = getMonthsPassed(latest) if (latest !== 0 && monthsPassed >= 6) { var months = monthsPassed + ' ' + (monthsPassed > 1 ? 'months' : 'month') console.warn( 'Browserslist: browsers data (caniuse-lite) is ' + months + ' old. Please run:\n' + ' npx update-browserslist-db@latest\n' + ' Why you should do it regularly: ' + 'https://github.com/browserslist/update-db#readme' ) } }, currentNode: function currentNode() { return 'node ' + process.versions.node }, env: process.env } browserslist-4.24.4/package.json000066400000000000000000000061071473746235500166610ustar00rootroot00000000000000{ "name": "browserslist", "version": "4.24.4", "description": "Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-env-preset", "keywords": [ "caniuse", "browsers", "target" ], "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "author": "Andrey Sitnik ", "license": "MIT", "repository": "browserslist/browserslist", "scripts": { "unit": "NODE_ENV=test uvu test .test.js", "test:coverage": "c8 pnpm unit", "test:lint": "eslint .", "test:size": "size-limit", "test": "pnpm run /^test:/" }, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" }, "bin": { "browserslist": "cli.js" }, "types": "./index.d.ts", "devDependencies": { "@eslint/eslintrc": "^3.2.0", "@logux/eslint-config": "^53.5.1", "@size-limit/preset-small-lib": "^11.1.6", "c8": "^10.1.3", "clean-publish": "^5.1.0", "cross-spawn": "^7.0.6", "eslint": "^9.16.0", "eslint-plugin-es5": "^1.5.0", "fs-extra": "^11.2.0", "nanospy": "^1.0.0", "size-limit": "^11.1.6", "uvu": "^0.5.6" }, "browser": { "./node.js": "./browser.js", "path": false }, "clean-publish": { "cleanDocs": true }, "c8": { "exclude": [ "**/*.test.*" ], "lines": 100, "reporter": "lcov", "check-coverage": true }, "size-limit": [ { "path": "index.js", "limit": "15 KB" } ], "eslintConfig": { "plugins": [ "es5" ], "extends": [ "@logux/eslint-config", "plugin:es5/no-es2015" ], "rules": { "node-import/prefer-node-protocol": "off", "perfectionist/sort-objects": "off", "prefer-let/prefer-let": "off", "prefer-arrow-callback": "off", "n/global-require": "off", "object-shorthand": "off", "no-console": "off", "no-var": "off" }, "overrides": [ { "files": "test/**/*", "rules": { "n/no-unsupported-features/es-syntax": "off", "es5/no-shorthand-properties": "off", "es5/no-template-literals": "off", "es5/no-rest-parameters": "off", "es5/no-arrow-functions": "off", "es5/no-destructuring": "off", "es5/no-block-scoping": "off", "es5/no-es6-methods": "off", "es5/no-spread": "off", "es5/no-for-of": "off", "no-console": "off" } } ] }, "eslintIgnore": [ "test/fixtures" ], "prettier": { "arrowParens": "avoid", "jsxSingleQuote": false, "quoteProps": "consistent", "semi": false, "singleQuote": true, "trailingComma": "none" } } browserslist-4.24.4/parse.js000066400000000000000000000033751473746235500160470ustar00rootroot00000000000000var AND_REGEXP = /^\s+and\s+(.*)/i var OR_REGEXP = /^(?:,\s*|\s+or\s+)(.*)/i function flatten(array) { if (!Array.isArray(array)) return [array] return array.reduce(function (a, b) { return a.concat(flatten(b)) }, []) } function find(string, predicate) { for (var max = string.length, n = 1; n <= max; n++) { var parsed = string.substr(-n, n) if (predicate(parsed, n, max)) { return string.slice(0, -n) } } return '' } function matchQuery(all, query) { var node = { query: query } if (query.indexOf('not ') === 0) { node.not = true query = query.slice(4) } for (var name in all) { var type = all[name] var match = query.match(type.regexp) if (match) { node.type = name for (var i = 0; i < type.matches.length; i++) { node[type.matches[i]] = match[i + 1] } return node } } node.type = 'unknown' return node } function matchBlock(all, string, qs) { var node return find(string, function (parsed, n, max) { if (AND_REGEXP.test(parsed)) { node = matchQuery(all, parsed.match(AND_REGEXP)[1]) node.compose = 'and' qs.unshift(node) return true } else if (OR_REGEXP.test(parsed)) { node = matchQuery(all, parsed.match(OR_REGEXP)[1]) node.compose = 'or' qs.unshift(node) return true } else if (n === max) { node = matchQuery(all, parsed.trim()) node.compose = 'or' qs.unshift(node) return true } return false }) } module.exports = function parse(all, queries) { if (!Array.isArray(queries)) queries = [queries] return flatten( queries.map(function (block) { var qs = [] do { block = matchBlock(all, block, qs) } while (block) return qs }) ) } browserslist-4.24.4/pnpm-lock.yaml000066400000000000000000003074551473746235500171710ustar00rootroot00000000000000lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: .: dependencies: caniuse-lite: specifier: ^1.0.30001688 version: 1.0.30001688 electron-to-chromium: specifier: ^1.5.73 version: 1.5.73 node-releases: specifier: ^2.0.19 version: 2.0.19 update-browserslist-db: specifier: ^1.1.1 version: 1.1.1(browserslist@4.24.0) devDependencies: '@eslint/eslintrc': specifier: ^3.2.0 version: 3.2.0 '@logux/eslint-config': specifier: ^53.5.1 version: 53.5.1(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@size-limit/preset-small-lib': specifier: ^11.1.6 version: 11.1.6(size-limit@11.1.6) c8: specifier: ^10.1.3 version: 10.1.3 clean-publish: specifier: ^5.1.0 version: 5.1.0 cross-spawn: specifier: ^7.0.6 version: 7.0.6 eslint: specifier: ^9.16.0 version: 9.16.0(jiti@2.4.1) eslint-plugin-es5: specifier: ^1.5.0 version: 1.5.0(eslint@9.16.0(jiti@2.4.1)) fs-extra: specifier: ^11.2.0 version: 11.2.0 nanospy: specifier: ^1.0.0 version: 1.0.0 size-limit: specifier: ^11.1.6 version: 11.1.6 uvu: specifier: ^0.5.6 version: 0.5.6 packages: '@bcoe/v8-coverage@1.0.1': resolution: {integrity: sha512-W+a0/JpU28AqH4IKtwUPcEUnUyXMDLALcn5/JLczGGT9fHE2sIby/xP/oQnx3nxkForzgzPy201RAKcB4xPAFQ==} engines: {node: '>=18'} '@esbuild/aix-ppc64@0.24.0': resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.24.0': resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.24.0': resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.24.0': resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.24.0': resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.24.0': resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.24.0': resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.24.0': resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.24.0': resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.24.0': resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.24.0': resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.24.0': resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.24.0': resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.24.0': resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.24.0': resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.24.0': resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.24.0': resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.24.0': resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.24.0': resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.24.0': resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.24.0': resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.24.0': resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.24.0': resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.24.0': resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.19.1': resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.9.1': resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.16.0': resolution: {integrity: sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.5': resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.2.4': resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} '@humanfs/node@0.16.6': resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} '@humanwhocodes/retry@0.4.1': resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@logux/eslint-config@53.5.1': resolution: {integrity: sha512-rw8NxhTWPcqBTenTrKhuLwq4vpecogq+cw7g0q9/QTbj+Waj2POZMuhS7Dn9UoXkmJ5r5n1gdyURHKZsB8MOLg==} engines: {node: '>=18.0.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 eslint-plugin-svelte: ^2.35.1 svelte: ^4.2.12 || ^5.0.0 peerDependenciesMeta: eslint-plugin-svelte: optional: true svelte: optional: true '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@size-limit/esbuild@11.1.6': resolution: {integrity: sha512-0nBKYSxeRjUVCVoCkWZbmGkGBwpm0HdwHedWgxksBGxTKU0PjOMSHc3XTjKOrXBKXQzw90Ue0mgOd4n6zct9SA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: size-limit: 11.1.6 '@size-limit/file@11.1.6': resolution: {integrity: sha512-ojzzJMrTfcSECRnaTjGy0wNIolTCRdyqZTSWG9sG5XEoXG6PNgHXDDS6gf6YNxnqb+rWfCfVe93u6aKi3wEocQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: size-limit: 11.1.6 '@size-limit/preset-small-lib@11.1.6': resolution: {integrity: sha512-hlmkBlOryJIsKlGpS61Ti7/EEZomygAzOabpo2htdxUbkCkvtVoUQpGWHUfWuxdhheDVF6rtZZ6lPGftMKlaQg==} peerDependencies: size-limit: 11.1.6 '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} '@typescript-eslint/eslint-plugin@8.18.0': resolution: {integrity: sha512-NR2yS7qUqCL7AIxdJUQf2MKKNDVNaig/dEB0GBLU7D+ZdHgK1NoH/3wsgO3OnPVipn51tG3MAwaODEGil70WEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/parser@8.18.0': resolution: {integrity: sha512-hgUZ3kTEpVzKaK3uNibExUYm6SKKOmTU2BOxBSvOYwtJEPdVQ70kZJpPjstlnhCHcuc2WGfSbpKlb/69ttyN5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/scope-manager@8.18.0': resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.18.0': resolution: {integrity: sha512-er224jRepVAVLnMF2Q7MZJCq5CsdH2oqjP4dT7K6ij09Kyd+R21r7UVJrF0buMVdZS5QRhDzpvzAxHxabQadow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/types@8.18.0': resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.18.0': resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/utils@8.18.0': resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/visitor-keys@8.18.0': resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} ansi-regex@6.1.0: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} browserslist@4.24.0: resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bytes-iec@3.1.1: resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} engines: {node: '>= 0.8'} c8@10.1.3: resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} engines: {node: '>=18'} hasBin: true peerDependencies: monocart-coverage-reports: ^2 peerDependenciesMeta: monocart-coverage-reports: optional: true call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} call-bound@1.0.2: resolution: {integrity: sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} caniuse-lite@1.0.30001688: resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} clean-publish@5.1.0: resolution: {integrity: sha512-Gbz8x7sL/sn0j+2B+yYEumD17WmPT6pHLN+A5nhcd0Sdh86EYblQleU+dUIICXVFalFMFBdW2aGynrVJ6k1u4Q==} engines: {node: '>= 18.0.0'} hasBin: true cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} dunder-proto@1.0.0: resolution: {integrity: sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==} engines: {node: '>= 0.4'} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} electron-to-chromium@1.5.73: resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} es-abstract@1.23.5: resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} engines: {node: '>= 0.4'} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} esbuild@0.24.0: resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} engines: {node: '>=18'} hasBin: true escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} eslint-compat-utils@0.5.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' eslint-config-standard@17.1.0: resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} engines: {node: '>=12.0.0'} peerDependencies: eslint: ^8.0.1 eslint-plugin-import: ^2.25.2 eslint-plugin-n: '^15.0.0 || ^16.0.0 ' eslint-plugin-promise: ^6.0.0 eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} eslint-module-utils@2.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' eslint-import-resolver-node: '*' eslint-import-resolver-typescript: '*' eslint-import-resolver-webpack: '*' peerDependenciesMeta: '@typescript-eslint/parser': optional: true eslint: optional: true eslint-import-resolver-node: optional: true eslint-import-resolver-typescript: optional: true eslint-import-resolver-webpack: optional: true eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' eslint-plugin-es5@1.5.0: resolution: {integrity: sha512-Qxmfo7v2B7SGAEURJo0dpBweFf+JU15kSyALfiB2rXWcBuJ96r6X9kFHXFnhdopPHCaHjoQs1xQPUJVbGMb1AA==} peerDependencies: eslint: '>= 3.0.0' eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true eslint-plugin-n@17.15.0: resolution: {integrity: sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' eslint-plugin-perfectionist@3.9.1: resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' svelte: '>=3.0.0' svelte-eslint-parser: ^0.41.1 vue-eslint-parser: '>=9.0.0' peerDependenciesMeta: astro-eslint-parser: optional: true svelte: optional: true svelte-eslint-parser: optional: true vue-eslint-parser: optional: true eslint-plugin-prefer-let@4.0.0: resolution: {integrity: sha512-X4ep5PMO1320HKaNC9DM5+p6XvOhwv+RcqGjhv3aiw9iAtHhiFtdIUB5l0Zya0iM22ys2BGKzrNI9Xpw/ZHooQ==} engines: {node: '>=0.10.0'} eslint-plugin-promise@7.2.1: resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.0: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.16.0: resolution: {integrity: sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' peerDependenciesMeta: jiti: optional: true espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fdir@6.4.2: resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} function.prototype.name@1.1.6: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.2.6: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} get-symbol-description@1.0.2: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} globals@15.13.0: resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-proto@1.2.0: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} is-async-function@2.0.0: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} is-boolean-object@1.2.1: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} is-finalizationregistry@1.1.0: resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} is-number-object@1.1.0: resolution: {integrity: sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==} engines: {node: '>= 0.4'} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} is-shared-array-buffer@1.0.3: resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} engines: {node: '>= 0.4'} is-string@1.1.0: resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==} engines: {node: '>= 0.4'} is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} is-typed-array@1.1.13: resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} is-weakref@1.1.0: resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} engines: {node: '>= 0.4'} is-weakset@2.0.3: resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} engines: {node: '>= 0.4'} isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} istanbul-reports@3.1.7: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jiti@2.4.1: resolution: {integrity: sha512-yPBThwecp1wS9DmoA4x4KR2h3QoslacnDR8ypuFM962kI4/456Iy1oHx2RAgh4jfZNdn0bctsdadceiBUgpU1g==} hasBin: true js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} math-intrinsics@1.0.0: resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} engines: {node: '>= 0.4'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} nanoid@5.0.9: resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==} engines: {node: ^18 || >=20} hasBin: true nanospinner@1.2.2: resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} nanospy@1.0.0: resolution: {integrity: sha512-wvmmALNstRRhLhy7RV11NCRY2k1zxstImiju4VyyKNNRIKDVjyBtmEd/Q4G82/3dN4VSTe+0PRR3DUAASSbEEQ==} engines: {node: ^8.0.0 || ^10.0.0 || ^12.0.0 || ^14.0.0 || ^16.0.0 || ^18.0.0 || >=20.0.0} natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} object-inspect@1.13.3: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} object.groupby@1.0.3: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} object.values@1.2.0: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} readdirp@4.0.2: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} reflect.getprototypeof@1.0.8: resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} engines: {node: '>= 0.4'} regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} set-function-name@2.0.2: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} size-limit@11.1.6: resolution: {integrity: sha512-S5ux2IB8rU26xwVgMskmknGMFkieaIAqDLuwgKiypk6oa4lFsie8yFPrzRFV+yrLDY2GddjXuCaVk5PveVOHiQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} strip-ansi@7.1.0: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} test-exclude@7.0.1: resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} engines: {node: '>=18'} tinyglobby@0.2.10: resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} typed-array-byte-length@1.0.1: resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} typed-array-byte-offset@1.0.3: resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} engines: {node: '>= 0.4'} typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typescript-eslint@8.18.0: resolution: {integrity: sha512-Xq2rRjn6tzVpAyHr3+nmSg1/9k9aIHnJ2iZeOH7cfGOWqTkXTm3kwpQglEuLGdNrYvPF+2gtAs+/KF5rjVo+WQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' typescript@5.6.2: resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} uvu@0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} hasBin: true v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} which-boxed-primitive@1.1.0: resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==} engines: {node: '>= 0.4'} which-builtin-type@1.2.1: resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} which-typed-array@1.1.16: resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} engines: {node: '>= 0.4'} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} wrap-ansi@8.1.0: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} snapshots: '@bcoe/v8-coverage@1.0.1': {} '@esbuild/aix-ppc64@0.24.0': optional: true '@esbuild/android-arm64@0.24.0': optional: true '@esbuild/android-arm@0.24.0': optional: true '@esbuild/android-x64@0.24.0': optional: true '@esbuild/darwin-arm64@0.24.0': optional: true '@esbuild/darwin-x64@0.24.0': optional: true '@esbuild/freebsd-arm64@0.24.0': optional: true '@esbuild/freebsd-x64@0.24.0': optional: true '@esbuild/linux-arm64@0.24.0': optional: true '@esbuild/linux-arm@0.24.0': optional: true '@esbuild/linux-ia32@0.24.0': optional: true '@esbuild/linux-loong64@0.24.0': optional: true '@esbuild/linux-mips64el@0.24.0': optional: true '@esbuild/linux-ppc64@0.24.0': optional: true '@esbuild/linux-riscv64@0.24.0': optional: true '@esbuild/linux-s390x@0.24.0': optional: true '@esbuild/linux-x64@0.24.0': optional: true '@esbuild/netbsd-x64@0.24.0': optional: true '@esbuild/openbsd-arm64@0.24.0': optional: true '@esbuild/openbsd-x64@0.24.0': optional: true '@esbuild/sunos-x64@0.24.0': optional: true '@esbuild/win32-arm64@0.24.0': optional: true '@esbuild/win32-ia32@0.24.0': optional: true '@esbuild/win32-x64@0.24.0': optional: true '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@2.4.1))': dependencies: eslint: 9.16.0(jiti@2.4.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.19.1': dependencies: '@eslint/object-schema': 2.1.5 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@eslint/core@0.9.1': dependencies: '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color '@eslint/js@9.16.0': {} '@eslint/object-schema@2.1.5': {} '@eslint/plugin-kit@0.2.4': dependencies: levn: 0.4.1 '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': dependencies: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.1': {} '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/schema@0.1.3': {} '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 '@logux/eslint-config@53.5.1(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@eslint/eslintrc': 3.2.0 eslint: 9.16.0(jiti@2.4.1) eslint-config-standard: 17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint-plugin-n@17.15.0(eslint@9.16.0(jiti@2.4.1)))(eslint-plugin-promise@7.2.1(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-n: 17.15.0(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-perfectionist: 3.9.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) eslint-plugin-prefer-let: 4.0.0 eslint-plugin-promise: 7.2.1(eslint@9.16.0(jiti@2.4.1)) typescript-eslint: 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) transitivePeerDependencies: - '@typescript-eslint/parser' - astro-eslint-parser - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - svelte-eslint-parser - typescript - vue-eslint-parser '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 '@nodelib/fs.stat@2.0.5': {} '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 '@pkgjs/parseargs@0.11.0': optional: true '@rtsao/scc@1.1.0': {} '@size-limit/esbuild@11.1.6(size-limit@11.1.6)': dependencies: esbuild: 0.24.0 nanoid: 5.0.9 size-limit: 11.1.6 '@size-limit/file@11.1.6(size-limit@11.1.6)': dependencies: size-limit: 11.1.6 '@size-limit/preset-small-lib@11.1.6(size-limit@11.1.6)': dependencies: '@size-limit/esbuild': 11.1.6(size-limit@11.1.6) '@size-limit/file': 11.1.6(size-limit@11.1.6) size-limit: 11.1.6 '@types/estree@1.0.6': {} '@types/istanbul-lib-coverage@2.0.6': {} '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} '@typescript-eslint/eslint-plugin@8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/type-utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.18.0 eslint: 9.16.0(jiti@2.4.1) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 ts-api-utils: 1.4.3(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/types': 8.18.0 '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.18.0 debug: 4.4.0 eslint: 9.16.0(jiti@2.4.1) typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/scope-manager@8.18.0': dependencies: '@typescript-eslint/types': 8.18.0 '@typescript-eslint/visitor-keys': 8.18.0 '@typescript-eslint/type-utils@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.2) '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) debug: 4.4.0 eslint: 9.16.0(jiti@2.4.1) ts-api-utils: 1.4.3(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.18.0': {} '@typescript-eslint/typescript-estree@8.18.0(typescript@5.6.2)': dependencies: '@typescript-eslint/types': 8.18.0 '@typescript-eslint/visitor-keys': 8.18.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.4.3(typescript@5.6.2) typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/utils@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) '@typescript-eslint/scope-manager': 8.18.0 '@typescript-eslint/types': 8.18.0 '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.2) eslint: 9.16.0(jiti@2.4.1) typescript: 5.6.2 transitivePeerDependencies: - supports-color '@typescript-eslint/visitor-keys@8.18.0': dependencies: '@typescript-eslint/types': 8.18.0 eslint-visitor-keys: 4.2.0 acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 acorn@8.14.0: {} ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@6.2.1: {} argparse@2.0.1: {} array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.8 is-array-buffer: 3.0.4 array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-object-atoms: 1.0.0 get-intrinsic: 1.2.6 is-string: 1.1.0 array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.6 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 balanced-match@1.0.2: {} brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 braces@3.0.3: dependencies: fill-range: 7.1.1 browserslist@4.24.0: dependencies: caniuse-lite: 1.0.30001688 electron-to-chromium: 1.5.73 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.0) bytes-iec@3.1.1: {} c8@10.1.3: dependencies: '@bcoe/v8-coverage': 1.0.1 '@istanbuljs/schema': 0.1.3 find-up: 5.0.0 foreground-child: 3.3.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.1.7 test-exclude: 7.0.1 v8-to-istanbul: 9.3.0 yargs: 17.7.2 yargs-parser: 21.1.1 call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 get-intrinsic: 1.2.6 set-function-length: 1.2.2 call-bound@1.0.2: dependencies: call-bind: 1.0.8 get-intrinsic: 1.2.6 callsites@3.1.0: {} caniuse-lite@1.0.30001688: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 chokidar@4.0.1: dependencies: readdirp: 4.0.2 clean-publish@5.1.0: dependencies: cross-spawn: 7.0.6 fast-glob: 3.3.2 lilconfig: 3.1.3 micromatch: 4.0.8 cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} concat-map@0.0.1: {} convert-source-map@2.0.0: {} cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 data-view-buffer@1.0.1: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-length@1.0.1: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 data-view-byte-offset@1.0.0: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 is-data-view: 1.0.2 debug@3.2.7: dependencies: ms: 2.1.3 debug@4.4.0: dependencies: ms: 2.1.3 deep-is@0.1.4: {} define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 define-properties@1.2.1: dependencies: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 dequal@2.0.3: {} diff@5.2.0: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 dunder-proto@1.0.0: dependencies: call-bind-apply-helpers: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 eastasianwidth@0.2.0: {} electron-to-chromium@1.5.73: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 es-abstract@1.23.5: dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.7 call-bind: 1.0.8 data-view-buffer: 1.0.1 data-view-byte-length: 1.0.1 data-view-byte-offset: 1.0.0 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 function.prototype.name: 1.1.6 get-intrinsic: 1.2.6 get-symbol-description: 1.0.2 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 internal-slot: 1.1.0 is-array-buffer: 3.0.4 is-callable: 1.2.7 is-data-view: 1.0.2 is-negative-zero: 2.0.3 is-regex: 1.2.1 is-shared-array-buffer: 1.0.3 is-string: 1.1.0 is-typed-array: 1.1.13 is-weakref: 1.1.0 object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.3 safe-regex-test: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 typed-array-byte-offset: 1.0.3 typed-array-length: 1.0.7 unbox-primitive: 1.0.2 which-typed-array: 1.1.16 es-define-property@1.0.1: {} es-errors@1.3.0: {} es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 es-set-tostringtag@2.0.3: dependencies: get-intrinsic: 1.2.6 has-tostringtag: 1.0.2 hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 esbuild@0.24.0: optionalDependencies: '@esbuild/aix-ppc64': 0.24.0 '@esbuild/android-arm': 0.24.0 '@esbuild/android-arm64': 0.24.0 '@esbuild/android-x64': 0.24.0 '@esbuild/darwin-arm64': 0.24.0 '@esbuild/darwin-x64': 0.24.0 '@esbuild/freebsd-arm64': 0.24.0 '@esbuild/freebsd-x64': 0.24.0 '@esbuild/linux-arm': 0.24.0 '@esbuild/linux-arm64': 0.24.0 '@esbuild/linux-ia32': 0.24.0 '@esbuild/linux-loong64': 0.24.0 '@esbuild/linux-mips64el': 0.24.0 '@esbuild/linux-ppc64': 0.24.0 '@esbuild/linux-riscv64': 0.24.0 '@esbuild/linux-s390x': 0.24.0 '@esbuild/linux-x64': 0.24.0 '@esbuild/netbsd-x64': 0.24.0 '@esbuild/openbsd-arm64': 0.24.0 '@esbuild/openbsd-x64': 0.24.0 '@esbuild/sunos-x64': 0.24.0 '@esbuild/win32-arm64': 0.24.0 '@esbuild/win32-ia32': 0.24.0 '@esbuild/win32-x64': 0.24.0 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.16.0(jiti@2.4.1)): dependencies: eslint: 9.16.0(jiti@2.4.1) semver: 7.6.3 eslint-config-standard@17.1.0(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)))(eslint-plugin-n@17.15.0(eslint@9.16.0(jiti@2.4.1)))(eslint-plugin-promise@7.2.1(eslint@9.16.0(jiti@2.4.1)))(eslint@9.16.0(jiti@2.4.1)): dependencies: eslint: 9.16.0(jiti@2.4.1) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-n: 17.15.0(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-promise: 7.2.1(eslint@9.16.0(jiti@2.4.1)) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.15.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color eslint-module-utils@2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@2.4.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) eslint: 9.16.0(jiti@2.4.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color eslint-plugin-es-x@7.8.0(eslint@9.16.0(jiti@2.4.1)): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) '@eslint-community/regexpp': 4.12.1 eslint: 9.16.0(jiti@2.4.1) eslint-compat-utils: 0.5.1(eslint@9.16.0(jiti@2.4.1)) eslint-plugin-es5@1.5.0(eslint@9.16.0(jiti@2.4.1)): dependencies: eslint: 9.16.0(jiti@2.4.1) eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 9.16.0(jiti@2.4.1) eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint@9.16.0(jiti@2.4.1)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color eslint-plugin-n@17.15.0(eslint@9.16.0(jiti@2.4.1)): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) enhanced-resolve: 5.17.1 eslint: 9.16.0(jiti@2.4.1) eslint-plugin-es-x: 7.8.0(eslint@9.16.0(jiti@2.4.1)) get-tsconfig: 4.8.1 globals: 15.13.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 eslint-plugin-perfectionist@3.9.1(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2): dependencies: '@typescript-eslint/types': 8.18.0 '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) eslint: 9.16.0(jiti@2.4.1) minimatch: 9.0.5 natural-compare-lite: 1.4.0 transitivePeerDependencies: - supports-color - typescript eslint-plugin-prefer-let@4.0.0: dependencies: requireindex: 1.2.0 eslint-plugin-promise@7.2.1(eslint@9.16.0(jiti@2.4.1)): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) eslint: 9.16.0(jiti@2.4.1) eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} eslint@9.16.0(jiti@2.4.1): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@2.4.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.1 '@eslint/core': 0.9.1 '@eslint/eslintrc': 3.2.0 '@eslint/js': 9.16.0 '@eslint/plugin-kit': 0.2.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.1 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: jiti: 2.4.1 transitivePeerDependencies: - supports-color espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 esquery@1.6.0: dependencies: estraverse: 5.3.0 esrecurse@4.3.0: dependencies: estraverse: 5.3.0 estraverse@5.3.0: {} esutils@2.0.3: {} fast-deep-equal@3.1.3: {} fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} fastq@1.17.1: dependencies: reusify: 1.0.4 fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 flat-cache@4.0.1: dependencies: flatted: 3.3.2 keyv: 4.5.4 flatted@3.3.2: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 function-bind@1.1.2: {} function.prototype.name@1.1.6: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 functions-have-names: 1.2.3 functions-have-names@1.2.3: {} get-caller-file@2.0.5: {} get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 dunder-proto: 1.0.0 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 function-bind: 1.1.2 gopd: 1.2.0 has-symbols: 1.1.0 hasown: 2.0.2 math-intrinsics: 1.0.0 get-symbol-description@1.0.2: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 glob-parent@5.1.2: dependencies: is-glob: 4.0.3 glob-parent@6.0.2: dependencies: is-glob: 4.0.3 glob@10.4.5: dependencies: foreground-child: 3.3.0 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 globals@14.0.0: {} globals@15.13.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} has-bigints@1.0.2: {} has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 has-proto@1.2.0: dependencies: dunder-proto: 1.0.0 has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 hasown@2.0.2: dependencies: function-bind: 1.1.2 html-escaper@2.0.2: {} ignore@5.3.2: {} import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 imurmurhash@0.1.4: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 is-array-buffer@3.0.4: dependencies: call-bind: 1.0.8 get-intrinsic: 1.2.6 is-async-function@2.0.0: dependencies: has-tostringtag: 1.0.2 is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 is-boolean-object@1.2.1: dependencies: call-bound: 1.0.2 has-tostringtag: 1.0.2 is-callable@1.2.7: {} is-core-module@2.15.1: dependencies: hasown: 2.0.2 is-data-view@1.0.2: dependencies: call-bound: 1.0.2 get-intrinsic: 1.2.6 is-typed-array: 1.1.13 is-date-object@1.1.0: dependencies: call-bound: 1.0.2 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} is-finalizationregistry@1.1.0: dependencies: call-bind: 1.0.8 is-fullwidth-code-point@3.0.0: {} is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-map@2.0.3: {} is-negative-zero@2.0.3: {} is-number-object@1.1.0: dependencies: call-bind: 1.0.8 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-regex@1.2.1: dependencies: call-bound: 1.0.2 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 is-set@2.0.3: {} is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.8 is-string@1.1.0: dependencies: call-bind: 1.0.8 has-tostringtag: 1.0.2 is-symbol@1.1.1: dependencies: call-bound: 1.0.2 has-symbols: 1.1.0 safe-regex-test: 1.1.0 is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.16 is-weakmap@2.0.2: {} is-weakref@1.1.0: dependencies: call-bound: 1.0.2 is-weakset@2.0.3: dependencies: call-bind: 1.0.8 get-intrinsic: 1.2.6 isarray@2.0.5: {} isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 jiti@2.4.1: {} js-yaml@4.1.0: dependencies: argparse: 2.0.1 json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: dependencies: minimist: 1.2.8 jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 keyv@4.5.4: dependencies: json-buffer: 3.0.1 kleur@4.1.5: {} levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 lilconfig@3.1.3: {} locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash.merge@4.6.2: {} lru-cache@10.4.3: {} make-dir@4.0.0: dependencies: semver: 7.6.3 math-intrinsics@1.0.0: {} merge2@1.4.1: {} micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 minimist@1.2.8: {} minipass@7.1.2: {} mri@1.2.0: {} ms@2.1.3: {} nanoid@5.0.9: {} nanospinner@1.2.2: dependencies: picocolors: 1.1.1 nanospy@1.0.0: {} natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} node-releases@2.0.19: {} object-inspect@1.13.3: {} object-keys@1.1.1: {} object.assign@4.1.5: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 has-symbols: 1.1.0 object-keys: 1.1.1 object.fromentries@2.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.5 object.values@1.2.0: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 p-locate@5.0.0: dependencies: p-limit: 3.1.0 package-json-from-dist@1.0.1: {} parent-module@1.0.1: dependencies: callsites: 3.1.0 path-exists@4.0.0: {} path-key@3.1.1: {} path-parse@1.0.7: {} path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 minipass: 7.1.2 picocolors@1.1.1: {} picomatch@2.3.1: {} picomatch@4.0.2: {} possible-typed-array-names@1.0.0: {} prelude-ls@1.2.1: {} punycode@2.3.1: {} queue-microtask@1.2.3: {} readdirp@4.0.2: {} reflect.getprototypeof@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 dunder-proto: 1.0.0 es-abstract: 1.23.5 es-errors: 1.3.0 get-intrinsic: 1.2.6 gopd: 1.2.0 which-builtin-type: 1.2.1 regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 require-directory@2.1.1: {} requireindex@1.2.0: {} resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} resolve@1.22.8: dependencies: is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 sade@1.8.1: dependencies: mri: 1.2.0 safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 call-bound: 1.0.2 get-intrinsic: 1.2.6 has-symbols: 1.1.0 isarray: 2.0.5 safe-regex-test@1.1.0: dependencies: call-bound: 1.0.2 es-errors: 1.3.0 is-regex: 1.2.1 semver@6.3.1: {} semver@7.6.3: {} set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.6 gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.3 side-channel-map@1.0.1: dependencies: call-bound: 1.0.2 es-errors: 1.3.0 get-intrinsic: 1.2.6 object-inspect: 1.13.3 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.2 es-errors: 1.3.0 get-intrinsic: 1.2.6 object-inspect: 1.13.3 side-channel-map: 1.0.1 side-channel@1.1.0: dependencies: es-errors: 1.3.0 object-inspect: 1.13.3 side-channel-list: 1.0.0 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 signal-exit@4.1.0: {} size-limit@11.1.6: dependencies: bytes-iec: 3.1.1 chokidar: 4.0.1 jiti: 2.4.1 lilconfig: 3.1.3 nanospinner: 1.2.2 picocolors: 1.1.1 tinyglobby: 0.2.10 string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 call-bound: 1.0.2 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.5 es-object-atoms: 1.0.0 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 call-bound: 1.0.2 define-properties: 1.2.1 es-object-atoms: 1.0.0 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.0.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: ansi-regex: 6.1.0 strip-bom@3.0.0: {} strip-json-comments@3.1.1: {} supports-color@7.2.0: dependencies: has-flag: 4.0.0 supports-preserve-symlinks-flag@1.0.0: {} tapable@2.2.1: {} test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 glob: 10.4.5 minimatch: 9.0.5 tinyglobby@0.2.10: dependencies: fdir: 6.4.2(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 ts-api-utils@1.4.3(typescript@5.6.2): dependencies: typescript: 5.6.2 tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 is-typed-array: 1.1.13 typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.13 typed-array-byte-offset@1.0.3: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.13 reflect.getprototypeof: 1.0.8 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.8 typescript-eslint@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2): dependencies: '@typescript-eslint/eslint-plugin': 8.18.0(@typescript-eslint/parser@8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2))(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@typescript-eslint/parser': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) '@typescript-eslint/utils': 8.18.0(eslint@9.16.0(jiti@2.4.1))(typescript@5.6.2) eslint: 9.16.0(jiti@2.4.1) typescript: 5.6.2 transitivePeerDependencies: - supports-color typescript@5.6.2: {} unbox-primitive@1.0.2: dependencies: call-bind: 1.0.8 has-bigints: 1.0.2 has-symbols: 1.1.0 which-boxed-primitive: 1.1.0 universalify@2.0.1: {} update-browserslist-db@1.1.1(browserslist@4.24.0): dependencies: browserslist: 4.24.0 escalade: 3.2.0 picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 uvu@0.5.6: dependencies: dequal: 2.0.3 diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 which-boxed-primitive@1.1.0: dependencies: is-bigint: 1.1.0 is-boolean-object: 1.2.1 is-number-object: 1.1.0 is-string: 1.1.0 is-symbol: 1.1.1 which-builtin-type@1.2.1: dependencies: call-bound: 1.0.2 function.prototype.name: 1.1.6 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.1.0 is-finalizationregistry: 1.1.0 is-generator-function: 1.0.10 is-regex: 1.2.1 is-weakref: 1.1.0 isarray: 2.0.5 which-boxed-primitive: 1.1.0 which-collection: 1.0.2 which-typed-array: 1.1.16 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.3 which-typed-array@1.1.16: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 word-wrap@1.2.5: {} wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 y18n@5.0.8: {} yargs-parser@21.1.1: {} yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 yocto-queue@0.1.0: {} browserslist-4.24.4/test/000077500000000000000000000000001473746235500153465ustar00rootroot00000000000000browserslist-4.24.4/test/all.test.js000066400000000000000000000013761473746235500174410ustar00rootroot00000000000000const { test } = require('uvu') const { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] const browserslist = require('..') const MAX_VERSIONS = Number.MAX_SAFE_INTEGER const MAX_YEARS = Number.MAX_SAFE_INTEGER const allTest = opts => { const result = browserslist('since 1990', opts) equal(browserslist('last ' + MAX_VERSIONS + ' versions', opts), result) equal(browserslist('last ' + MAX_YEARS + ' years', opts), result) // Removed until mobileToDesktop works for usage queries // equal(browserslist('>= 0%, not unreleased versions', opts), result) } test('Queries for all browsers', () => { allTest() }) test('Queries for all browsers with mobile to desktop', () => { allTest({ mobileToDesktop: true }) }) test.run() browserslist-4.24.4/test/and.test.js000066400000000000000000000017341473746235500174310ustar00rootroot00000000000000let { join } = require('path') let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let PACKAGE = join(__dirname, 'fixtures', 'package2') test('query composition with AND operator', () => { equal(browserslist('ie >= 6, ie <= 7'), [ 'ie 11', 'ie 10', 'ie 9', 'ie 8', 'ie 7', 'ie 6', 'ie 5.5' ]) equal(browserslist('ie >= 6 and ie <= 7'), ['ie 7', 'ie 6']) equal(browserslist('ie < 11 and not ie 7'), [ 'ie 10', 'ie 9', 'ie 8', 'ie 6', 'ie 5.5' ]) }) test('correctly works with not and one-version browsers as AND query', () => { equal(browserslist('last 1 Baidu version and not <2% in AT'), ['baidu 13.52']) }) test('reads config from package.json', () => { equal(browserslist.findConfig(PACKAGE), { defaults: 'ie > 6 and ie 9 or ie 10' }) equal(browserslist(null, { path: PACKAGE }), ['ie 10', 'ie 9']) }) test.run() browserslist-4.24.4/test/benchmark/000077500000000000000000000000001473746235500173005ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/one/000077500000000000000000000000001473746235500200615ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/one/app/000077500000000000000000000000001473746235500206415ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/one/app/css/000077500000000000000000000000001473746235500214315ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/one/app/css/hello.css000066400000000000000000000000001473746235500232340ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/one/package.json000066400000000000000000000001071473746235500223450ustar00rootroot00000000000000{ "private": true, "browserslist": [ "ie 9", "ie 10" ] } browserslist-4.24.4/test/benchmark/run.js000077500000000000000000000011361473746235500204460ustar00rootroot00000000000000#!/usr/bin/env node let { join } = require('path') let browserslist = require('../..') let cases = [ { exists: true, file: join(__dirname, 'one/app/css/hello.css'), n: 5000 }, { exists: true, file: join(__dirname, 'two/app/js/hello.js'), n: 5000 }, { exists: false, file: join(__dirname, 'three/app/js/hello.js'), n: 5000 } ] for (let { exists, file, n } of cases) { for (let i = 0; i < n; i++) { let result = browserslist.findConfig(file) if (!!result !== exists) { throw new Error('expected config to exist but it did not') } } } browserslist-4.24.4/test/benchmark/three/000077500000000000000000000000001473746235500204075ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/three/app/000077500000000000000000000000001473746235500211675ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/three/app/js/000077500000000000000000000000001473746235500216035ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/three/app/js/hello.js000066400000000000000000000000111473746235500232340ustar00rootroot00000000000000// three browserslist-4.24.4/test/benchmark/two/000077500000000000000000000000001473746235500201115ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/two/app/000077500000000000000000000000001473746235500206715ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/two/app/js/000077500000000000000000000000001473746235500213055ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/two/app/js/hello.js000066400000000000000000000000001473746235500227340ustar00rootroot00000000000000browserslist-4.24.4/test/benchmark/two/browserslist000066400000000000000000000000061473746235500225720ustar00rootroot00000000000000ie 11 browserslist-4.24.4/test/browser.test.js000066400000000000000000000026141473746235500203500ustar00rootroot00000000000000let { test } = require('uvu') let { is, equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: {} }, android: { name: 'android', released: ['4.4', '4.4.3-4.4.4', '67'], versions: [], releaseDate: {} }, chrome: { name: 'chrome', released: ['7', '17', '27', '37', '47', '57', '67'], versions: [], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects versions of browser', () => { equal(browserslist('last 2 ie versions'), ['ie 11', 'ie 10']) }) test('does not include unreleased versions', () => { browserslist.data = originData is(browserslist('last 2 safari versions').indexOf('safari TP'), -1) }) test('supports pluralization', () => { equal(browserslist('last 1 ie version'), ['ie 11']) }) test('has case insensitive aliases', () => { equal(browserslist('Last 01 Explorer Version'), ['ie 11']) }) test('has special logic for android', () => { equal(browserslist('last 4 android versions'), ['android 67']) equal(browserslist('last 5 android versions'), [ 'android 67', 'android 4.4.3-4.4.4' ]) }) test.run() browserslist-4.24.4/test/cache.test.js000066400000000000000000000024601473746235500177270ustar00rootroot00000000000000let { writeFile, remove, mkdir } = require('fs-extra') let { tmpdir } = require('os') let { join } = require('path') let { test } = require('uvu') let { equal, not } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let DIR = join(tmpdir(), 'browserslist-' + Math.random()) let CONFIG = join(DIR, 'browserslist') test.before(async () => { await mkdir(DIR) }) test.after.each(() => { browserslist.clearCaches() delete process.env.BROWSERSLIST_DISABLE_CACHE }) test.after(async () => { await Promise.all([remove(CONFIG), remove(DIR)]) }) test('caches configuration but the cache is clearable', async () => { await writeFile(CONFIG, 'ie 8', 'UTF-8') let result1 = browserslist.findConfig(DIR) await writeFile(CONFIG, 'chrome 56', 'UTF-8') let result2 = browserslist.findConfig(DIR) equal(result1, result2) browserslist.clearCaches() let result3 = browserslist.findConfig(DIR) not.equal(result1, result3) }) test('does not use cache when ENV variable set', async () => { process.env.BROWSERSLIST_DISABLE_CACHE = '1' await writeFile(CONFIG, 'ie 8', 'UTF-8') let result1 = browserslist.findConfig(DIR) await writeFile(CONFIG, 'chrome 56', 'UTF-8') let result2 = browserslist.findConfig(DIR) not.equal(result1, result2) }) test.run() browserslist-4.24.4/test/cli.test.js000066400000000000000000000112541473746235500174340ustar00rootroot00000000000000delete require.cache[require.resolve('..')] let spawn = require('cross-spawn') let { join } = require('path') let { test } = require('uvu') let { is, equal, match } = require('uvu/assert') let browserslist = require('..') let pkg = require('../package.json') let STATS = '--stats=' + join(__dirname, 'fixtures/stats.json') let CONF = '--config=' + join(__dirname, 'fixtures/env-config/browserslist') function run(args) { let opts = {} if (typeof args[0] === 'object') { opts = args[0] args = [] } let cli = spawn(join(__dirname, '..', 'cli.js'), args, opts) return new Promise(resolve => { let stdout = '' let stderr = '' cli.stdout.on('data', data => { stdout += data.toString() }) cli.stderr.on('data', data => { stderr += data.toString() }) cli.on('close', code => { resolve({ code: code || 0, stdout, stderr }) }) }) } async function err(...args) { let { code, stdout, stderr } = await run(args) is(stdout, '') is.not(code, 0) return stderr } async function out(...args) { let { code, stdout, stderr } = await run(args) is(stderr, '') is(code, 0) return stdout } async function arr(...args) { let stdout = await out(...args) return stdout.split('\n').filter(Boolean) } function coverage(query, area) { let result = browserslist.coverage(query, area) return Math.round(result * 100) / 100.0 } function ie8cov(area) { return coverage(['ie 8'], area) } test('returns help', async () => { match(await out('--help'), 'Usage:') match(await out('-h'), 'Usage:') }) test('returns version', async () => { let result = pkg.name + ' ' + pkg.version + '\n' is(await out('--version'), result) is(await out('-v'), result) }) test('returns error: `unknown arguments`', async () => { match(await err('--unknown'), 'Unknown arguments') }) test('selects last 2 versions', async () => { equal(await arr('last 2 versions'), browserslist('last 2 versions')) }) test('uses case insensitive aliases', async () => { equal(await arr('Explorer > 10'), browserslist('Explorer > 10')) }) test('returns error `unknown browser query`', async () => { is( await err('unknow'), 'browserslist: Unknown browser query `unknow`. ' + 'Maybe you are using old Browserslist or made typo in query.\n' ) }) test('returns usage in specified country', async () => { match( await out('--coverage=US', 'ie 8'), `These browsers account for ${ie8cov('US')}% of all users in the US` ) }) test('returns usage in specified ares', async () => { let post = '% of all users ' match( await out('--coverage=US,alt-AS,global', 'ie 8'), `These browsers account for ${ie8cov('US') + post}in the US\n` + ` ${ie8cov('alt-AS') + post}in the ALT-AS\n` + ` ${ie8cov() + post}globally\n` ) }) test('returns error: `unknown browser query to get coverage`', async () => { is( await err('--coverage=UK', 'ie8'), 'browserslist: Unknown browser query `ie8`. ' + 'Maybe you are using old Browserslist or made typo in query.\n' ) }) test('reads browserslist config', async () => { equal(await arr(CONF), ['ie 11', 'ie 10']) }) test('reads browserslist config from current directory', async () => { let cwd = join(__dirname, 'fixtures') equal(await arr({ cwd }), ['ie 11', 'ie 10']) }) test('returns error browserslist config', async () => { is( await err('--config="./unknown_path"'), "browserslist: Can't read ./unknown_path config\n" ) }) test('reads browserslist config: env production', async () => { equal(await arr(CONF, '--env="production"'), ['ie 9', 'opera 41']) }) test('returns usage from config', async () => { let result = coverage(['ie 11', 'ie 10']) match(await out(CONF, '--coverage'), `${result}`) }) test('supports custom stats', async () => { equal(await arr(STATS, '> 5% in my stats'), ['ie 11', 'ie 10']) }) test('supports custom stats in coverage', async () => { is( await out('--coverage', STATS, '> 5% in my stats'), 'These browsers account for 15.7% of all users in custom statistics\n' ) }) test('shows Browserslist error', async () => { is( await err({ cwd: join(__dirname, 'fixtures', 'wrong1') }), 'browserslist: Browserslist config ' + 'should be a string or an array of strings with browser queries\n' ) }) test('supports JSON', async () => { is( await out('--json', '"ie 8"'), '{\n "browsers": [\n "ie 8"\n ]\n}\n' ) }) test('supports JSON with coverage', async () => { is( await out('--json', '--coverage=US', '"ie 8"'), '{\n' + ' "browsers": [\n "ie 8"\n ],\n' + ` "coverage": {\n "US": ${ie8cov('US')}\n }\n` + '}\n' ) }) test.run() browserslist-4.24.4/test/config-query.test.js000066400000000000000000000006661473746235500213020ustar00rootroot00000000000000let { join } = require('path') let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let FILE = join(__dirname, 'fixtures', 'env-config', 'test.css') test('supports config query', () => { equal( browserslist('browserslist config, not chrome >0', { path: FILE, env: 'development' }), ['firefox 50'] ) }) test.run() browserslist-4.24.4/test/config.test.js000066400000000000000000000111041473746235500201240ustar00rootroot00000000000000let { join } = require('path') let { test } = require('uvu') let { is, equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let RC = join(__dirname, 'fixtures', 'rc', 'test.css') let FILE = join(__dirname, 'fixtures', 'dir', 'test.css') let TYPO = join(__dirname, 'fixtures', 'typo', 'test.css') let BOTH1 = join(__dirname, 'fixtures', 'both1', 'test.css') let BOTH2 = join(__dirname, 'fixtures', 'both2', 'test.css') let BOTH3 = join(__dirname, 'fixtures', 'both3', 'test.css') let WRONG1 = join(__dirname, 'fixtures', 'wrong1', 'test.css') let WRONG2 = join(__dirname, 'fixtures', 'wrong2', 'test.css') let BROKEN = join(__dirname, 'fixtures', 'broken', 'test.css') let STRING = join(__dirname, 'fixtures', 'string', 'test.css') let PACKAGE = join(__dirname, 'fixtures', 'package', 'test.css') let originWarn = console.warn let warnCallCount = 0 test.before.each(() => { warnCallCount = 0 console.warn = () => { warnCallCount++ return true } }) let originCwd = process.cwd() test.after.each(() => { process.chdir(originCwd) console.warn = originWarn }) test('parses queries', () => { equal( browserslist.parseConfig('ie 10\n> 1%'), { defaults: ['ie 10', '> 1%'] } ) }) test('parses comma', () => { equal( browserslist.parseConfig('ie 10, > 1%'), { defaults: ['ie 10', '> 1%'] } ) }) test('removes comments', () => { let config = '# support list\nie 10#bad\n> 1%' equal( browserslist.parseConfig(config), { defaults: ['ie 10', '> 1%'] } ) }) test('supports sections', () => { equal( browserslist.parseConfig('ie 10\n[test]\nie 11'), { defaults: ['ie 10'], test: ['ie 11'] } ) }) test('throws on duplicate sections', () => { let config = '[test]\nie 10\n[production test]\nie 11' throws(() => { browserslist.parseConfig(config) }, /Duplicate section test in Browserslist config/) }) test('trims whitespaces', () => { equal( browserslist.parseConfig('ie 9\n\n [ test] \n \n > 1%\n'), { defaults: ['ie 9'], test: ['> 1%'] } ) }) test('returns undefined on no config', () => { equal(browserslist.findConfig(__dirname), undefined) }) test('findConfigFile returns undefined on no config', () => { equal(browserslist.findConfigFile(__dirname), undefined) }) test('reads config', () => { equal(browserslist.findConfig(FILE), { defaults: ['ie 11', 'ie 10'] }) }) test('findConfigFile returns browserslist', () => { equal(browserslist.findConfigFile(FILE), join(__dirname, 'fixtures', 'browserslist')) }) test('reads .browserslistrc config', () => { equal(browserslist.findConfig(RC), { defaults: ['ie 11'] }) }) test('findConfigFile returns .browserslistrc config', () => { equal(browserslist.findConfigFile(RC), join(__dirname, 'fixtures', 'rc', '.browserslistrc')) }) test('reads config from package.json', () => { equal(browserslist.findConfig(PACKAGE), { defaults: ['ie 9', 'ie 10'] }) }) test('findConfigFile returns package.json', () => { equal(browserslist.findConfigFile(PACKAGE), join(__dirname, 'fixtures', 'package', 'package.json')) }) test('shows warning on broken package.json', () => { equal(browserslist.findConfig(BROKEN), { defaults: ['ie 11', 'ie 10'] }) is(warnCallCount, 1) }) test('shows error on key typo', () => { throws(() => { browserslist.findConfig(TYPO) }, /browserlist/) }) test('reads from dir wich contains both browserslist and package.json', () => { throws(() => { browserslist.findConfig(BOTH1) }, /contains both browserslist and package\.json/) }) test('reads from dir wich contains both .browserslistrc and package.json', () => { throws(() => { browserslist.findConfig(BOTH2) }, /contains both .browserslistrc and package\.json/) }) test('reads from dir wich contains both .browserslistrc and browserslist', () => { throws(() => { browserslist.findConfig(BOTH3) }, /contains both .browserslistrc and browserslist/) }) test('checks config format', () => { throws(() => { browserslist.findConfig(WRONG1) }, /Browserslist config should/) throws(() => { browserslist.findConfig(WRONG2) }, /Browserslist config should/) }) test('reads config with one string', () => { equal(browserslist.findConfig(STRING), { defaults: 'ie 9, ie 8' }) }) test('stops at ROOT', () => { browserslist.clearCaches() process.env.BROWSERSLIST_ROOT_PATH = join(__dirname, 'fixtures', 'dir') equal(browserslist.findConfig(FILE), undefined) }) test('allows up to ROOT', () => { browserslist.clearCaches() process.env.BROWSERSLIST_ROOT_PATH = join(__dirname, 'fixtures') equal(browserslist.findConfig(FILE), { defaults: ['ie 11', 'ie 10'] }) }) test.run() browserslist-4.24.4/test/country.test.js000066400000000000000000000041421473746235500203660ustar00rootroot00000000000000let { test } = require('uvu') let { is, equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originUsage = browserslist.usage test.before.each(() => { browserslist.usage = { US: { 'chrome 999': null, // unreleased 'ie 8': 1, 'ie 9': 5, 'ie 10': 10.1, 'ie 11': 75 }, XX: { 'and_chr 0': 100 } } browserslist.data.and_chr = { name: 'and_chr', versions: ['80'], released: [], releaseDate: {} } }) test.after.each(() => { browserslist.usage = originUsage }) test('selects browsers by popularity', () => { equal(browserslist('> 10% in US'), ['ie 11', 'ie 10']) }) test('selects popularity by more or equal', () => { equal(browserslist('>= 5% in US'), ['ie 11', 'ie 10', 'ie 9']) }) test('selects browsers by unpopularity', () => { equal(browserslist('< 5% in US'), ['ie 8']) }) test('selects unpopularity by less or equal', () => { equal(browserslist('<= 5% in US'), ['ie 9', 'ie 8']) }) test('works with float', () => { equal(browserslist('> 10.2% in US'), ['ie 11']) }) test('works with float that has a leading dot', () => { equal( browserslist('> .2% in US'), [ 'ie 11', 'ie 10', 'ie 9', 'ie 8' ] ) }) test('fixes country case', () => { equal(browserslist('> 10.2% in us'), ['ie 11']) }) test('loads country from Can I Use', () => { is(browserslist('> 1% in RU').length > 0, true) }) test('throw an error on wrong country name from Can I Use', () => { throws(() => browserslist('> 1% in __'), /Unknown region name/) }) test('loads continents from Can I Use', () => { is(browserslist('> 1% in alt-AS').length > 0, true) }) test('throw an error on wrong continent name from Can I Use', () => { throws(() => browserslist('> 1% in alt-__'), /Unknown region name/) }) test('allows omission of the space between the > and the percentage', () => { is(browserslist('>10% in US').length > 0, true) }) test('normalize incorrect caniuse versions for and_*', () => { equal(browserslist('> 50% in XX'), ['and_chr 80']) }) test.run() browserslist-4.24.4/test/cover.test.js000066400000000000000000000036261473746235500200070ustar00rootroot00000000000000let { join } = require('path') let { test } = require('uvu') let { equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let CUSTOM_STATS = join(__dirname, 'fixtures', 'stats.json') let originUsage = browserslist.usage test.before.each(() => { process.env.BROWSERSLIST_STATS = CUSTOM_STATS browserslist.usage = { 'global': { 'ie 5': 50, 'ie 11': 10 }, 'US': { 'ie 8': 2, 'ie 9': 4.4 }, 'alt-us': { 'ie 8': 25, 'ie 9': 10 } } }) test.after.each(() => { delete process.env.BROWSERSLIST_STATS browserslist.usage = originUsage }) test('adds at least one browser', () => { equal(browserslist('cover 1% in my stats'), ['ie 11']) }) test('is case insensitive for custom stat', () => { equal(browserslist('Cover 1% In My Stats'), ['ie 11']) }) test('global coverage', () => { equal(browserslist('cover 0.1%'), ['ie 5']) }) test('is case insensitive for global coverage', () => { equal(browserslist('Cover 0.1%'), ['ie 5']) }) test('country coverage', () => { equal(browserslist('cover 0.1% in US'), ['ie 9']) }) test('country coverage alt', () => { equal(browserslist('cover 0.1% in alt-us'), ['ie 8']) }) test('is case insensitive for country coverage', () => { equal(browserslist('Cover 0.1% in us'), ['ie 9']) equal(browserslist('Cover 0.1% in Alt-US'), ['ie 8']) }) test('adds browsers by popularity', () => { equal(browserslist('cover 20% in my stats'), [ 'chrome 37', 'chrome 36', 'ie 11', 'ie 10' ]) }) test('does not add zero-popularity', () => { let stats = { stats: { ie: { 11: 10, 10: 0 } } } equal(browserslist('cover 20% in my stats', stats), ['ie 11']) }) test('throws error on no stats', () => { delete process.env.BROWSERSLIST_STATS throws( () => browserslist('cover 70% in my stats'), /statistics was not provided/ ) }) test.run() browserslist-4.24.4/test/coverage.test.js000066400000000000000000000044441473746235500204630ustar00rootroot00000000000000let { join } = require('path') let { test } = require('uvu') let { equal, is, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let STATS = join(__dirname, 'fixtures', 'browserslist-stats.json') let CUSTOM_STATS = join(__dirname, 'fixtures', 'stats.json') let custom = { ie: { 8: 3, 9: 10 } } let originUsage = browserslist.usage test.before.each(() => { browserslist.usage = { global: { 'ie 8': 5, 'ie 9': 10.1 }, UK: { 'ie 8': 2, 'ie 9': 4.4 }, RU: { 'ie 0': 2 } } }) test.after.each(() => { delete process.env.BROWSERSLIST_STATS browserslist.usage = originUsage }) test('returns browsers coverage', () => { equal(browserslist.coverage(['ie 8', 'ie 9']), 15.1) }) test('returns zero coverage on empty browsers', () => { equal(browserslist.coverage([]), 0) }) test('returns zero coverage on missed data', () => { equal(browserslist.coverage(['ie 12']), 0) }) test('returns usage in specified country', () => { equal(browserslist.coverage(['ie 9'], 'UK'), 4.4) }) test('accepts country in any case', () => { equal(browserslist.coverage(['ie 9'], 'uk'), 4.4) }) test('accepts mystats to load from custom stats', () => { process.env.BROWSERSLIST_STATS = STATS equal(browserslist.coverage(['ie 8'], 'my stats'), 6) }) test('accepts mystats to load from custom stats with dataByBrowser', () => { process.env.BROWSERSLIST_STATS = CUSTOM_STATS equal(browserslist.coverage(['ie 8'], 'my stats'), 0.1) }) test('throws when no custom stats', () => { throws( () => browserslist.coverage(['ie 8'], 'my stats'), /statistics was not provided/ ) }) test('loads country usage data from Can I Use', () => { is(browserslist.coverage(['ie 8', 'ie 9'], 'US') > 0, true) }) test('loads continents usage data from Can I Use', () => { is(browserslist.coverage(['ie 8', 'ie 9'], 'alt-AS') > 0, true) }) test('fixes statistics of 0 version', () => { is(browserslist.coverage(['ie 9'], 'RU'), 2) }) test('fixes statistics of all version', () => { is(browserslist.coverage(['ie all'], 'RU'), 2) }) test('supports custom statistics', () => { is(browserslist.coverage(['ie 9'], custom), 10) is(browserslist.coverage(['ie 9'], { dataByBrowser: custom }), 10) }) test.run() browserslist-4.24.4/test/custom.test.js000066400000000000000000000051151473746235500201760ustar00rootroot00000000000000let { readFile } = require('fs-extra') let { join } = require('path') let { test } = require('uvu') let { equal, is, throws, match } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } let CUSTOM_STATS = join(__dirname, 'fixtures', 'stats.json') let ANDROID = join(__dirname, 'fixtures', 'android-stats.json') let STATS = join(__dirname, 'fixtures', 'browserslist-stats.json') test.after.each(() => { delete process.env.BROWSERSLIST_STATS browserslist.data = originData }) test('throws error on invalid file', () => { throws(() => browserslist('', { stats: 'no.json' }), "Can't read no.json") }) test('takes stats file from environment variable', () => { process.env.BROWSERSLIST_STATS = CUSTOM_STATS equal(browserslist('> 10% in my stats'), ['ie 11']) }) test('takes stats by path', () => { equal(browserslist('> 10% in my stats', { stats: CUSTOM_STATS }), ['ie 11']) }) test('selects popularity by more or equal', () => { equal(browserslist('>= 5.3% in my stats', { stats: CUSTOM_STATS }), [ 'ie 11', 'ie 10' ]) }) test('selects browsers by unpopularity', () => { equal(browserslist('< 0.5% in my stats', { stats: CUSTOM_STATS }), [ 'chrome 34', 'ie 8' ]) }) test('selects unpopularity by less or equal', () => { equal(browserslist('<= 2.3% in my stats', { stats: CUSTOM_STATS }), [ 'chrome 36', 'chrome 35', 'chrome 34', 'ie 9', 'ie 8' ]) }) test('accepts non-space query', () => { equal(browserslist('>10% in my stats', { stats: CUSTOM_STATS }), ['ie 11']) }) test('takes stats from usage data object', async () => { let data = JSON.parse((await readFile(CUSTOM_STATS)).toString()) equal(browserslist('> 10% in my stats', { stats: data }), ['ie 11']) }) test('works alongside global usage query', () => { let list = browserslist('> 10% in my stats, > 1%', { stats: CUSTOM_STATS }) is(list.length > 1, true) }) test('takes stats from browserslist-stats.json', () => { equal(browserslist('> 5% in my stats', { path: STATS }), ['ie 8']) }) test('normalizes versions', () => { let opts = { stats: ANDROID } let last = browserslist(['last 1 and_chr version'], undefined, true) match(browserslist(['> 3% in my stats'], opts)[0], last[0]) match( browserslist(['> 3% in my stats'], { ...opts, mobileToDesktop: true })[0], last[0] ) equal(browserslist(['> 3% in my stats', 'not and_chr > 0'], opts), []) }) test('throws error on no stats', () => { throws(() => browserslist('> 5% in my stats'), /statistics was not provided/) }) test.run() browserslist-4.24.4/test/dead.test.js000066400000000000000000000005731473746235500175640ustar00rootroot00000000000000let { test } = require('uvu') let { equal, is } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('selects dead browsers by keywords', () => { is.not(browserslist('dead').indexOf('ie 10'), -1) }) test('selects dead browsers case insensitive', () => { equal(browserslist('Dead'), browserslist('dead')) }) test.run() browserslist-4.24.4/test/defaults.test.js000066400000000000000000000011521473746235500204700ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('selects defaults by keywords', () => { equal( browserslist('defaults, ie 6'), browserslist(browserslist.defaults.concat(['ie 6'])) ) }) test('selects defaults case insensitive', () => { equal(browserslist('Defaults'), browserslist(browserslist.defaults)) }) test('should respect options', () => { equal( browserslist('defaults', { mobileToDesktop: true }), browserslist(browserslist.defaults, { mobileToDesktop: true }) ) }) test.run() browserslist-4.24.4/test/direct.test.js000066400000000000000000000050601473746235500201350ustar00rootroot00000000000000let { test } = require('uvu') let { equal, throws, is, not } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('selects browser by name', () => { equal(browserslist('ie 10'), ['ie 10']) }) test('uses case insensitive aliases', () => { let result = browserslist('ie 10') equal(browserslist('Explorer 10'), result) equal(browserslist('IE 10'), result) }) test('raises on unknown name', () => { throws(() => browserslist('unknow 10'), 'Unknown browser unknow') }) test('raises on unknown version', () => { throws(() => browserslist('IE 1'), 'Unknown version 1 of IE') }) test('uses right browser name in error', () => { throws( () => browserslist('chrome 70, ie 11, safari 12.2, safari 12'), 'Unknown version 12.2 of safari' ) }) test('ignores unknown versions on request', () => { equal(browserslist('IE 1, IE 9', { ignoreUnknownVersions: true }), ['ie 9']) }) test('works with joined versions from Can I Use', () => { equal(browserslist('ios 7.0'), ['ios_saf 7.0-7.1']) equal(browserslist('ios 7.1'), ['ios_saf 7.0-7.1']) }) test('allows to miss zero in version', () => { equal(browserslist('ios 7'), ['ios_saf 7.0-7.1']) equal(browserslist('ios 8.0'), ['ios_saf 8']) }) test('supports Safari TP', () => { equal(browserslist('safari tp'), ['safari TP']) equal(browserslist('Safari TP'), ['safari TP']) }) test('supports Can I Use cutted versions', () => { is(browserslist('and_uc 10').length, 1) }) test('supports Can I Use missing mobile versions', () => { let opts = { mobileToDesktop: true } equal(browserslist('chromeandroid 53', opts), ['and_chr 53']) equal(browserslist('and_ff 60', opts), ['and_ff 60']) equal(browserslist('ie_mob 9', opts), ['ie_mob 9']) equal(browserslist('chromeandroid >= 52 and chromeandroid < 54', opts), [ 'and_chr 53', 'and_chr 52' ]) equal(browserslist('and_chr 52-53', opts), ['and_chr 53', 'and_chr 52']) equal(browserslist('android 4.4-38', opts), [ 'android 38', 'android 37', 'android 4.4.3-4.4.4', 'android 4.4' ]) }) test('missing mobile versions are not aliased by default', () => { not.equal(browserslist('chromeandroid 53'), ['and_chr 53']) not.equal(browserslist('and_ff 60'), ['and_ff 60']) throws(() => browserslist('ie_mob 9'), /Unknown version 9 of ie_mob/) throws(() => browserslist('op_mob 30'), /Unknown version 30/) }) test('works for all browsers', () => { not.throws(() => { let first = browserslist(['> 0%', 'dead']) browserslist(first, { mobileToDesktop: true }) }) }) test.run() browserslist-4.24.4/test/electron.test.js000066400000000000000000000036551473746235500205060ustar00rootroot00000000000000let { test } = require('uvu') let { equal, throws, is } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('converts Electron to Chrome', () => { equal(browserslist('electron 1.1'), ['chrome 50']) }) test('supports Electron Patch versions to Chrome', () => { equal(browserslist('electron 4.0.4'), ['chrome 69']) }) test('supports case insensitive Electron name', () => { equal(browserslist('Electron 1.1'), ['chrome 50']) }) test('throws on unknown Electron version', () => { throws(() => browserslist('electron 0.19'), /Unknown version/) }) test('converts Electron to Chrome in ranges', () => { equal(browserslist('electron 0.36-1.2'), [ 'chrome 51', 'chrome 50', 'chrome 49', 'chrome 47' ]) }) test('ignores case in Electron ranges', () => { equal(browserslist('Electron 0.37-1.0'), ['chrome 49']) }) test('supports patch versions in Electron ranges', () => { equal(browserslist('Electron 0.37.5-1.0.3'), ['chrome 49']) }) test('throws on unknown Electron range version', () => { throws(() => browserslist('electron 0.1-1.2'), /Unknown version/) throws(() => browserslist('electron 0.37-999'), /Unknown version/) }) test('converts Electron versions to Chrome', () => { equal(browserslist('electron <= 0.21'), ['chrome 41', 'chrome 39']) }) test('ignores case in Electron versions', () => { equal(browserslist('Electron < 0.21'), ['chrome 39']) }) test('converts Electron patch versions to Chrome', () => { equal(browserslist('Electron < 0.21.5'), ['chrome 39']) }) test('supports last versions for Electron', () => { is(browserslist('last 2 Electron versions').length >= 1, true) }) test('supports last major versions for Electron', () => { is(browserslist('last 2 Electron major versions').length >= 1, true) }) test('supports unreleased versions for Electron', () => { is(browserslist('unreleased Electron versions').length, 0) }) test.run() browserslist-4.24.4/test/error.test.js000066400000000000000000000007671473746235500200250ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') let BrowserslistError = require('../error') let originCapture = Error.captureStackTrace test.after.each(() => { Error.captureStackTrace = originCapture }) test('sets stack', () => { let error = new BrowserslistError('test') equal(typeof error.stack, 'string') }) test('works in Firefox', () => { Error.captureStackTrace = undefined let error = new BrowserslistError('test') equal(error.stack, undefined) }) test.run() browserslist-4.24.4/test/esr.test.js000066400000000000000000000010671473746235500174570ustar00rootroot00000000000000let { test } = require('uvu') let { equal, is } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('selects Firefox ESR', () => { let versions = browserslist('Firefox ESR') is(versions.length >= 1, true) is( versions.every(i => /^firefox \d+$/.test(i)), true ) }) test('uses case insensitive aliases', () => { let result = browserslist('Firefox ESR') equal(browserslist('firefox esr'), result) equal(browserslist('ff esr'), result) equal(browserslist('fx esr'), result) }) test.run() browserslist-4.24.4/test/extends.test.js000066400000000000000000000113061473746235500203350ustar00rootroot00000000000000let { ensureDir, writeFile, remove } = require('fs-extra') let { join } = require('path') let { test } = require('uvu') let { equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let mocked = [] async function mock(name, exports) { let dir = join(__dirname, '..', 'node_modules', name) mocked.push(dir) await ensureDir(dir) let content = 'module.exports = ' + JSON.stringify(exports) await writeFile(join(dir, 'index.js'), content) } test.after.each(async () => { await Promise.all(mocked.map(dir => remove(dir))) mocked = [] delete process.env.BROWSERSLIST_DANGEROUS_EXTEND }) test('uses package', async () => { await mock('browserslist-config-test', ['ie 11']) let result = browserslist(['extends browserslist-config-test', 'ie 6']) equal(result, ['ie 11', 'ie 6']) }) test('uses file in package', async () => { await mock('browserslist-config-test/ie', ['ie 11']) let result = browserslist(['extends browserslist-config-test/ie']) equal(result, ['ie 11']) }) test('works with non-prefixed package with dangerousExtend', async () => { await mock('pkg', ['ie 11']) let result = browserslist(['extends pkg', 'edge 12'], { dangerousExtend: true }) equal(result, ['edge 12', 'ie 11']) }) test('supports BROWSERSLIST_DANGEROUS_EXTEND', async () => { process.env.BROWSERSLIST_DANGEROUS_EXTEND = '1' await mock('pkg', ['ie 11']) let result = browserslist(['extends pkg', 'edge 12']) equal(result, ['edge 12', 'ie 11']) }) test('handles scoped packages', async () => { await mock('@scope/browserslist-config-test', ['ie 11']) let result = browserslist(['extends @scope/browserslist-config-test']) equal(result, ['ie 11']) }) test('handles scoped packages with a dot in the name', async () => { await mock('@example.com/browserslist-config-test', ['ie 11']) let result = browserslist(['extends @example.com/browserslist-config-test']) equal(result, ['ie 11']) }) test('handles file in scoped packages', async () => { await mock('@scope/browserslist-config-test/ie', ['ie 11']) let result = browserslist(['extends @scope/browserslist-config-test/ie']) equal(result, ['ie 11']) }) test('handles file-less scoped packages', async () => { await mock('@scope/browserslist-config', ['ie 11']) let result = browserslist(['extends @scope/browserslist-config']) equal(result, ['ie 11']) }) test('recursively imports configs', async () => { await Promise.all([ mock('browserslist-config-a', ['extends browserslist-config-b', 'ie 9']), mock('browserslist-config-b', ['ie 10']) ]) let result = browserslist(['extends browserslist-config-a']) equal(result, ['ie 10', 'ie 9']) }) test('handles relative queries with local overrides', async () => { await mock('browserslist-config-rel', ['ie 9-10']) let result = browserslist(['extends browserslist-config-rel', 'not ie 9']) equal(result, ['ie 10']) }) test('throws on external package with empty export', async () => { await mock('browserslist-config-wrong', 'some string') throws( () => browserslist(['extends browserslist-config-wrong']), /not an array of queries or an object/ ) }) test('throws when package does not have browserslist-config- prefix', () => { throws( () => browserslist(['extends thing-without-prefix']), /needs `browserslist-config-` prefix/ ) }) test('throws when extends package has dot in path', () => { throws( () => browserslist(['extends browserslist-config-package/../something']), /`.` not allowed/ ) }) test('throws when extends package has node_modules in path', () => { throws( () => browserslist(['extends browserslist-config-test/node_modules/a']), /`node_modules` not allowed/ ) }) test("works with shareable config doesn't contains defaults env", async () => { await mock('browserslist-config-with-env-a', { someEnv: ['ie 10'] }) let result = browserslist(['extends browserslist-config-with-env-a']) equal(result, []) }) test('works with shareable config contains env', async () => { process.env.NODE_ENV = 'someEnv' await mock('browserslist-config-with-env-b', { someEnv: ['ie 10'] }) let result = browserslist(['extends browserslist-config-with-env-b']) equal(result, ['ie 10']) }) test('works with shareable config contains defaults env', async () => { await mock('browserslist-config-with-defaults', { defaults: ['ie 10'] }) let result = browserslist(['extends browserslist-config-with-defaults']) equal(result, ['ie 10']) }) test('throws when external package resolve to nullable', async () => { await mock('browserslist-config-null', null) throws( () => browserslist(['extends browserslist-config-null']), /config exports not an array/ ) }) test.run() browserslist-4.24.4/test/feature.test.js000066400000000000000000000073231473746235500203220ustar00rootroot00000000000000let { test } = require('uvu') let { equal, is, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { and_chr: { name: 'and_chr', versions: ['81'], released: ['81'], releaseDate: {} }, chrome: { name: 'chrome', versions: ['79', '80', '81', '82'], released: ['79', '80', '81'], releaseDate: {} }, ie: { name: 'ie', versions: ['10', '11'], released: ['10', '11'], releaseDate: {} } } }) test.after.each(() => { browserslist.clearCaches() browserslist.data = originData }) test('load features from Can I Use', () => { browserslist.data = originData is(browserslist('supports objectrtc').length > 0, true) }) test('throw an error on wrong feature name from Can I Use', () => { throws( () => browserslist('supports wrong-feature-name'), /Unknown feature name/ ) }) test('selects browsers by feature', () => { browserslist.cache.rtcpeerconnection = { and_chr: { 81: 'y' }, chrome: { 79: 'n', 80: 'n', 81: 'a', 82: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('supports rtcpeerconnection'), [ 'and_chr 81', 'chrome 82', 'chrome 81' ]) }) test('selects browsers by feature, including partial support', () => { browserslist.cache.rtcpeerconnection = { and_chr: { 81: 'y' }, chrome: { 79: 'n', 80: 'n', 81: 'a', 82: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('partially supports rtcpeerconnection'), [ 'and_chr 81', 'chrome 82', 'chrome 81' ]) equal(browserslist('partially supports rtcpeerconnection'), [ 'and_chr 81', 'chrome 82', 'chrome 81' ]) }) test('selects browsers by feature, omiting partial support', () => { browserslist.cache.rtcpeerconnection = { and_chr: { 81: 'y' }, chrome: { 79: 'n', 80: 'n', 81: 'a', 82: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('fully supports rtcpeerconnection'), [ 'and_chr 81', 'chrome 82' ]) equal(browserslist('fully supports rtcpeerconnection'), [ 'and_chr 81', 'chrome 82' ]) }) test('selects browsers by feature with dashes in its name', () => { browserslist.cache['arrow-functions'] = { and_chr: { 81: 'n' }, chrome: { 79: 'n', 80: 'n', 81: 'y', 82: 'y' }, ie: { 10: 'n', 11: 'y' } } equal(browserslist('supports arrow-functions'), [ 'chrome 82', 'chrome 81', 'ie 11' ]) }) test('Selects extra versions with mobile to desktop option', () => { browserslist.cache.filesystem = { and_chr: { 81: 'y' }, chrome: { 79: 'n', 80: 'y', 81: 'y', 82: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('supports filesystem', { mobileToDesktop: true }), [ 'and_chr 82', 'and_chr 81', 'and_chr 80', 'chrome 82', 'chrome 81', 'chrome 80' ]) }) test('Selects extra versions with mobile to desktop and feature missing latest release', () => { browserslist.cache.clipboard = { and_chr: { 80: 'y' }, // not the latest release chrome: { 79: 'y', 80: 'y', 81: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('supports clipboard', { mobileToDesktop: true }), [ 'and_chr 81', 'and_chr 80', 'and_chr 79', 'chrome 81', 'chrome 80', 'chrome 79' ]) }) test('Ignores mobile to desktop if unsupported by latest', () => { browserslist.cache['font-smooth'] = { and_chr: { 81: 'n' }, chrome: { 79: 'n', 80: 'y', 81: 'y', 82: 'y' }, ie: { 10: 'n', 11: 'n' } } equal(browserslist('supports font-smooth', { mobileToDesktop: true }), [ 'chrome 82', 'chrome 81', 'chrome 80' ]) }) test.run() browserslist-4.24.4/test/fixtures/000077500000000000000000000000001473746235500172175ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/android-stats.json000066400000000000000000000000431473746235500226630ustar00rootroot00000000000000{ "and_chr": { "10": 4 } } browserslist-4.24.4/test/fixtures/both1/000077500000000000000000000000001473746235500202345ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/both1/browserslist000066400000000000000000000000341473746235500227160ustar00rootroot00000000000000# File for test ie 11 ie 10 browserslist-4.24.4/test/fixtures/both1/package.json000066400000000000000000000001071473746235500225200ustar00rootroot00000000000000{ "private": true, "browserslist": [ "ie 9", "ie 10" ] } browserslist-4.24.4/test/fixtures/both2/000077500000000000000000000000001473746235500202355ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/both2/.browserslistrc000066400000000000000000000000341473746235500233220ustar00rootroot00000000000000# File for test ie 11 ie 10 browserslist-4.24.4/test/fixtures/both2/package.json000066400000000000000000000001071473746235500225210ustar00rootroot00000000000000{ "private": true, "browserslist": [ "ie 9", "ie 10" ] } browserslist-4.24.4/test/fixtures/both3/000077500000000000000000000000001473746235500202365ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/both3/.browserslistrc000066400000000000000000000000341473746235500233230ustar00rootroot00000000000000# File for test ie 11 ie 10 browserslist-4.24.4/test/fixtures/both3/browserslist000066400000000000000000000000341473746235500227200ustar00rootroot00000000000000# File for test ie 11 ie 10 browserslist-4.24.4/test/fixtures/broken/000077500000000000000000000000001473746235500204775ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/broken/package.json000066400000000000000000000000261473746235500227630ustar00rootroot00000000000000{ "browserslist": [ browserslist-4.24.4/test/fixtures/browserslist000066400000000000000000000000341473746235500217010ustar00rootroot00000000000000# File for test ie 11 ie 10 browserslist-4.24.4/test/fixtures/browserslist-stats.json000066400000000000000000000000721473746235500240070ustar00rootroot00000000000000{ "ie": { "6": 0.01, "7": 0.4, "8": 6 } } browserslist-4.24.4/test/fixtures/dir/000077500000000000000000000000001473746235500177755ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/dir/test.css000066400000000000000000000000001473746235500214540ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/env-config/000077500000000000000000000000001473746235500212525ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/env-config/browserslist000066400000000000000000000001371473746235500237400ustar00rootroot00000000000000# File for test ie 11 ie 10 [development] ff 50 chrome 55 [production staging] ie 9 opera 41 browserslist-4.24.4/test/fixtures/env-config/package.json000066400000000000000000000000261473746235500235360ustar00rootroot00000000000000{ "private": true } browserslist-4.24.4/test/fixtures/env-package/000077500000000000000000000000001473746235500214005ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/env-package/package.json000066400000000000000000000002061473746235500236640ustar00rootroot00000000000000{ "private": true, "browserslist": { "development": ["chrome 55", "firefox 50"], "production": ["ie 9", "opera 41"] } } browserslist-4.24.4/test/fixtures/explorers000066400000000000000000000000121473746235500211560ustar00rootroot00000000000000ie 9 ie 8 browserslist-4.24.4/test/fixtures/package/000077500000000000000000000000001473746235500206125ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/package/package.json000066400000000000000000000000731473746235500231000ustar00rootroot00000000000000{ "private": true, "browserslist": ["ie 9", "ie 10"] } browserslist-4.24.4/test/fixtures/package2/000077500000000000000000000000001473746235500206745ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/package2/package.json000066400000000000000000000001041473746235500231550ustar00rootroot00000000000000{ "private": true, "browserslist": "ie > 6 and ie 9 or ie 10" } browserslist-4.24.4/test/fixtures/rc/000077500000000000000000000000001473746235500176235ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/rc/.browserslistrc000066400000000000000000000000061473746235500227070ustar00rootroot00000000000000ie 11 browserslist-4.24.4/test/fixtures/stats.json000066400000000000000000000003361473746235500212520ustar00rootroot00000000000000{ "dataByBrowser": { "ie": { "8": 0.1, "9": 0.7, "10": 5.3, "11": 10.4 }, "chrome": { "34": 0.2, "35": 0.7, "36": 2.3, "37": 3.5, "999": null } } } browserslist-4.24.4/test/fixtures/string/000077500000000000000000000000001473746235500205255ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/string/package.json000066400000000000000000000000661473746235500230150ustar00rootroot00000000000000{ "private": true, "browserslist": "ie 9, ie 8" } browserslist-4.24.4/test/fixtures/symlink000077700000000000000000000000001473746235500225712explorersustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/typo/000077500000000000000000000000001473746235500202125ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/typo/package.json000066400000000000000000000000531473746235500224760ustar00rootroot00000000000000{ "private": true, "browserlist": [] } browserslist-4.24.4/test/fixtures/wrong1/000077500000000000000000000000001473746235500204345ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/wrong1/package.json000066400000000000000000000000741473746235500227230ustar00rootroot00000000000000{ "private": true, "browserslist": { "ie": 10 } } browserslist-4.24.4/test/fixtures/wrong2/000077500000000000000000000000001473746235500204355ustar00rootroot00000000000000browserslist-4.24.4/test/fixtures/wrong2/package.json000066400000000000000000000000651473746235500227240ustar00rootroot00000000000000{ "private": true, "browserslist": [ 1 ] } browserslist-4.24.4/test/global.test.js000066400000000000000000000023551473746235500201270ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originUsage = browserslist.usage test.before.each(() => { browserslist.usage = { global: { 'ie 8': 1, 'ie 9': 5, 'ie 10': 10.1, 'ie 11': 75 } } }) test.after.each(() => { browserslist.usage = originUsage }) test('selects browsers by popularity', () => { equal(browserslist('> 10%'), ['ie 11', 'ie 10']) }) test('selects popularity by more or equal', () => { equal(browserslist('>= 5%'), ['ie 11', 'ie 10', 'ie 9']) }) test('selects browsers by unpopularity', () => { equal(browserslist('< 5%'), ['ie 8']) }) test('selects unpopularity by less or equal', () => { equal(browserslist('<= 5%'), ['ie 9', 'ie 8']) }) test('accepts non-space query', () => { equal(browserslist('>10%'), ['ie 11', 'ie 10']) }) test('works with float', () => { equal(browserslist('> 10.2%'), ['ie 11']) }) test('works with float that has a leading dot', () => { equal(browserslist('> .2%'), ['ie 11', 'ie 10', 'ie 9', 'ie 8']) }) test('allows omission of the space between the > and the percentage', () => { equal(browserslist('>10%'), ['ie 11', 'ie 10']) }) test.run() browserslist-4.24.4/test/last.test.js000066400000000000000000000053741473746235500176360ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: {} }, edge: { name: 'edge', released: ['12'], versions: ['12', '13'], releaseDate: {} }, chrome: { name: 'chrome', released: ['36', '37', '38', '39'], versions: ['36', '37', '38', '39', '40'], releaseDate: {} }, bb: { name: 'bb', released: ['8'], versions: ['8'], releaseDate: {} }, firefox: { name: 'firefox', released: [], versions: [], releaseDate: {} }, android: { name: 'android', released: ['4.4', '4.4.3-4.4.4', '39'], versions: [], releaseDate: {} }, opera: { name: 'opera', released: ['85', '86'], versions: ['85', '86', '87'], releaseDate: {} }, op_mob: { name: 'op_mob', released: ['12', '12.1', '17'], versions: [], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects versions of each browser', () => { let res = browserslist('last 2 versions', undefined, true) equal(res, [ 'android 39', 'bb 8', 'chrome 39', 'chrome 38', 'edge 12', 'ie 11', 'ie 10', 'op_mob 17', 'opera 86', 'opera 85' ]) }) test('Properly handles Android version jump', () => { equal(browserslist('last 3 android versions'), ['android 39']) equal(browserslist('last 4 android versions'), [ 'android 39', 'android 4.4.3-4.4.4' ]) }) test('Properly handles Opera Mobile version jump', () => { equal(browserslist('last 4 op_mob versions'), ['op_mob 17']) equal(browserslist('last 5 op_mob versions'), ['op_mob 17', 'op_mob 12.1']) }) test('supports pluralization', () => { equal(browserslist('last 1 version'), [ 'android 39', 'bb 8', 'chrome 39', 'edge 12', 'ie 11', 'op_mob 17', 'opera 86' ]) }) test('is case insensitive', () => { equal(browserslist('Last 01 Version'), [ 'android 39', 'bb 8', 'chrome 39', 'edge 12', 'ie 11', 'op_mob 17', 'opera 86' ]) }) test('excludes unreleased versions if enabling mobile to desktop', () => { equal(browserslist('last 2 versions', { mobileToDesktop: true }), [ 'and_chr 39', 'and_chr 38', 'android 39', 'android 38', 'bb 8', 'chrome 39', 'chrome 38', 'edge 12', 'ie 11', 'ie 10', 'ie_mob 11', 'ie_mob 10', 'op_mob 17', 'opera 86', 'opera 85' ]) }) test.run() browserslist-4.24.4/test/main.test.js000066400000000000000000000170731473746235500176160ustar00rootroot00000000000000delete require.cache[require.resolve('..')] let { spyOn, restoreAll } = require('nanospy') let path = require('path') let { test } = require('uvu') let { equal, throws, is, type, not } = require('uvu/assert') let browserslist = require('..') let IE = path.join(__dirname, 'fixtures', 'explorers') let FILE = path.join(__dirname, 'fixtures', 'dir', 'test.css') let LINK = path.join(__dirname, 'fixtures', 'symlink') let CONFIG = path.join(__dirname, 'fixtures', 'env-config', 'test.css') let STRING = path.join(__dirname, 'fixtures', 'string', 'package.json') let PACKAGE = path.join(__dirname, 'fixtures', 'env-package', 'package.json') let DEFAULTS = browserslist(browserslist.defaults) test.after.each(() => { restoreAll() process.env.NODE_ENV = 'test' delete process.env.BROWSERSLIST delete process.env.BROWSERSLIST_CONFIG delete process.env.BROWSERSLIST_ENV delete process.env.BROWSERSLIST_ROOT_PATH }) test('accepts array', () => { equal(browserslist(['ie 11', 'ie 10']), ['ie 11', 'ie 10']) }) test('accepts string', () => { equal(browserslist('ie 11, ie 10'), ['ie 11', 'ie 10']) }) test('trims queries', () => { equal(browserslist(['ie 11 ', ' ie 10']), ['ie 11', 'ie 10']) equal(browserslist('ie 11 , ie 10'), ['ie 11', 'ie 10']) }) test('does not accept non-string and non-array parameters', () => { throws(() => browserslist({}), /an array or string. Got object/) }) test('returns unique array', () => { equal(browserslist('ie 10, ie 10'), ['ie 10']) }) test('returns empty result', () => { equal(browserslist([]), []) equal(browserslist(''), []) }) test('uses environment variable on empty request', () => { process.env.BROWSERSLIST = 'ie 10' equal(browserslist(null, { path: FILE }), ['ie 10']) }) test('reads config on no variable', () => { equal(browserslist(null, { path: FILE }), ['ie 11', 'ie 10']) }) test('reads config by direct path', () => { equal(browserslist(null, { config: IE }), ['ie 9', 'ie 8']) }) test('reads package.json config by direct path', () => { equal(browserslist(null, { config: PACKAGE, env: 'development' }), [ 'chrome 55', 'firefox 50' ]) }) test('reads package.json config with one string', () => { equal(browserslist(null, { config: STRING }), ['ie 9', 'ie 8']) }) test('reads config by direct path in environment variable', () => { process.env.BROWSERSLIST_CONFIG = IE equal(browserslist(null, { path: FILE }), ['ie 9', 'ie 8']) }) test('handles undefined stats and path correctly', () => { let config = { stats: undefined, path: undefined } equal(browserslist([], config), []) }) test('throw an error on wrong path to config', () => { throws(() => browserslist(null, { config: IE + '2' }), /Can't read/) }) if (!/^win/.test(process.platform)) { test('reads config by symlink', () => { equal(browserslist(null, { config: LINK }), ['ie 9', 'ie 8']) }) } test('has default selection', () => { is(browserslist.defaults.length > 0, true) }) test('uses default selection on empty request and no config', () => { equal(browserslist(), DEFAULTS) }) test('uses current dir on undefined path', () => { let loadConfig = spyOn(browserslist, 'loadConfig') equal(browserslist(undefined, { path: undefined }), DEFAULTS) equal(loadConfig.calls, [[{ path: process.cwd() }]]) }) test('uses default selection on disabled path', () => { let loadConfig = spyOn(browserslist, 'loadConfig') equal(browserslist(null, { path: false }), DEFAULTS) equal(loadConfig.calls, [[{ path: false }]]) }) test('raises on unknow query', () => { throws(() => browserslist('good'), 'Unknown browser query `good`') throws(() => browserslist('IE === 9'), 'Unknown browser query `IE === 9`') }) test('raises on missed version', () => { throws( () => browserslist('IE'), 'Specify versions in Browserslist query for browser IE' ) }) test('sorts browsers', () => { equal(browserslist(['ff 10', 'ie 11', 'ie 6', 'ie 10', 'ff 9']), [ 'firefox 10', 'firefox 9', 'ie 11', 'ie 10', 'ie 6' ]) }) test('sorts browsers with version ranges', () => { equal(browserslist(['ios_saf 7', 'ie 11', 'ie 6', 'ios_saf 10']), [ 'ie 11', 'ie 6', 'ios_saf 10.0-10.2', 'ios_saf 7.0-7.1' ]) }) test('throws custom error', () => { let error try { browserslist('wrong') } catch (e) { if (e instanceof Error) error = e } equal(error.name, 'BrowserslistError') type(error.stack, 'string') }) test('excludes queries', () => { equal(browserslist(['ie >= 9', 'not ie 11', 'not ie 10', 'ie 10']), [ 'ie 10', 'ie 9' ]) }) test('excludes queries for 0 version', () => { let browsers = browserslist(['> 1% in US', 'not last 2 and_chr versions']) let android = browsers.filter(i => i.indexOf('and_chr ') !== -1) is(android.length, 0) }) test('excludes queries for all version', () => { let browsers = browserslist(['> 0% in US', 'not last 1 op_mini versions']) let operaMini = browsers.filter(i => i.indexOf('op_mini ') !== -1) is(operaMini.length, 0) }) test('has actual browsers list in docs', () => { let names = browserslist(['last 1 version']).map(i => i.split(' ')[0]) equal(names, [ 'and_chr', 'and_ff', 'and_qq', 'and_uc', 'android', 'baidu', 'bb', 'chrome', 'edge', 'firefox', 'ie', 'ie_mob', 'ios_saf', 'kaios', 'op_mini', 'op_mob', 'opera', 'safari', 'samsung' ]) }) test('throws error on first exclude query', () => { throws( () => browserslist(['not ie 11']), 'Write any browsers query (for instance, `defaults`) ' + 'before `not ie 11`' ) }) test('cleans 0 version', () => { not.match(browserslist(['> 0%', '> 0% in FI']), 'and_chr 0') }) test('uses env options to browserlist config', () => { equal(browserslist(null, { path: CONFIG, env: 'production' }), [ 'ie 9', 'opera 41' ]) equal(browserslist(null, { path: CONFIG, env: 'staging' }), [ 'ie 9', 'opera 41' ]) equal(browserslist(null, { path: CONFIG, env: 'development' }), [ 'chrome 55', 'firefox 50' ]) equal(browserslist(null, { path: CONFIG, env: 'test' }), ['ie 11', 'ie 10']) }) test('uses env options to package.json', () => { equal(browserslist(null, { path: PACKAGE, env: 'production' }), [ 'ie 9', 'opera 41' ]) equal(browserslist(null, { path: PACKAGE, env: 'development' }), [ 'chrome 55', 'firefox 50' ]) equal(browserslist(null, { path: PACKAGE, env: 'test' }), DEFAULTS) }) test('uses NODE_ENV to get environment', () => { process.env.NODE_ENV = 'test' equal(browserslist(null, { path: CONFIG }), ['ie 11', 'ie 10']) }) test('uses BROWSERSLIST_ENV to get environment', () => { process.env.BROWSERSLIST_ENV = 'development' equal(browserslist(null, { path: CONFIG }), ['chrome 55', 'firefox 50']) }) test('uses production environment by default', () => { delete process.env.NODE_ENV equal(browserslist(null, { path: CONFIG }), ['ie 9', 'opera 41']) }) test('correctly works with not and one-version browsers', () => { equal(browserslist('last 1 Baidu version, not <2% in AT'), ['baidu 13.52']) }) test('throws error on missing env', () => { throws( () => browserslist(null, { path: PACKAGE, throwOnMissing: true, env: 'test' }), "Missing config for Browserslist environment 'test'" ) }) test('does not throw error on missing defaults env', () => { equal( browserslist(null, { path: PACKAGE, throwOnMissing: true, env: 'defaults' }), DEFAULTS ) }) test('does not throw error on missing env', () => { equal( browserslist(null, { path: PACKAGE, throwOnMissing: false, env: 'test' }), DEFAULTS ) }) test.run() browserslist-4.24.4/test/major.test.js000066400000000000000000000051001473746235500177660ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: {} }, edge: { name: 'edge', released: ['8', '9', '10', '11.0.1', '11.1', '12'], versions: ['8', '9', '10', '11.0.1', '11.1', '12', '13'], releaseDate: {} }, chrome: { name: 'chrome', released: ['37', '38', '39'], versions: ['37', '38', '39', '40'], releaseDate: {} }, bb: { name: 'bb', released: ['8', '10'], versions: ['8'], releaseDate: {} }, firefox: { name: 'firefox', released: [], versions: [], releaseDate: {} }, android: { name: 'android', released: ['4.4', '4.4.3-4.4.4', '39'], versions: ['4.4', '4.4.3-4.4.4', '39'], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects versions of each browser', () => { equal(browserslist('last 2 major versions'), [ 'android 39', 'bb 10', 'bb 8', 'chrome 39', 'chrome 38', 'edge 12', 'edge 11.1', 'edge 11.0.1', 'ie 11', 'ie 10' ]) }) test('supports pluralization', () => { equal(browserslist('last 1 major version'), [ 'android 39', 'bb 10', 'chrome 39', 'edge 12', 'ie 11' ]) }) test('is case insensitive', () => { equal(browserslist('Last 01 MaJoR Version'), [ 'android 39', 'bb 10', 'chrome 39', 'edge 12', 'ie 11' ]) }) test('selects versions of a single browser', () => { equal(browserslist('last 2 edge major versions'), [ 'edge 12', 'edge 11.1', 'edge 11.0.1' ]) equal(browserslist('last 1 bb major version'), ['bb 10']) equal(browserslist('last 3 Chrome major versions'), [ 'chrome 39', 'chrome 38', 'chrome 37' ]) equal(browserslist('last 2 android major versions'), ['android 39']) }) test('supports non-sequential version numbers', () => { equal(browserslist('last 2 bb major versions'), ['bb 10', 'bb 8']) }) test('supports more versions than have been released', () => { equal(browserslist('last 3 bb major versions'), ['bb 10', 'bb 8']) }) test('supports Can I Use missing mobile versions', () => { let opts = { mobileToDesktop: true } equal(browserslist('last 2 android major versions', opts), [ 'android 39', 'android 38' ]) }) test.run() browserslist-4.24.4/test/node.test.js000066400000000000000000000162641473746235500176200ustar00rootroot00000000000000let { test } = require('uvu') let { equal, throws, is, match } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let arrayContaining = (set, subset) => subset.every(v => set.includes(v)) test('selects Node.js version', () => { equal(browserslist('node 7.5.0'), ['node 7.5.0']) }) test('supports case insensitive Node.js name', () => { equal(browserslist('Node 7.5.0'), ['node 7.5.0']) }) test('throws on unknown Node.js version', () => { throws(() => browserslist('node 3'), /Unknown version/) }) test('throws on malformed Node.js version', () => { throws(() => browserslist('node 8.a'), /Unknown/) throws(() => browserslist('node 8.8.8.8'), /Unknown/) throws(() => browserslist('node 8.01'), /Unknown/) throws(() => browserslist('node 6 - 8.a'), /Unknown/) }) test('return empty array on unknown Node.js version with special flag', () => { equal(browserslist('node 3', { ignoreUnknownVersions: true }), []) }) test('supports selection of Node.js version by major.minor query', () => { equal(browserslist('node 5.1'), ['node 5.1.0']) }) test('supports selection of Node.js version by major version only', () => { equal(browserslist('node 5'), ['node 5.12.0']) }) test('selects maintained Node.js versions', () => { is(Array.isArray(browserslist('maintained node versions')), true) }) test('supports case insensitive query for maintained Node.js versions', () => { is(Array.isArray(browserslist('maintained Node versions')), true) }) test('supports current node version', () => { let versions = browserslist('current node') is(versions.length, 1) match(versions[0], /node \d+\.\d+\.\d+/) }) test('supports comparison operator', () => { equal(browserslist('node <= 5'), [ 'node 5.0.0', 'node 4.9.0', 'node 4.8.0', 'node 4.7.0', 'node 4.6.0', 'node 4.5.0', 'node 4.4.0', 'node 4.3.0', 'node 4.2.0', 'node 4.1.0', 'node 4.0.0', 'node 0.12.0', 'node 0.11.0', 'node 0.10.0', 'node 0.9.0', 'node 0.8.0', 'node 0.7.0', 'node 0.6.0', 'node 0.5.0', 'node 0.4.0', 'node 0.3.0', 'node 0.2.0' ]) equal(browserslist('node < 5'), [ 'node 4.9.0', 'node 4.8.0', 'node 4.7.0', 'node 4.6.0', 'node 4.5.0', 'node 4.4.0', 'node 4.3.0', 'node 4.2.0', 'node 4.1.0', 'node 4.0.0', 'node 0.12.0', 'node 0.11.0', 'node 0.10.0', 'node 0.9.0', 'node 0.8.0', 'node 0.7.0', 'node 0.6.0', 'node 0.5.0', 'node 0.4.0', 'node 0.3.0', 'node 0.2.0' ]) is(browserslist('Node <= 5').length, 22) is( arrayContaining(browserslist('node >= 9'), [ 'node 9.0.0', 'node 9.1.0', 'node 9.2.0', 'node 9.3.0', 'node 9.4.0', 'node 9.5.0', 'node 9.6.0', 'node 9.7.0', 'node 9.8.0', 'node 9.9.0', 'node 9.10.0', 'node 9.11.0', 'node 10.0.0', 'node 10.1.0', 'node 10.2.0', 'node 10.3.0', 'node 10.4.0', 'node 10.5.0', 'node 10.6.0', 'node 10.7.0', 'node 10.8.0', 'node 10.9.0', 'node 10.10.0', 'node 10.11.0', 'node 10.12.0', 'node 10.13.0', 'node 10.14.0', 'node 10.15.0', 'node 11.0.0', 'node 11.1.0', 'node 11.2.0', 'node 11.3.0', 'node 11.4.0', 'node 11.5.0', 'node 11.6.0', 'node 11.7.0', 'node 11.8.0', 'node 11.9.0', 'node 11.10.0' ]), true ) is( arrayContaining(browserslist('node > 9'), [ 'node 9.1.0', 'node 9.2.0', 'node 9.3.0', 'node 9.4.0', 'node 9.5.0', 'node 9.6.0', 'node 9.7.0', 'node 9.8.0', 'node 9.9.0', 'node 9.10.0', 'node 9.11.0', 'node 10.0.0', 'node 10.1.0', 'node 10.2.0', 'node 10.3.0', 'node 10.4.0', 'node 10.5.0', 'node 10.6.0', 'node 10.7.0', 'node 10.8.0', 'node 10.9.0', 'node 10.10.0', 'node 10.11.0', 'node 10.12.0', 'node 10.13.0', 'node 10.14.0', 'node 10.15.0', 'node 11.0.0', 'node 11.1.0', 'node 11.2.0', 'node 11.3.0', 'node 11.4.0', 'node 11.5.0', 'node 11.6.0', 'node 11.7.0', 'node 11.8.0', 'node 11.9.0', 'node 11.10.0' ]), true ) }) test('supports range selection', () => { equal(browserslist('node 4-6'), [ 'node 6.17.0', 'node 6.16.0', 'node 6.15.0', 'node 6.14.0', 'node 6.13.0', 'node 6.12.0', 'node 6.11.0', 'node 6.10.0', 'node 6.9.0', 'node 6.8.0', 'node 6.7.0', 'node 6.6.0', 'node 6.5.0', 'node 6.4.0', 'node 6.3.0', 'node 6.2.0', 'node 6.1.0', 'node 6.0.0', 'node 5.12.0', 'node 5.11.0', 'node 5.10.0', 'node 5.9.0', 'node 5.8.0', 'node 5.7.0', 'node 5.6.0', 'node 5.5.0', 'node 5.4.0', 'node 5.3.0', 'node 5.2.0', 'node 5.1.0', 'node 5.0.0', 'node 4.9.0', 'node 4.8.0', 'node 4.7.0', 'node 4.6.0', 'node 4.5.0', 'node 4.4.0', 'node 4.3.0', 'node 4.2.0', 'node 4.1.0', 'node 4.0.0' ]) equal(browserslist('node 4-6.0.0'), [ 'node 6.0.0', 'node 5.12.0', 'node 5.11.0', 'node 5.10.0', 'node 5.9.0', 'node 5.8.0', 'node 5.7.0', 'node 5.6.0', 'node 5.5.0', 'node 5.4.0', 'node 5.3.0', 'node 5.2.0', 'node 5.1.0', 'node 5.0.0', 'node 4.9.0', 'node 4.8.0', 'node 4.7.0', 'node 4.6.0', 'node 4.5.0', 'node 4.4.0', 'node 4.3.0', 'node 4.2.0', 'node 4.1.0', 'node 4.0.0' ]) equal(browserslist('node 6.5-7.5'), [ 'node 7.5.0', 'node 7.4.0', 'node 7.3.0', 'node 7.2.0', 'node 7.1.0', 'node 7.0.0', 'node 6.17.0', 'node 6.16.0', 'node 6.15.0', 'node 6.14.0', 'node 6.13.0', 'node 6.12.0', 'node 6.11.0', 'node 6.10.0', 'node 6.9.0', 'node 6.8.0', 'node 6.7.0', 'node 6.6.0', 'node 6.5.0' ]) equal(browserslist('node 6.6.4-7.7.5'), [ 'node 7.7.0', 'node 7.6.0', 'node 7.5.0', 'node 7.4.0', 'node 7.3.0', 'node 7.2.0', 'node 7.1.0', 'node 7.0.0', 'node 6.17.0', 'node 6.16.0', 'node 6.15.0', 'node 6.14.0', 'node 6.13.0', 'node 6.12.0', 'node 6.11.0', 'node 6.10.0', 'node 6.9.0', 'node 6.8.0', 'node 6.7.0', // include 6.6.0 as patch versions are ignored 'node 6.6.0' ]) }) test('supports last versions for Node.js', () => { is(browserslist('last 2 node versions').length >= 1, true) browserslist.nodeVersions = ['16.0.0', '16.1.0', '17.0.0', '17.1.0'] equal(browserslist('last 3 node versions'), [ 'node 17.1.0', 'node 17.0.0', 'node 16.1.0' ]) }) test('supports last major versions for Node.js', () => { is(browserslist('last 2 node major versions').length >= 1, true) browserslist.nodeVersions = [ '14.0.0', '14.1.0', '15.0.0', '15.1.0', '16.0.0', '16.1.0', '17.0.0', '17.1.0' ] equal(browserslist('last 3 node major versions'), [ 'node 17.1.0', 'node 17.0.0', 'node 16.1.0', 'node 16.0.0', 'node 15.1.0', 'node 15.0.0' ]) }) test.run() browserslist-4.24.4/test/opera.test.js000066400000000000000000000005531473746235500177730ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('selects opera mini', () => { equal(browserslist('op_mini all'), ['op_mini all']) }) test('selects opera mini case insensitive', () => { equal(browserslist('OperaMini All'), ['op_mini all']) }) test.run() browserslist-4.24.4/test/parse.test.js000066400000000000000000000012161473746235500177740ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('parses queries to AST', () => { equal(browserslist.parse('last 2 version and >1%, not ie 11'), [ { query: 'last 2 version', type: 'last_versions', versions: '2', compose: 'or' }, { query: '>1%', type: 'popularity', sign: '>', popularity: '1', compose: 'and' }, { query: 'not ie 11', not: true, type: 'browser_version', browser: 'ie', version: '11', compose: 'or' } ]) }) test.run() browserslist-4.24.4/test/phantomjs.test.js000066400000000000000000000007401473746235500206660ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') test('converts PhantomJS to Safari', () => { equal(browserslist('phantomjs 2.1'), ['safari 6']) equal(browserslist('phantomjs 1.9'), ['safari 5']) }) test('supports case insensitive PhantomJS name', () => { equal(browserslist('PhantomJS 2.1'), ['safari 6']) equal(browserslist('PhantomJS 1.9'), ['safari 5']) }) test.run() browserslist-4.24.4/test/range.test.js000066400000000000000000000022471473746235500177630ustar00rootroot00000000000000let { test } = require('uvu') let { equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['8', '9', '10', '11'], versions: ['8', '9', '10', '11'], releaseDate: {} }, android: { name: 'android', released: ['4.2-4.3', '4.4', '4.4.3-4.4.4', '37'], versions: ['4.2-4.3', '4.4', '4.4.3-4.4.4', '37'], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects a range of browsers', () => { equal(browserslist('ie 8-10'), ['ie 10', 'ie 9', 'ie 8']) }) test('selects versions with query out of range', () => { equal(browserslist('ie 1-12'), ['ie 11', 'ie 10', 'ie 9', 'ie 8']) }) test('selects a range of android browsers', () => { equal(browserslist('android 4.3-37'), [ 'android 37', 'android 4.4.3-4.4.4', 'android 4.4', 'android 4.2-4.3' ]) }) test('raises on an unknown browser', () => { throws(() => browserslist('unknown 4-7'), 'Unknown browser unknown') }) test.run() browserslist-4.24.4/test/release.test.js000066400000000000000000000063651473746235500203140ustar00rootroot00000000000000delete require.cache[require.resolve('..')] let fs = require('fs') let { spyOn, restoreAll } = require('nanospy') let { test } = require('uvu') let { equal, is } = require('uvu/assert') let browserslist = require('..') let originData = browserslist.data function createDate(monthBack) { let releaseTime = Date.now() - monthBack * 30 * 24 * 60 * 60 * 1000 return releaseTime / 1000 } let youngerSixMonthsData = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: { 9: createDate(14), 10: createDate(8), 11: createDate(7) } }, edge: { name: 'edge', released: ['14', '15', '16', '17', '18'], versions: ['14', '15', '16', '17', '18'], releaseDate: { 14: createDate(8), 15: createDate(6), 16: createDate(5), 17: createDate(4), 18: null } }, bb: { name: 'bb', released: [], versions: [], releaseDate: {} } } let olderSixMonthsData = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: { 9: createDate(7), 10: createDate(8), 11: createDate(10) } }, edge: { name: 'edge', released: ['14', '15', '16', '17', '18'], versions: ['14', '15', '16', '17', '18'], releaseDate: { 14: createDate(9), 15: createDate(8), 16: createDate(12), 17: createDate(7), 18: null } }, bb: { name: 'bb', released: [], versions: [], releaseDate: {} } } function findPackage(text) { return /package.json/.test(text.toString()) } function mockStatSync() { return { isFile: () => true } } let warn test.before.each(() => { warn = spyOn(console, 'warn', () => true) }) test.after.each(() => { restoreAll() browserslist.clearCaches() delete process.env.BROWSERSLIST_IGNORE_OLD_DATA }) test.after(() => { browserslist.data = originData }) test('does not print warning', () => { browserslist.data = youngerSixMonthsData browserslist('last 2 versions') warn(warn.called, false) }) test('shows warning', () => { browserslist.data = olderSixMonthsData spyOn(fs, 'existsSync', findPackage) spyOn(fs, 'statSync', mockStatSync) browserslist('last 2 versions') const monthsPassed = createDate.arguments ? createDate.arguments : 0; var monthWord = monthsPassed > 1 ? 'months' : 'month' var monthsOldText = monthsPassed + ' ' + monthWord + ' old.' if (monthsPassed === 0) return; equal(warn.calls, [ [ 'Browserslist: caniuse-lite is '+ monthsOldText +' . Please run:\n' + ' npx update-browserslist-db@latest\n' + ' Why you should do it regularly: ' + 'https://github.com/browserslist/update-db#readme' ] ]) }) test('hides warning on request', () => { process.env.BROWSERSLIST_IGNORE_OLD_DATA = 'true' browserslist.data = olderSixMonthsData spyOn(fs, 'existsSync', findPackage) spyOn(fs, 'statSync', mockStatSync) browserslist('last 2 versions') is(warn.called, false) }) test('shows warning only once', () => { browserslist.data = olderSixMonthsData spyOn(fs, 'existsSync', findPackage) spyOn(fs, 'statSync', mockStatSync) browserslist('last 2 versions') browserslist('last 2 versions') is(warn.callCount, 1) }) test.run() browserslist-4.24.4/test/shareable-stats.test.js000066400000000000000000000100661473746235500217470ustar00rootroot00000000000000let { ensureDir, writeFile, remove } = require('fs-extra') let { join } = require('path') let { test } = require('uvu') let { equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let STATS = join(__dirname, 'fixtures', 'browserslist-stats.json') let CUSTOM_STATS = join(__dirname, 'fixtures', 'stats.json') let mocked = [] async function mock(name, index, stats) { let dir = join(__dirname, '..', 'node_modules', name) mocked.push(dir) await ensureDir(dir) if (index) { let content = 'module.exports = ' + JSON.stringify(index) await writeFile(join(dir, 'index.js'), content) } if (stats) { let statsContent = JSON.stringify(stats) await writeFile(join(dir, 'browserslist-stats.json'), statsContent) } } test.after.each(async () => { await Promise.all(mocked.map(dir => remove(dir))) mocked = [] delete process.env.BROWSERSLIST_STATS }) test('takes stats from shareable config', async () => { await mock('browserslist-config-test1', undefined, { dataByBrowser: { chrome: { 55: 4, 56: 6 } } }) equal(browserslist('> 5% in browserslist-config-test1 stats'), ['chrome 56']) }) test('takes stats and queries from shareable config', async () => { await mock( 'browserslist-config-test2', ['> 1% in browserslist-config-test2 stats'], { ie: { 8: 1, 11: 2 } } ) equal(browserslist('extends browserslist-config-test2'), ['ie 11']) }) test('ignores null usage value', async () => { await mock('browserslist-config-null-test', undefined, { chrome: { 90: 3, 999: null } }) equal(browserslist('< 5% in browserslist-config-null-test stats'), [ 'chrome 90' ]) }) test('works with non-prefixed stats with dangerousExtend', async () => { await mock('pkg', undefined, { chrome: { 78: 6 } }) equal(browserslist(['> 5% in pkg stats'], { dangerousExtend: true }), [ 'chrome 78' ]) }) test('handles scoped stats with a dot in the name', async () => { await mock('@example.com/browserslist-config', undefined, { ie: { 8: 5, 11: 4 } }) equal(browserslist(['< 5% in @example.com/browserslist-config stats']), [ 'ie 11' ]) }) test('handles file in scoped stats', async () => { await mock('@scope/browserslist-config/ie', undefined, { ie: { 8: 2, 11: 5 } }) equal(browserslist(['>= 5% in @scope/browserslist-config/ie stats']), [ 'ie 11' ]) }) test('handles file-less scoped stats', async () => { await mock('@scope/browserslist-config', undefined, { ie: { 8: 6, 11: 5 } }) equal(browserslist(['<= 5% in @scope/browserslist-config stats']), ['ie 11']) }) test('handles scoped stats', async () => { await mock('@scope/browserslist-config-test', undefined, { ie: { 8: 2, 11: 6 } }) equal(browserslist(['> 5% in @scope/browserslist-config-test stats']), [ 'ie 11' ]) }) test('ignores passed stats', () => { throws( () => browserslist('> 5% in browserslist-config-test3 stats', { stats: STATS }), /Cannot (find|resolve) module/ ) }) test('ignores environment variable stats', () => { process.env.BROWSERSLIST_STATS = CUSTOM_STATS throws( () => browserslist('> 5% in browserslist-config-test4 stats'), /Cannot (find|resolve) module/ ) }) test('throws when stats does not have browserslist-config- prefix', () => { throws(() => { browserslist(['> 5% in thing-without-prefix stats']) }, /needs `browserslist-config-` prefix/) }) test('throws when stats has dot in path', () => { throws( () => browserslist(['> 5% in browserslist-config-package/../something stats']), /`.` not allowed/ ) }) test('throws when stats has node_modules in path', () => { throws( () => browserslist(['> 5% in browserslist-config-test/node_modules/a stats']), /`node_modules` not allowed/ ) }) test('throw if stats undefined', async () => { await mock( 'browserslist-config-undefined', undefined, // @ts-expect-error { dataByBrowser: 'not object' } ) throws( () => browserslist(['> 5% in browserslist-config-undefined stats']), /statistics was not provided/ ) }) test.run() browserslist-4.24.4/test/since.test.js000066400000000000000000000027061473746235500177700ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } let originWarn = console.warn test.before.each(() => { browserslist.data = { ie: { name: 'ie', versions: ['1', '2', '3'], released: [], releaseDate: { 1: 0, // 01 Jan 1970 00:00:00 +0000 2: 1485907200, // 01 Feb 2017 00:00:00 +0000 3: 1487116800 // 15 Feb 2017 00:00:00 +0000 } }, safari: { name: 'safari', versions: ['TP'], released: [], releaseDate: { 1: 1451606400, // 01 Jan 2016 00:00:00 +0000 TP: null // unreleased } } } console.warn = function (...args) { if (args[0].includes('update-browserslist-db')) return originWarn.apply(this, args) } }) test.after.each(() => { browserslist.data = originData console.warn = originWarn }) test('selects versions released on year boundaries', () => { equal(browserslist('since 1970'), ['ie 3', 'ie 2', 'ie 1', 'safari 1']) }) test('is case insensitive', () => { equal(browserslist('Since 1970'), ['ie 3', 'ie 2', 'ie 1', 'safari 1']) }) test('selects versions released on year and month boundaries', () => { equal(browserslist('since 2017-02'), ['ie 3', 'ie 2']) }) test('selects versions released on date boundaries', () => { equal(browserslist('since 2017-02-10'), ['ie 3']) }) test.run() browserslist-4.24.4/test/unreleased.test.js000066400000000000000000000021731473746235500210140ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['9', '10', '11'], versions: ['9', '10', '11'], releaseDate: {} }, edge: { name: 'edge', released: ['12'], versions: ['12', '13'], releaseDate: {} }, chrome: { name: 'chrome', released: ['37', '38', '39'], versions: ['37', '38', '39', '40'], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects unreleased versions of each browser', () => { equal(browserslist('unreleased versions'), ['chrome 40', 'edge 13']) }) test('selects unreleased versions of specific browser', () => { equal(browserslist('unreleased Edge versions'), ['edge 13']) }) test('is case insensitive', () => { equal(browserslist('Unreleased Versions'), ['chrome 40', 'edge 13']) equal(browserslist('Unreleased Chrome versions'), ['chrome 40']) }) test.run() browserslist-4.24.4/test/versions.test.js000066400000000000000000000044771473746235500205460ustar00rootroot00000000000000let { test } = require('uvu') let { equal, throws } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let originData = { ...browserslist.data } test.before.each(() => { browserslist.data = { ie: { name: 'ie', released: ['8', '9', '10', '11'], versions: ['8', '9', '10', '11'], releaseDate: {} }, android: { name: 'android', released: ['4.2-4.3'], versions: ['4.2-4.3'], releaseDate: {} }, and_qq: { name: 'and_qq', released: ['1.2'], versions: ['1.2'], releaseDate: {} }, ios_saf: { name: 'ios_saf', released: ['15.0', '15.6-15.8', '16.0'], versions: ['15.0', '15.6-15.8', '16.0'], releaseDate: {} } } }) test.after.each(() => { browserslist.data = originData }) test('selects browser by more sign', () => { equal(browserslist('ie > 9'), ['ie 11', 'ie 10']) }) test('selects browser by more or equal sign', () => { equal(browserslist('ie >= 10'), ['ie 11', 'ie 10']) }) test('selects browser by less sign', () => { equal(browserslist('ie < 10'), ['ie 9', 'ie 8']) }) test('selects browser by less or equal sign', () => { equal(browserslist('ie <= 9'), ['ie 9', 'ie 8']) }) test('uses case insensitive aliases', () => { equal(browserslist('Explorer > 10'), ['ie 11']) }) test('raises on unknown browser', () => { throws(() => { browserslist('unknown > 10') }, 'Unknown browser unknown') }) test('works with joined versions from Can I Use', () => { equal(browserslist('android >= 4.2'), ['android 4.2-4.3']) equal(browserslist('android >= 4.3'), ['android 4.2-4.3']) }) test('allows omission of the space around the operator', () => { equal(browserslist('ie<=9'), ['ie 9', 'ie 8']) }) test('selects browser with one version', () => { equal(browserslist('and_qq > 0'), ['and_qq 1.2']) }) test('selects browser gte or gt between version range', () => { equal(browserslist('ios >= 15.7.2'), ['ios_saf 16.0', 'ios_saf 15.6-15.8']) equal(browserslist('ios > 15.7.2'), ['ios_saf 16.0', 'ios_saf 15.6-15.8']) }) test('selects browser lte or lt between version range', () => { equal(browserslist('ios <= 15.7.2'), ['ios_saf 15.6-15.8', 'ios_saf 15.0']) equal(browserslist('ios < 15.7.2'), ['ios_saf 15.6-15.8', 'ios_saf 15.0']) }) test.run() browserslist-4.24.4/test/years.test.js000066400000000000000000000037251473746235500200140ustar00rootroot00000000000000let { test } = require('uvu') let { equal } = require('uvu/assert') delete require.cache[require.resolve('..')] let browserslist = require('..') let RealDate = Date let originData = { ...browserslist.data } let originWarn = console.warn function mockDate(iso) { global.Date = function (self) { Object.getPrototypeOf(RealDate.prototype).constructor.call(self) return new RealDate(iso) } global.Date.now = function () { return new RealDate(iso).valueOf() } } test.before.each(() => { mockDate('2018-01-01T00:00:00z') browserslist.data = { ie: { name: 'ie', versions: [], released: ['9', '10', '11'], releaseDate: { 9: 1300060800, // 2011-03-14T00:00:00.000Z 10: 1346716800, // 2012-09-04T00:00:00.000Z 11: 1381968000 // 2013-10-17T00:00:00.000Z } }, edge: { name: 'edge', versions: [], released: ['12', '13', '14', '15', '16'], releaseDate: { 12: 1438128000, // 2015-07-29T00:00:00.000Z 13: 1447286400, // 2015-11-12T00:00:00.000Z 14: 1470096000, // 2016-08-02T00:00:00.000Z 15: 1491868800, // 2017-04-11T00:00:00.000Z 16: 1508198400 // 2017-10-17T00:00:00.000Z } } } console.warn = function (...args) { if (/(yarn|npm) upgrade/.test(args[0])) return originWarn.apply(this, args) } }) test.after.each(() => { global.Date = RealDate browserslist.data = originData }) test('selects versions released within last X years', () => { equal(browserslist('last 2 years'), ['edge 16', 'edge 15', 'edge 14']) }) test('selects versions released within last year', () => { equal(browserslist('last 1 year'), ['edge 16', 'edge 15']) }) test('supports year fraction', () => { equal(browserslist('last 1.4 years'), ['edge 16', 'edge 15']) }) test('is case insensitive', () => { equal(browserslist('Last 5 years'), [ 'edge 16', 'edge 15', 'edge 14', 'edge 13', 'edge 12', 'ie 11' ]) }) test.run()