├── .editorconfig
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .mocharc.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
├── src
├── compare.ts
├── compareVersions.ts
├── index.ts
├── satisfies.ts
├── utils.ts
└── validate.ts
├── test
├── compare.ts
├── satisfies.ts
├── sort.ts
└── validate.ts
└── tsconfig.json
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = spaces
5 | indent_size = 2
6 | quote_type = single
7 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: build
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 |
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@v4
12 | - uses: actions/setup-node@v4
13 | with:
14 | node-version: 20
15 | - run: npm ci
16 | - run: npm test
17 |
18 | - name: Coveralls
19 | uses: coverallsapp/github-action@master
20 | with:
21 | github-token: ${{ secrets.GITHUB_TOKEN }}
22 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .nyc_output/
2 | .vscode/
3 | coverage/
4 | lib/
5 | node_modules/
--------------------------------------------------------------------------------
/.mocharc.json:
--------------------------------------------------------------------------------
1 | {
2 | "require": "ts-node/register",
3 | "extension": ["ts"],
4 | "spec": "test/**/*.ts",
5 | "watch-files": ["src/**/*.ts", "test/**/*.ts"]
6 | }
7 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## [6.1.1](https://github.com/omichelsen/compare-versions/releases/tag/v6.1.1) - 2024-07-13
4 | - Fix ESM module browser support by appending `.js` extension to imports.
5 |
6 | ## [6.1.0](https://github.com/omichelsen/compare-versions/releases/tag/v6.1.0) - 2023-08-07
7 | - Add new function `validateStrict` to validate according to strict semver rules.
8 |
9 | ## [6.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v6.0.0) - 2022-12-15
10 | - BREAKING CHANGE: `satisfies()` now supports npm comparator sets. This should not be a breaking change but it will assign meaning to spaces in the range which previously were ignored.
11 |
12 | ## [5.0.3](https://github.com/omichelsen/compare-versions/releases/tag/v5.0.3) - 2022-12-13
13 | - Fix npm build chache from 5.0.2.
14 |
15 | ## [5.0.2](https://github.com/omichelsen/compare-versions/releases/tag/v5.0.2) - 2022-12-13
16 | - Fix `satisfies()` handling of 0.x versions.
17 |
18 | ## [5.0.1](https://github.com/omichelsen/compare-versions/releases/tag/v5.0.1) - 2022-08-26
19 | - Include source file in npm bundle for source maps.
20 |
21 | ## [5.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v5.0.0) - 2022-08-25
22 | - BREAKING CHANGE: main export is now named.
23 | - Rewrite in TypeScript. Ensure single source of truth for all outputs.
24 | - Support ESM and CJS (through UMD).
25 | - Dropped Bower support.
26 |
27 | ## [4.1.4](https://github.com/omichelsen/compare-versions/releases/tag/v4.1.4) - 2022-08-23
28 | - Fix `satisfies()` CJS export.
29 |
30 | ## [4.1.3](https://github.com/omichelsen/compare-versions/releases/tag/v4.1.3) - 2022-01-11
31 | - Export CJS style in ESM for cross compatibility.
32 |
33 | ## [4.1.2](https://github.com/omichelsen/compare-versions/releases/tag/v4.1.2) - 2021-12-09
34 | - Do not allow leading comparators in `validate()`.
35 |
36 | ## [4.1.1](https://github.com/omichelsen/compare-versions/releases/tag/v4.1.1) - 2021-11-12
37 | - Remove optional chaining operator.
38 |
39 | ## [4.1.0](https://github.com/omichelsen/compare-versions/releases/tag/v4.1.0) - 2021-11-12
40 | - Add `satisfies()` function to test for range match.
41 |
42 | ## [4.0.2](https://github.com/omichelsen/compare-versions/releases/tag/v4.0.2) - 2021-11-12
43 | - Fix wildcard comparisons.
44 |
45 | ## [4.0.1](https://github.com/omichelsen/compare-versions/releases/tag/v4.0.1) - 2021-11-01
46 | - Remove `{ "type": "module" }` from package.json and set `{ "sideEffects": false }`.
47 |
48 | ## [4.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v4.0.0) - 2021-10-30
49 | - Add new ESM version in addition to the original CJS version.
50 | - Refactor ESM version to improve performance and reduce lines of code.
51 | - No breaking API changes but releasing as a major version bump to signal the new ESM code will be used by compatible bundlers like webpack and parcel.
52 |
53 | ## [3.6.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.6.0) - 2020-02-13
54 | - Add `validate()` function for checking whether a version number is semver-compliant.
55 |
56 | ## [3.5.1](https://github.com/omichelsen/compare-versions/releases/tag/v3.5.1) - 2019-07-31
57 | - Refactor map compare with less code.
58 |
59 | ## [3.5.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.5.0) - 2019-06-22
60 | - Add api returning true or false given a comparison operator.
61 |
62 | ## [3.4.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.4.0) - 2018-08-30
63 | - Show rejected version in error message.
64 |
65 | ## [3.3.1](https://github.com/omichelsen/compare-versions/releases/tag/v3.3.1) - 2018-08-18
66 | - Fix TypeScript export declaration.
67 |
68 | ## [3.3.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.3.0) - 2018-06-10
69 | - Add TypeScript declarations.
70 |
71 | ## [3.2.1](https://github.com/omichelsen/compare-versions/releases/tag/v3.2.1) - 2018-05-14
72 | - Fix rare bug in handling optional metadata.
73 |
74 | ## [3.2.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.2.0) - 2018-05-13
75 | - Support Chromium version numbers.
76 |
77 | ## [3.1.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.1.0) - 2017-09-25
78 | - Ignore leading zero in numbers.
79 |
80 | ## [3.0.1](https://github.com/omichelsen/compare-versions/releases/tag/v3.0.1) - 2017-04-01
81 | - Fix for leading 'v'.
82 |
83 | ## [3.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v3.0.0) - 2016-08-08
84 | - Validate input data.
85 |
86 | ## [2.0.2](https://github.com/omichelsen/compare-versions/releases/tag/v2.0.2) - 2016-06-06
87 | - Handle numbers in pre-release versions.
88 |
89 | ## [2.0.1](https://github.com/omichelsen/compare-versions/releases/tag/v2.0.1) - 2015-09-13
90 | - Fix for versions with <3 digits.
91 |
92 | ## [2.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v2.0.0) - 2015-09-07
93 | - Change global window accessor from returnExports to compareVersions.
94 |
95 | ## [1.1.2](https://github.com/omichelsen/compare-versions/releases/tag/v1.1.2) - 2015-05-03
96 | - Move patch check outside of the for loop.
97 |
98 | ## [1.1.1](https://github.com/omichelsen/compare-versions/releases/tag/v1.1.1) - 2015-05-03
99 | - Add a base 10 radix.
100 |
101 | ## [1.1.0](https://github.com/omichelsen/compare-versions/releases/tag/v1.1.0) - 2015-03-18
102 | - Added support for semver pre-release and metadata syntax.
103 |
104 | ## [1.0.0](https://github.com/omichelsen/compare-versions/releases/tag/v1.0.0) - 2015-03-18
105 | - Initial release.
106 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015-2021 Ole Michelsen
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # compare-versions
2 |
3 | [](https://github.com/omichelsen/compare-versions/actions/workflows/ci.yml)
4 | [](https://coveralls.io/github/omichelsen/compare-versions?branch=main)
5 | [](https://bundlephobia.com/package/compare-versions)
6 |
7 | Compare [semver](https://semver.org/) version strings to find greater, equal or lesser. Runs in the browser as well as Node.js/React Native etc. Has no dependencies and is [tiny](https://bundlephobia.com/package/compare-versions).
8 |
9 | Supports the full semver specification including versions with different number of digits like `1.0.0`, `1.0`, `1` and pre-releases like `1.0.0-alpha`. Additionally supports the following variations:
10 |
11 | - Wildcards for minor and patch version like `1.0.x` or `1.0.*`.
12 | - [Chromium version numbers](https://www.chromium.org/developers/version-numbers) with 4 parts, e.g. version `25.0.1364.126`.
13 | - Any leading `v` is ignored, e.g. `v1.0` is interpreted as `1.0`.
14 | - Leading zero is ignored, e.g. `1.01.1` is interpreted as `1.1.1`.
15 | - [npm version ranges](https://docs.npmjs.com/cli/v6/using-npm/semver#ranges), e.g. `1.2.7 || >=1.2.9 <2.0.0`
16 |
17 | ## Install
18 |
19 | ```bash
20 | $ npm install compare-versions
21 | ```
22 |
23 | __Note__: Starting from v5 the main export is now _named_ like so: `import { compareVersions } from 'compare-versions'`.
24 |
25 | __Note__: Starting from v4 this library includes a ESM version which will automatically be selected by your bundler (webpack, parcel etc). The CJS/UMD version is `lib/umd/index.js` and the new ESM version is `lib/esm/index.js`.
26 |
27 | ## Usage
28 |
29 | Will return `1` if first version is greater, `0` if versions are equal, and `-1` if the second version is greater:
30 |
31 | ```js
32 | import { compareVersions } from 'compare-versions';
33 |
34 | compareVersions('11.1.1', '10.0.0'); // 1
35 | compareVersions('10.0.0', '10.0.0'); // 0
36 | compareVersions('10.0.0', '11.1.1'); // -1
37 | ```
38 |
39 | Can also be used for sorting:
40 |
41 | ```js
42 | const versions = [
43 | '1.5.19',
44 | '1.2.3',
45 | '1.5.5'
46 | ]
47 | const sorted = versions.sort(compareVersions);
48 | /*
49 | [
50 | '1.2.3',
51 | '1.5.5',
52 | '1.5.19'
53 | ]
54 | */
55 | ```
56 |
57 | ### "Human Readable" Compare
58 |
59 | The alternative `compare` function accepts an operator which will be more familiar to humans:
60 |
61 | ```js
62 | import { compare } from 'compare-versions';
63 |
64 | compare('10.1.8', '10.0.4', '>'); // true
65 | compare('10.0.1', '10.0.1', '='); // true
66 | compare('10.1.1', '10.2.2', '<'); // true
67 | compare('10.1.1', '10.2.2', '<='); // true
68 | compare('10.1.1', '10.2.2', '>='); // false
69 | ```
70 |
71 | ### Version ranges
72 |
73 | The `satisfies` function accepts a range to compare, compatible with [npm package versioning](https://docs.npmjs.com/cli/v6/using-npm/semver):
74 |
75 | ```js
76 | import { satisfies } from 'compare-versions';
77 |
78 | satisfies('10.0.1', '~10.0.0'); // true
79 | satisfies('10.1.0', '~10.0.0'); // false
80 | satisfies('10.1.2', '^10.0.0'); // true
81 | satisfies('11.0.0', '^10.0.0'); // false
82 | satisfies('10.1.8', '>10.0.4'); // true
83 | satisfies('10.0.1', '=10.0.1'); // true
84 | satisfies('10.1.1', '<10.2.2'); // true
85 | satisfies('10.1.1', '<=10.2.2'); // true
86 | satisfies('10.1.1', '>=10.2.2'); // false
87 | satisfies('1.4.6', '1.2.7 || >=1.2.9 <2.0.0'); // true
88 | satisfies('1.2.8', '1.2.7 || >=1.2.9 <2.0.0'); // false
89 | satisfies('1.5.1', '1.2.3 - 2.3.4'); // true
90 | satisfies('2.3.5', '1.2.3 - 2.3.4'); // false
91 | ```
92 |
93 | ### Validate version numbers
94 |
95 | Applies the same rules used comparing version numbers and returns a boolean:
96 |
97 | ```js
98 | import { validate } from 'compare-versions';
99 |
100 | validate('1.0.0-rc.1'); // true
101 | validate('1.0-rc.1'); // false
102 | validate('foo'); // false
103 | ```
104 |
105 | ### Validate version numbers (strict)
106 |
107 | Validate version numbers strictly according to semver.org; 3 integers, no wildcards, no leading zero or "v" etc:
108 |
109 | ```js
110 | import { validateStrict } from 'compare-versions';
111 |
112 | validate('1.0.0'); // true
113 | validate('1.0.0-rc.1'); // true
114 | validate('1.0'); // false
115 | validate('1.x'); // false
116 | validate('v1.02'); // false
117 | ```
118 |
119 | ### Browser
120 |
121 | In modern browsers the functions above can be imported as modules:
122 |
123 | ```html
124 |
132 | ```
133 |
134 | #### Legacy (UMD)
135 |
136 | If included directly in the browser, the functions above are available on the global window under the `compareVersions` object:
137 |
138 | ```html
139 |
140 |
148 | ```
149 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "compare-versions",
3 | "version": "6.1.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "compare-versions",
9 | "version": "6.1.1",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@types/mocha": "^10.0.7",
13 | "c8": "^10.1.2",
14 | "mocha": "^10.6.0",
15 | "rollup": "^4.18.1",
16 | "ts-node": "^10.9.2",
17 | "typescript": "^5.5.3"
18 | }
19 | },
20 | "node_modules/@bcoe/v8-coverage": {
21 | "version": "0.2.3",
22 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
23 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
24 | "dev": true
25 | },
26 | "node_modules/@cspotcode/source-map-support": {
27 | "version": "0.8.1",
28 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
29 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
30 | "dev": true,
31 | "dependencies": {
32 | "@jridgewell/trace-mapping": "0.3.9"
33 | },
34 | "engines": {
35 | "node": ">=12"
36 | }
37 | },
38 | "node_modules/@isaacs/cliui": {
39 | "version": "8.0.2",
40 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
41 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
42 | "dev": true,
43 | "dependencies": {
44 | "string-width": "^5.1.2",
45 | "string-width-cjs": "npm:string-width@^4.2.0",
46 | "strip-ansi": "^7.0.1",
47 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
48 | "wrap-ansi": "^8.1.0",
49 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
50 | },
51 | "engines": {
52 | "node": ">=12"
53 | }
54 | },
55 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
56 | "version": "6.0.1",
57 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
58 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
59 | "dev": true,
60 | "engines": {
61 | "node": ">=12"
62 | },
63 | "funding": {
64 | "url": "https://github.com/chalk/ansi-regex?sponsor=1"
65 | }
66 | },
67 | "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
68 | "version": "6.2.1",
69 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
70 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
71 | "dev": true,
72 | "engines": {
73 | "node": ">=12"
74 | },
75 | "funding": {
76 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
77 | }
78 | },
79 | "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
80 | "version": "9.2.2",
81 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
82 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
83 | "dev": true
84 | },
85 | "node_modules/@isaacs/cliui/node_modules/string-width": {
86 | "version": "5.1.2",
87 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
88 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
89 | "dev": true,
90 | "dependencies": {
91 | "eastasianwidth": "^0.2.0",
92 | "emoji-regex": "^9.2.2",
93 | "strip-ansi": "^7.0.1"
94 | },
95 | "engines": {
96 | "node": ">=12"
97 | },
98 | "funding": {
99 | "url": "https://github.com/sponsors/sindresorhus"
100 | }
101 | },
102 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
103 | "version": "7.1.0",
104 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
105 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
106 | "dev": true,
107 | "dependencies": {
108 | "ansi-regex": "^6.0.1"
109 | },
110 | "engines": {
111 | "node": ">=12"
112 | },
113 | "funding": {
114 | "url": "https://github.com/chalk/strip-ansi?sponsor=1"
115 | }
116 | },
117 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
118 | "version": "8.1.0",
119 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
120 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
121 | "dev": true,
122 | "dependencies": {
123 | "ansi-styles": "^6.1.0",
124 | "string-width": "^5.0.1",
125 | "strip-ansi": "^7.0.1"
126 | },
127 | "engines": {
128 | "node": ">=12"
129 | },
130 | "funding": {
131 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
132 | }
133 | },
134 | "node_modules/@istanbuljs/schema": {
135 | "version": "0.1.3",
136 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
137 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
138 | "dev": true,
139 | "engines": {
140 | "node": ">=8"
141 | }
142 | },
143 | "node_modules/@jridgewell/resolve-uri": {
144 | "version": "3.1.1",
145 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
146 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
147 | "dev": true,
148 | "engines": {
149 | "node": ">=6.0.0"
150 | }
151 | },
152 | "node_modules/@jridgewell/sourcemap-codec": {
153 | "version": "1.4.15",
154 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
155 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
156 | "dev": true
157 | },
158 | "node_modules/@jridgewell/trace-mapping": {
159 | "version": "0.3.9",
160 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
161 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
162 | "dev": true,
163 | "dependencies": {
164 | "@jridgewell/resolve-uri": "^3.0.3",
165 | "@jridgewell/sourcemap-codec": "^1.4.10"
166 | }
167 | },
168 | "node_modules/@pkgjs/parseargs": {
169 | "version": "0.11.0",
170 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
171 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
172 | "dev": true,
173 | "optional": true,
174 | "engines": {
175 | "node": ">=14"
176 | }
177 | },
178 | "node_modules/@rollup/rollup-android-arm-eabi": {
179 | "version": "4.18.1",
180 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
181 | "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
182 | "cpu": [
183 | "arm"
184 | ],
185 | "dev": true,
186 | "optional": true,
187 | "os": [
188 | "android"
189 | ]
190 | },
191 | "node_modules/@rollup/rollup-android-arm64": {
192 | "version": "4.18.1",
193 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
194 | "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
195 | "cpu": [
196 | "arm64"
197 | ],
198 | "dev": true,
199 | "optional": true,
200 | "os": [
201 | "android"
202 | ]
203 | },
204 | "node_modules/@rollup/rollup-darwin-arm64": {
205 | "version": "4.18.1",
206 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
207 | "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
208 | "cpu": [
209 | "arm64"
210 | ],
211 | "dev": true,
212 | "optional": true,
213 | "os": [
214 | "darwin"
215 | ]
216 | },
217 | "node_modules/@rollup/rollup-darwin-x64": {
218 | "version": "4.18.1",
219 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
220 | "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
221 | "cpu": [
222 | "x64"
223 | ],
224 | "dev": true,
225 | "optional": true,
226 | "os": [
227 | "darwin"
228 | ]
229 | },
230 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
231 | "version": "4.18.1",
232 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
233 | "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
234 | "cpu": [
235 | "arm"
236 | ],
237 | "dev": true,
238 | "optional": true,
239 | "os": [
240 | "linux"
241 | ]
242 | },
243 | "node_modules/@rollup/rollup-linux-arm-musleabihf": {
244 | "version": "4.18.1",
245 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
246 | "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
247 | "cpu": [
248 | "arm"
249 | ],
250 | "dev": true,
251 | "optional": true,
252 | "os": [
253 | "linux"
254 | ]
255 | },
256 | "node_modules/@rollup/rollup-linux-arm64-gnu": {
257 | "version": "4.18.1",
258 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
259 | "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
260 | "cpu": [
261 | "arm64"
262 | ],
263 | "dev": true,
264 | "optional": true,
265 | "os": [
266 | "linux"
267 | ]
268 | },
269 | "node_modules/@rollup/rollup-linux-arm64-musl": {
270 | "version": "4.18.1",
271 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
272 | "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
273 | "cpu": [
274 | "arm64"
275 | ],
276 | "dev": true,
277 | "optional": true,
278 | "os": [
279 | "linux"
280 | ]
281 | },
282 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
283 | "version": "4.18.1",
284 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
285 | "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
286 | "cpu": [
287 | "ppc64"
288 | ],
289 | "dev": true,
290 | "optional": true,
291 | "os": [
292 | "linux"
293 | ]
294 | },
295 | "node_modules/@rollup/rollup-linux-riscv64-gnu": {
296 | "version": "4.18.1",
297 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
298 | "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
299 | "cpu": [
300 | "riscv64"
301 | ],
302 | "dev": true,
303 | "optional": true,
304 | "os": [
305 | "linux"
306 | ]
307 | },
308 | "node_modules/@rollup/rollup-linux-s390x-gnu": {
309 | "version": "4.18.1",
310 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
311 | "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
312 | "cpu": [
313 | "s390x"
314 | ],
315 | "dev": true,
316 | "optional": true,
317 | "os": [
318 | "linux"
319 | ]
320 | },
321 | "node_modules/@rollup/rollup-linux-x64-gnu": {
322 | "version": "4.18.1",
323 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
324 | "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
325 | "cpu": [
326 | "x64"
327 | ],
328 | "dev": true,
329 | "optional": true,
330 | "os": [
331 | "linux"
332 | ]
333 | },
334 | "node_modules/@rollup/rollup-linux-x64-musl": {
335 | "version": "4.18.1",
336 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
337 | "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
338 | "cpu": [
339 | "x64"
340 | ],
341 | "dev": true,
342 | "optional": true,
343 | "os": [
344 | "linux"
345 | ]
346 | },
347 | "node_modules/@rollup/rollup-win32-arm64-msvc": {
348 | "version": "4.18.1",
349 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
350 | "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
351 | "cpu": [
352 | "arm64"
353 | ],
354 | "dev": true,
355 | "optional": true,
356 | "os": [
357 | "win32"
358 | ]
359 | },
360 | "node_modules/@rollup/rollup-win32-ia32-msvc": {
361 | "version": "4.18.1",
362 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
363 | "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
364 | "cpu": [
365 | "ia32"
366 | ],
367 | "dev": true,
368 | "optional": true,
369 | "os": [
370 | "win32"
371 | ]
372 | },
373 | "node_modules/@rollup/rollup-win32-x64-msvc": {
374 | "version": "4.18.1",
375 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
376 | "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
377 | "cpu": [
378 | "x64"
379 | ],
380 | "dev": true,
381 | "optional": true,
382 | "os": [
383 | "win32"
384 | ]
385 | },
386 | "node_modules/@tsconfig/node10": {
387 | "version": "1.0.9",
388 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
389 | "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
390 | "dev": true
391 | },
392 | "node_modules/@tsconfig/node12": {
393 | "version": "1.0.11",
394 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
395 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
396 | "dev": true
397 | },
398 | "node_modules/@tsconfig/node14": {
399 | "version": "1.0.3",
400 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
401 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
402 | "dev": true
403 | },
404 | "node_modules/@tsconfig/node16": {
405 | "version": "1.0.4",
406 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
407 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
408 | "dev": true
409 | },
410 | "node_modules/@types/estree": {
411 | "version": "1.0.5",
412 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
413 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
414 | "dev": true
415 | },
416 | "node_modules/@types/istanbul-lib-coverage": {
417 | "version": "2.0.4",
418 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
419 | "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
420 | "dev": true
421 | },
422 | "node_modules/@types/mocha": {
423 | "version": "10.0.7",
424 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.7.tgz",
425 | "integrity": "sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==",
426 | "dev": true
427 | },
428 | "node_modules/@types/node": {
429 | "version": "20.4.8",
430 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz",
431 | "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==",
432 | "dev": true,
433 | "peer": true
434 | },
435 | "node_modules/acorn": {
436 | "version": "8.10.0",
437 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
438 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
439 | "dev": true,
440 | "bin": {
441 | "acorn": "bin/acorn"
442 | },
443 | "engines": {
444 | "node": ">=0.4.0"
445 | }
446 | },
447 | "node_modules/acorn-walk": {
448 | "version": "8.2.0",
449 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
450 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
451 | "dev": true,
452 | "engines": {
453 | "node": ">=0.4.0"
454 | }
455 | },
456 | "node_modules/ansi-colors": {
457 | "version": "4.1.3",
458 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
459 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
460 | "dev": true,
461 | "engines": {
462 | "node": ">=6"
463 | }
464 | },
465 | "node_modules/ansi-regex": {
466 | "version": "5.0.1",
467 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
468 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
469 | "dev": true,
470 | "engines": {
471 | "node": ">=8"
472 | }
473 | },
474 | "node_modules/ansi-styles": {
475 | "version": "4.3.0",
476 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
477 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
478 | "dev": true,
479 | "dependencies": {
480 | "color-convert": "^2.0.1"
481 | },
482 | "engines": {
483 | "node": ">=8"
484 | },
485 | "funding": {
486 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
487 | }
488 | },
489 | "node_modules/anymatch": {
490 | "version": "3.1.3",
491 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
492 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
493 | "dev": true,
494 | "dependencies": {
495 | "normalize-path": "^3.0.0",
496 | "picomatch": "^2.0.4"
497 | },
498 | "engines": {
499 | "node": ">= 8"
500 | }
501 | },
502 | "node_modules/arg": {
503 | "version": "4.1.3",
504 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
505 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
506 | "dev": true
507 | },
508 | "node_modules/argparse": {
509 | "version": "2.0.1",
510 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
511 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
512 | "dev": true
513 | },
514 | "node_modules/balanced-match": {
515 | "version": "1.0.2",
516 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
517 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
518 | "dev": true
519 | },
520 | "node_modules/binary-extensions": {
521 | "version": "2.2.0",
522 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
523 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
524 | "dev": true,
525 | "engines": {
526 | "node": ">=8"
527 | }
528 | },
529 | "node_modules/brace-expansion": {
530 | "version": "2.0.1",
531 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
532 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
533 | "dev": true,
534 | "dependencies": {
535 | "balanced-match": "^1.0.0"
536 | }
537 | },
538 | "node_modules/braces": {
539 | "version": "3.0.3",
540 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
541 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
542 | "dev": true,
543 | "dependencies": {
544 | "fill-range": "^7.1.1"
545 | },
546 | "engines": {
547 | "node": ">=8"
548 | }
549 | },
550 | "node_modules/browser-stdout": {
551 | "version": "1.3.1",
552 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
553 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
554 | "dev": true
555 | },
556 | "node_modules/c8": {
557 | "version": "10.1.2",
558 | "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz",
559 | "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==",
560 | "dev": true,
561 | "dependencies": {
562 | "@bcoe/v8-coverage": "^0.2.3",
563 | "@istanbuljs/schema": "^0.1.3",
564 | "find-up": "^5.0.0",
565 | "foreground-child": "^3.1.1",
566 | "istanbul-lib-coverage": "^3.2.0",
567 | "istanbul-lib-report": "^3.0.1",
568 | "istanbul-reports": "^3.1.6",
569 | "test-exclude": "^7.0.1",
570 | "v8-to-istanbul": "^9.0.0",
571 | "yargs": "^17.7.2",
572 | "yargs-parser": "^21.1.1"
573 | },
574 | "bin": {
575 | "c8": "bin/c8.js"
576 | },
577 | "engines": {
578 | "node": ">=18"
579 | },
580 | "peerDependencies": {
581 | "monocart-coverage-reports": "^2"
582 | },
583 | "peerDependenciesMeta": {
584 | "monocart-coverage-reports": {
585 | "optional": true
586 | }
587 | }
588 | },
589 | "node_modules/camelcase": {
590 | "version": "6.3.0",
591 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
592 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
593 | "dev": true,
594 | "engines": {
595 | "node": ">=10"
596 | },
597 | "funding": {
598 | "url": "https://github.com/sponsors/sindresorhus"
599 | }
600 | },
601 | "node_modules/chalk": {
602 | "version": "4.1.2",
603 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
604 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
605 | "dev": true,
606 | "dependencies": {
607 | "ansi-styles": "^4.1.0",
608 | "supports-color": "^7.1.0"
609 | },
610 | "engines": {
611 | "node": ">=10"
612 | },
613 | "funding": {
614 | "url": "https://github.com/chalk/chalk?sponsor=1"
615 | }
616 | },
617 | "node_modules/chokidar": {
618 | "version": "3.5.3",
619 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
620 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
621 | "dev": true,
622 | "funding": [
623 | {
624 | "type": "individual",
625 | "url": "https://paulmillr.com/funding/"
626 | }
627 | ],
628 | "dependencies": {
629 | "anymatch": "~3.1.2",
630 | "braces": "~3.0.2",
631 | "glob-parent": "~5.1.2",
632 | "is-binary-path": "~2.1.0",
633 | "is-glob": "~4.0.1",
634 | "normalize-path": "~3.0.0",
635 | "readdirp": "~3.6.0"
636 | },
637 | "engines": {
638 | "node": ">= 8.10.0"
639 | },
640 | "optionalDependencies": {
641 | "fsevents": "~2.3.2"
642 | }
643 | },
644 | "node_modules/cliui": {
645 | "version": "8.0.1",
646 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
647 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
648 | "dev": true,
649 | "dependencies": {
650 | "string-width": "^4.2.0",
651 | "strip-ansi": "^6.0.1",
652 | "wrap-ansi": "^7.0.0"
653 | },
654 | "engines": {
655 | "node": ">=12"
656 | }
657 | },
658 | "node_modules/color-convert": {
659 | "version": "2.0.1",
660 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
661 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
662 | "dev": true,
663 | "dependencies": {
664 | "color-name": "~1.1.4"
665 | },
666 | "engines": {
667 | "node": ">=7.0.0"
668 | }
669 | },
670 | "node_modules/color-name": {
671 | "version": "1.1.4",
672 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
673 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
674 | "dev": true
675 | },
676 | "node_modules/convert-source-map": {
677 | "version": "1.9.0",
678 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
679 | "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
680 | "dev": true
681 | },
682 | "node_modules/create-require": {
683 | "version": "1.1.1",
684 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
685 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
686 | "dev": true
687 | },
688 | "node_modules/cross-spawn": {
689 | "version": "7.0.3",
690 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
691 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
692 | "dev": true,
693 | "dependencies": {
694 | "path-key": "^3.1.0",
695 | "shebang-command": "^2.0.0",
696 | "which": "^2.0.1"
697 | },
698 | "engines": {
699 | "node": ">= 8"
700 | }
701 | },
702 | "node_modules/debug": {
703 | "version": "4.3.5",
704 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
705 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
706 | "dev": true,
707 | "dependencies": {
708 | "ms": "2.1.2"
709 | },
710 | "engines": {
711 | "node": ">=6.0"
712 | },
713 | "peerDependenciesMeta": {
714 | "supports-color": {
715 | "optional": true
716 | }
717 | }
718 | },
719 | "node_modules/debug/node_modules/ms": {
720 | "version": "2.1.2",
721 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
722 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
723 | "dev": true
724 | },
725 | "node_modules/decamelize": {
726 | "version": "4.0.0",
727 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
728 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
729 | "dev": true,
730 | "engines": {
731 | "node": ">=10"
732 | },
733 | "funding": {
734 | "url": "https://github.com/sponsors/sindresorhus"
735 | }
736 | },
737 | "node_modules/diff": {
738 | "version": "5.2.0",
739 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
740 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
741 | "dev": true,
742 | "engines": {
743 | "node": ">=0.3.1"
744 | }
745 | },
746 | "node_modules/eastasianwidth": {
747 | "version": "0.2.0",
748 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
749 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
750 | "dev": true
751 | },
752 | "node_modules/emoji-regex": {
753 | "version": "8.0.0",
754 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
755 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
756 | "dev": true
757 | },
758 | "node_modules/escalade": {
759 | "version": "3.1.1",
760 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
761 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
762 | "dev": true,
763 | "engines": {
764 | "node": ">=6"
765 | }
766 | },
767 | "node_modules/escape-string-regexp": {
768 | "version": "4.0.0",
769 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
770 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
771 | "dev": true,
772 | "engines": {
773 | "node": ">=10"
774 | },
775 | "funding": {
776 | "url": "https://github.com/sponsors/sindresorhus"
777 | }
778 | },
779 | "node_modules/fill-range": {
780 | "version": "7.1.1",
781 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
782 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
783 | "dev": true,
784 | "dependencies": {
785 | "to-regex-range": "^5.0.1"
786 | },
787 | "engines": {
788 | "node": ">=8"
789 | }
790 | },
791 | "node_modules/find-up": {
792 | "version": "5.0.0",
793 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
794 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
795 | "dev": true,
796 | "dependencies": {
797 | "locate-path": "^6.0.0",
798 | "path-exists": "^4.0.0"
799 | },
800 | "engines": {
801 | "node": ">=10"
802 | },
803 | "funding": {
804 | "url": "https://github.com/sponsors/sindresorhus"
805 | }
806 | },
807 | "node_modules/flat": {
808 | "version": "5.0.2",
809 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
810 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
811 | "dev": true,
812 | "bin": {
813 | "flat": "cli.js"
814 | }
815 | },
816 | "node_modules/foreground-child": {
817 | "version": "3.2.1",
818 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
819 | "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
820 | "dev": true,
821 | "dependencies": {
822 | "cross-spawn": "^7.0.0",
823 | "signal-exit": "^4.0.1"
824 | },
825 | "engines": {
826 | "node": ">=14"
827 | },
828 | "funding": {
829 | "url": "https://github.com/sponsors/isaacs"
830 | }
831 | },
832 | "node_modules/fs.realpath": {
833 | "version": "1.0.0",
834 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
835 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
836 | "dev": true
837 | },
838 | "node_modules/fsevents": {
839 | "version": "2.3.2",
840 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
841 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
842 | "dev": true,
843 | "hasInstallScript": true,
844 | "optional": true,
845 | "os": [
846 | "darwin"
847 | ],
848 | "engines": {
849 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
850 | }
851 | },
852 | "node_modules/get-caller-file": {
853 | "version": "2.0.5",
854 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
855 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
856 | "dev": true,
857 | "engines": {
858 | "node": "6.* || 8.* || >= 10.*"
859 | }
860 | },
861 | "node_modules/glob": {
862 | "version": "8.1.0",
863 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
864 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
865 | "deprecated": "Glob versions prior to v9 are no longer supported",
866 | "dev": true,
867 | "dependencies": {
868 | "fs.realpath": "^1.0.0",
869 | "inflight": "^1.0.4",
870 | "inherits": "2",
871 | "minimatch": "^5.0.1",
872 | "once": "^1.3.0"
873 | },
874 | "engines": {
875 | "node": ">=12"
876 | },
877 | "funding": {
878 | "url": "https://github.com/sponsors/isaacs"
879 | }
880 | },
881 | "node_modules/glob-parent": {
882 | "version": "5.1.2",
883 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
884 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
885 | "dev": true,
886 | "dependencies": {
887 | "is-glob": "^4.0.1"
888 | },
889 | "engines": {
890 | "node": ">= 6"
891 | }
892 | },
893 | "node_modules/has-flag": {
894 | "version": "4.0.0",
895 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
896 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
897 | "dev": true,
898 | "engines": {
899 | "node": ">=8"
900 | }
901 | },
902 | "node_modules/he": {
903 | "version": "1.2.0",
904 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
905 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
906 | "dev": true,
907 | "bin": {
908 | "he": "bin/he"
909 | }
910 | },
911 | "node_modules/html-escaper": {
912 | "version": "2.0.2",
913 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
914 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
915 | "dev": true
916 | },
917 | "node_modules/inflight": {
918 | "version": "1.0.6",
919 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
920 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
921 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
922 | "dev": true,
923 | "dependencies": {
924 | "once": "^1.3.0",
925 | "wrappy": "1"
926 | }
927 | },
928 | "node_modules/inherits": {
929 | "version": "2.0.4",
930 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
931 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
932 | "dev": true
933 | },
934 | "node_modules/is-binary-path": {
935 | "version": "2.1.0",
936 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
937 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
938 | "dev": true,
939 | "dependencies": {
940 | "binary-extensions": "^2.0.0"
941 | },
942 | "engines": {
943 | "node": ">=8"
944 | }
945 | },
946 | "node_modules/is-extglob": {
947 | "version": "2.1.1",
948 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
949 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
950 | "dev": true,
951 | "engines": {
952 | "node": ">=0.10.0"
953 | }
954 | },
955 | "node_modules/is-fullwidth-code-point": {
956 | "version": "3.0.0",
957 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
958 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
959 | "dev": true,
960 | "engines": {
961 | "node": ">=8"
962 | }
963 | },
964 | "node_modules/is-glob": {
965 | "version": "4.0.3",
966 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
967 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
968 | "dev": true,
969 | "dependencies": {
970 | "is-extglob": "^2.1.1"
971 | },
972 | "engines": {
973 | "node": ">=0.10.0"
974 | }
975 | },
976 | "node_modules/is-number": {
977 | "version": "7.0.0",
978 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
979 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
980 | "dev": true,
981 | "engines": {
982 | "node": ">=0.12.0"
983 | }
984 | },
985 | "node_modules/is-plain-obj": {
986 | "version": "2.1.0",
987 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
988 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
989 | "dev": true,
990 | "engines": {
991 | "node": ">=8"
992 | }
993 | },
994 | "node_modules/is-unicode-supported": {
995 | "version": "0.1.0",
996 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
997 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
998 | "dev": true,
999 | "engines": {
1000 | "node": ">=10"
1001 | },
1002 | "funding": {
1003 | "url": "https://github.com/sponsors/sindresorhus"
1004 | }
1005 | },
1006 | "node_modules/isexe": {
1007 | "version": "2.0.0",
1008 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1009 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1010 | "dev": true
1011 | },
1012 | "node_modules/istanbul-lib-coverage": {
1013 | "version": "3.2.0",
1014 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
1015 | "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
1016 | "dev": true,
1017 | "engines": {
1018 | "node": ">=8"
1019 | }
1020 | },
1021 | "node_modules/istanbul-lib-report": {
1022 | "version": "3.0.1",
1023 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
1024 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
1025 | "dev": true,
1026 | "dependencies": {
1027 | "istanbul-lib-coverage": "^3.0.0",
1028 | "make-dir": "^4.0.0",
1029 | "supports-color": "^7.1.0"
1030 | },
1031 | "engines": {
1032 | "node": ">=10"
1033 | }
1034 | },
1035 | "node_modules/istanbul-reports": {
1036 | "version": "3.1.6",
1037 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
1038 | "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
1039 | "dev": true,
1040 | "dependencies": {
1041 | "html-escaper": "^2.0.0",
1042 | "istanbul-lib-report": "^3.0.0"
1043 | },
1044 | "engines": {
1045 | "node": ">=8"
1046 | }
1047 | },
1048 | "node_modules/jackspeak": {
1049 | "version": "3.4.3",
1050 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
1051 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
1052 | "dev": true,
1053 | "dependencies": {
1054 | "@isaacs/cliui": "^8.0.2"
1055 | },
1056 | "funding": {
1057 | "url": "https://github.com/sponsors/isaacs"
1058 | },
1059 | "optionalDependencies": {
1060 | "@pkgjs/parseargs": "^0.11.0"
1061 | }
1062 | },
1063 | "node_modules/js-yaml": {
1064 | "version": "4.1.0",
1065 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1066 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1067 | "dev": true,
1068 | "dependencies": {
1069 | "argparse": "^2.0.1"
1070 | },
1071 | "bin": {
1072 | "js-yaml": "bin/js-yaml.js"
1073 | }
1074 | },
1075 | "node_modules/locate-path": {
1076 | "version": "6.0.0",
1077 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1078 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1079 | "dev": true,
1080 | "dependencies": {
1081 | "p-locate": "^5.0.0"
1082 | },
1083 | "engines": {
1084 | "node": ">=10"
1085 | },
1086 | "funding": {
1087 | "url": "https://github.com/sponsors/sindresorhus"
1088 | }
1089 | },
1090 | "node_modules/log-symbols": {
1091 | "version": "4.1.0",
1092 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
1093 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
1094 | "dev": true,
1095 | "dependencies": {
1096 | "chalk": "^4.1.0",
1097 | "is-unicode-supported": "^0.1.0"
1098 | },
1099 | "engines": {
1100 | "node": ">=10"
1101 | },
1102 | "funding": {
1103 | "url": "https://github.com/sponsors/sindresorhus"
1104 | }
1105 | },
1106 | "node_modules/lru-cache": {
1107 | "version": "6.0.0",
1108 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
1109 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
1110 | "dev": true,
1111 | "dependencies": {
1112 | "yallist": "^4.0.0"
1113 | },
1114 | "engines": {
1115 | "node": ">=10"
1116 | }
1117 | },
1118 | "node_modules/make-dir": {
1119 | "version": "4.0.0",
1120 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
1121 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
1122 | "dev": true,
1123 | "dependencies": {
1124 | "semver": "^7.5.3"
1125 | },
1126 | "engines": {
1127 | "node": ">=10"
1128 | },
1129 | "funding": {
1130 | "url": "https://github.com/sponsors/sindresorhus"
1131 | }
1132 | },
1133 | "node_modules/make-error": {
1134 | "version": "1.3.6",
1135 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
1136 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
1137 | "dev": true
1138 | },
1139 | "node_modules/minimatch": {
1140 | "version": "5.1.6",
1141 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
1142 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
1143 | "dev": true,
1144 | "dependencies": {
1145 | "brace-expansion": "^2.0.1"
1146 | },
1147 | "engines": {
1148 | "node": ">=10"
1149 | }
1150 | },
1151 | "node_modules/minipass": {
1152 | "version": "7.1.2",
1153 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
1154 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
1155 | "dev": true,
1156 | "engines": {
1157 | "node": ">=16 || 14 >=14.17"
1158 | }
1159 | },
1160 | "node_modules/mocha": {
1161 | "version": "10.6.0",
1162 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.6.0.tgz",
1163 | "integrity": "sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==",
1164 | "dev": true,
1165 | "dependencies": {
1166 | "ansi-colors": "^4.1.3",
1167 | "browser-stdout": "^1.3.1",
1168 | "chokidar": "^3.5.3",
1169 | "debug": "^4.3.5",
1170 | "diff": "^5.2.0",
1171 | "escape-string-regexp": "^4.0.0",
1172 | "find-up": "^5.0.0",
1173 | "glob": "^8.1.0",
1174 | "he": "^1.2.0",
1175 | "js-yaml": "^4.1.0",
1176 | "log-symbols": "^4.1.0",
1177 | "minimatch": "^5.1.6",
1178 | "ms": "^2.1.3",
1179 | "serialize-javascript": "^6.0.2",
1180 | "strip-json-comments": "^3.1.1",
1181 | "supports-color": "^8.1.1",
1182 | "workerpool": "^6.5.1",
1183 | "yargs": "^16.2.0",
1184 | "yargs-parser": "^20.2.9",
1185 | "yargs-unparser": "^2.0.0"
1186 | },
1187 | "bin": {
1188 | "_mocha": "bin/_mocha",
1189 | "mocha": "bin/mocha.js"
1190 | },
1191 | "engines": {
1192 | "node": ">= 14.0.0"
1193 | }
1194 | },
1195 | "node_modules/mocha/node_modules/cliui": {
1196 | "version": "7.0.4",
1197 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
1198 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
1199 | "dev": true,
1200 | "dependencies": {
1201 | "string-width": "^4.2.0",
1202 | "strip-ansi": "^6.0.0",
1203 | "wrap-ansi": "^7.0.0"
1204 | }
1205 | },
1206 | "node_modules/mocha/node_modules/supports-color": {
1207 | "version": "8.1.1",
1208 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1209 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1210 | "dev": true,
1211 | "dependencies": {
1212 | "has-flag": "^4.0.0"
1213 | },
1214 | "engines": {
1215 | "node": ">=10"
1216 | },
1217 | "funding": {
1218 | "url": "https://github.com/chalk/supports-color?sponsor=1"
1219 | }
1220 | },
1221 | "node_modules/mocha/node_modules/yargs": {
1222 | "version": "16.2.0",
1223 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
1224 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
1225 | "dev": true,
1226 | "dependencies": {
1227 | "cliui": "^7.0.2",
1228 | "escalade": "^3.1.1",
1229 | "get-caller-file": "^2.0.5",
1230 | "require-directory": "^2.1.1",
1231 | "string-width": "^4.2.0",
1232 | "y18n": "^5.0.5",
1233 | "yargs-parser": "^20.2.2"
1234 | },
1235 | "engines": {
1236 | "node": ">=10"
1237 | }
1238 | },
1239 | "node_modules/mocha/node_modules/yargs-parser": {
1240 | "version": "20.2.9",
1241 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
1242 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
1243 | "dev": true,
1244 | "engines": {
1245 | "node": ">=10"
1246 | }
1247 | },
1248 | "node_modules/ms": {
1249 | "version": "2.1.3",
1250 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1251 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1252 | "dev": true
1253 | },
1254 | "node_modules/normalize-path": {
1255 | "version": "3.0.0",
1256 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1257 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1258 | "dev": true,
1259 | "engines": {
1260 | "node": ">=0.10.0"
1261 | }
1262 | },
1263 | "node_modules/once": {
1264 | "version": "1.4.0",
1265 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1266 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1267 | "dev": true,
1268 | "dependencies": {
1269 | "wrappy": "1"
1270 | }
1271 | },
1272 | "node_modules/p-limit": {
1273 | "version": "3.1.0",
1274 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
1275 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
1276 | "dev": true,
1277 | "dependencies": {
1278 | "yocto-queue": "^0.1.0"
1279 | },
1280 | "engines": {
1281 | "node": ">=10"
1282 | },
1283 | "funding": {
1284 | "url": "https://github.com/sponsors/sindresorhus"
1285 | }
1286 | },
1287 | "node_modules/p-locate": {
1288 | "version": "5.0.0",
1289 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
1290 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
1291 | "dev": true,
1292 | "dependencies": {
1293 | "p-limit": "^3.0.2"
1294 | },
1295 | "engines": {
1296 | "node": ">=10"
1297 | },
1298 | "funding": {
1299 | "url": "https://github.com/sponsors/sindresorhus"
1300 | }
1301 | },
1302 | "node_modules/package-json-from-dist": {
1303 | "version": "1.0.0",
1304 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
1305 | "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
1306 | "dev": true
1307 | },
1308 | "node_modules/path-exists": {
1309 | "version": "4.0.0",
1310 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1311 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1312 | "dev": true,
1313 | "engines": {
1314 | "node": ">=8"
1315 | }
1316 | },
1317 | "node_modules/path-key": {
1318 | "version": "3.1.1",
1319 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1320 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1321 | "dev": true,
1322 | "engines": {
1323 | "node": ">=8"
1324 | }
1325 | },
1326 | "node_modules/path-scurry": {
1327 | "version": "1.11.1",
1328 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
1329 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
1330 | "dev": true,
1331 | "dependencies": {
1332 | "lru-cache": "^10.2.0",
1333 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1334 | },
1335 | "engines": {
1336 | "node": ">=16 || 14 >=14.18"
1337 | },
1338 | "funding": {
1339 | "url": "https://github.com/sponsors/isaacs"
1340 | }
1341 | },
1342 | "node_modules/path-scurry/node_modules/lru-cache": {
1343 | "version": "10.4.3",
1344 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
1345 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
1346 | "dev": true
1347 | },
1348 | "node_modules/picomatch": {
1349 | "version": "2.3.1",
1350 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1351 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1352 | "dev": true,
1353 | "engines": {
1354 | "node": ">=8.6"
1355 | },
1356 | "funding": {
1357 | "url": "https://github.com/sponsors/jonschlinkert"
1358 | }
1359 | },
1360 | "node_modules/randombytes": {
1361 | "version": "2.1.0",
1362 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1363 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1364 | "dev": true,
1365 | "dependencies": {
1366 | "safe-buffer": "^5.1.0"
1367 | }
1368 | },
1369 | "node_modules/readdirp": {
1370 | "version": "3.6.0",
1371 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1372 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1373 | "dev": true,
1374 | "dependencies": {
1375 | "picomatch": "^2.2.1"
1376 | },
1377 | "engines": {
1378 | "node": ">=8.10.0"
1379 | }
1380 | },
1381 | "node_modules/require-directory": {
1382 | "version": "2.1.1",
1383 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1384 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1385 | "dev": true,
1386 | "engines": {
1387 | "node": ">=0.10.0"
1388 | }
1389 | },
1390 | "node_modules/rollup": {
1391 | "version": "4.18.1",
1392 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
1393 | "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
1394 | "dev": true,
1395 | "dependencies": {
1396 | "@types/estree": "1.0.5"
1397 | },
1398 | "bin": {
1399 | "rollup": "dist/bin/rollup"
1400 | },
1401 | "engines": {
1402 | "node": ">=18.0.0",
1403 | "npm": ">=8.0.0"
1404 | },
1405 | "optionalDependencies": {
1406 | "@rollup/rollup-android-arm-eabi": "4.18.1",
1407 | "@rollup/rollup-android-arm64": "4.18.1",
1408 | "@rollup/rollup-darwin-arm64": "4.18.1",
1409 | "@rollup/rollup-darwin-x64": "4.18.1",
1410 | "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
1411 | "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
1412 | "@rollup/rollup-linux-arm64-gnu": "4.18.1",
1413 | "@rollup/rollup-linux-arm64-musl": "4.18.1",
1414 | "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
1415 | "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
1416 | "@rollup/rollup-linux-s390x-gnu": "4.18.1",
1417 | "@rollup/rollup-linux-x64-gnu": "4.18.1",
1418 | "@rollup/rollup-linux-x64-musl": "4.18.1",
1419 | "@rollup/rollup-win32-arm64-msvc": "4.18.1",
1420 | "@rollup/rollup-win32-ia32-msvc": "4.18.1",
1421 | "@rollup/rollup-win32-x64-msvc": "4.18.1",
1422 | "fsevents": "~2.3.2"
1423 | }
1424 | },
1425 | "node_modules/safe-buffer": {
1426 | "version": "5.2.1",
1427 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1428 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1429 | "dev": true,
1430 | "funding": [
1431 | {
1432 | "type": "github",
1433 | "url": "https://github.com/sponsors/feross"
1434 | },
1435 | {
1436 | "type": "patreon",
1437 | "url": "https://www.patreon.com/feross"
1438 | },
1439 | {
1440 | "type": "consulting",
1441 | "url": "https://feross.org/support"
1442 | }
1443 | ]
1444 | },
1445 | "node_modules/semver": {
1446 | "version": "7.5.4",
1447 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1448 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1449 | "dev": true,
1450 | "dependencies": {
1451 | "lru-cache": "^6.0.0"
1452 | },
1453 | "bin": {
1454 | "semver": "bin/semver.js"
1455 | },
1456 | "engines": {
1457 | "node": ">=10"
1458 | }
1459 | },
1460 | "node_modules/serialize-javascript": {
1461 | "version": "6.0.2",
1462 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
1463 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
1464 | "dev": true,
1465 | "dependencies": {
1466 | "randombytes": "^2.1.0"
1467 | }
1468 | },
1469 | "node_modules/shebang-command": {
1470 | "version": "2.0.0",
1471 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1472 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1473 | "dev": true,
1474 | "dependencies": {
1475 | "shebang-regex": "^3.0.0"
1476 | },
1477 | "engines": {
1478 | "node": ">=8"
1479 | }
1480 | },
1481 | "node_modules/shebang-regex": {
1482 | "version": "3.0.0",
1483 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1484 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1485 | "dev": true,
1486 | "engines": {
1487 | "node": ">=8"
1488 | }
1489 | },
1490 | "node_modules/signal-exit": {
1491 | "version": "4.1.0",
1492 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
1493 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
1494 | "dev": true,
1495 | "engines": {
1496 | "node": ">=14"
1497 | },
1498 | "funding": {
1499 | "url": "https://github.com/sponsors/isaacs"
1500 | }
1501 | },
1502 | "node_modules/string-width": {
1503 | "version": "4.2.3",
1504 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1505 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1506 | "dev": true,
1507 | "dependencies": {
1508 | "emoji-regex": "^8.0.0",
1509 | "is-fullwidth-code-point": "^3.0.0",
1510 | "strip-ansi": "^6.0.1"
1511 | },
1512 | "engines": {
1513 | "node": ">=8"
1514 | }
1515 | },
1516 | "node_modules/string-width-cjs": {
1517 | "name": "string-width",
1518 | "version": "4.2.3",
1519 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1520 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1521 | "dev": true,
1522 | "dependencies": {
1523 | "emoji-regex": "^8.0.0",
1524 | "is-fullwidth-code-point": "^3.0.0",
1525 | "strip-ansi": "^6.0.1"
1526 | },
1527 | "engines": {
1528 | "node": ">=8"
1529 | }
1530 | },
1531 | "node_modules/strip-ansi": {
1532 | "version": "6.0.1",
1533 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1534 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1535 | "dev": true,
1536 | "dependencies": {
1537 | "ansi-regex": "^5.0.1"
1538 | },
1539 | "engines": {
1540 | "node": ">=8"
1541 | }
1542 | },
1543 | "node_modules/strip-ansi-cjs": {
1544 | "name": "strip-ansi",
1545 | "version": "6.0.1",
1546 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1547 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1548 | "dev": true,
1549 | "dependencies": {
1550 | "ansi-regex": "^5.0.1"
1551 | },
1552 | "engines": {
1553 | "node": ">=8"
1554 | }
1555 | },
1556 | "node_modules/strip-json-comments": {
1557 | "version": "3.1.1",
1558 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
1559 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
1560 | "dev": true,
1561 | "engines": {
1562 | "node": ">=8"
1563 | },
1564 | "funding": {
1565 | "url": "https://github.com/sponsors/sindresorhus"
1566 | }
1567 | },
1568 | "node_modules/supports-color": {
1569 | "version": "7.2.0",
1570 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1571 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1572 | "dev": true,
1573 | "dependencies": {
1574 | "has-flag": "^4.0.0"
1575 | },
1576 | "engines": {
1577 | "node": ">=8"
1578 | }
1579 | },
1580 | "node_modules/test-exclude": {
1581 | "version": "7.0.1",
1582 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz",
1583 | "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==",
1584 | "dev": true,
1585 | "dependencies": {
1586 | "@istanbuljs/schema": "^0.1.2",
1587 | "glob": "^10.4.1",
1588 | "minimatch": "^9.0.4"
1589 | },
1590 | "engines": {
1591 | "node": ">=18"
1592 | }
1593 | },
1594 | "node_modules/test-exclude/node_modules/glob": {
1595 | "version": "10.4.5",
1596 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
1597 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
1598 | "dev": true,
1599 | "dependencies": {
1600 | "foreground-child": "^3.1.0",
1601 | "jackspeak": "^3.1.2",
1602 | "minimatch": "^9.0.4",
1603 | "minipass": "^7.1.2",
1604 | "package-json-from-dist": "^1.0.0",
1605 | "path-scurry": "^1.11.1"
1606 | },
1607 | "bin": {
1608 | "glob": "dist/esm/bin.mjs"
1609 | },
1610 | "funding": {
1611 | "url": "https://github.com/sponsors/isaacs"
1612 | }
1613 | },
1614 | "node_modules/test-exclude/node_modules/minimatch": {
1615 | "version": "9.0.5",
1616 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1617 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1618 | "dev": true,
1619 | "dependencies": {
1620 | "brace-expansion": "^2.0.1"
1621 | },
1622 | "engines": {
1623 | "node": ">=16 || 14 >=14.17"
1624 | },
1625 | "funding": {
1626 | "url": "https://github.com/sponsors/isaacs"
1627 | }
1628 | },
1629 | "node_modules/to-regex-range": {
1630 | "version": "5.0.1",
1631 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1632 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1633 | "dev": true,
1634 | "dependencies": {
1635 | "is-number": "^7.0.0"
1636 | },
1637 | "engines": {
1638 | "node": ">=8.0"
1639 | }
1640 | },
1641 | "node_modules/ts-node": {
1642 | "version": "10.9.2",
1643 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
1644 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
1645 | "dev": true,
1646 | "dependencies": {
1647 | "@cspotcode/source-map-support": "^0.8.0",
1648 | "@tsconfig/node10": "^1.0.7",
1649 | "@tsconfig/node12": "^1.0.7",
1650 | "@tsconfig/node14": "^1.0.0",
1651 | "@tsconfig/node16": "^1.0.2",
1652 | "acorn": "^8.4.1",
1653 | "acorn-walk": "^8.1.1",
1654 | "arg": "^4.1.0",
1655 | "create-require": "^1.1.0",
1656 | "diff": "^4.0.1",
1657 | "make-error": "^1.1.1",
1658 | "v8-compile-cache-lib": "^3.0.1",
1659 | "yn": "3.1.1"
1660 | },
1661 | "bin": {
1662 | "ts-node": "dist/bin.js",
1663 | "ts-node-cwd": "dist/bin-cwd.js",
1664 | "ts-node-esm": "dist/bin-esm.js",
1665 | "ts-node-script": "dist/bin-script.js",
1666 | "ts-node-transpile-only": "dist/bin-transpile.js",
1667 | "ts-script": "dist/bin-script-deprecated.js"
1668 | },
1669 | "peerDependencies": {
1670 | "@swc/core": ">=1.2.50",
1671 | "@swc/wasm": ">=1.2.50",
1672 | "@types/node": "*",
1673 | "typescript": ">=2.7"
1674 | },
1675 | "peerDependenciesMeta": {
1676 | "@swc/core": {
1677 | "optional": true
1678 | },
1679 | "@swc/wasm": {
1680 | "optional": true
1681 | }
1682 | }
1683 | },
1684 | "node_modules/ts-node/node_modules/diff": {
1685 | "version": "4.0.2",
1686 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
1687 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
1688 | "dev": true,
1689 | "engines": {
1690 | "node": ">=0.3.1"
1691 | }
1692 | },
1693 | "node_modules/typescript": {
1694 | "version": "5.5.3",
1695 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz",
1696 | "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==",
1697 | "dev": true,
1698 | "bin": {
1699 | "tsc": "bin/tsc",
1700 | "tsserver": "bin/tsserver"
1701 | },
1702 | "engines": {
1703 | "node": ">=14.17"
1704 | }
1705 | },
1706 | "node_modules/v8-compile-cache-lib": {
1707 | "version": "3.0.1",
1708 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1709 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
1710 | "dev": true
1711 | },
1712 | "node_modules/v8-to-istanbul": {
1713 | "version": "9.1.0",
1714 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
1715 | "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
1716 | "dev": true,
1717 | "dependencies": {
1718 | "@jridgewell/trace-mapping": "^0.3.12",
1719 | "@types/istanbul-lib-coverage": "^2.0.1",
1720 | "convert-source-map": "^1.6.0"
1721 | },
1722 | "engines": {
1723 | "node": ">=10.12.0"
1724 | }
1725 | },
1726 | "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": {
1727 | "version": "0.3.19",
1728 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
1729 | "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
1730 | "dev": true,
1731 | "dependencies": {
1732 | "@jridgewell/resolve-uri": "^3.1.0",
1733 | "@jridgewell/sourcemap-codec": "^1.4.14"
1734 | }
1735 | },
1736 | "node_modules/which": {
1737 | "version": "2.0.2",
1738 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1739 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1740 | "dev": true,
1741 | "dependencies": {
1742 | "isexe": "^2.0.0"
1743 | },
1744 | "bin": {
1745 | "node-which": "bin/node-which"
1746 | },
1747 | "engines": {
1748 | "node": ">= 8"
1749 | }
1750 | },
1751 | "node_modules/workerpool": {
1752 | "version": "6.5.1",
1753 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
1754 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
1755 | "dev": true
1756 | },
1757 | "node_modules/wrap-ansi": {
1758 | "version": "7.0.0",
1759 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1760 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1761 | "dev": true,
1762 | "dependencies": {
1763 | "ansi-styles": "^4.0.0",
1764 | "string-width": "^4.1.0",
1765 | "strip-ansi": "^6.0.0"
1766 | },
1767 | "engines": {
1768 | "node": ">=10"
1769 | },
1770 | "funding": {
1771 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1772 | }
1773 | },
1774 | "node_modules/wrap-ansi-cjs": {
1775 | "name": "wrap-ansi",
1776 | "version": "7.0.0",
1777 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1778 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1779 | "dev": true,
1780 | "dependencies": {
1781 | "ansi-styles": "^4.0.0",
1782 | "string-width": "^4.1.0",
1783 | "strip-ansi": "^6.0.0"
1784 | },
1785 | "engines": {
1786 | "node": ">=10"
1787 | },
1788 | "funding": {
1789 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1790 | }
1791 | },
1792 | "node_modules/wrappy": {
1793 | "version": "1.0.2",
1794 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1795 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1796 | "dev": true
1797 | },
1798 | "node_modules/y18n": {
1799 | "version": "5.0.8",
1800 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1801 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1802 | "dev": true,
1803 | "engines": {
1804 | "node": ">=10"
1805 | }
1806 | },
1807 | "node_modules/yallist": {
1808 | "version": "4.0.0",
1809 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1810 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1811 | "dev": true
1812 | },
1813 | "node_modules/yargs": {
1814 | "version": "17.7.2",
1815 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
1816 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
1817 | "dev": true,
1818 | "dependencies": {
1819 | "cliui": "^8.0.1",
1820 | "escalade": "^3.1.1",
1821 | "get-caller-file": "^2.0.5",
1822 | "require-directory": "^2.1.1",
1823 | "string-width": "^4.2.3",
1824 | "y18n": "^5.0.5",
1825 | "yargs-parser": "^21.1.1"
1826 | },
1827 | "engines": {
1828 | "node": ">=12"
1829 | }
1830 | },
1831 | "node_modules/yargs-parser": {
1832 | "version": "21.1.1",
1833 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1834 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1835 | "dev": true,
1836 | "engines": {
1837 | "node": ">=12"
1838 | }
1839 | },
1840 | "node_modules/yargs-unparser": {
1841 | "version": "2.0.0",
1842 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
1843 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
1844 | "dev": true,
1845 | "dependencies": {
1846 | "camelcase": "^6.0.0",
1847 | "decamelize": "^4.0.0",
1848 | "flat": "^5.0.2",
1849 | "is-plain-obj": "^2.1.0"
1850 | },
1851 | "engines": {
1852 | "node": ">=10"
1853 | }
1854 | },
1855 | "node_modules/yn": {
1856 | "version": "3.1.1",
1857 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1858 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1859 | "dev": true,
1860 | "engines": {
1861 | "node": ">=6"
1862 | }
1863 | },
1864 | "node_modules/yocto-queue": {
1865 | "version": "0.1.0",
1866 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
1867 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
1868 | "dev": true,
1869 | "engines": {
1870 | "node": ">=10"
1871 | },
1872 | "funding": {
1873 | "url": "https://github.com/sponsors/sindresorhus"
1874 | }
1875 | }
1876 | }
1877 | }
1878 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "compare-versions",
3 | "version": "6.1.1",
4 | "description": "Compare semver version strings to find greater, equal or lesser.",
5 | "repository": {
6 | "type": "git",
7 | "url": "git+https://github.com/omichelsen/compare-versions.git"
8 | },
9 | "author": "Ole Michelsen",
10 | "license": "MIT",
11 | "bugs": {
12 | "url": "https://github.com/omichelsen/compare-versions/issues"
13 | },
14 | "homepage": "https://github.com/omichelsen/compare-versions#readme",
15 | "keywords": [
16 | "semver",
17 | "version",
18 | "compare",
19 | "browser",
20 | "node"
21 | ],
22 | "scripts": {
23 | "build": "npm run build:esm && npm run build:umd",
24 | "build:esm": "tsc --module esnext --target es2017 --outDir lib/esm",
25 | "build:umd": "rollup lib/esm/index.js --format umd --name compareVersions --sourcemap -o lib/umd/index.js",
26 | "prepublishOnly": "npm run build",
27 | "test": "c8 --reporter=lcov mocha"
28 | },
29 | "main": "./lib/umd/index.js",
30 | "module": "./lib/esm/index.js",
31 | "types": "./lib/esm/index.d.ts",
32 | "sideEffects": false,
33 | "files": [
34 | "lib",
35 | "src"
36 | ],
37 | "devDependencies": {
38 | "@types/mocha": "^10.0.7",
39 | "c8": "^10.1.2",
40 | "mocha": "^10.6.0",
41 | "rollup": "^4.18.1",
42 | "ts-node": "^10.9.2",
43 | "typescript": "^5.5.3"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/compare.ts:
--------------------------------------------------------------------------------
1 | import { compareVersions } from './compareVersions.js';
2 | import { CompareOperator } from './utils.js';
3 |
4 | /**
5 | * Compare [semver](https://semver.org/) version strings using the specified operator.
6 | *
7 | * @param v1 First version to compare
8 | * @param v2 Second version to compare
9 | * @param operator Allowed arithmetic operator to use
10 | * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.
11 | *
12 | * @example
13 | * ```
14 | * compare('10.1.8', '10.0.4', '>'); // return true
15 | * compare('10.0.1', '10.0.1', '='); // return true
16 | * compare('10.1.1', '10.2.2', '<'); // return true
17 | * compare('10.1.1', '10.2.2', '<='); // return true
18 | * compare('10.1.1', '10.2.2', '>='); // return false
19 | * ```
20 | */
21 | export const compare = (v1: string, v2: string, operator: CompareOperator) => {
22 | // validate input operator
23 | assertValidOperator(operator);
24 |
25 | // since result of compareVersions can only be -1 or 0 or 1
26 | // a simple map can be used to replace switch
27 | const res = compareVersions(v1, v2);
28 |
29 | return operatorResMap[operator].includes(res);
30 | };
31 |
32 | const operatorResMap = {
33 | '>': [1],
34 | '>=': [0, 1],
35 | '=': [0],
36 | '<=': [-1, 0],
37 | '<': [-1],
38 | '!=': [-1, 1],
39 | };
40 |
41 | const allowedOperators = Object.keys(operatorResMap);
42 |
43 | const assertValidOperator = (op: string) => {
44 | if (typeof op !== 'string') {
45 | throw new TypeError(
46 | `Invalid operator type, expected string but got ${typeof op}`
47 | );
48 | }
49 | if (allowedOperators.indexOf(op) === -1) {
50 | throw new Error(
51 | `Invalid operator, expected one of ${allowedOperators.join('|')}`
52 | );
53 | }
54 | };
55 |
--------------------------------------------------------------------------------
/src/compareVersions.ts:
--------------------------------------------------------------------------------
1 | import { compareSegments, validateAndParse } from './utils.js';
2 |
3 | /**
4 | * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.
5 | * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.
6 | * @param v1 - First version to compare
7 | * @param v2 - Second version to compare
8 | * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).
9 | */
10 | export const compareVersions = (v1: string, v2: string) => {
11 | // validate input and split into segments
12 | const n1 = validateAndParse(v1);
13 | const n2 = validateAndParse(v2);
14 |
15 | // pop off the patch
16 | const p1 = n1.pop();
17 | const p2 = n2.pop();
18 |
19 | // validate numbers
20 | const r = compareSegments(n1, n2);
21 | if (r !== 0) return r;
22 |
23 | // validate pre-release
24 | if (p1 && p2) {
25 | return compareSegments(p1.split('.'), p2.split('.'));
26 | } else if (p1 || p2) {
27 | return p1 ? -1 : 1;
28 | }
29 |
30 | return 0;
31 | };
32 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | export { compare } from './compare.js';
2 | export { compareVersions } from './compareVersions.js';
3 | export { satisfies } from './satisfies.js';
4 | export { CompareOperator } from './utils.js';
5 | export { validate, validateStrict } from './validate.js';
6 |
--------------------------------------------------------------------------------
/src/satisfies.ts:
--------------------------------------------------------------------------------
1 | import { compare } from './compare.js';
2 | import { CompareOperator, compareSegments, validateAndParse } from './utils.js';
3 |
4 | /**
5 | * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.
6 | *
7 | * @param version Version number to match
8 | * @param range Range pattern for version
9 | * @returns `true` if the version number is within the range, `false` otherwise.
10 | *
11 | * @example
12 | * ```
13 | * satisfies('1.1.0', '^1.0.0'); // return true
14 | * satisfies('1.1.0', '~1.0.0'); // return false
15 | * ```
16 | */
17 | export const satisfies = (version: string, range: string): boolean => {
18 | // clean input
19 | range = range.replace(/([><=]+)\s+/g, '$1');
20 |
21 | // handle multiple comparators
22 | if (range.includes('||')) {
23 | return range.split('||').some((r) => satisfies(version, r));
24 | } else if (range.includes(' - ')) {
25 | const [a, b] = range.split(' - ', 2);
26 | return satisfies(version, `>=${a} <=${b}`);
27 | } else if (range.includes(' ')) {
28 | return range
29 | .trim()
30 | .replace(/\s{2,}/g, ' ')
31 | .split(' ')
32 | .every((r) => satisfies(version, r));
33 | }
34 |
35 | // if no range operator then "="
36 | const m = range.match(/^([<>=~^]+)/);
37 | const op = m ? m[1] : '=';
38 |
39 | // if gt/lt/eq then operator compare
40 | if (op !== '^' && op !== '~')
41 | return compare(version, range, op as CompareOperator);
42 |
43 | // else range of either "~" or "^" is assumed
44 | const [v1, v2, v3, , vp] = validateAndParse(version);
45 | const [r1, r2, r3, , rp] = validateAndParse(range);
46 | const v = [v1, v2, v3];
47 | const r = [r1, r2 ?? 'x', r3 ?? 'x'];
48 |
49 | // validate pre-release
50 | if (rp) {
51 | if (!vp) return false;
52 | if (compareSegments(v, r) !== 0) return false;
53 | if (compareSegments(vp.split('.'), rp.split('.')) === -1) return false;
54 | }
55 |
56 | // first non-zero number
57 | const nonZero = r.findIndex((v) => v !== '0') + 1;
58 |
59 | // pointer to where segments can be >=
60 | const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;
61 |
62 | // before pointer must be equal
63 | if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0) return false;
64 |
65 | // after pointer must be >=
66 | if (compareSegments(v.slice(i), r.slice(i)) === -1) return false;
67 |
68 | return true;
69 | };
70 |
--------------------------------------------------------------------------------
/src/utils.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Allowed arithmetic operators
3 | */
4 | export type CompareOperator = '>' | '>=' | '=' | '<' | '<=' | '!=';
5 |
6 | export const semver =
7 | /^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i;
8 |
9 | export const validateAndParse = (version: string) => {
10 | if (typeof version !== 'string') {
11 | throw new TypeError('Invalid argument expected string');
12 | }
13 | const match = version.match(semver);
14 | if (!match) {
15 | throw new Error(
16 | `Invalid argument not valid semver ('${version}' received)`
17 | );
18 | }
19 | match.shift();
20 | return match;
21 | };
22 |
23 | const isWildcard = (s: string) => s === '*' || s === 'x' || s === 'X';
24 |
25 | const tryParse = (v: string) => {
26 | const n = parseInt(v, 10);
27 | return isNaN(n) ? v : n;
28 | };
29 |
30 | const forceType = (a: string | number, b: string | number) =>
31 | typeof a !== typeof b ? [String(a), String(b)] : [a, b];
32 |
33 | const compareStrings = (a: string, b: string) => {
34 | if (isWildcard(a) || isWildcard(b)) return 0;
35 | const [ap, bp] = forceType(tryParse(a), tryParse(b));
36 | if (ap > bp) return 1;
37 | if (ap < bp) return -1;
38 | return 0;
39 | };
40 |
41 | export const compareSegments = (
42 | a: string | string[] | RegExpMatchArray,
43 | b: string | string[] | RegExpMatchArray
44 | ) => {
45 | for (let i = 0; i < Math.max(a.length, b.length); i++) {
46 | const r = compareStrings(a[i] || '0', b[i] || '0');
47 | if (r !== 0) return r;
48 | }
49 | return 0;
50 | };
51 |
--------------------------------------------------------------------------------
/src/validate.ts:
--------------------------------------------------------------------------------
1 | import { semver } from './utils.js';
2 |
3 | /**
4 | * Validate [semver](https://semver.org/) version strings.
5 | *
6 | * @param version Version number to validate
7 | * @returns `true` if the version number is a valid semver version number, `false` otherwise.
8 | *
9 | * @example
10 | * ```
11 | * validate('1.0.0-rc.1'); // return true
12 | * validate('1.0-rc.1'); // return false
13 | * validate('foo'); // return false
14 | * ```
15 | */
16 | export const validate = (version: string) =>
17 | typeof version === 'string' && /^[v\d]/.test(version) && semver.test(version);
18 |
19 | /**
20 | * Validate [semver](https://semver.org/) version strings strictly. Will not accept wildcards and version ranges.
21 | *
22 | * @param version Version number to validate
23 | * @returns `true` if the version number is a valid semver version number `false` otherwise
24 | *
25 | * @example
26 | * ```
27 | * validate('1.0.0-rc.1'); // return true
28 | * validate('1.0-rc.1'); // return false
29 | * validate('foo'); // return false
30 | * ```
31 | */
32 | export const validateStrict = (version: string) =>
33 | typeof version === 'string' &&
34 | /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/.test(
35 | version
36 | );
37 |
--------------------------------------------------------------------------------
/test/compare.ts:
--------------------------------------------------------------------------------
1 | import assert from 'assert';
2 | import { compareVersions, compare, CompareOperator } from '../src/index';
3 |
4 | describe('compare versions', () => {
5 | const cmp = {
6 | '1': '>',
7 | '0': '=',
8 | '-1': '<',
9 | } as { [key: string]: string };
10 |
11 | const runTests = (dataSet: Array<[string, string, number]>) => {
12 | dataSet.forEach(([v1, v2, expected]) => {
13 | it(`${v1} ${cmp[expected]} ${v2}`, () =>
14 | assert.strictEqual(
15 | compareVersions(v1, v2),
16 | expected,
17 | `${v1} ${cmp[expected]} ${v2} !== ${expected}`
18 | ));
19 | });
20 | };
21 |
22 | describe('single-segment versions', () => {
23 | runTests([
24 | ['10', '9', 1],
25 | ['10', '10', 0],
26 | ['9', '10', -1],
27 | ]);
28 | });
29 |
30 | describe('two-segment versions', () => {
31 | runTests([
32 | ['10.8', '10.4', 1],
33 | ['10.1', '10.1', 0],
34 | ['10.1', '10.2', -1],
35 | ]);
36 | });
37 |
38 | describe('three-segment versions', () => {
39 | runTests([
40 | ['10.1.8', '10.0.4', 1],
41 | ['10.0.1', '10.0.1', 0],
42 | ['10.1.1', '10.2.2', -1],
43 | ['11.0.10', '11.0.2', 1],
44 | ['11.0.2', '11.0.10', -1],
45 | ]);
46 | });
47 |
48 | describe('four-segment versions - https://www.chromium.org/developers/version-numbers', () => {
49 | runTests([
50 | ['1.0.0.0', '1', 0],
51 | ['1.0.0.0', '1.0', 0],
52 | ['1.0.0.0', '1.0.0', 0],
53 | ['1.0.0.0', '1.0.0.0', 0],
54 | ['1.2.3.4', '1.2.3.4', 0],
55 | ['1.2.3.4', '1.2.3.04', 0],
56 | ['v1.2.3.4', '01.2.3.4', 0],
57 | ['1.2.3.4', '1.2.3.5', -1],
58 | ['1.2.3.5', '1.2.3.4', 1],
59 | ['1.0.0.0-alpha', '1.0.0-alpha', 0],
60 | ['1.0.0.0-alpha', '1.0.0.0-beta', -1],
61 | ]);
62 | });
63 |
64 | describe('different segment versions', () => {
65 | runTests([
66 | ['11.1.10', '11.0', 1],
67 | ['1.1.1', '1', 1],
68 | ['01.1.0', '1.01', 0],
69 | ['1.0.0', '1', 0],
70 | ['10.0.0', '10.114', -1],
71 | ['1.0', '1.4.1', -1],
72 | ]);
73 | });
74 |
75 | describe('pre-release versions - https://semver.org/#spec-item-9', () => {
76 | runTests([
77 | ['1.0.0-alpha.1', '1.0.0-alpha', 1],
78 | ['1.0.0-alpha', '1.0.0-alpha.1', -1],
79 | ['1.0.0-alpha.1', '1.0.0-alpha.beta', -1],
80 | ['1.0.0-alpha.beta', '1.0.0-beta', -1],
81 | ['1.0.0-beta', '1.0.0-beta.2', -1],
82 | ['1.0.0-beta.2', '1.0.0-beta.11', -1],
83 | ['1.0.0-beta.11', '1.0.0-rc.1', -1],
84 | ['1.0.0-rc.1', '1.0.0', -1],
85 | ['1.0.0-alpha', '1', -1],
86 | ['1.0.0-beta.11', '1.0.0-beta.1', 1],
87 | ['1.0.0-beta.10', '1.0.0-beta.9', 1],
88 | ['1.0.0-beta.10', '1.0.0-beta.90', -1],
89 | ]);
90 | });
91 |
92 | describe('ignore build metadata - https://semver.org/#spec-item-10', () => {
93 | runTests([
94 | ['1.4.0-build.3928', '1.4.0-build.3928+sha.a8d9d4f', 0],
95 | ['1.4.0-build.3928+sha.b8dbdb0', '1.4.0-build.3928+sha.a8d9d4f', 0],
96 | ['1.0.0-alpha+001', '1.0.0-alpha', 0],
97 | ['1.0.0-beta+exp.sha.5114f85', '1.0.0-beta+exp.sha.999999', 0],
98 | ['1.0.0+20130313144700', '1.0.0', 0],
99 | ['1.0.0+20130313144700', '2.0.0', -1],
100 | ['1.0.0+20130313144700', '1.0.1+11234343435', -1],
101 | ['1.0.1+1', '1.0.1+2', 0],
102 | ['1.0.0+a-a', '1.0.0+a-b', 0],
103 | ]);
104 | });
105 |
106 | describe('ignore leading `v`', () => {
107 | runTests([
108 | ['v1.0.0', '1.0.0', 0],
109 | ['v1.0.0', 'v1.0.0', 0],
110 | ['v1.0.0', 'v1.0.0', 0],
111 | ['v1.0.0-alpha', '1.0.0-alpha', 0],
112 | ]);
113 | });
114 |
115 | describe('ignore leading `0`', () => {
116 | runTests([
117 | ['01.0.0', '1', 0],
118 | ['01.0.0', '1.0.0', 0],
119 | ['1.01.0', '1.01.0', 0],
120 | ['1.0.03', '1.0.3', 0],
121 | ['1.0.03-alpha', '1.0.3-alpha', 0],
122 | ['v01.0.0', '1.0.0', 0],
123 | ['v01.0.0', '2.0.0', -1],
124 | ]);
125 | });
126 |
127 | describe('wildcards', () => {
128 | runTests([
129 | ['3', '3.x.x', 0],
130 | ['3.3', '3.x.x', 0],
131 | ['3.3.3', '3.x.x', 0],
132 | ['3.x.x', '3.3.3', 0],
133 | ['3.3.3', '3.X.X', 0],
134 | ['3.3.3', '3.3.x', 0],
135 | ['3.3.3', '3.*.*', 0],
136 | ['3.3.3', '3.3.*', 0],
137 | ['3.0.3', '3.0.*', 0],
138 | ['0.7.x', '0.6.0', 1],
139 | ['0.7.x', '0.6.0-asdf', 1],
140 | ['0.7.x', '0.6.2', 1],
141 | ['0.7.x', '0.7.0-asdf', 1],
142 | ['1.2.*', '1.1.3', 1],
143 | ['1.2.*', '1.1.9999', 1],
144 | ['1.2.x', '1.0.0', 1],
145 | ['1.2.x', '1.1.0', 1],
146 | ['1.2.x', '1.1.3', 1],
147 | ['2.*.*', '1.0.1', 1],
148 | ['2.*.*', '1.1.3', 1],
149 | ['2.x.x', '1.0.0', 1],
150 | ['2.x.x', '1.1.3', 1],
151 | ]);
152 | });
153 |
154 | describe('invalid input', () => {
155 | (
156 | [
157 | [42, /Invalid argument expected string/],
158 | [{}, /Invalid argument expected string/],
159 | [[], /Invalid argument expected string/],
160 | [() => undefined, /Invalid argument expected string/],
161 | ['6.3.', /Invalid argument not valid semver/],
162 | ['1.2.3a', /Invalid argument not valid semver/],
163 | ['1.2.-3a', /Invalid argument not valid semver/],
164 | ] as const
165 | ).forEach(([v1, exception]) => {
166 | it(`should throw on ${v1}`, () => {
167 | assert.throws(() => {
168 | compareVersions(v1 as any, v1 as any);
169 | }, exception);
170 | });
171 | });
172 | });
173 |
174 | runTests([
175 | ['0.1.20', '0.1.5', 1],
176 | ['0.6.1-1', '0.6.1-0', 1],
177 | ['1', '0.0.0-beta', 1],
178 | ['1', '0.2.3', 1],
179 | ['1', '0.2.4', 1],
180 | ['1', '1.0.0-0', 1],
181 | ['1', '1.0.0-beta', 1],
182 | ['1.0', '0.0.0', 1],
183 | ['1.0', '0.1.0', 1],
184 | ['1.0', '0.1.2', 1],
185 | ['1.0.0', '0.0.0', 1],
186 | ['1.0.0', '0.0.1', 1],
187 | ['1.0.0', '0.2.3', 1],
188 | ['1.0.0-beta.2', '1.0.0-beta.1', 1],
189 | ['1.2.2', '1.2.1', 1],
190 | ['2', '1.0.0', 1],
191 | ['2', '1.0.0-beta', 1],
192 | ['2', '1.9999.9999', 1],
193 | ['2.0.0', '1.0.0', 1],
194 | ['2.0.0', '1.1.1', 1],
195 | ['2.0.0', '1.2.9', 1],
196 | ['2.0.0', '1.9999.9999', 1],
197 | ['2.3', '2.2.1', 1],
198 | ['2.3', '2.2.2', 1],
199 | ['2.4', '2.3.0', 1],
200 | ['2.4', '2.3.5', 1],
201 | ['3.2.1', '2.3.2', 1],
202 | ['3.2.1', '3.2.0', 1],
203 | ['v0.5.4-pre', '0.5.4-alpha', 1],
204 | ['v3.2.1', 'v2.3.2', 1],
205 | ]);
206 | });
207 |
208 | describe('human readable compare versions', () => {
209 | const runTests = (
210 | dataSet: Array<[string, string, CompareOperator, boolean]>
211 | ) => {
212 | dataSet.forEach(([v1, v2, operator, expected]) => {
213 | it(`${v1} ${operator} ${v2}`, () =>
214 | assert.strictEqual(
215 | compare(v1, v2, operator),
216 | expected,
217 | `${v1} ${operator} ${v2} !== ${expected}`
218 | ));
219 | });
220 | };
221 |
222 | const runThrows = (dataSet: Array<[string, string, any, RegExp]>) => {
223 | dataSet.forEach(([v1, v2, operator, expected]) => {
224 | it(`${v1} ${operator} ${v2}`, () => {
225 | assert.throws(() => {
226 | compare(v1, v2, operator);
227 | }, expected);
228 | });
229 | });
230 | };
231 |
232 | runThrows([
233 | ['3.2.1', '3.2.0', null, /Invalid operator type, expected string but got /],
234 | [
235 | '3.2.1',
236 | '3.2.0',
237 | undefined,
238 | /Invalid operator type, expected string but got /,
239 | ],
240 | [
241 | '3.2.1',
242 | '3.2.0',
243 | true,
244 | /Invalid operator type, expected string but got boolean/,
245 | ],
246 | [
247 | '3.2.1',
248 | '3.2.0',
249 | 1,
250 | /Invalid operator type, expected string but got number/,
251 | ],
252 | [
253 | '3.2.1',
254 | '3.2.0',
255 | { foo: 'bar' },
256 | /Invalid operator type, expected string but got object/,
257 | ],
258 | [
259 | '3.2.1',
260 | '3.2.0',
261 | () => {},
262 | /Invalid operator type, expected string but got function/,
263 | ],
264 | ['3.2.1', '3.2.0', '', /Invalid operator, expected one of /],
265 | ['3.2.1', '3.2.0', 'foo', /Invalid operator, expected one of /],
266 | ['3.2.1', '3.2.0', '> ', /Invalid operator, expected one of /],
267 | ]);
268 |
269 | it('should throw the same Errors thrown by the main function', () => {
270 | (
271 | [
272 | [42, /Invalid argument expected string/],
273 | [{}, /Invalid argument expected string/],
274 | [[], /Invalid argument expected string/],
275 | [() => undefined, /Invalid argument expected string/],
276 | ['6.3.', /Invalid argument not valid semver/],
277 | ['1.2.3a', /Invalid argument not valid semver/],
278 | ['1.2.-3a', /Invalid argument not valid semver/],
279 | ] as const
280 | ).forEach(([v1, exception]) => {
281 | assert.throws(() => {
282 | compare(v1 as any, v1 as any, '>');
283 | }, exception);
284 | });
285 | });
286 |
287 | runTests([
288 | ['10.1.8', '10.0.4', '>', true],
289 | ['10.1.8', '10.0.4', '>=', true],
290 | ['10.0.1', '10.0.1', '=', true],
291 | ['10.0.1', '10.1.*', '=', false],
292 | ['3.3.3', '3.x.x', '<', false],
293 | ['3.3.3', '3.x.x', '>=', true],
294 | ['10.1.1', '10.2.2', '<', true],
295 | ['10.1.1', '10.0.2', '<', false],
296 | ['10.1.1', '10.2.2', '<=', true],
297 | ['10.1.1', '10.1.1', '<=', true],
298 | ['10.1.1', '10.0.2', '<=', false],
299 | ['10.1.1', '10.0.2', '>=', true],
300 | ['10.1.1', '10.1.1', '>=', true],
301 | ['10.1.1', '10.2.2', '>=', false],
302 | ['10.1.1', '10.2.2', '!=', true],
303 | ['10.1.1', '10.1.1', '!=', false],
304 | ]);
305 | });
306 |
--------------------------------------------------------------------------------
/test/satisfies.ts:
--------------------------------------------------------------------------------
1 | import assert from 'assert';
2 | import { satisfies } from '../src/index';
3 |
4 | describe('satisfies versions', () => {
5 | const runTests = (dataSet: Array<[string, string, boolean]>) => {
6 | dataSet.forEach(([v, m, expected]) => {
7 | it(`${v} ${expected ? 'satisfies' : 'violates'} ${m}`, () => {
8 | assert.strictEqual(satisfies(v, m), expected);
9 | });
10 | });
11 | };
12 |
13 | describe('tilde - https://docs.npmjs.com/cli/v6/using-npm/semver#tilde-ranges-123-12-1', () => {
14 | runTests([
15 | ['1.0.0', '~1.0.1', false],
16 | ['1.0.1', '~1.0.1', true],
17 | ['1.2.5', '~1.2.3', true],
18 | ['1.3.0', '~1.2.3', false],
19 | ['1.2.5', '~1.2', true], // (Same as 1.2.x)
20 | ['1.3.0', '~1.2', false], // (Same as 1.2.x)
21 | ['1.0.0', '~1', true], // (Same as 1.x)
22 | ['2.0.0', '~1', false], // (Same as 1.x)
23 | ['0.2.5', '~0.2.3', true],
24 | ['0.3.0', '~0.2.3', false],
25 | ['0.2.5', '~0.2', true], // (Same as 0.2.x)
26 | ['0.3.0', '~0.2', false], // (Same as 0.2.x)
27 | ['0.0.0', '~0', true], // (Same as 0.x)
28 | ['0.1.2', '~0', true], // (Same as 0.x)
29 | ['1.0.0', '~0', false], // (Same as 0.x)
30 | ]);
31 | });
32 |
33 | describe('caret - https://docs.npmjs.com/cli/v6/using-npm/semver#caret-ranges-123-025-004', () => {
34 | runTests([
35 | ['1.0.0', '^1', true],
36 | ['1.0.0', '^1.0', true],
37 | ['1.0.0', '^1.0.0', true],
38 | ['1.2.0', '^1.0.0', true],
39 | ['v1.2.0', '^1.0.0', true],
40 | ['2.0.0', '^1.0.0', false],
41 | ['1.0.0', '^1.2.0', false],
42 | ['1.0.1', '^1.2.0', false],
43 | ['1.3.4', '^1.2.3', true],
44 | ['2.0.0', '^1.2.3', false],
45 | ['0.3.0', '^0.2.3', false],
46 | ['0.0.4', '^0.0.3', false],
47 | ]);
48 | });
49 |
50 | runTests([
51 | ['1.2.0', '>1.0.0', true],
52 | ['1.2.0', '<1.0.0', false],
53 | ['1.0.0', '<=1.0.0', true],
54 | ['1.0.0', '<=2.0.0', true],
55 | ['1.0.1', '1.0.0', false],
56 | ['1.0.0', '1.0.0', true],
57 | ['10.1.8', '>10.0.4', true],
58 | ['10.1.8', '>=10.0.4', true],
59 | ['10.0.1', '=10.0.1', true],
60 | ['10.0.1', '=10.1.*', false],
61 | ['10.1.1', '<10.2.2', true],
62 | ['10.1.1', '<10.0.2', false],
63 | ['10.1.1', '<=10.2.2', true],
64 | ['10.1.1', '<=10.1.1', true],
65 | ['10.1.1', '<=10.0.2', false],
66 | ['10.1.1', '>=10.0.2', true],
67 | ['10.1.1', '>=10.1.1', true],
68 | ['10.1.1', '>=10.2.2', false],
69 | ['11.0.0', '>=10.1.1', true],
70 | ['3', '3.x.x', true],
71 | ['3.3', '3.x.x', true],
72 | ['3.3.3', '3.x.x', true],
73 | ['3.x.x', '3.3.3', true],
74 | ['3.3.3', '3.X.X', true],
75 | ['3.3.3', '3.3.x', true],
76 | ['3.3.3', '3.*.*', true],
77 | ['3.3.3', '3.3.*', true],
78 | ['3.0.3', '3.0.*', true],
79 | ['1.1.0', '1.2.x', false],
80 | ['1.1.0', '2.x.x', false],
81 | ['2.0.0', '<2.x.x', false],
82 | ['2.0.0', '<=2.x.x', true],
83 | ['2.0.0', '>2.x.x', false],
84 | ]);
85 |
86 | describe('pre-release versions - https://semver.org/#spec-item-9', () => {
87 | runTests([
88 | ['1.2.3-beta.4', '~1.2.3-beta.2', true],
89 | ['1.2.3-beta.1', '~1.2.3-beta.2', false],
90 | ['1.2.4-beta.2', '~1.2.3-beta.2', false],
91 | ['1.2.3-beta.4', '^1.2.3-beta.2', true],
92 | ['1.2.4-beta.2', '^1.2.3-beta.2', false],
93 | ['2.0.0', '^1.2.3-beta.2', false],
94 | ['0.0.3-beta.2', '^0.0.3-beta', true],
95 | ['0.0.3-pr.2', '^0.0.3-beta', true],
96 | ['0.0.4', '^0.0.3-beta', false],
97 | ]);
98 | });
99 |
100 | describe('comparator sets - https://docs.npmjs.com/cli/v6/using-npm/semver#ranges', () => {
101 | runTests([
102 | ['1.1.0', '>=1.2.7 <1.3.0', false],
103 | ['1.2.9', '>=1.2.7 <1.3.0', true],
104 | ['1.3.0', '>=1.2.7 <1.3.0', false],
105 | ['1.2.9', ' >=1.2.7 <1.3.0 ', true],
106 | ['1.3.0', ' >=1.2.7 <1.3.0 ', false],
107 | ['1.2.7', '1.2.7 || >=1.2.9 <2.0.0', true],
108 | ['1.2.9', '1.2.7 || >=1.2.9 <2.0.0', true],
109 | ['1.4.6', '1.2.7 || >=1.2.9 <2.0.0', true],
110 | ['1.2.8', '1.2.7 || >=1.2.9 <2.0.0', false],
111 | ['2.0.0', '1.2.7 || >=1.2.9 <2.0.0', false],
112 | ['2.0.0', '1.2.7 || >=1.2.9 <2.0.0', false],
113 | ['1.4.6', ' 1.2.7 || >=1.2.9 <2.0.0 ', true],
114 | ['2.0.0', ' 1.2.7 || >=1.2.9 <2.0.0 ', false],
115 | ['1.0.0', '1.2.3 - 2.3.4', false],
116 | ['1.2.3', '1.2.3 - 2.3.4', true],
117 | ['1.5.1', '1.2.3 - 2.3.4', true],
118 | ['2.3.4', '1.2.3 - 2.3.4', true],
119 | ['2.4.0', '1.2.3 - 2.3.4', false],
120 | ['12.25.0', '^12.22.0 || ^14.17.0 || >=16.0.0', true],
121 | ['14.25.0', '^12.22.0 || ^14.17.0 || >=16.0.0', true],
122 | ['17', '^12.22.0 || ^14.17.0 || >=16.0.0', true],
123 | ['15', '^12.22.0 || ^14.17.0 || >=16.0.0', false],
124 | ]);
125 | });
126 |
127 | describe('malformed input - https://docs.npmjs.com/cli/v6/using-npm/semver#hyphen-ranges-xyz---abc', () => {
128 | runTests([
129 | ['1.2.3', '> 1.2.3', false],
130 | ['1.2.4', '> 1.2.3', true],
131 | ['1.2.3', '> 1.2.3 < 1.2.5', false],
132 | ['1.2.4', '> 1.2.3 < 1.2.5', true],
133 | ['0.0.0', '> 1.2.3 <= 1.2.5 || 0.0.0', true],
134 | ['1.2.5', '> 1.2.3 <= 1.2.5 || 0.0.0', true],
135 | ['1.3.0', '> 1.2.3 <= 1.2.5 || 0.0.0', false],
136 | ]);
137 | });
138 | });
139 |
--------------------------------------------------------------------------------
/test/sort.ts:
--------------------------------------------------------------------------------
1 | import assert from 'assert';
2 | import { compareVersions } from '../src/index';
3 |
4 | describe('sort versions', function () {
5 | it('should sort versions', function () {
6 | const versions = [
7 | '1.2.3',
8 | '4.11.6',
9 | '4.2.0',
10 | '1.5.19',
11 | '1.5.5',
12 | '4.1.3',
13 | '2.3.1',
14 | '10.5.5',
15 | '11.3.0',
16 | ];
17 |
18 | assert.deepEqual(versions.sort(compareVersions), [
19 | '1.2.3',
20 | '1.5.5',
21 | '1.5.19',
22 | '2.3.1',
23 | '4.1.3',
24 | '4.2.0',
25 | '4.11.6',
26 | '10.5.5',
27 | '11.3.0',
28 | ]);
29 | });
30 |
31 | it('should sort different digits', function () {
32 | const versions = ['1.0', '1.0.0', '1.0.1'];
33 |
34 | assert.deepEqual(versions.sort(compareVersions), ['1.0', '1.0.0', '1.0.1']);
35 | });
36 |
37 | it('should sort pre-release', function () {
38 | const versions = ['1.0.0', '1.0.1', '1.0.1-gamma', '1.0.1-alpha'];
39 |
40 | assert.deepEqual(versions.sort(compareVersions), [
41 | '1.0.0',
42 | '1.0.1-alpha',
43 | '1.0.1-gamma',
44 | '1.0.1',
45 | ]);
46 | });
47 | });
48 |
--------------------------------------------------------------------------------
/test/validate.ts:
--------------------------------------------------------------------------------
1 | import assert from 'assert';
2 | import { validate, validateStrict } from '../src/index';
3 |
4 | describe('validate versions', () => {
5 | (
6 | [
7 | [undefined, false],
8 | [null, false],
9 | [42, false],
10 | [{}, false],
11 | [[], false],
12 | [() => undefined, false],
13 | ['foo', false],
14 | ['6.3.', false],
15 | ['1.2.3a', false],
16 | ['1.2.-3a', false],
17 | ['v1.0.0', true],
18 | ['01.0.0', true],
19 | ['1.0.x', true],
20 | ['1.0.0-rc.1', true],
21 | ['1.0.0-alpha', true],
22 | ['1.0.0-build.3928', true],
23 | ['1.0.0+20130313144700', true],
24 | ['1.2.3.100', true],
25 | ['2020', true],
26 | ['=1.0', false],
27 | ['>1.0.0', false],
28 | ] as const
29 | ).forEach(([v, expected]) => {
30 | it(`${v}`, () => {
31 | assert.equal(validate(v as any), expected);
32 | });
33 | });
34 | });
35 |
36 | describe('validateStrict - https://regex101.com/r/vkijKf/1/', () => {
37 | describe('valid', () => {
38 | [
39 | '0.0.4',
40 | '1.2.3',
41 | '10.20.30',
42 | '1.1.2-prerelease+meta',
43 | '1.1.2+meta',
44 | '1.1.2+meta-valid',
45 | '1.0.0-alpha',
46 | '1.0.0-beta',
47 | '1.0.0-alpha.beta',
48 | '1.0.0-alpha.beta.1',
49 | '1.0.0-alpha.1',
50 | '1.0.0-alpha0.valid',
51 | '1.0.0-alpha.0valid',
52 | '1.0.0-alpha-a.b-c-somethinglong+build.1-aef.1-its-okay',
53 | '1.0.0-rc.1+build.1',
54 | '2.0.0-rc.1+build.123',
55 | '1.2.3-beta',
56 | '10.2.3-DEV-SNAPSHOT',
57 | '1.2.3-SNAPSHOT-123',
58 | '1.0.0',
59 | '2.0.0',
60 | '1.1.7',
61 | '2.0.0+build.1848',
62 | '2.0.1-alpha.1227',
63 | '1.0.0-alpha+beta',
64 | '1.2.3----RC-SNAPSHOT.12.9.1--.12+788',
65 | '1.2.3----R-S.12.9.1--.12+meta',
66 | '1.2.3----RC-SNAPSHOT.12.9.1--.12',
67 | '1.0.0+0.build.1-rc.10000aaa-kk-0.1',
68 | '99999999999999999999999.999999999999999999.99999999999999999',
69 | '1.0.0-0A.is.legal',
70 | ].forEach((v) => {
71 | it(`${v}`, () => {
72 | assert.equal(validateStrict(v), true);
73 | });
74 | });
75 | });
76 |
77 | describe('invalid', () => {
78 | [
79 | '1',
80 | '1.2',
81 | '1.2.3-0123',
82 | '1.2.3-0123.0123',
83 | '1.1.2+.123',
84 | '+invalid',
85 | '-invalid',
86 | '-invalid+invalid',
87 | '-invalid.01',
88 | 'alpha',
89 | 'alpha.beta',
90 | 'alpha.beta.1',
91 | 'alpha.1',
92 | 'alpha+beta',
93 | 'alpha_beta',
94 | 'alpha.',
95 | 'alpha..',
96 | 'beta',
97 | '1.0.0-alpha_beta',
98 | '-alpha.',
99 | '1.0.0-alpha..',
100 | '1.0.0-alpha..1',
101 | '1.0.0-alpha...1',
102 | '1.0.0-alpha....1',
103 | '1.0.0-alpha.....1',
104 | '1.0.0-alpha......1',
105 | '1.0.0-alpha.......1',
106 | '01.1.1',
107 | '1.01.1',
108 | '1.1.01',
109 | '1.2',
110 | '1.2.3.DEV',
111 | '1.2-SNAPSHOT',
112 | '1.2.31.2.3----RC-SNAPSHOT.12.09.1--..12+788',
113 | '1.2-RC-SNAPSHOT',
114 | '-1.0.3-gamma+b7718',
115 | '+justmeta',
116 | '9.8.7+meta+meta',
117 | '9.8.7-whatever+meta+meta',
118 | '99999999999999999999999.999999999999999999.99999999999999999----RC-SNAPSHOT.12.09.1--------------------------------..',
119 | '12',
120 | ].forEach((v) => {
121 | it(`${v}`, () => {
122 | assert.equal(validateStrict(v), false);
123 | });
124 | });
125 | });
126 | });
127 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "declaration": true,
4 | "esModuleInterop": true,
5 | "module": "UMD",
6 | "noUnusedLocals": true,
7 | "noUnusedParameters": true,
8 | "outDir": ".",
9 | "sourceMap": true,
10 | "strict": true,
11 | "target": "ES5"
12 | },
13 | "include": ["src/index.ts"],
14 | "exclude": ["./src/test/**/*", "node_modules"],
15 | "ts-node": {
16 | "experimentalResolver": true
17 | }
18 | }
19 |
--------------------------------------------------------------------------------