├── .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 | [![CI](https://github.com/nfriedly/approximate-number/actions/workflows/ci.yml/badge.svg)](https://github.com/nfriedly/approximate-number/actions/workflows/ci.yml) 4 | [![npm version](https://badge.fury.io/js/approximate-number.svg)](https://www.npmjs.com/package/approximate-number) 5 | [![npm downloads](https://img.shields.io/npm/dm/approximate-number)](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 | --------------------------------------------------------------------------------