├── .editorconfig
├── .eslintrc.js
├── .github
└── workflows
│ └── ci.yml
├── .gitignore
├── .npmignore
├── README.md
├── bower.json
├── lib
└── approximate-number.js
├── package-lock.json
├── package.json
└── test
├── .eslintrc.js
└── approximate-number_test.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig - http://EditorConfig.org
2 |
3 | # top-most EditorConfig file
4 | root = true
5 |
6 | # Unix-style newlines with a newline ending every file
7 | [*]
8 | end_of_line = lf
9 | insert_final_newline = true
10 |
11 | # Indentation
12 | indent_style = space
13 | indent_size = 2
14 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | 'env': {
3 | 'browser': true,
4 | 'node': true,
5 | 'amd': true
6 | },
7 | 'extends': 'eslint:recommended',
8 | 'rules': {
9 | 'indent': [
10 | 'error',
11 | 2
12 | ],
13 | 'linebreak-style': [
14 | 'error',
15 | 'unix'
16 | ],
17 | 'quotes': [
18 | 'error',
19 | 'single'
20 | ],
21 | 'semi': [
22 | 'error',
23 | 'always'
24 | ]
25 | }
26 | };
27 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages
3 |
4 | name: CI
5 |
6 | on: [push, pull_request]
7 |
8 | jobs:
9 | test:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - uses: actions/checkout@v3
13 | - uses: actions/setup-node@v3
14 | with:
15 | node-version: 20
16 | - run: npm ci
17 | - run: npm test
18 |
19 | publish-npm:
20 | needs: test
21 | if: startsWith(github.ref, 'refs/tags/v')
22 | runs-on: ubuntu-latest
23 | steps:
24 | - uses: actions/checkout@v3
25 | - uses: actions/setup-node@v3
26 | with:
27 | node-version: 20
28 | registry-url: https://registry.npmjs.org/
29 | - run: npm publish
30 | env:
31 | NODE_AUTH_TOKEN: ${{secrets.npm_token}}
32 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | npm-debug.log
3 | .idea/
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .gitignore
2 | .jshintrc
3 | .travis.yml
4 | .yo-rc.json
5 | bower.json
6 | Gruntfile.js
7 | test/
8 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Approximate Number
2 |
3 | [](https://github.com/nfriedly/approximate-number/actions/workflows/ci.yml)
4 | [](https://www.npmjs.com/package/approximate-number)
5 | [](https://www.npmjs.com/package/approximate-number)
6 |
7 | Abbreviates numbers into a more human-friendly format, similar to `ls`'s `--human-readable` flag (`ls -lh`) or Stack
8 | Overflow's reputation numbers. For example, 123456 becomes '123k'.
9 |
10 | Works in Node.js and in browsers.
11 |
12 | ```js
13 | var approx = require('approximate-number');
14 |
15 | console.log(approx(1234));
16 | //> 1.2k
17 |
18 | console.log(approx(12345));
19 | //> 12k
20 |
21 | console.log(approx(1234, {decimal: false}));
22 | //> 1k
23 |
24 | console.log(approx(1234, {decimal: ','}));
25 | //> 1,2k
26 |
27 | console.log('My Stack Overflow reputation is %s.', approx(3671, {
28 | min10k: true
29 | }));
30 | //> My Stack Overflow reputation is 3,671.
31 |
32 | console.log('The US national debt is %s.', approx(19939034457936, {
33 | prefix: '$',
34 | capital: true,
35 | round: true
36 | }));
37 | // > The US national debt is $20T.
38 |
39 | // Truncates/floors numbers by default
40 | approx(9999);
41 | // > '9.9k'
42 |
43 | // Set `round: true` to round instead of floor.
44 | approx(9999,{round: true});
45 | // > '10k'
46 |
47 | ```
48 |
49 | ## Getting Started
50 |
51 | ### Node.js
52 |
53 | Install node module with: `npm install --save approximate-number`
54 |
55 | ```js
56 | var approx = require('approximate-number');
57 | approx(123456) // 123k
58 | ```
59 |
60 | ### Bower
61 |
62 | Install with: `bower install approximate-number`
63 |
64 | ```html
65 |
66 |
69 | ```
70 |
71 | ### Browser usage without a package manager
72 |
73 | Grab the latest [approximate-number.js](https://github.com/nfriedly/approximate-number/blob/master/lib/approximate-number.js) and copy it onto your site.
74 |
75 | ## Options
76 |
77 | * **separator** {String|Boolean} Default = `','`. Thousands separator - set to a string (e.g. '.') to use that string or false to not use any separator.
78 | * **decimal** {String|Boolean} Default = `'.'`. Decimal - set to a string (e.g. ',') to use that or set to false to avoid outputting values with a decimal.
79 | * **round** {Boolean} Default = `false`. Round numbers off rather than flooring/truncating. When true, 105000 would become '11m', when false it becomes '10m'.
80 | * **min10k** {Boolean} Default = `false`. Do not abbreviate numbers below 10000. E.g. 9999 would become '9,999' rather than '9k'. (Stack Overflow-style).
81 | * **prefix** {String} Default = `''`. Optional string to prepend to the value, e.g. '$'.
82 | * **suffix** {String} Default = `''`. Optional string to append to the value, e.g. '%'.
83 | * **capital** {Boolean} Default = `false`. Set to true to use capital letters, e.g. 3.9M instead of 3.9m
84 | * **precision** {Number} Default = undefined. Number of significant digits. Must be greater than 0. Use of this option forces rounding.
85 |
86 | ## V2.1 Changes
87 | * Added precision
88 |
89 | ## V2 Changes
90 |
91 | * Added optional configuration object
92 | * Changed default from rounding to truncation. Override with `options.round=true`.
93 | * Started abbreviating numbers between 1000 and 9999 by default. Override with `options.min10k=true`.
94 | * Added trillions support.
95 | * Dropped cli support.
96 |
97 | ## License
98 |
99 | Copyright (c) 2014 Nathan Friedly
100 | Licensed under the MIT license.
101 |
102 |
103 | [tests]: https://github.com/nfriedly/approximate-number/blob/master/test/approximate-number_test.js
104 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "approximate-number",
3 | "main": "lib/approximate-number.js",
4 | "homepage": "https://github.com/nfriedly/approximate-number",
5 | "authors": [
6 | "Nathan Friedly "
7 | ],
8 | "description": "Converts large numbers into a more human-friendly format. For example, 123456 becomes '123k'.",
9 | "keywords": [
10 | "approximate-number",
11 | "human",
12 | "friendly",
13 | "readable",
14 | "large",
15 | "big",
16 | "number",
17 | "numbers",
18 | "stack overflow",
19 | "stack exchange",
20 | "-h",
21 | "format",
22 | "formatter",
23 | "approximate",
24 | "approximation",
25 | "short",
26 | "simple",
27 | "near",
28 | "nearest",
29 | "closest",
30 | "round"
31 | ],
32 | "moduleType": [
33 | "amd",
34 | "globals",
35 | "node"
36 | ],
37 | "license": "MIT",
38 | "ignore": [
39 | "**/.*",
40 | "node_modules",
41 | "bower_components",
42 | "test",
43 | "tests"
44 | ]
45 | }
46 |
--------------------------------------------------------------------------------
/lib/approximate-number.js:
--------------------------------------------------------------------------------
1 | /* Approximate Number - outputs numbers in human-readable format, similar to ls -lh or Stack Overflow's reputation
2 | *
3 | * https://github.com/nfriedly/approximate-number
4 | *
5 | * Copyright (c) 2014 Nathan Friedly
6 | * Licensed under the MIT license.
7 | */
8 | (function() {
9 | 'use strict';
10 |
11 | function addCommas(num, opts) {
12 | if (opts.separator === false) {
13 | return num.toString();
14 | }
15 |
16 | if (num < 1000) {
17 | return num.toString();
18 | }
19 |
20 | var separator = (typeof opts.separator === 'string' ? opts.separator : ',');
21 |
22 | var out = [],
23 | digits = Math.round(num).toString().split('');
24 |
25 | digits.reverse().forEach(function(digit, i){
26 | if (i && i%3 === 0) {
27 | out.push(separator);
28 | }
29 | out.push(digit);
30 | });
31 |
32 | return out.reverse().join('');
33 | }
34 |
35 | function formatDec(num, base, opts) {
36 | var workingNum = num/base;
37 | var ROUND = opts.round ? 'round' : 'floor';
38 | if (opts.decimal === false) {
39 | num = Math[ROUND](workingNum);
40 | return num.toString();
41 | }
42 | if (opts.precision) {
43 | num = workingNum;
44 | } else {
45 | num = workingNum < 10 ? (Math[ROUND](workingNum * 10) / 10) : Math[ROUND](workingNum);
46 | }
47 | num = num.toString();
48 | if (typeof opts.decimal === 'string') {
49 | num = num.replace('.', opts.decimal);
50 | }
51 | return num;
52 | }
53 |
54 | var THOUSAND = 1000;
55 | var TEN_THOUSAND = 10000;
56 | var MILLION = 1000000;
57 | var BILLION = 1000000000;
58 | var TRILLION = 1000000000000;
59 |
60 | /**
61 | * Converts big numbers into human-readable forms
62 | * @param {Number} num
63 | * @param {Object} [opts]
64 | * @param {String|Boolean} [opts.separator=','] Thousands separator - set to a string (e.g. '.') to use that string or false to not use any separator
65 | * @param {String|Boolean} [opts.decimal='.'] Decimal - set to a string (e.g. ',') to use that or set to false to avoid outputting values with a decimal
66 | * @param {Boolean} [opts.round=false] Round numbers off rather than flooring/truncating. When true, 105000 would become '11m', when false it becomes '10m'
67 | * @param {Boolean} [opts.min10k=false] Do not abbreviate numbers below 10000. E.g. 9999 would become '9,999' rather than '9k'. (Stack Overflow-style)
68 | * @param {String} [opts.prefix=''] Optional string to prepend to the value, e.g. '$'
69 | * @param {String} [opts.suffix=''] Optional string to append to the value, e.g. '%'
70 | * @param {Boolean} [opts.capital=false] Set to true to use capital letters, e.g. 3.9M instead of 3.9m
71 | * @param {Number} [opts.precision] Optional number of significant digits. Must be greater than 0.
72 | *
73 | * @returns {String}
74 | */
75 | function approximateNumber(num, opts) {
76 | var numString;
77 | opts = opts || {};
78 |
79 | // if we're working on a negative number, convert it to positive and then prefix the final result with a -
80 | var negative = num < 0;
81 | if (negative) {
82 | num = Math.abs(num);
83 | }
84 |
85 | if (opts.precision) {
86 | num = parseFloat(num.toPrecision(opts.precision));
87 | }
88 |
89 | var thousandsBreak = opts.min10k ? TEN_THOUSAND : THOUSAND;
90 |
91 | if (num < thousandsBreak) {
92 | numString = addCommas(formatDec(num, 1, opts), opts);
93 | } else if (opts.precision && opts.precision > Math.log10(num)) {
94 | numString = addCommas(formatDec(num, 1, opts), opts);
95 | } else if (num < MILLION) {
96 | numString = formatDec(num, THOUSAND, opts) + 'k';
97 | } else if (num < BILLION) {
98 | numString = formatDec(num, MILLION, opts) + 'm';
99 | } else if (num < TRILLION) {
100 | numString = addCommas(formatDec(num, BILLION, opts), opts) + 'b';
101 | } else {
102 | numString = addCommas(formatDec(num, TRILLION, opts), opts) + 't';
103 | }
104 |
105 | if (negative) {
106 | numString = '-' + numString;
107 | }
108 |
109 | if (opts.capital) {
110 | numString = numString.toUpperCase();
111 | }
112 |
113 | if (opts.prefix) {
114 | numString = opts.prefix + numString;
115 | }
116 | if (opts.suffix) {
117 | numString = numString + opts.suffix;
118 | }
119 |
120 | return numString;
121 | }
122 |
123 | approximateNumber.addCommas = addCommas;
124 |
125 | if (typeof module === 'object') {
126 | // node.js/common js
127 | module.exports = approximateNumber;
128 | } else if (typeof define === 'function') {
129 | // require.js/amd
130 | define([], approximateNumber);
131 | } else if(typeof window !== 'undefined') {
132 | window.approximateNumber = approximateNumber;
133 | }
134 | }());
135 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "approximate-number",
3 | "version": "2.1.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "approximate-number",
9 | "version": "2.1.1",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "eslint": "^8.45.0",
13 | "mocha": "^10.2.0"
14 | }
15 | },
16 | "node_modules/@aashutoshrathi/word-wrap": {
17 | "version": "1.2.6",
18 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
19 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
20 | "dev": true,
21 | "engines": {
22 | "node": ">=0.10.0"
23 | }
24 | },
25 | "node_modules/@eslint-community/eslint-utils": {
26 | "version": "4.4.0",
27 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
28 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
29 | "dev": true,
30 | "dependencies": {
31 | "eslint-visitor-keys": "^3.3.0"
32 | },
33 | "engines": {
34 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
35 | },
36 | "peerDependencies": {
37 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
38 | }
39 | },
40 | "node_modules/@eslint-community/regexpp": {
41 | "version": "4.6.1",
42 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.1.tgz",
43 | "integrity": "sha512-O7x6dMstWLn2ktjcoiNLDkAGG2EjveHL+Vvc+n0fXumkJYAcSqcVYKtwDU+hDZ0uDUsnUagSYaZrOLAYE8un1A==",
44 | "dev": true,
45 | "engines": {
46 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
47 | }
48 | },
49 | "node_modules/@eslint/eslintrc": {
50 | "version": "2.1.0",
51 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
52 | "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
53 | "dev": true,
54 | "dependencies": {
55 | "ajv": "^6.12.4",
56 | "debug": "^4.3.2",
57 | "espree": "^9.6.0",
58 | "globals": "^13.19.0",
59 | "ignore": "^5.2.0",
60 | "import-fresh": "^3.2.1",
61 | "js-yaml": "^4.1.0",
62 | "minimatch": "^3.1.2",
63 | "strip-json-comments": "^3.1.1"
64 | },
65 | "engines": {
66 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
67 | },
68 | "funding": {
69 | "url": "https://opencollective.com/eslint"
70 | }
71 | },
72 | "node_modules/@eslint/js": {
73 | "version": "8.44.0",
74 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
75 | "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
76 | "dev": true,
77 | "engines": {
78 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
79 | }
80 | },
81 | "node_modules/@humanwhocodes/config-array": {
82 | "version": "0.11.10",
83 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
84 | "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
85 | "dev": true,
86 | "dependencies": {
87 | "@humanwhocodes/object-schema": "^1.2.1",
88 | "debug": "^4.1.1",
89 | "minimatch": "^3.0.5"
90 | },
91 | "engines": {
92 | "node": ">=10.10.0"
93 | }
94 | },
95 | "node_modules/@humanwhocodes/module-importer": {
96 | "version": "1.0.1",
97 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
98 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
99 | "dev": true,
100 | "engines": {
101 | "node": ">=12.22"
102 | },
103 | "funding": {
104 | "type": "github",
105 | "url": "https://github.com/sponsors/nzakas"
106 | }
107 | },
108 | "node_modules/@humanwhocodes/object-schema": {
109 | "version": "1.2.1",
110 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
111 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
112 | "dev": true
113 | },
114 | "node_modules/@nodelib/fs.scandir": {
115 | "version": "2.1.5",
116 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
117 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
118 | "dev": true,
119 | "dependencies": {
120 | "@nodelib/fs.stat": "2.0.5",
121 | "run-parallel": "^1.1.9"
122 | },
123 | "engines": {
124 | "node": ">= 8"
125 | }
126 | },
127 | "node_modules/@nodelib/fs.stat": {
128 | "version": "2.0.5",
129 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
130 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
131 | "dev": true,
132 | "engines": {
133 | "node": ">= 8"
134 | }
135 | },
136 | "node_modules/@nodelib/fs.walk": {
137 | "version": "1.2.8",
138 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
139 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
140 | "dev": true,
141 | "dependencies": {
142 | "@nodelib/fs.scandir": "2.1.5",
143 | "fastq": "^1.6.0"
144 | },
145 | "engines": {
146 | "node": ">= 8"
147 | }
148 | },
149 | "node_modules/acorn": {
150 | "version": "8.10.0",
151 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
152 | "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
153 | "dev": true,
154 | "bin": {
155 | "acorn": "bin/acorn"
156 | },
157 | "engines": {
158 | "node": ">=0.4.0"
159 | }
160 | },
161 | "node_modules/acorn-jsx": {
162 | "version": "5.3.2",
163 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
164 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
165 | "dev": true,
166 | "peerDependencies": {
167 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
168 | }
169 | },
170 | "node_modules/ajv": {
171 | "version": "6.12.6",
172 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
173 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
174 | "dev": true,
175 | "dependencies": {
176 | "fast-deep-equal": "^3.1.1",
177 | "fast-json-stable-stringify": "^2.0.0",
178 | "json-schema-traverse": "^0.4.1",
179 | "uri-js": "^4.2.2"
180 | },
181 | "funding": {
182 | "type": "github",
183 | "url": "https://github.com/sponsors/epoberezkin"
184 | }
185 | },
186 | "node_modules/ansi-colors": {
187 | "version": "4.1.3",
188 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
189 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
190 | "dev": true,
191 | "license": "MIT",
192 | "engines": {
193 | "node": ">=6"
194 | }
195 | },
196 | "node_modules/ansi-regex": {
197 | "version": "5.0.1",
198 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
199 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
200 | "dev": true,
201 | "engines": {
202 | "node": ">=8"
203 | }
204 | },
205 | "node_modules/anymatch": {
206 | "version": "3.1.2",
207 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
208 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
209 | "dev": true,
210 | "dependencies": {
211 | "normalize-path": "^3.0.0",
212 | "picomatch": "^2.0.4"
213 | },
214 | "engines": {
215 | "node": ">= 8"
216 | }
217 | },
218 | "node_modules/argparse": {
219 | "version": "2.0.1",
220 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
221 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
222 | "dev": true
223 | },
224 | "node_modules/balanced-match": {
225 | "version": "1.0.0",
226 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
227 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
228 | "dev": true
229 | },
230 | "node_modules/binary-extensions": {
231 | "version": "2.2.0",
232 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
233 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
234 | "dev": true,
235 | "engines": {
236 | "node": ">=8"
237 | }
238 | },
239 | "node_modules/brace-expansion": {
240 | "version": "1.1.11",
241 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
242 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
243 | "dev": true,
244 | "dependencies": {
245 | "balanced-match": "^1.0.0",
246 | "concat-map": "0.0.1"
247 | }
248 | },
249 | "node_modules/braces": {
250 | "version": "3.0.3",
251 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
252 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
253 | "dev": true,
254 | "dependencies": {
255 | "fill-range": "^7.1.1"
256 | },
257 | "engines": {
258 | "node": ">=8"
259 | }
260 | },
261 | "node_modules/browser-stdout": {
262 | "version": "1.3.1",
263 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
264 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
265 | "dev": true
266 | },
267 | "node_modules/callsites": {
268 | "version": "3.1.0",
269 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
270 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
271 | "dev": true,
272 | "engines": {
273 | "node": ">=6"
274 | }
275 | },
276 | "node_modules/camelcase": {
277 | "version": "6.3.0",
278 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
279 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
280 | "dev": true,
281 | "engines": {
282 | "node": ">=10"
283 | },
284 | "funding": {
285 | "url": "https://github.com/sponsors/sindresorhus"
286 | }
287 | },
288 | "node_modules/chalk": {
289 | "version": "4.1.1",
290 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
291 | "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
292 | "dev": true,
293 | "dependencies": {
294 | "ansi-styles": "^4.1.0",
295 | "supports-color": "^7.1.0"
296 | },
297 | "engines": {
298 | "node": ">=10"
299 | },
300 | "funding": {
301 | "url": "https://github.com/chalk/chalk?sponsor=1"
302 | }
303 | },
304 | "node_modules/chalk/node_modules/ansi-styles": {
305 | "version": "4.3.0",
306 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
307 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
308 | "dev": true,
309 | "dependencies": {
310 | "color-convert": "^2.0.1"
311 | },
312 | "engines": {
313 | "node": ">=8"
314 | },
315 | "funding": {
316 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
317 | }
318 | },
319 | "node_modules/chalk/node_modules/color-convert": {
320 | "version": "2.0.1",
321 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
322 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
323 | "dev": true,
324 | "dependencies": {
325 | "color-name": "~1.1.4"
326 | },
327 | "engines": {
328 | "node": ">=7.0.0"
329 | }
330 | },
331 | "node_modules/chalk/node_modules/color-name": {
332 | "version": "1.1.4",
333 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
334 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
335 | "dev": true
336 | },
337 | "node_modules/chalk/node_modules/has-flag": {
338 | "version": "4.0.0",
339 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
340 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
341 | "dev": true,
342 | "engines": {
343 | "node": ">=8"
344 | }
345 | },
346 | "node_modules/chalk/node_modules/supports-color": {
347 | "version": "7.2.0",
348 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
349 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
350 | "dev": true,
351 | "dependencies": {
352 | "has-flag": "^4.0.0"
353 | },
354 | "engines": {
355 | "node": ">=8"
356 | }
357 | },
358 | "node_modules/chokidar": {
359 | "version": "3.5.3",
360 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
361 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
362 | "dev": true,
363 | "funding": [
364 | {
365 | "type": "individual",
366 | "url": "https://paulmillr.com/funding/"
367 | }
368 | ],
369 | "dependencies": {
370 | "anymatch": "~3.1.2",
371 | "braces": "~3.0.2",
372 | "glob-parent": "~5.1.2",
373 | "is-binary-path": "~2.1.0",
374 | "is-glob": "~4.0.1",
375 | "normalize-path": "~3.0.0",
376 | "readdirp": "~3.6.0"
377 | },
378 | "engines": {
379 | "node": ">= 8.10.0"
380 | },
381 | "optionalDependencies": {
382 | "fsevents": "~2.3.2"
383 | }
384 | },
385 | "node_modules/cliui": {
386 | "version": "7.0.4",
387 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
388 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
389 | "dev": true,
390 | "dependencies": {
391 | "string-width": "^4.2.0",
392 | "strip-ansi": "^6.0.0",
393 | "wrap-ansi": "^7.0.0"
394 | }
395 | },
396 | "node_modules/concat-map": {
397 | "version": "0.0.1",
398 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
399 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
400 | "dev": true
401 | },
402 | "node_modules/cross-spawn": {
403 | "version": "7.0.3",
404 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
405 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
406 | "dev": true,
407 | "dependencies": {
408 | "path-key": "^3.1.0",
409 | "shebang-command": "^2.0.0",
410 | "which": "^2.0.1"
411 | },
412 | "engines": {
413 | "node": ">= 8"
414 | }
415 | },
416 | "node_modules/debug": {
417 | "version": "4.4.0",
418 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
419 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
420 | "dev": true,
421 | "license": "MIT",
422 | "dependencies": {
423 | "ms": "^2.1.3"
424 | },
425 | "engines": {
426 | "node": ">=6.0"
427 | },
428 | "peerDependenciesMeta": {
429 | "supports-color": {
430 | "optional": true
431 | }
432 | }
433 | },
434 | "node_modules/decamelize": {
435 | "version": "4.0.0",
436 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
437 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
438 | "dev": true,
439 | "engines": {
440 | "node": ">=10"
441 | },
442 | "funding": {
443 | "url": "https://github.com/sponsors/sindresorhus"
444 | }
445 | },
446 | "node_modules/deep-is": {
447 | "version": "0.1.4",
448 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
449 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
450 | "dev": true
451 | },
452 | "node_modules/diff": {
453 | "version": "5.2.0",
454 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
455 | "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
456 | "dev": true,
457 | "license": "BSD-3-Clause",
458 | "engines": {
459 | "node": ">=0.3.1"
460 | }
461 | },
462 | "node_modules/doctrine": {
463 | "version": "3.0.0",
464 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
465 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
466 | "dev": true,
467 | "dependencies": {
468 | "esutils": "^2.0.2"
469 | },
470 | "engines": {
471 | "node": ">=6.0.0"
472 | }
473 | },
474 | "node_modules/emoji-regex": {
475 | "version": "8.0.0",
476 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
477 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
478 | "dev": true
479 | },
480 | "node_modules/escalade": {
481 | "version": "3.1.1",
482 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
483 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
484 | "dev": true,
485 | "engines": {
486 | "node": ">=6"
487 | }
488 | },
489 | "node_modules/escape-string-regexp": {
490 | "version": "4.0.0",
491 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
492 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
493 | "dev": true,
494 | "engines": {
495 | "node": ">=10"
496 | },
497 | "funding": {
498 | "url": "https://github.com/sponsors/sindresorhus"
499 | }
500 | },
501 | "node_modules/eslint": {
502 | "version": "8.45.0",
503 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
504 | "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
505 | "dev": true,
506 | "dependencies": {
507 | "@eslint-community/eslint-utils": "^4.2.0",
508 | "@eslint-community/regexpp": "^4.4.0",
509 | "@eslint/eslintrc": "^2.1.0",
510 | "@eslint/js": "8.44.0",
511 | "@humanwhocodes/config-array": "^0.11.10",
512 | "@humanwhocodes/module-importer": "^1.0.1",
513 | "@nodelib/fs.walk": "^1.2.8",
514 | "ajv": "^6.10.0",
515 | "chalk": "^4.0.0",
516 | "cross-spawn": "^7.0.2",
517 | "debug": "^4.3.2",
518 | "doctrine": "^3.0.0",
519 | "escape-string-regexp": "^4.0.0",
520 | "eslint-scope": "^7.2.0",
521 | "eslint-visitor-keys": "^3.4.1",
522 | "espree": "^9.6.0",
523 | "esquery": "^1.4.2",
524 | "esutils": "^2.0.2",
525 | "fast-deep-equal": "^3.1.3",
526 | "file-entry-cache": "^6.0.1",
527 | "find-up": "^5.0.0",
528 | "glob-parent": "^6.0.2",
529 | "globals": "^13.19.0",
530 | "graphemer": "^1.4.0",
531 | "ignore": "^5.2.0",
532 | "imurmurhash": "^0.1.4",
533 | "is-glob": "^4.0.0",
534 | "is-path-inside": "^3.0.3",
535 | "js-yaml": "^4.1.0",
536 | "json-stable-stringify-without-jsonify": "^1.0.1",
537 | "levn": "^0.4.1",
538 | "lodash.merge": "^4.6.2",
539 | "minimatch": "^3.1.2",
540 | "natural-compare": "^1.4.0",
541 | "optionator": "^0.9.3",
542 | "strip-ansi": "^6.0.1",
543 | "text-table": "^0.2.0"
544 | },
545 | "bin": {
546 | "eslint": "bin/eslint.js"
547 | },
548 | "engines": {
549 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
550 | },
551 | "funding": {
552 | "url": "https://opencollective.com/eslint"
553 | }
554 | },
555 | "node_modules/eslint-scope": {
556 | "version": "7.2.1",
557 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
558 | "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
559 | "dev": true,
560 | "dependencies": {
561 | "esrecurse": "^4.3.0",
562 | "estraverse": "^5.2.0"
563 | },
564 | "engines": {
565 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
566 | },
567 | "funding": {
568 | "url": "https://opencollective.com/eslint"
569 | }
570 | },
571 | "node_modules/eslint-visitor-keys": {
572 | "version": "3.4.1",
573 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
574 | "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
575 | "dev": true,
576 | "engines": {
577 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
578 | },
579 | "funding": {
580 | "url": "https://opencollective.com/eslint"
581 | }
582 | },
583 | "node_modules/eslint/node_modules/glob-parent": {
584 | "version": "6.0.2",
585 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
586 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
587 | "dev": true,
588 | "dependencies": {
589 | "is-glob": "^4.0.3"
590 | },
591 | "engines": {
592 | "node": ">=10.13.0"
593 | }
594 | },
595 | "node_modules/espree": {
596 | "version": "9.6.1",
597 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
598 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
599 | "dev": true,
600 | "dependencies": {
601 | "acorn": "^8.9.0",
602 | "acorn-jsx": "^5.3.2",
603 | "eslint-visitor-keys": "^3.4.1"
604 | },
605 | "engines": {
606 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
607 | },
608 | "funding": {
609 | "url": "https://opencollective.com/eslint"
610 | }
611 | },
612 | "node_modules/esquery": {
613 | "version": "1.5.0",
614 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
615 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
616 | "dev": true,
617 | "dependencies": {
618 | "estraverse": "^5.1.0"
619 | },
620 | "engines": {
621 | "node": ">=0.10"
622 | }
623 | },
624 | "node_modules/esrecurse": {
625 | "version": "4.3.0",
626 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
627 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
628 | "dev": true,
629 | "dependencies": {
630 | "estraverse": "^5.2.0"
631 | },
632 | "engines": {
633 | "node": ">=4.0"
634 | }
635 | },
636 | "node_modules/estraverse": {
637 | "version": "5.3.0",
638 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
639 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
640 | "dev": true,
641 | "engines": {
642 | "node": ">=4.0"
643 | }
644 | },
645 | "node_modules/esutils": {
646 | "version": "2.0.3",
647 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
648 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
649 | "dev": true,
650 | "engines": {
651 | "node": ">=0.10.0"
652 | }
653 | },
654 | "node_modules/fast-deep-equal": {
655 | "version": "3.1.3",
656 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
657 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
658 | "dev": true
659 | },
660 | "node_modules/fast-json-stable-stringify": {
661 | "version": "2.1.0",
662 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
663 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
664 | "dev": true
665 | },
666 | "node_modules/fast-levenshtein": {
667 | "version": "2.0.6",
668 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
669 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
670 | "dev": true
671 | },
672 | "node_modules/fastq": {
673 | "version": "1.15.0",
674 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
675 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
676 | "dev": true,
677 | "dependencies": {
678 | "reusify": "^1.0.4"
679 | }
680 | },
681 | "node_modules/file-entry-cache": {
682 | "version": "6.0.1",
683 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
684 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
685 | "dev": true,
686 | "dependencies": {
687 | "flat-cache": "^3.0.4"
688 | },
689 | "engines": {
690 | "node": "^10.12.0 || >=12.0.0"
691 | }
692 | },
693 | "node_modules/fill-range": {
694 | "version": "7.1.1",
695 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
696 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
697 | "dev": true,
698 | "dependencies": {
699 | "to-regex-range": "^5.0.1"
700 | },
701 | "engines": {
702 | "node": ">=8"
703 | }
704 | },
705 | "node_modules/find-up": {
706 | "version": "5.0.0",
707 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
708 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
709 | "dev": true,
710 | "dependencies": {
711 | "locate-path": "^6.0.0",
712 | "path-exists": "^4.0.0"
713 | },
714 | "engines": {
715 | "node": ">=10"
716 | },
717 | "funding": {
718 | "url": "https://github.com/sponsors/sindresorhus"
719 | }
720 | },
721 | "node_modules/flat": {
722 | "version": "5.0.2",
723 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
724 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
725 | "dev": true,
726 | "bin": {
727 | "flat": "cli.js"
728 | }
729 | },
730 | "node_modules/flat-cache": {
731 | "version": "3.0.4",
732 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
733 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
734 | "dev": true,
735 | "dependencies": {
736 | "flatted": "^3.1.0",
737 | "rimraf": "^3.0.2"
738 | },
739 | "engines": {
740 | "node": "^10.12.0 || >=12.0.0"
741 | }
742 | },
743 | "node_modules/flatted": {
744 | "version": "3.1.1",
745 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
746 | "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
747 | "dev": true
748 | },
749 | "node_modules/fs.realpath": {
750 | "version": "1.0.0",
751 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
752 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
753 | "dev": true
754 | },
755 | "node_modules/fsevents": {
756 | "version": "2.3.2",
757 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
758 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
759 | "dev": true,
760 | "hasInstallScript": true,
761 | "optional": true,
762 | "os": [
763 | "darwin"
764 | ],
765 | "engines": {
766 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
767 | }
768 | },
769 | "node_modules/get-caller-file": {
770 | "version": "2.0.5",
771 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
772 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
773 | "dev": true,
774 | "engines": {
775 | "node": "6.* || 8.* || >= 10.*"
776 | }
777 | },
778 | "node_modules/glob": {
779 | "version": "7.1.7",
780 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
781 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
782 | "dev": true,
783 | "dependencies": {
784 | "fs.realpath": "^1.0.0",
785 | "inflight": "^1.0.4",
786 | "inherits": "2",
787 | "minimatch": "^3.0.4",
788 | "once": "^1.3.0",
789 | "path-is-absolute": "^1.0.0"
790 | },
791 | "engines": {
792 | "node": "*"
793 | },
794 | "funding": {
795 | "url": "https://github.com/sponsors/isaacs"
796 | }
797 | },
798 | "node_modules/glob-parent": {
799 | "version": "5.1.2",
800 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
801 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
802 | "dev": true,
803 | "dependencies": {
804 | "is-glob": "^4.0.1"
805 | },
806 | "engines": {
807 | "node": ">= 6"
808 | }
809 | },
810 | "node_modules/globals": {
811 | "version": "13.20.0",
812 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
813 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
814 | "dev": true,
815 | "dependencies": {
816 | "type-fest": "^0.20.2"
817 | },
818 | "engines": {
819 | "node": ">=8"
820 | },
821 | "funding": {
822 | "url": "https://github.com/sponsors/sindresorhus"
823 | }
824 | },
825 | "node_modules/graphemer": {
826 | "version": "1.4.0",
827 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
828 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
829 | "dev": true
830 | },
831 | "node_modules/he": {
832 | "version": "1.2.0",
833 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
834 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
835 | "dev": true,
836 | "bin": {
837 | "he": "bin/he"
838 | }
839 | },
840 | "node_modules/ignore": {
841 | "version": "5.2.4",
842 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
843 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
844 | "dev": true,
845 | "engines": {
846 | "node": ">= 4"
847 | }
848 | },
849 | "node_modules/import-fresh": {
850 | "version": "3.3.0",
851 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
852 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
853 | "dev": true,
854 | "dependencies": {
855 | "parent-module": "^1.0.0",
856 | "resolve-from": "^4.0.0"
857 | },
858 | "engines": {
859 | "node": ">=6"
860 | },
861 | "funding": {
862 | "url": "https://github.com/sponsors/sindresorhus"
863 | }
864 | },
865 | "node_modules/imurmurhash": {
866 | "version": "0.1.4",
867 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
868 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
869 | "dev": true,
870 | "engines": {
871 | "node": ">=0.8.19"
872 | }
873 | },
874 | "node_modules/inflight": {
875 | "version": "1.0.6",
876 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
877 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
878 | "dev": true,
879 | "dependencies": {
880 | "once": "^1.3.0",
881 | "wrappy": "1"
882 | }
883 | },
884 | "node_modules/inherits": {
885 | "version": "2.0.4",
886 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
887 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
888 | "dev": true
889 | },
890 | "node_modules/is-binary-path": {
891 | "version": "2.1.0",
892 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
893 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
894 | "dev": true,
895 | "dependencies": {
896 | "binary-extensions": "^2.0.0"
897 | },
898 | "engines": {
899 | "node": ">=8"
900 | }
901 | },
902 | "node_modules/is-extglob": {
903 | "version": "2.1.1",
904 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
905 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
906 | "dev": true,
907 | "engines": {
908 | "node": ">=0.10.0"
909 | }
910 | },
911 | "node_modules/is-fullwidth-code-point": {
912 | "version": "3.0.0",
913 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
914 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
915 | "dev": true,
916 | "engines": {
917 | "node": ">=8"
918 | }
919 | },
920 | "node_modules/is-glob": {
921 | "version": "4.0.3",
922 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
923 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
924 | "dev": true,
925 | "dependencies": {
926 | "is-extglob": "^2.1.1"
927 | },
928 | "engines": {
929 | "node": ">=0.10.0"
930 | }
931 | },
932 | "node_modules/is-number": {
933 | "version": "7.0.0",
934 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
935 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
936 | "dev": true,
937 | "engines": {
938 | "node": ">=0.12.0"
939 | }
940 | },
941 | "node_modules/is-path-inside": {
942 | "version": "3.0.3",
943 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
944 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
945 | "dev": true,
946 | "engines": {
947 | "node": ">=8"
948 | }
949 | },
950 | "node_modules/is-plain-obj": {
951 | "version": "2.1.0",
952 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
953 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
954 | "dev": true,
955 | "engines": {
956 | "node": ">=8"
957 | }
958 | },
959 | "node_modules/is-unicode-supported": {
960 | "version": "0.1.0",
961 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
962 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
963 | "dev": true,
964 | "engines": {
965 | "node": ">=10"
966 | },
967 | "funding": {
968 | "url": "https://github.com/sponsors/sindresorhus"
969 | }
970 | },
971 | "node_modules/isexe": {
972 | "version": "2.0.0",
973 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
974 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
975 | "dev": true
976 | },
977 | "node_modules/js-yaml": {
978 | "version": "4.1.0",
979 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
980 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
981 | "dev": true,
982 | "dependencies": {
983 | "argparse": "^2.0.1"
984 | },
985 | "bin": {
986 | "js-yaml": "bin/js-yaml.js"
987 | }
988 | },
989 | "node_modules/json-schema-traverse": {
990 | "version": "0.4.1",
991 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
992 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
993 | "dev": true
994 | },
995 | "node_modules/json-stable-stringify-without-jsonify": {
996 | "version": "1.0.1",
997 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
998 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
999 | "dev": true
1000 | },
1001 | "node_modules/levn": {
1002 | "version": "0.4.1",
1003 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1004 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1005 | "dev": true,
1006 | "dependencies": {
1007 | "prelude-ls": "^1.2.1",
1008 | "type-check": "~0.4.0"
1009 | },
1010 | "engines": {
1011 | "node": ">= 0.8.0"
1012 | }
1013 | },
1014 | "node_modules/locate-path": {
1015 | "version": "6.0.0",
1016 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1017 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1018 | "dev": true,
1019 | "dependencies": {
1020 | "p-locate": "^5.0.0"
1021 | },
1022 | "engines": {
1023 | "node": ">=10"
1024 | },
1025 | "funding": {
1026 | "url": "https://github.com/sponsors/sindresorhus"
1027 | }
1028 | },
1029 | "node_modules/lodash.merge": {
1030 | "version": "4.6.2",
1031 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
1032 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
1033 | "dev": true
1034 | },
1035 | "node_modules/log-symbols": {
1036 | "version": "4.1.0",
1037 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
1038 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
1039 | "dev": true,
1040 | "dependencies": {
1041 | "chalk": "^4.1.0",
1042 | "is-unicode-supported": "^0.1.0"
1043 | },
1044 | "engines": {
1045 | "node": ">=10"
1046 | },
1047 | "funding": {
1048 | "url": "https://github.com/sponsors/sindresorhus"
1049 | }
1050 | },
1051 | "node_modules/minimatch": {
1052 | "version": "3.1.2",
1053 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1054 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1055 | "dev": true,
1056 | "dependencies": {
1057 | "brace-expansion": "^1.1.7"
1058 | },
1059 | "engines": {
1060 | "node": "*"
1061 | }
1062 | },
1063 | "node_modules/mocha": {
1064 | "version": "10.8.2",
1065 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
1066 | "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
1067 | "dev": true,
1068 | "license": "MIT",
1069 | "dependencies": {
1070 | "ansi-colors": "^4.1.3",
1071 | "browser-stdout": "^1.3.1",
1072 | "chokidar": "^3.5.3",
1073 | "debug": "^4.3.5",
1074 | "diff": "^5.2.0",
1075 | "escape-string-regexp": "^4.0.0",
1076 | "find-up": "^5.0.0",
1077 | "glob": "^8.1.0",
1078 | "he": "^1.2.0",
1079 | "js-yaml": "^4.1.0",
1080 | "log-symbols": "^4.1.0",
1081 | "minimatch": "^5.1.6",
1082 | "ms": "^2.1.3",
1083 | "serialize-javascript": "^6.0.2",
1084 | "strip-json-comments": "^3.1.1",
1085 | "supports-color": "^8.1.1",
1086 | "workerpool": "^6.5.1",
1087 | "yargs": "^16.2.0",
1088 | "yargs-parser": "^20.2.9",
1089 | "yargs-unparser": "^2.0.0"
1090 | },
1091 | "bin": {
1092 | "_mocha": "bin/_mocha",
1093 | "mocha": "bin/mocha.js"
1094 | },
1095 | "engines": {
1096 | "node": ">= 14.0.0"
1097 | }
1098 | },
1099 | "node_modules/mocha/node_modules/brace-expansion": {
1100 | "version": "2.0.1",
1101 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
1102 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
1103 | "dev": true,
1104 | "license": "MIT",
1105 | "dependencies": {
1106 | "balanced-match": "^1.0.0"
1107 | }
1108 | },
1109 | "node_modules/mocha/node_modules/glob": {
1110 | "version": "8.1.0",
1111 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
1112 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
1113 | "deprecated": "Glob versions prior to v9 are no longer supported",
1114 | "dev": true,
1115 | "license": "ISC",
1116 | "dependencies": {
1117 | "fs.realpath": "^1.0.0",
1118 | "inflight": "^1.0.4",
1119 | "inherits": "2",
1120 | "minimatch": "^5.0.1",
1121 | "once": "^1.3.0"
1122 | },
1123 | "engines": {
1124 | "node": ">=12"
1125 | },
1126 | "funding": {
1127 | "url": "https://github.com/sponsors/isaacs"
1128 | }
1129 | },
1130 | "node_modules/mocha/node_modules/has-flag": {
1131 | "version": "4.0.0",
1132 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1133 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1134 | "dev": true,
1135 | "engines": {
1136 | "node": ">=8"
1137 | }
1138 | },
1139 | "node_modules/mocha/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 | "license": "ISC",
1145 | "dependencies": {
1146 | "brace-expansion": "^2.0.1"
1147 | },
1148 | "engines": {
1149 | "node": ">=10"
1150 | }
1151 | },
1152 | "node_modules/mocha/node_modules/supports-color": {
1153 | "version": "8.1.1",
1154 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1155 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1156 | "dev": true,
1157 | "dependencies": {
1158 | "has-flag": "^4.0.0"
1159 | },
1160 | "engines": {
1161 | "node": ">=10"
1162 | },
1163 | "funding": {
1164 | "url": "https://github.com/chalk/supports-color?sponsor=1"
1165 | }
1166 | },
1167 | "node_modules/ms": {
1168 | "version": "2.1.3",
1169 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1170 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1171 | "dev": true,
1172 | "license": "MIT"
1173 | },
1174 | "node_modules/natural-compare": {
1175 | "version": "1.4.0",
1176 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1177 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1178 | "dev": true
1179 | },
1180 | "node_modules/normalize-path": {
1181 | "version": "3.0.0",
1182 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1183 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1184 | "dev": true,
1185 | "engines": {
1186 | "node": ">=0.10.0"
1187 | }
1188 | },
1189 | "node_modules/once": {
1190 | "version": "1.4.0",
1191 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1192 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1193 | "dev": true,
1194 | "dependencies": {
1195 | "wrappy": "1"
1196 | }
1197 | },
1198 | "node_modules/optionator": {
1199 | "version": "0.9.3",
1200 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
1201 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
1202 | "dev": true,
1203 | "dependencies": {
1204 | "@aashutoshrathi/word-wrap": "^1.2.3",
1205 | "deep-is": "^0.1.3",
1206 | "fast-levenshtein": "^2.0.6",
1207 | "levn": "^0.4.1",
1208 | "prelude-ls": "^1.2.1",
1209 | "type-check": "^0.4.0"
1210 | },
1211 | "engines": {
1212 | "node": ">= 0.8.0"
1213 | }
1214 | },
1215 | "node_modules/p-limit": {
1216 | "version": "3.1.0",
1217 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
1218 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
1219 | "dev": true,
1220 | "dependencies": {
1221 | "yocto-queue": "^0.1.0"
1222 | },
1223 | "engines": {
1224 | "node": ">=10"
1225 | },
1226 | "funding": {
1227 | "url": "https://github.com/sponsors/sindresorhus"
1228 | }
1229 | },
1230 | "node_modules/p-locate": {
1231 | "version": "5.0.0",
1232 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
1233 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
1234 | "dev": true,
1235 | "dependencies": {
1236 | "p-limit": "^3.0.2"
1237 | },
1238 | "engines": {
1239 | "node": ">=10"
1240 | },
1241 | "funding": {
1242 | "url": "https://github.com/sponsors/sindresorhus"
1243 | }
1244 | },
1245 | "node_modules/parent-module": {
1246 | "version": "1.0.1",
1247 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1248 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1249 | "dev": true,
1250 | "dependencies": {
1251 | "callsites": "^3.0.0"
1252 | },
1253 | "engines": {
1254 | "node": ">=6"
1255 | }
1256 | },
1257 | "node_modules/path-exists": {
1258 | "version": "4.0.0",
1259 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1260 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1261 | "dev": true,
1262 | "engines": {
1263 | "node": ">=8"
1264 | }
1265 | },
1266 | "node_modules/path-is-absolute": {
1267 | "version": "1.0.1",
1268 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1269 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1270 | "dev": true,
1271 | "engines": {
1272 | "node": ">=0.10.0"
1273 | }
1274 | },
1275 | "node_modules/path-key": {
1276 | "version": "3.1.1",
1277 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1278 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1279 | "dev": true,
1280 | "engines": {
1281 | "node": ">=8"
1282 | }
1283 | },
1284 | "node_modules/picomatch": {
1285 | "version": "2.3.1",
1286 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1287 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1288 | "dev": true,
1289 | "engines": {
1290 | "node": ">=8.6"
1291 | },
1292 | "funding": {
1293 | "url": "https://github.com/sponsors/jonschlinkert"
1294 | }
1295 | },
1296 | "node_modules/prelude-ls": {
1297 | "version": "1.2.1",
1298 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1299 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1300 | "dev": true,
1301 | "engines": {
1302 | "node": ">= 0.8.0"
1303 | }
1304 | },
1305 | "node_modules/punycode": {
1306 | "version": "2.3.0",
1307 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
1308 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
1309 | "dev": true,
1310 | "engines": {
1311 | "node": ">=6"
1312 | }
1313 | },
1314 | "node_modules/queue-microtask": {
1315 | "version": "1.2.3",
1316 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1317 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1318 | "dev": true,
1319 | "funding": [
1320 | {
1321 | "type": "github",
1322 | "url": "https://github.com/sponsors/feross"
1323 | },
1324 | {
1325 | "type": "patreon",
1326 | "url": "https://www.patreon.com/feross"
1327 | },
1328 | {
1329 | "type": "consulting",
1330 | "url": "https://feross.org/support"
1331 | }
1332 | ]
1333 | },
1334 | "node_modules/randombytes": {
1335 | "version": "2.1.0",
1336 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1337 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1338 | "dev": true,
1339 | "license": "MIT",
1340 | "dependencies": {
1341 | "safe-buffer": "^5.1.0"
1342 | }
1343 | },
1344 | "node_modules/readdirp": {
1345 | "version": "3.6.0",
1346 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1347 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1348 | "dev": true,
1349 | "dependencies": {
1350 | "picomatch": "^2.2.1"
1351 | },
1352 | "engines": {
1353 | "node": ">=8.10.0"
1354 | }
1355 | },
1356 | "node_modules/require-directory": {
1357 | "version": "2.1.1",
1358 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1359 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1360 | "dev": true,
1361 | "engines": {
1362 | "node": ">=0.10.0"
1363 | }
1364 | },
1365 | "node_modules/resolve-from": {
1366 | "version": "4.0.0",
1367 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1368 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1369 | "dev": true,
1370 | "engines": {
1371 | "node": ">=4"
1372 | }
1373 | },
1374 | "node_modules/reusify": {
1375 | "version": "1.0.4",
1376 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1377 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1378 | "dev": true,
1379 | "engines": {
1380 | "iojs": ">=1.0.0",
1381 | "node": ">=0.10.0"
1382 | }
1383 | },
1384 | "node_modules/rimraf": {
1385 | "version": "3.0.2",
1386 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1387 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1388 | "dev": true,
1389 | "dependencies": {
1390 | "glob": "^7.1.3"
1391 | },
1392 | "bin": {
1393 | "rimraf": "bin.js"
1394 | },
1395 | "funding": {
1396 | "url": "https://github.com/sponsors/isaacs"
1397 | }
1398 | },
1399 | "node_modules/run-parallel": {
1400 | "version": "1.2.0",
1401 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1402 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1403 | "dev": true,
1404 | "funding": [
1405 | {
1406 | "type": "github",
1407 | "url": "https://github.com/sponsors/feross"
1408 | },
1409 | {
1410 | "type": "patreon",
1411 | "url": "https://www.patreon.com/feross"
1412 | },
1413 | {
1414 | "type": "consulting",
1415 | "url": "https://feross.org/support"
1416 | }
1417 | ],
1418 | "dependencies": {
1419 | "queue-microtask": "^1.2.2"
1420 | }
1421 | },
1422 | "node_modules/safe-buffer": {
1423 | "version": "5.2.1",
1424 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1425 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1426 | "dev": true,
1427 | "funding": [
1428 | {
1429 | "type": "github",
1430 | "url": "https://github.com/sponsors/feross"
1431 | },
1432 | {
1433 | "type": "patreon",
1434 | "url": "https://www.patreon.com/feross"
1435 | },
1436 | {
1437 | "type": "consulting",
1438 | "url": "https://feross.org/support"
1439 | }
1440 | ],
1441 | "license": "MIT"
1442 | },
1443 | "node_modules/serialize-javascript": {
1444 | "version": "6.0.2",
1445 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
1446 | "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
1447 | "dev": true,
1448 | "license": "BSD-3-Clause",
1449 | "dependencies": {
1450 | "randombytes": "^2.1.0"
1451 | }
1452 | },
1453 | "node_modules/shebang-command": {
1454 | "version": "2.0.0",
1455 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1456 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1457 | "dev": true,
1458 | "dependencies": {
1459 | "shebang-regex": "^3.0.0"
1460 | },
1461 | "engines": {
1462 | "node": ">=8"
1463 | }
1464 | },
1465 | "node_modules/shebang-regex": {
1466 | "version": "3.0.0",
1467 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1468 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1469 | "dev": true,
1470 | "engines": {
1471 | "node": ">=8"
1472 | }
1473 | },
1474 | "node_modules/string-width": {
1475 | "version": "4.2.2",
1476 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
1477 | "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
1478 | "dev": true,
1479 | "dependencies": {
1480 | "emoji-regex": "^8.0.0",
1481 | "is-fullwidth-code-point": "^3.0.0",
1482 | "strip-ansi": "^6.0.0"
1483 | },
1484 | "engines": {
1485 | "node": ">=8"
1486 | }
1487 | },
1488 | "node_modules/strip-ansi": {
1489 | "version": "6.0.1",
1490 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1491 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1492 | "dev": true,
1493 | "dependencies": {
1494 | "ansi-regex": "^5.0.1"
1495 | },
1496 | "engines": {
1497 | "node": ">=8"
1498 | }
1499 | },
1500 | "node_modules/strip-json-comments": {
1501 | "version": "3.1.1",
1502 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
1503 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
1504 | "dev": true,
1505 | "engines": {
1506 | "node": ">=8"
1507 | },
1508 | "funding": {
1509 | "url": "https://github.com/sponsors/sindresorhus"
1510 | }
1511 | },
1512 | "node_modules/text-table": {
1513 | "version": "0.2.0",
1514 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
1515 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
1516 | "dev": true
1517 | },
1518 | "node_modules/to-regex-range": {
1519 | "version": "5.0.1",
1520 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1521 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1522 | "dev": true,
1523 | "dependencies": {
1524 | "is-number": "^7.0.0"
1525 | },
1526 | "engines": {
1527 | "node": ">=8.0"
1528 | }
1529 | },
1530 | "node_modules/type-check": {
1531 | "version": "0.4.0",
1532 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
1533 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
1534 | "dev": true,
1535 | "dependencies": {
1536 | "prelude-ls": "^1.2.1"
1537 | },
1538 | "engines": {
1539 | "node": ">= 0.8.0"
1540 | }
1541 | },
1542 | "node_modules/type-fest": {
1543 | "version": "0.20.2",
1544 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1545 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
1546 | "dev": true,
1547 | "engines": {
1548 | "node": ">=10"
1549 | },
1550 | "funding": {
1551 | "url": "https://github.com/sponsors/sindresorhus"
1552 | }
1553 | },
1554 | "node_modules/uri-js": {
1555 | "version": "4.4.1",
1556 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1557 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1558 | "dev": true,
1559 | "dependencies": {
1560 | "punycode": "^2.1.0"
1561 | }
1562 | },
1563 | "node_modules/which": {
1564 | "version": "2.0.2",
1565 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1566 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1567 | "dev": true,
1568 | "dependencies": {
1569 | "isexe": "^2.0.0"
1570 | },
1571 | "bin": {
1572 | "node-which": "bin/node-which"
1573 | },
1574 | "engines": {
1575 | "node": ">= 8"
1576 | }
1577 | },
1578 | "node_modules/workerpool": {
1579 | "version": "6.5.1",
1580 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
1581 | "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
1582 | "dev": true,
1583 | "license": "Apache-2.0"
1584 | },
1585 | "node_modules/wrap-ansi": {
1586 | "version": "7.0.0",
1587 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1588 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1589 | "dev": true,
1590 | "dependencies": {
1591 | "ansi-styles": "^4.0.0",
1592 | "string-width": "^4.1.0",
1593 | "strip-ansi": "^6.0.0"
1594 | },
1595 | "engines": {
1596 | "node": ">=10"
1597 | },
1598 | "funding": {
1599 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1600 | }
1601 | },
1602 | "node_modules/wrap-ansi/node_modules/ansi-styles": {
1603 | "version": "4.3.0",
1604 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1605 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1606 | "dev": true,
1607 | "dependencies": {
1608 | "color-convert": "^2.0.1"
1609 | },
1610 | "engines": {
1611 | "node": ">=8"
1612 | },
1613 | "funding": {
1614 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
1615 | }
1616 | },
1617 | "node_modules/wrap-ansi/node_modules/color-convert": {
1618 | "version": "2.0.1",
1619 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1620 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1621 | "dev": true,
1622 | "dependencies": {
1623 | "color-name": "~1.1.4"
1624 | },
1625 | "engines": {
1626 | "node": ">=7.0.0"
1627 | }
1628 | },
1629 | "node_modules/wrap-ansi/node_modules/color-name": {
1630 | "version": "1.1.4",
1631 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1632 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1633 | "dev": true
1634 | },
1635 | "node_modules/wrappy": {
1636 | "version": "1.0.2",
1637 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1638 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1639 | "dev": true
1640 | },
1641 | "node_modules/y18n": {
1642 | "version": "5.0.8",
1643 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1644 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1645 | "dev": true,
1646 | "engines": {
1647 | "node": ">=10"
1648 | }
1649 | },
1650 | "node_modules/yargs": {
1651 | "version": "16.2.0",
1652 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
1653 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
1654 | "dev": true,
1655 | "dependencies": {
1656 | "cliui": "^7.0.2",
1657 | "escalade": "^3.1.1",
1658 | "get-caller-file": "^2.0.5",
1659 | "require-directory": "^2.1.1",
1660 | "string-width": "^4.2.0",
1661 | "y18n": "^5.0.5",
1662 | "yargs-parser": "^20.2.2"
1663 | },
1664 | "engines": {
1665 | "node": ">=10"
1666 | }
1667 | },
1668 | "node_modules/yargs-parser": {
1669 | "version": "20.2.9",
1670 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
1671 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
1672 | "dev": true,
1673 | "license": "ISC",
1674 | "engines": {
1675 | "node": ">=10"
1676 | }
1677 | },
1678 | "node_modules/yargs-unparser": {
1679 | "version": "2.0.0",
1680 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
1681 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
1682 | "dev": true,
1683 | "dependencies": {
1684 | "camelcase": "^6.0.0",
1685 | "decamelize": "^4.0.0",
1686 | "flat": "^5.0.2",
1687 | "is-plain-obj": "^2.1.0"
1688 | },
1689 | "engines": {
1690 | "node": ">=10"
1691 | }
1692 | },
1693 | "node_modules/yocto-queue": {
1694 | "version": "0.1.0",
1695 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
1696 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
1697 | "dev": true,
1698 | "engines": {
1699 | "node": ">=10"
1700 | },
1701 | "funding": {
1702 | "url": "https://github.com/sponsors/sindresorhus"
1703 | }
1704 | }
1705 | }
1706 | }
1707 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "approximate-number",
3 | "version": "2.1.1",
4 | "main": "lib/approximate-number.js",
5 | "description": "Converts numbers into a more human-friendly format, similar to `ls`'s `--human-readable` flag (`ls -lh`) or Stack Overflow's reputation numbers. For example, 123456 becomes '123k'.",
6 | "homepage": "https://github.com/nfriedly/approximate-number",
7 | "bugs": "https://github.com/nfriedly/approximate-number/issues",
8 | "author": {
9 | "name": "Nathan Friedly",
10 | "url": "http://nfriedly.com/"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/nfriedly/approximate-number"
15 | },
16 | "license": "MIT",
17 | "keywords": [
18 | "approximate-number",
19 | "abbreviate",
20 | "abbreviated",
21 | "human",
22 | "friendly",
23 | "readable",
24 | "large",
25 | "big",
26 | "number",
27 | "numbers",
28 | "stack overflow",
29 | "stack exchange",
30 | "-h",
31 | "format",
32 | "formatter",
33 | "approximate",
34 | "approximation",
35 | "short",
36 | "simple",
37 | "near",
38 | "nearest",
39 | "closest",
40 | "round",
41 | "thousand",
42 | "million",
43 | "billion",
44 | "trillion"
45 | ],
46 | "devDependencies": {
47 | "eslint": "^8.45.0",
48 | "mocha": "^10.2.0"
49 | },
50 | "scripts": {
51 | "test": "npm run lint && npm run test-unit",
52 | "test-unit": "mocha",
53 | "watch": "mocha --watch",
54 | "lint": "eslint .",
55 | "autofix": "eslint . --fix"
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/test/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | 'env': {
3 | 'browser': true,
4 | 'node': true,
5 | 'mocha': true
6 | }
7 | };
8 |
--------------------------------------------------------------------------------
/test/approximate-number_test.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | var assert = require('assert'),
3 | format = require('util').format,
4 | approximateNumber = require('../lib/approximate-number.js');
5 |
6 | describe('approximate-number', function() {
7 |
8 | describe('default options', function() {
9 | // input => output
10 | var tests = {
11 | 0: '0',
12 | 0.1: '0.1',
13 | 1: '1',
14 | 10: '10',
15 | 999: '999',
16 | 1000: '1k',
17 | 1001: '1k',
18 | 1234: '1.2k',
19 | 9999: '9.9k',
20 | 10000: '10k',
21 | 10000.1: '10k',
22 | 10500: '10k',
23 | 10999: '10k',
24 | 11111: '11k',
25 | 111111: '111k',
26 | 1000000: '1m',
27 | 1111111: '1.1m',
28 | 12345678: '12m',
29 | 1000000000: '1b',
30 | 1500000000: '1.5b',
31 | 9500000000: '9.5b',
32 | 9050000000: '9b',
33 | 10000000000: '10b',
34 | 10500000000: '10b',
35 | 1000000000000: '1t',
36 | 10000000000000: '10t',
37 | 19939034457936: '19t',
38 | 9007199254740991: '9,007t' // Number.MAX_SAFE_INTEGER, 2^53-1
39 | };
40 |
41 | // positive number tests
42 | Object.keys(tests).forEach(function(input) {
43 | var expected = tests[input];
44 | it(format('should convert %s to %s', input, expected), function() {
45 | assert.equal( approximateNumber(input), expected);
46 | });
47 | });
48 |
49 | // negative number tests - skip 0
50 | Object.keys(tests).slice(1).forEach(function(input) {
51 | var expected = '-' +tests[input];
52 | input = -input;
53 | it(format('should convert %s to %s', input, expected), function () {
54 | assert.equal(approximateNumber(input), expected);
55 | });
56 | });
57 | });
58 |
59 | describe('options.min10k', function() {
60 | var options = {
61 | min10k: true
62 | };
63 |
64 | // input => output
65 | var tests = {
66 | 0: '0',
67 | 0.1: '0.1',
68 | 1: '1',
69 | 10: '10',
70 | 999: '999',
71 | 1000: '1,000',
72 | 1001: '1,001',
73 | 1234: '1,234',
74 | 9999: '9,999',
75 | 10000: '10k',
76 | 10000.1: '10k',
77 | 10500: '10k',
78 | 999000: '999k'
79 | };
80 |
81 | // positive number tests
82 | Object.keys(tests).forEach(function(input) {
83 | var expected = tests[input];
84 | it(format('should convert %s to %s with min10k option', input, expected), function() {
85 | assert.equal( approximateNumber(input, options), expected);
86 | });
87 | });
88 |
89 | // negative number tests - skip 0
90 | Object.keys(tests).slice(1).forEach(function(input) {
91 | var expected = '-' +tests[input];
92 | input = -input;
93 | it(format('should convert %s to %s with min10k option', input, expected), function () {
94 | assert.equal(approximateNumber(input, options), expected);
95 | });
96 | });
97 | });
98 |
99 | describe('options.capital', function() {
100 | var options = {
101 | capital: true
102 | };
103 |
104 | // input => output
105 | var tests = {
106 | 1000: '1K',
107 | 1000000: '1M',
108 | 1000000000: '1B',
109 | 1500000000: '1.5B',
110 | 1000000000000: '1T',
111 | 10000000000000: '10T',
112 | 9007199254740991: '9,007T' // Number.MAX_SAFE_INTEGER, 2^53-1
113 | };
114 |
115 | // positive number tests
116 | Object.keys(tests).forEach(function(input) {
117 | var expected = tests[input];
118 | it(format('should convert %s to %s capital option', input, expected), function() {
119 | assert.equal( approximateNumber(input, options), expected);
120 | });
121 | });
122 |
123 | // negative number tests - skip 0
124 | Object.keys(tests).slice(1).forEach(function(input) {
125 | var expected = '-' +tests[input];
126 | input = -input;
127 | it(format('should convert %s to %s capital option', input, expected), function () {
128 | assert.equal(approximateNumber(input, options), expected);
129 | });
130 | });
131 | });
132 |
133 | describe('options.separator=false', function() {
134 | var options = {
135 | separator: false,
136 | min10k: true
137 | };
138 |
139 | // input => output
140 | var tests = {
141 | 0: '0',
142 | 0.1: '0.1',
143 | 1: '1',
144 | 10: '10',
145 | 999: '999',
146 | 1000: '1000',
147 | 1001: '1001',
148 | 1234: '1234',
149 | 9999: '9999',
150 | 10000: '10k',
151 | 9007199254740991: '9007t' // Number.MAX_SAFE_INTEGER, 2^53-1
152 | };
153 |
154 |
155 |
156 | // positive number tests
157 | Object.keys(tests).forEach(function(input) {
158 | var expected = tests[input];
159 | it(format('should convert %s to %s separator=false', input, expected), function() {
160 | assert.equal( approximateNumber(input, options), expected);
161 | });
162 | });
163 |
164 | // negative number tests - skip 0
165 | Object.keys(tests).slice(1).forEach(function(input) {
166 | var expected = '-' +tests[input];
167 | input = -input;
168 | it(format('should convert %s to %s separator=false', input, expected), function () {
169 | assert.equal(approximateNumber(input, options), expected);
170 | });
171 | });
172 |
173 | it('should allow for an alternative separator', function() {
174 | var actual = approximateNumber(1234, {separator: '.', min10k: true});
175 | assert.equal(actual, '1.234');
176 | });
177 | });
178 |
179 | describe('prefix/suffix', function(){
180 | it('should add the prefix', function() {
181 | assert.equal(approximateNumber(12345, {prefix: '$'}), '$12k');
182 | });
183 | it('should add the suffix', function() {
184 | assert.equal(approximateNumber(12345, {suffix: '%'}), '12k%');
185 | });
186 | });
187 |
188 | describe('options.round', function() {
189 | var options = {
190 | round: true
191 | };
192 |
193 | // input => output
194 | var tests = {
195 | 0: '0',
196 | 0.1: '0.1',
197 | 1: '1',
198 | 10: '10',
199 | 999: '999',
200 | 1000: '1k',
201 | 1001: '1k',
202 | 1234: '1.2k',
203 | 9999: '10k',
204 | 10000: '10k',
205 | 10000.1: '10k',
206 | 10500: '11k',
207 | 10999: '11k',
208 | 11111: '11k',
209 | 111111: '111k',
210 | 1000000: '1m',
211 | 1111111: '1.1m',
212 | 12345678: '12m',
213 | 1000000000: '1b',
214 | 1500000000: '1.5b',
215 | 9500000000: '9.5b',
216 | 9050000000: '9.1b',
217 | 10000000000: '10b',
218 | 10500000000: '11b',
219 | 1000000000000: '1t',
220 | 10000000000000: '10t',
221 | 19939034457936: '20t',
222 | 9007199254740991: '9,007t' // Number.MAX_SAFE_INTEGER, 2^53-1
223 | };
224 |
225 | // positive number tests
226 | Object.keys(tests).forEach(function(input) {
227 | var expected = tests[input];
228 | it(format('should convert %s to %s', input, expected), function() {
229 | assert.equal( approximateNumber(input, options), expected);
230 | });
231 | });
232 |
233 | // negative number tests - skip 0
234 | Object.keys(tests).slice(1).forEach(function(input) {
235 | var expected = '-' +tests[input];
236 | input = -input;
237 | it(format('should convert %s to %s', input, expected), function () {
238 | assert.equal(approximateNumber(input, options), expected);
239 | });
240 | });
241 | });
242 |
243 | describe('options.decimal', function() {
244 | var options = {
245 | decimal: false
246 | };
247 |
248 | // input => output
249 | var tests = {
250 | 0: '0',
251 | 0.1: '0',
252 | 1: '1',
253 | 10: '10',
254 | 999: '999',
255 | 1000: '1k',
256 | 1001: '1k',
257 | 1234: '1k',
258 | 9999: '9k',
259 | 10000: '10k',
260 | 10000.1: '10k',
261 | 10500: '10k',
262 | 10999: '10k',
263 | 11111: '11k',
264 | 111111: '111k',
265 | 1000000: '1m',
266 | 1111111: '1m',
267 | 12345678: '12m',
268 | 1000000000: '1b',
269 | 1500000000: '1b',
270 | 9500000000: '9b',
271 | 9050000000: '9b',
272 | 10000000000: '10b',
273 | 10500000000: '10b',
274 | 1000000000000: '1t',
275 | 10000000000000: '10t',
276 | 19939034457936: '19t',
277 | 9007199254740991: '9,007t' // Number.MAX_SAFE_INTEGER, 2^53-1
278 | };
279 |
280 | // positive number tests
281 | Object.keys(tests).forEach(function(input) {
282 | var expected = tests[input];
283 | it(format('should convert %s to %s', input, expected), function() {
284 | assert.equal( approximateNumber(input, options), expected);
285 | });
286 | });
287 |
288 | // negative number tests - skip 0
289 | Object.keys(tests).slice(1).forEach(function(input) {
290 | var expected = '-' +tests[input];
291 | input = -input;
292 | it(format('should convert %s to %s', input, expected), function () {
293 | assert.equal(approximateNumber(input, options), expected);
294 | });
295 | });
296 |
297 | it('should allow the decimal character to be changed', function() {
298 | var actual = approximateNumber(1234, {decimal: ','});
299 | assert.equal(actual, '1,2k');
300 | });
301 | });
302 |
303 | describe('options.decimal=false and options.round=true', function() {
304 | var options = {
305 | round: true,
306 | decimal: false
307 | };
308 |
309 | // input => output
310 | var tests = {
311 | 0: '0',
312 | 0.1: '0',
313 | 1: '1',
314 | 10: '10',
315 | 999: '999',
316 | 1000: '1k',
317 | 1001: '1k',
318 | 1234: '1k',
319 | 9999: '10k',
320 | 10000: '10k',
321 | 10000.1: '10k',
322 | 10500: '11k',
323 | 10999: '11k',
324 | 11111: '11k',
325 | 111111: '111k',
326 | 1000000: '1m',
327 | 1111111: '1m',
328 | 1500000: '2m',
329 | 12345678: '12m',
330 | 1000000000: '1b',
331 | 1500000000: '2b',
332 | 9500000000: '10b',
333 | 9050000000: '9b',
334 | 10000000000: '10b',
335 | 10500000000: '11b',
336 | 1000000000000: '1t',
337 | 10000000000000: '10t',
338 | 19939034457936: '20t',
339 | 9007199254740991: '9,007t' // Number.MAX_SAFE_INTEGER, 2^53-1
340 | };
341 |
342 | // positive number tests
343 | Object.keys(tests).forEach(function(input) {
344 | var expected = tests[input];
345 | it(format('should convert %s to %s', input, expected), function() {
346 | assert.equal( approximateNumber(input, options), expected);
347 | });
348 | });
349 |
350 | // negative number tests - skip 0
351 | Object.keys(tests).slice(1).forEach(function(input) {
352 | var expected = '-' +tests[input];
353 | input = -input;
354 | it(format('should convert %s to %s', input, expected), function () {
355 | assert.equal(approximateNumber(input, options), expected);
356 | });
357 | });
358 | });
359 |
360 | describe('with options.precision', function() {
361 | // input => output
362 | var tests = {
363 | 0: ['0', '0', '0', '0', '0'],
364 | 0.1: ['0.1', '0.1', '0.1', '0.1', '0.1'],
365 | 1: ['1', '1', '1', '1', '1'],
366 | 1.3: ['1', '1.3', '1.3', '1.3', '1.3'],
367 | 10: ['10', '10', '10', '10', '10'],
368 | 11: ['10', '11', '11' ,'11','11'],
369 | 999: ['1k', '1k', '999', '999', '999'],
370 | 1000: ['1k', '1k', '1k', '1,000', '1,000'],
371 | 1001: ['1k', '1k', '1k', '1,001', '1,001'],
372 | 1234: ['1k', '1.2k', '1.23k', '1,234', '1,234'],
373 | 9999: ['10k', '10k', '10k', '9,999', '9,999'],
374 | 10000: ['10k', '10k', '10k', '10k', '10,000'],
375 | 10000.1: ['10k', '10k', '10k', '10k', '10,000'],
376 | 10001: ['10k', '10k', '10k', '10k', '10,001'],
377 | 10500: ['10k', '11k', '10.5k', '10.5k', '10,500'],
378 | 10999: ['10k', '11k', '11k', '11k', '10,999'],
379 | 11111: ['10k', '11k', '11.1k', '11.11k', '11,111'],
380 | 111111: ['100k', '110k', '111k', '111.1k', '111.11k'],
381 | 1000000: ['1m', '1m', '1m', '1m', '1m'],
382 | 1111111: ['1m', '1.1m', '1.11m', '1.111m', '1.1111m'],
383 | 1500000: ['2m', '1.5m', '1.5m', '1.5m', '1.5m'],
384 | 12345678: ['10m', '12m', '12.3m', '12.35m', '12.346m'],
385 | 1000000000: ['1b', '1b', '1b', '1b', '1b'],
386 | 1500000000: ['2b', '1.5b', '1.5b', '1.5b', '1.5b'],
387 | 9500000000: ['10b', '9.5b', '9.5b', '9.5b', '9.5b'],
388 | 9050000000: ['9b', '9.1b', '9.05b', '9.05b', '9.05b'],
389 | 10000000000: ['10b', '10b', '10b', '10b', '10b'],
390 | 10500000000: ['10b', '11b', '10.5b', '10.5b', '10.5b'],
391 | 1000000000000: ['1t', '1t', '1t', '1t', '1t'],
392 | 10000000000000: ['10t', '10t', '10t', '10t', '10t'],
393 | 19939034457936: ['20t', '20t', '19.9t', '19.94t', '19.939t'],
394 | 9007199254740991: ['9,000t', '9,000t', '9,010t', '9,007t', '9,007t']
395 | };
396 |
397 | // positive number tests
398 | Object.keys(tests).forEach(function(input) {
399 | input = parseFloat(input);
400 | tests[input].forEach(function(expected, index) {
401 | var precision = index + 1;
402 | it(format('should convert "%s" with precision %s to "%s"', input, precision, expected), function() {
403 | assert.equal( approximateNumber(input, { precision: index + 1 }), expected);
404 | });
405 | });
406 | });
407 |
408 | // negative number tests - skip 0
409 | Object.keys(tests).slice(1).forEach(function(input) {
410 | tests[input].forEach(function(expected, index) {
411 | expected = '-' + expected;
412 | var precision = index + 1;
413 | it(format('should convert "%s" with precision %s to "%s"', -input, precision, expected), function () {
414 | assert.equal(approximateNumber(-input, { precision: precision }), expected);
415 | });
416 | });
417 | });
418 | });
419 | });
420 |
--------------------------------------------------------------------------------