├── .circleci └── config.yml ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .npmignore ├── CODE_OF_CONDUCT.md ├── LICENSE ├── README.md ├── assets ├── banner.png ├── banner.psd ├── demo-color.png ├── demo-level.png ├── demo-log.png ├── make-demo-color.js ├── make-demo-level.js └── make-demo-log.js ├── change.log.md ├── index.d.ts ├── index.js ├── jest.config.js ├── package-lock.json ├── package.json └── test ├── jest ├── environmentVariable.spec.js ├── levelLog.spec.js ├── logChain.spec.js ├── stream.spec.js ├── utility.spec.js └── utils │ └── levelLogUtils.js ├── test.js ├── test2.js ├── test3.js ├── test4.js ├── test_main.ps1 ├── test_main.sh └── test_stream.js /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # This config was automatically generated from your source code 2 | # Stacks detected: cicd:github-actions:.github/workflows,deps:node:.,test:jest: 3 | version: 2.1 4 | orbs: 5 | node: circleci/node@5 6 | jobs: 7 | test-node: 8 | # Install node dependencies and run tests 9 | executor: node/default 10 | environment: 11 | JEST_JUNIT_OUTPUT_DIR: ./test-results/ 12 | steps: 13 | - checkout 14 | - node/install-packages: 15 | pkg-manager: npm 16 | - run: 17 | command: npm install jest-junit 18 | - run: 19 | name: Run tests 20 | command: npm run test --ci --runInBand --reporters=default --reporters=jest-junit 21 | - store_test_results: 22 | path: ./test-results/ 23 | deploy: 24 | # This is an example deploy job, not actually used by the workflow 25 | docker: 26 | - image: cimg/base:stable 27 | steps: 28 | # Replace this with steps to deploy to users 29 | - run: 30 | name: deploy 31 | command: '#e.g. ./deploy.sh' 32 | - run: 33 | name: found github actions config 34 | command: ':' 35 | workflows: 36 | build-and-test: 37 | jobs: 38 | - test-node 39 | # - deploy: 40 | # requires: 41 | # - test-node 42 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | test-ubuntu: 10 | runs-on: ubuntu-latest 11 | 12 | strategy: 13 | matrix: 14 | node-version: [20, 21] 15 | 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v3 19 | 20 | - name: Use Node.js 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Install dependency 26 | run: npm i 27 | 28 | - name: Run tests 29 | run: npm run jest 30 | 31 | test-macos: 32 | runs-on: macos-latest 33 | 34 | strategy: 35 | matrix: 36 | node-version: [20, 21] 37 | 38 | steps: 39 | - name: Checkout repository 40 | uses: actions/checkout@v2 41 | 42 | - name: Use Node.js 43 | uses: actions/setup-node@v3 44 | with: 45 | node-version: ${{ matrix.node-version }} 46 | 47 | - name: Install dependency 48 | run: npm i 49 | 50 | - name: Run tests 51 | run: npm run jest 52 | 53 | test-windows: 54 | runs-on: windows-latest 55 | 56 | strategy: 57 | matrix: 58 | node-version: [20, 21] 59 | 60 | steps: 61 | - name: Checkout repository 62 | uses: actions/checkout@v2 63 | 64 | - name: Use Node.js 65 | uses: actions/setup-node@v3 66 | with: 67 | node-version: ${{ matrix.node-version }} 68 | 69 | - name: Install dependency 70 | run: npm i 71 | 72 | - name: Run tests 73 | run: npm run jest 74 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.test.log 2 | node_modules -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | assets 2 | .github 3 | test 4 | node_modules 5 | jest.config.js 6 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at b04209032@ntu.edu.tw. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Liu, An-Chi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Banner](https://raw.githubusercontent.com/tigercosmos/node-color-log/master/assets/banner.png) 2 | 3 | [![Test](https://github.com/tigercosmos/node-color-log/actions/workflows/test.yml/badge.svg)](https://github.com/tigercosmos/node-color-log/actions/workflows/test.yml) 4 | [![npm version](https://badge.fury.io/js/node-color-log.svg)](https://badge.fury.io/js/node-color-log) 5 | [![npm downloads](https://badgen.now.sh/npm/dm/node-color-log)](https://www.npmjs.com/package/node-color-log) 6 | 7 | # Node Color Log 8 | 9 | A lightweight and more JavaScript logger for NodeJS and browsers. 10 | 11 | `node-color-log` is a logger package for NodeJS and browsers. It provides more functions than the origin `console.log`. You can log text with colorful fonts and colorful backgrounds. Also, it has 4 levels log, including `debug`, `info`, `warn` and `error`. Give you a much better experience while developing JavaScript projects. 12 | 13 | Winston and Pino are famous loggers for JavaScript, but they are too heavy and fancy. Sometimes we just want to have a simple logger, and don't want to spend time learning a fancy library. Then, `node-color-log` is your best choice. 14 | 15 | ## Demo 16 | 17 | Demo 18 | 19 | Demo 20 | 21 | Demo 22 | 23 | ## Usage 24 | 25 | ### Install 26 | 27 | Install package in your project: 28 | 29 | ```bash 30 | npm install node-color-log@latest --save 31 | ``` 32 | 33 | ### Import 34 | 35 | Put the following code in your `js` in which you want to log. 36 | 37 | ```javascript 38 | const logger = require('node-color-log'); 39 | ``` 40 | 41 | Logger level can be set like this. Logs belongs to this level and above that level will be printed. 42 | 43 | ```javascript 44 | logger.setLevel("error"); // it can be any log level. 45 | ``` 46 | 47 | ## API 48 | 49 | ### `log()` 50 | 51 | log with attributes, the order of setters can change. 52 | 53 | **NOTE:** `log()` need to put behind of attribute setter(at the end). 54 | 55 | `append()` can appends the contents in one line. (Note: old `joint` is now deprecated.) 56 | 57 | `color()` and `bgColor()` includes: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`. 58 | 59 | `reset()` can clear the previous attributes in the same line. 60 | 61 | Usage: 62 | 63 | ```javascript 64 | // normal log 65 | logger.log(message) 66 | // Attribute log 67 | logger.color('red').bgColor('blue') 68 | .bold().italic().dim().reverse().underscore().strikethrough() 69 | .log(message); 70 | // use `append` to joint contents, and use `log` to print out at the end 71 | logger.color('red').bold().append('message_style_1') 72 | .bgColor('white').italic().append('message_style_2') 73 | .strikethrough().log('message_style_3'); 74 | 75 | // use `reset` to clean the attributes 76 | logger.bgColor('red').append('background red color message') 77 | .reset() // by calling this, background is reset 78 | .log('default background color message'); 79 | 80 | // log multiple arguments 81 | logger.log(obj1, arr2, str3); 82 | ``` 83 | 84 | ### `setLogStream` 85 | 86 | You can redirect the logs to the stream. 87 | 88 | For example, you can write the log into the file: 89 | 90 | ```js 91 | fileStream = fs.createWriteStream('test.log'), 92 | logger.setLogStream(fileStream) 93 | 94 | logger.log("hi"); 95 | logger.error("hello", "world"); 96 | 97 | fileStream.close() 98 | ``` 99 | 100 | You can use `less -R test.log` to see the result. 101 | 102 | ### `fontColorLog()`, `bgColorLog()`, `colorLog()` 103 | 104 | - `message` here must be a string. 105 | 106 | - Color includes: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`. 107 | 108 | - `setting` is optional. Keys in `setting` need to be boolean, and all are `false` by default. 109 | 110 | Parameters: 111 | 112 | ```javascript 113 | const color = 'red'; 114 | const message = 'any string you will put into console.log'; 115 | const setting = { 116 | bold: true, 117 | dim: true, 118 | underscore: true, 119 | reverse: true, 120 | italic: true, 121 | strikethrough: true 122 | } 123 | ``` 124 | 125 | Usage: 126 | 127 | ```javascript 128 | // only set font color 129 | logger.fontColorLog('red', message, setting); 130 | // only set background color 131 | logger.bgColorLog('yellow', message, setting); 132 | // set font and background color 133 | logger.colorLog({ 134 | font: 'black', 135 | bg: 'yellow' 136 | }, message, setting); 137 | ``` 138 | 139 | ### `success()`, `debug()`, `info()`, `warn()`, `error()` 140 | 141 | With prefix that has background color 142 | 143 | Usage: 144 | 145 | ```javascript 146 | // Success level, with prefix "[SUCCESS]" 147 | logger.success(message); 148 | // debug level, with prefix "[DEBUG]" 149 | logger.debug(message); 150 | // Info level, with prefix "[INFO]" 151 | logger.info(message); 152 | // Warn level, with prefix "[WARN]" 153 | logger.warn(message); 154 | // Error level, with prefix "[ERROR]" 155 | logger.error(message); 156 | 157 | 158 | // Level logs enable multiple arguments 159 | logger.debug(obj1, arr2, str3); 160 | ``` 161 | 162 | The output looks like: 163 | 164 | ```log 165 | 2018-08-14T18:23:09.836Z [SUCCESS] This is success mode 166 | 2018-08-14T18:23:09.837Z [DEBUG] This is debug mode 167 | 2018-08-14T18:23:09.838Z [INFO] This is info mode 168 | 2018-08-14T18:23:09.838Z [WARN] This is warn mode 169 | 2018-08-14T18:23:09.839Z [ERROR] This is error mode 170 | ``` 171 | 172 | ### `setLevel()` & `LOGGER` environment variable 173 | 174 | If you want to set mask for levels, simply add the line at the front. Levels below the setting level will all be hidden. There are four levels, which are `success`, `debug`, `info`, `warn`, `error`, or `disable` in lower-case. 175 | 176 | ```js 177 | logger.setLevel("info"); // success < debug < info < warn < error < disable 178 | logger.debug("This `debug` will be hidden"); 179 | logger.error("This `error` will be shown"); 180 | 181 | logger.setLevel("disable"); // hide every logs 182 | ``` 183 | 184 | Or, you can set the environment variable `LOGGER`, such as `LOGGER=info npm start`, where it's equal to `setLevel("info")`. 185 | 186 | 187 | ### `setLevelNoColor()`, `setLevelColor()` 188 | 189 | Level logs print in colors as a default. 190 | 191 | You can set `setLevelNoColor()` to turn off the setting, and use `setLevelColor()` to reverse it. 192 | 193 | None color mode is helpful for text files or browser environments. 194 | 195 | ```js 196 | logger.setLevelNoColor(); 197 | ``` 198 | 199 | ### `setDate()` 200 | 201 | The default time format is `toISOString`, but you can change it by using `setDate(callback)` 202 | 203 | ```javascript 204 | logger.setDate(() => (new Date()).toLocaleTimeString()) 205 | logger.info("This is an info message") // 5:17:59 pm [INFO] This is an info message 206 | ``` 207 | 208 | ### `createNamedLogger()` 209 | 210 | You can create a named logger by calling `createNamedLogger()` 211 | 212 | ```javascript 213 | logger1 = logger.createNamedLogger("Test 1"); 214 | logger2 = logger.createNamedLogger("Test 2"); 215 | logger1.info('something happened'); // 2022-08-20T04:56:17.834Z [Test 1] [INFO] something happened 216 | logger2.info('something happened'); // 2022-08-20T04:56:17.835Z [Test 2] [INFO] something happened 217 | ``` 218 | 219 | ### Contribute 220 | 221 | Any issues and PRs are very welcome! 222 | 223 | ### License 224 | 225 | MIT 226 | -------------------------------------------------------------------------------- /assets/banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tigercosmos/node-color-log/b9513d50451963a4ca8ef1769346d7438b38c7aa/assets/banner.png -------------------------------------------------------------------------------- /assets/banner.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tigercosmos/node-color-log/b9513d50451963a4ca8ef1769346d7438b38c7aa/assets/banner.psd -------------------------------------------------------------------------------- /assets/demo-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tigercosmos/node-color-log/b9513d50451963a4ca8ef1769346d7438b38c7aa/assets/demo-color.png -------------------------------------------------------------------------------- /assets/demo-level.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tigercosmos/node-color-log/b9513d50451963a4ca8ef1769346d7438b38c7aa/assets/demo-level.png -------------------------------------------------------------------------------- /assets/demo-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tigercosmos/node-color-log/b9513d50451963a4ca8ef1769346d7438b38c7aa/assets/demo-log.png -------------------------------------------------------------------------------- /assets/make-demo-color.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | logger.fontColorLog('red', "logger.fontColorLog('red', message)"); 4 | logger.fontColorLog( 5 | 'blue', 6 | "logger.fontColorLog('blue', message, '{bold: true,italic: true}')", { 7 | bold: true, 8 | italic: true 9 | }); 10 | 11 | logger.bgColorLog('red', "logger.bgColorLog('red', message)"); 12 | logger.bgColorLog( 13 | 'magenta', 14 | "logger.bgColorLog('magenta', message, '{underscore: true, dim: true}')", { 15 | underscore: true, 16 | dim: true 17 | }); 18 | 19 | logger.colorLog({ 20 | font: 'blue', 21 | bg: 'white' 22 | }, "logger.colorLog({font: 'red',bg: 'white'}, message"); 23 | logger.colorLog({ 24 | font: 'blue', 25 | bg: 'white' 26 | }, "logger.colorLog({font: 'red',bg: 'white'}, message, {reverse: true,strikethrough: true})", { 27 | reverse: true, 28 | strikethrough: true 29 | }); 30 | 31 | -------------------------------------------------------------------------------- /assets/make-demo-level.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | logger.debug('logger.debug() prints prefix "DEBUG: " with background and text in color cyan'); 4 | logger.error('logger.error() prints prefix "ERROR: " with background and text in color red'); 5 | logger.info('logger.info() prints prefix "INFO: " with background and text in color green'); 6 | logger.warn('logger.warn() prints prefix "WARN: " with background and text in color yellow'); -------------------------------------------------------------------------------- /assets/make-demo-log.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | logger.log(`logger.log`); 4 | logger.bold().log(`logger.bold().log`); 5 | logger.underscore().log(`logger.underscore().log`); 6 | logger.reverse().log(`logger.reverse().log`); 7 | logger.dim().log(`logger.dim().log`); 8 | logger.italic().log(`logger.italic().log`); 9 | logger.strikethrough().log(`logger.strikethrough().log`); 10 | logger.color('yellow').bold().log(`logger.color('yellow').bold().log`) 11 | logger.color('yellow').underscore().log(`logger.color('yellow').underscore().log`); 12 | logger.color('yellow').reverse().log(`logger.color('yellow').reverse().log`); 13 | logger.color('yellow').dim().log(`logger.color('yellow').dim().log`); 14 | logger.color('yellow').italic().log(`logger.color('yellow').italic().log`); 15 | logger.color('yellow').strikethrough().log(`logger.color('yellow').strikethrough().log`); 16 | logger.color('blue').bgColor('white').bold().log(`logger.color('blue').bgColor('white').bold().log`) 17 | logger.color('blue').bgColor('white').underscore().log(`logger.color('blue').bgColor('white').underscore().log`); 18 | logger.color('blue').bgColor('white').reverse().log(`logger.color('blue').bgColor('white').reverse().log`); 19 | logger.color('blue').bgColor('white').dim().log(`logger.color('blue').bgColor('white').dim().log`); 20 | logger.color('blue').bgColor('white').italic().log(`logger.color('blue').bgColor('white').italic().log`); 21 | logger.color('blue').bgColor('white').strikethrough().log(`logger.color('blue').bgColor('white').strikethrough().log`); 22 | logger.color('white').bgColor('red') 23 | .bold().italic().dim().reverse().underscore().strikethrough() 24 | .log(`logger.color('white').bgColor('red').bold().italic().dim().reverse().underscore().strikethrough().log`); -------------------------------------------------------------------------------- /change.log.md: -------------------------------------------------------------------------------- 1 | 12.0.1 2 | - added tests. 3 | 4 | 12.0.0 5 | - default output to stderr. enhanced CI. 6 | 7 | 11.0.2 8 | - check `process.env` exists 9 | 10 | 11.0.1 11 | - fixed `Stream` typescript 12 | 13 | 11.0.0 14 | - add `append()` and deprecate `joint`, add `reset`, add `setLogStream` to redirect logs to the stream 15 | 16 | 10.0.2 17 | - fix typescript namespace issues 18 | 19 | 10.0.1 20 | - update document for `createNamedLogger()` 21 | 22 | 10.0.0 23 | - Adding error catching to json stringify 24 | - Adding support for named loggers: `createNamedLogger()` 25 | 26 | 9.0.0 27 | - modify `success()` 28 | 29 | 8.0.1 30 | - revise README 31 | 32 | 8.0.0 33 | - add success option 34 | - increase label contrast 35 | 36 | 7.0.0 37 | - fix TypeScript types 38 | 39 | 6.0.0 40 | - add `setDate` and `getDate` 41 | 42 | 5.3.1 43 | - fix typescript declaration 44 | 45 | 5.3.0 46 | - support `disable` for levels 47 | 48 | 5.2.0 49 | - support TypeScript (may require `--esModuleInterop` flag) 50 | 51 | 5.1.0 52 | - fix none color mode not pure text 53 | 54 | 5.0.0 55 | - log(), debug(), info(), warn(), error(): support for multiple arguments 56 | - add setLevelNoColor(), setLevelColor() 57 | 58 | 4.0.0 59 | - add LOGGER environment variable as level setter 60 | 61 | 3.0.3 62 | - update readme 63 | 64 | 3.0.2 65 | - update readme 66 | 67 | 3.0.1 68 | - update CI & add npmignore 69 | 70 | 3.0.0 71 | - change log level order 72 | 73 | 2.2.0 74 | - add setLevel 75 | 76 | 2.1.2 77 | - update README and demo image 78 | 79 | 2.1.0 80 | - add time for level log. 81 | e.g. 2018-08-04T15:58:56.186Z [WARN] XXXXX 82 | 83 | 2.0.2 84 | - banner modified. 85 | 86 | 2.0.0 87 | - `module.exports` from class type to function. 88 | 89 | 1.1.1 90 | - add new demo image 91 | 92 | 1.1.0 93 | - add `joint` 94 | - update `debug()`, `error()`, `info()`, `warn()` 95 | 96 | 1.0.2 97 | - update demo image 98 | 99 | 1.0.1 100 | - update demo image 101 | - update readme 102 | 103 | 1.0.0 104 | - `log` add attribute setter `color`, `bgColor`, `bold`, `italic`, `dim`, `reverse`, `undserscore`, `strikethrough` 105 | - `fontColor` rename `fontColorLog` 106 | - `bgColor` rename `bgColorLog` 107 | - `setColor` rename `setColorLog` 108 | 109 | 0.0.3 110 | - Add the third parameter `setting` for `fontColor`, `bgColor`, `setColor` 111 | 112 | 0.0.2 113 | - Implement `fontColor`, `bgColor`, `setColor` and other functions 114 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | import { Stream } from "stream"; 2 | declare namespace types { 3 | export type LEVEL = "debug" | "info" | "warn" | "error" | "disable" | "success"; 4 | 5 | export type SETTING = "bold" | "italic" | "dim" | "underscore" | "reverse" | "strikethrough"; 6 | 7 | export type COLOR = "black" | "red" | "green" | "yellow" | "blue" | "magenta" | "cyan" | "white"; 8 | } 9 | 10 | type ticketObject = { 11 | font?: types.COLOR, 12 | bg?: types.COLOR, 13 | } 14 | 15 | type settingObject = { 16 | [key in types.SETTING]?: boolean; 17 | }; 18 | 19 | declare class Logger { 20 | command: string; 21 | lastCommand: string; 22 | level: any; 23 | noColor: boolean; 24 | 25 | setLevel(level: types.LEVEL): void; 26 | 27 | createNamedLogger(name: string): Logger; 28 | 29 | setLogStream(stream: Stream): Logger; 30 | 31 | setLevelNoColor(): void; 32 | 33 | setLevelColor(): void; 34 | 35 | isLevelValid(level: types.LEVEL): boolean; 36 | 37 | isAllowedLevel(level: types.LEVEL): boolean; 38 | 39 | checkSetting(setting: settingObject): string; 40 | 41 | joint(): Logger; 42 | 43 | append(...args: any[]): Logger; 44 | 45 | reset(): Logger; 46 | 47 | setDate(callback: Function): void; 48 | 49 | getDate(): string; 50 | 51 | color(ticket: types.COLOR): Logger; 52 | 53 | bgColor(ticket: types.COLOR): Logger; 54 | 55 | bold(): Logger; 56 | 57 | dim(): Logger; 58 | 59 | underscore(): Logger; 60 | 61 | strikethrough(): Logger; 62 | 63 | reverse(): Logger; 64 | 65 | italic(): Logger; 66 | 67 | fontColorLog(ticket: types.COLOR, text: string, setting?: settingObject): void; 68 | 69 | bgColorLog(ticket: types.COLOR, text: string, setting?: settingObject): void; 70 | 71 | colorLog(ticketObj: ticketObject, text: string, setting?: settingObject): void; 72 | 73 | log(...args: any[]): Logger; 74 | 75 | error(...args: any[]): void; 76 | 77 | warn(...args: any[]): void; 78 | 79 | info(...args: any[]): void; 80 | 81 | debug(...args: any[]): void; 82 | 83 | success(...args: any[]): void; 84 | } 85 | 86 | declare const logger: Logger; 87 | export = logger; -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const CONFIG = { 2 | SYSTEM: { 3 | reset: "\x1b[0m", 4 | bold: "\x1b[1m", 5 | dim: "\x1b[2m", 6 | italic: "\x1b[3m", 7 | underscore: "\x1b[4m", 8 | reverse: "\x1b[7m", 9 | strikethrough: "\x1b[9m", 10 | backoneline: "\x1b[1A", 11 | cleanthisline: "\x1b[K" 12 | }, 13 | FONT: { 14 | black: "\x1b[30m", 15 | red: "\x1b[31m", 16 | green: "\x1b[32m", 17 | yellow: "\x1b[33m", 18 | blue: "\x1b[34m", 19 | magenta: "\x1b[35m", 20 | cyan: "\x1b[36m", 21 | white: "\x1b[37m", 22 | }, 23 | BACKGROUND: { 24 | black: "\x1b[40m", 25 | red: "\x1b[41m", 26 | green: "\x1b[42m", 27 | yellow: "\x1b[43m", 28 | blue: "\x1b[44m", 29 | magenta: "\x1b[45m", 30 | cyan: "\x1b[46m", 31 | white: "\x1b[47m" 32 | } 33 | }; 34 | 35 | // Sequence of levels is important. 36 | const LEVELS = ["success", "debug", "info", "warn", "error", "disable"]; 37 | 38 | class Logger { 39 | constructor(name) { 40 | // Current command 41 | this.command = ''; 42 | // Last line 43 | this.lastCommand = ''; 44 | 45 | this.name = name || "" 46 | 47 | // set level from env 48 | const level = typeof process !== 'undefined' ? process.env.LOGGER : undefined; 49 | if (this.isLevelValid(level)) { 50 | this.level = level; 51 | } 52 | 53 | this.noColor = false; 54 | 55 | this._getDate = () => (new Date()).toISOString(); 56 | 57 | this._customizedConsole = console; 58 | } 59 | 60 | createNamedLogger(name) { 61 | return new Logger(name) 62 | } 63 | 64 | setLevel(level) { 65 | if (this.isLevelValid(level)) { 66 | this.level = level; 67 | } else { 68 | throw "Level you are trying to set is invalid"; 69 | } 70 | 71 | } 72 | 73 | setLogStream(newStream) { 74 | if (newStream.writable) { 75 | this._customizedConsole = new console.Console(newStream); 76 | } else { 77 | throw "invalid writable stream object"; 78 | } 79 | } 80 | 81 | setLevelNoColor() { 82 | this.noColor = true; 83 | } 84 | 85 | setLevelColor() { 86 | this.noColor = false; 87 | } 88 | 89 | isLevelValid(level) { 90 | return LEVELS.includes(level); 91 | } 92 | 93 | isAllowedLevel(level) { 94 | return this.level ? LEVELS.indexOf(this.level) <= LEVELS.indexOf(level) : true 95 | } 96 | 97 | log(...args) { 98 | this.append(...args); 99 | if (!this.noColor) { 100 | this.command += CONFIG.SYSTEM.reset; 101 | } 102 | this._print(this.command); 103 | // Save last command if we need to use for joint 104 | this.lastCommand = this.command; 105 | this.command = ''; 106 | return this; 107 | } 108 | 109 | // deprecated 110 | joint() { 111 | console.error("node-color-log warning: `joint` is deprecated, please use `append`"); 112 | 113 | // Clear the last line 114 | this._print(CONFIG.SYSTEM.backoneline + CONFIG.SYSTEM.cleanthisline); 115 | 116 | // Reset the command to let it joint the next 117 | // And print from the position of last line 118 | this.command = ''; 119 | 120 | // if joint more than twice, we should clean the previous 121 | // backline command, since we should only do it for the 122 | // current time. 123 | this.lastCommand = this.lastCommand.replace(CONFIG.SYSTEM.backoneline, ""); 124 | 125 | // back to the last line 126 | this.command += CONFIG.SYSTEM.backoneline; 127 | 128 | this.command += this.lastCommand; 129 | return this; 130 | } 131 | 132 | setDate(callback) { 133 | this._getDate = callback; 134 | } 135 | 136 | getPrefix() { 137 | if (this.name) { 138 | return `${this._getDate()} [${this.name}]`; 139 | } else { 140 | return this._getDate(); 141 | } 142 | } 143 | 144 | color(ticket) { 145 | if (ticket in CONFIG.FONT) { 146 | this.command += CONFIG.FONT[ticket]; 147 | } else { 148 | console.error("node-color-log warning: Font color not found! Use the default.") 149 | } 150 | return this; 151 | } 152 | 153 | bgColor(ticket) { 154 | if (ticket in CONFIG.BACKGROUND) { 155 | this.command += CONFIG.BACKGROUND[ticket]; 156 | } else { 157 | console.error("node-color-log warning: Background color not found! Use the default.") 158 | } 159 | return this; 160 | } 161 | 162 | bold() { 163 | this.command += CONFIG.SYSTEM.bold; 164 | return this; 165 | } 166 | 167 | dim() { 168 | this.command += CONFIG.SYSTEM.dim; 169 | return this; 170 | } 171 | 172 | underscore() { 173 | this.command += CONFIG.SYSTEM.underscore; 174 | return this; 175 | } 176 | 177 | strikethrough() { 178 | this.command += CONFIG.SYSTEM.strikethrough; 179 | return this; 180 | } 181 | 182 | reverse() { 183 | this.command += CONFIG.SYSTEM.reverse; 184 | return this; 185 | } 186 | 187 | italic() { 188 | this.command += CONFIG.SYSTEM.italic; 189 | return this; 190 | } 191 | 192 | fontColorLog(ticket, text, setting) { 193 | let command = ''; 194 | if (setting) { 195 | command += this.checkSetting(setting); 196 | } 197 | if (ticket in CONFIG.FONT) { 198 | command += CONFIG.FONT[ticket]; 199 | } else { 200 | console.error("node-color-log warning: Font color not found! Use the default.") 201 | } 202 | command += text; 203 | 204 | command += CONFIG.SYSTEM.reset; 205 | this.lastCommand = command; 206 | this._print(command); 207 | } 208 | 209 | bgColorLog(ticket, text, setting) { 210 | let command = ''; 211 | if (setting) { 212 | command += this.checkSetting(setting); 213 | } 214 | if (ticket in CONFIG.BACKGROUND) { 215 | command += CONFIG.BACKGROUND[ticket]; 216 | } else { 217 | console.error("node-color-log warning: Background color not found! Use the default.") 218 | } 219 | command += text; 220 | 221 | command += CONFIG.SYSTEM.reset; 222 | this.lastCommand = command; 223 | this._print(command); 224 | } 225 | 226 | colorLog(ticketObj, text, setting) { 227 | let command = ''; 228 | if (setting) { 229 | command += this.checkSetting(setting); 230 | } 231 | if (ticketObj.font in CONFIG.FONT) { 232 | command += CONFIG.FONT[ticketObj.font]; 233 | } else { 234 | console.error("node-color-log warning: Font color not found! Use the default.") 235 | } 236 | if (ticketObj.bg in CONFIG.BACKGROUND) { 237 | command += CONFIG.BACKGROUND[ticketObj.bg] 238 | } else { 239 | console.error("node-color-log warning: Background color not found! Use the default.") 240 | } 241 | 242 | command += text; 243 | 244 | command += CONFIG.SYSTEM.reset; 245 | this.lastCommand = command; 246 | this._print(command); 247 | } 248 | 249 | error(...args) { 250 | if (!this.isAllowedLevel("error")) 251 | return; 252 | 253 | if (this.noColor) { 254 | const d = this.getPrefix(); 255 | this.log(d, " [ERROR] ", ...args); 256 | } else { 257 | const d = this.getPrefix(); 258 | this.append(d + " ") 259 | .bgColor('red').append('[ERROR]').reset() 260 | .append(" ") 261 | .color('red').log(...args); 262 | } 263 | } 264 | 265 | warn(...args) { 266 | if (!this.isAllowedLevel("warn")) 267 | return; 268 | 269 | if (this.noColor) { 270 | const d = this.getPrefix(); 271 | this.log(d, " [WARN] ", ...args); 272 | } else { 273 | const d = this.getPrefix(); 274 | this.append(d + " ") 275 | .bgColor('yellow').color('black').append('[WARN]').reset() 276 | .append(" ") 277 | .color('yellow').log(...args); 278 | } 279 | } 280 | 281 | info(...args) { 282 | if (!this.isAllowedLevel("info")) 283 | return; 284 | 285 | if (this.noColor) { 286 | const d = this.getPrefix(); 287 | this.log(d, " [INFO] ", ...args); 288 | } else { 289 | const d = this.getPrefix(); 290 | this.append(d + " ") 291 | .bgColor('green').color('black').append('[INFO]').reset() 292 | .append(" ") 293 | .color('green').log(...args); 294 | } 295 | } 296 | 297 | debug(...args) { 298 | if (!this.isAllowedLevel("debug")) 299 | return; 300 | 301 | if (this.noColor) { 302 | const d = this.getPrefix(); 303 | this.log(d, " [DEBUG] ", ...args); 304 | } else { 305 | const d = this.getPrefix(); 306 | this.append(d + " ") 307 | .bgColor('cyan').color('black').append("[DEBUG]").reset() 308 | .append(' ') 309 | .color('cyan') 310 | .log(...args); 311 | } 312 | } 313 | 314 | success(...args) { 315 | if (!this.isAllowedLevel("success")) 316 | return; 317 | 318 | if (this.noColor) { 319 | const d = this.getPrefix(); 320 | this.log(d, " [SUCCESS] ", ...args); 321 | } else { 322 | const d = this.getPrefix(); 323 | this.append(d + " ") 324 | .bgColor('green').color('black').append("[SUCCESS]").reset() 325 | .append(' ') 326 | .color('green') 327 | .log(...args); 328 | } 329 | } 330 | 331 | checkSetting(setting) { 332 | const validSetting = ['bold', 'italic', 'dim', 'underscore', 'reverse', 'strikethrough']; 333 | let command = ''; 334 | for (const item in setting) { 335 | if (validSetting.indexOf(item) !== -1) { 336 | if (setting[item] === true) { 337 | command += CONFIG.SYSTEM[item]; 338 | } else if (setting[item] !== false) { 339 | console.error(`node-color-log warning: The value ${item} should be boolean.`) 340 | } 341 | } else { 342 | console.error(`node-color-log warning: ${item} is not valid in setting.`) 343 | } 344 | } 345 | return command; 346 | } 347 | 348 | // helper function to output the the log to stream 349 | _print(...args) { 350 | this._customizedConsole.error(...args); 351 | } 352 | 353 | // helper function to append the command buffer 354 | append(...args) { 355 | for (const idx in args) { 356 | const arg = args[idx]; 357 | if (typeof arg === "string") { 358 | this.command += arg; 359 | } else { 360 | try { 361 | this.command += JSON.stringify(arg); 362 | } catch { 363 | this.command += arg; 364 | } 365 | } 366 | if (args.length > 1 && idx < args.length - 1) { 367 | this.command += " "; 368 | } 369 | } 370 | return this; 371 | } 372 | 373 | reset() { 374 | this.command += CONFIG.SYSTEM.reset; 375 | return this; 376 | } 377 | } 378 | 379 | const logger = new Logger(); 380 | module.exports = logger; 381 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * For a detailed explanation regarding each configuration property, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | /** @type {import('jest').Config} */ 7 | const config = { 8 | // All imported modules in your tests should be mocked automatically 9 | // automock: false, 10 | 11 | // Stop running tests after `n` failures 12 | // bail: 0, 13 | 14 | // The directory where Jest should store its cached dependency information 15 | // cacheDirectory: "C:\\Users\\mocli\\AppData\\Local\\Temp\\jest", 16 | 17 | // Automatically clear mock calls, instances, contexts and results before every test 18 | // clearMocks: false, 19 | 20 | // Indicates whether the coverage information should be collected while executing the test 21 | // collectCoverage: false, 22 | 23 | // An array of glob patterns indicating a set of files for which coverage information should be collected 24 | // collectCoverageFrom: undefined, 25 | 26 | // The directory where Jest should output its coverage files 27 | // coverageDirectory: undefined, 28 | 29 | // An array of regexp pattern strings used to skip coverage collection 30 | // coveragePathIgnorePatterns: [ 31 | // "\\\\node_modules\\\\" 32 | // ], 33 | 34 | // Indicates which provider should be used to instrument code for coverage 35 | coverageProvider: "v8", 36 | 37 | // A list of reporter names that Jest uses when writing coverage reports 38 | // coverageReporters: [ 39 | // "json", 40 | // "text", 41 | // "lcov", 42 | // "clover" 43 | // ], 44 | 45 | // An object that configures minimum threshold enforcement for coverage results 46 | // coverageThreshold: undefined, 47 | 48 | // A path to a custom dependency extractor 49 | // dependencyExtractor: undefined, 50 | 51 | // Make calling deprecated APIs throw helpful error messages 52 | // errorOnDeprecated: false, 53 | 54 | // The default configuration for fake timers 55 | // fakeTimers: { 56 | // "enableGlobally": false 57 | // }, 58 | 59 | // Force coverage collection from ignored files using an array of glob patterns 60 | // forceCoverageMatch: [], 61 | 62 | // A path to a module which exports an async function that is triggered once before all test suites 63 | // globalSetup: undefined, 64 | 65 | // A path to a module which exports an async function that is triggered once after all test suites 66 | // globalTeardown: undefined, 67 | 68 | // A set of global variables that need to be available in all test environments 69 | // globals: {}, 70 | 71 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 72 | // maxWorkers: "50%", 73 | 74 | // An array of directory names to be searched recursively up from the requiring module's location 75 | // moduleDirectories: [ 76 | // "node_modules" 77 | // ], 78 | 79 | // An array of file extensions your modules use 80 | // moduleFileExtensions: [ 81 | // "js", 82 | // "mjs", 83 | // "cjs", 84 | // "jsx", 85 | // "ts", 86 | // "tsx", 87 | // "json", 88 | // "node" 89 | // ], 90 | 91 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module 92 | // moduleNameMapper: {}, 93 | 94 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 95 | // modulePathIgnorePatterns: [], 96 | 97 | // Activates notifications for test results 98 | // notify: false, 99 | 100 | // An enum that specifies notification mode. Requires { notify: true } 101 | // notifyMode: "failure-change", 102 | 103 | // A preset that is used as a base for Jest's configuration 104 | // preset: undefined, 105 | 106 | // Run tests from one or more projects 107 | // projects: undefined, 108 | 109 | // Use this configuration option to add custom reporters to Jest 110 | // reporters: undefined, 111 | 112 | // Automatically reset mock state before every test 113 | // resetMocks: false, 114 | 115 | // Reset the module registry before running each individual test 116 | // resetModules: false, 117 | 118 | // A path to a custom resolver 119 | // resolver: undefined, 120 | 121 | // Automatically restore mock state and implementation before every test 122 | // restoreMocks: false, 123 | 124 | // The root directory that Jest should scan for tests and modules within 125 | // rootDir: undefined, 126 | 127 | // A list of paths to directories that Jest should use to search for files in 128 | // roots: [ 129 | // "" 130 | // ], 131 | 132 | // Allows you to use a custom runner instead of Jest's default test runner 133 | // runner: "jest-runner", 134 | 135 | // The paths to modules that run some code to configure or set up the testing environment before each test 136 | // setupFiles: [], 137 | 138 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 139 | setupFilesAfterEnv: ['jest-expect-message'], 140 | 141 | // The number of seconds after which a test is considered as slow and reported as such in the results. 142 | // slowTestThreshold: 5, 143 | 144 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 145 | // snapshotSerializers: [], 146 | 147 | // The test environment that will be used for testing 148 | // testEnvironment: "jest-environment-node", 149 | 150 | // Options that will be passed to the testEnvironment 151 | // testEnvironmentOptions: {}, 152 | 153 | // Adds a location field to test results 154 | // testLocationInResults: false, 155 | 156 | // The glob patterns Jest uses to detect test files 157 | testMatch: [ 158 | // "**/__tests__/**/*.[jt]s?(x)", 159 | // "**/?(*.)+(spec|test).[tj]s?(x)", 160 | "**/test/**/*.spec.js" 161 | ], 162 | 163 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 164 | // testPathIgnorePatterns: [ 165 | // "\\\\node_modules\\\\" 166 | // ], 167 | 168 | // The regexp pattern or array of patterns that Jest uses to detect test files 169 | // testRegex: [], 170 | 171 | // This option allows the use of a custom results processor 172 | // testResultsProcessor: undefined, 173 | 174 | // This option allows use of a custom test runner 175 | // testRunner: "jest-circus/runner", 176 | 177 | // A map from regular expressions to paths to transformers 178 | // transform: undefined, 179 | 180 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 181 | // transformIgnorePatterns: [ 182 | // "\\\\node_modules\\\\", 183 | // "\\.pnp\\.[^\\\\]+$" 184 | // ], 185 | 186 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 187 | // unmockedModulePathPatterns: undefined, 188 | 189 | // Indicates whether each individual test should be reported during the run 190 | // verbose: undefined, 191 | 192 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 193 | // watchPathIgnorePatterns: [], 194 | 195 | // Whether to use watchman for file crawling 196 | // watchman: true, 197 | }; 198 | 199 | module.exports = config; 200 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-color-log", 3 | "version": "12.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "node-color-log", 9 | "version": "12.0.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "jest": "^29.7.0", 13 | "jest-expect-message": "^1.1.3" 14 | } 15 | }, 16 | "node_modules/@ampproject/remapping": { 17 | "version": "2.3.0", 18 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 19 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 20 | "dev": true, 21 | "dependencies": { 22 | "@jridgewell/gen-mapping": "^0.3.5", 23 | "@jridgewell/trace-mapping": "^0.3.24" 24 | }, 25 | "engines": { 26 | "node": ">=6.0.0" 27 | } 28 | }, 29 | "node_modules/@babel/code-frame": { 30 | "version": "7.24.2", 31 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", 32 | "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", 33 | "dev": true, 34 | "dependencies": { 35 | "@babel/highlight": "^7.24.2", 36 | "picocolors": "^1.0.0" 37 | }, 38 | "engines": { 39 | "node": ">=6.9.0" 40 | } 41 | }, 42 | "node_modules/@babel/compat-data": { 43 | "version": "7.24.4", 44 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", 45 | "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", 46 | "dev": true, 47 | "engines": { 48 | "node": ">=6.9.0" 49 | } 50 | }, 51 | "node_modules/@babel/core": { 52 | "version": "7.24.5", 53 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", 54 | "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", 55 | "dev": true, 56 | "dependencies": { 57 | "@ampproject/remapping": "^2.2.0", 58 | "@babel/code-frame": "^7.24.2", 59 | "@babel/generator": "^7.24.5", 60 | "@babel/helper-compilation-targets": "^7.23.6", 61 | "@babel/helper-module-transforms": "^7.24.5", 62 | "@babel/helpers": "^7.24.5", 63 | "@babel/parser": "^7.24.5", 64 | "@babel/template": "^7.24.0", 65 | "@babel/traverse": "^7.24.5", 66 | "@babel/types": "^7.24.5", 67 | "convert-source-map": "^2.0.0", 68 | "debug": "^4.1.0", 69 | "gensync": "^1.0.0-beta.2", 70 | "json5": "^2.2.3", 71 | "semver": "^6.3.1" 72 | }, 73 | "engines": { 74 | "node": ">=6.9.0" 75 | }, 76 | "funding": { 77 | "type": "opencollective", 78 | "url": "https://opencollective.com/babel" 79 | } 80 | }, 81 | "node_modules/@babel/generator": { 82 | "version": "7.24.5", 83 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", 84 | "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", 85 | "dev": true, 86 | "dependencies": { 87 | "@babel/types": "^7.24.5", 88 | "@jridgewell/gen-mapping": "^0.3.5", 89 | "@jridgewell/trace-mapping": "^0.3.25", 90 | "jsesc": "^2.5.1" 91 | }, 92 | "engines": { 93 | "node": ">=6.9.0" 94 | } 95 | }, 96 | "node_modules/@babel/helper-compilation-targets": { 97 | "version": "7.23.6", 98 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", 99 | "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", 100 | "dev": true, 101 | "dependencies": { 102 | "@babel/compat-data": "^7.23.5", 103 | "@babel/helper-validator-option": "^7.23.5", 104 | "browserslist": "^4.22.2", 105 | "lru-cache": "^5.1.1", 106 | "semver": "^6.3.1" 107 | }, 108 | "engines": { 109 | "node": ">=6.9.0" 110 | } 111 | }, 112 | "node_modules/@babel/helper-environment-visitor": { 113 | "version": "7.22.20", 114 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", 115 | "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", 116 | "dev": true, 117 | "engines": { 118 | "node": ">=6.9.0" 119 | } 120 | }, 121 | "node_modules/@babel/helper-function-name": { 122 | "version": "7.23.0", 123 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", 124 | "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", 125 | "dev": true, 126 | "dependencies": { 127 | "@babel/template": "^7.22.15", 128 | "@babel/types": "^7.23.0" 129 | }, 130 | "engines": { 131 | "node": ">=6.9.0" 132 | } 133 | }, 134 | "node_modules/@babel/helper-hoist-variables": { 135 | "version": "7.22.5", 136 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 137 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 138 | "dev": true, 139 | "dependencies": { 140 | "@babel/types": "^7.22.5" 141 | }, 142 | "engines": { 143 | "node": ">=6.9.0" 144 | } 145 | }, 146 | "node_modules/@babel/helper-module-imports": { 147 | "version": "7.24.3", 148 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", 149 | "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", 150 | "dev": true, 151 | "dependencies": { 152 | "@babel/types": "^7.24.0" 153 | }, 154 | "engines": { 155 | "node": ">=6.9.0" 156 | } 157 | }, 158 | "node_modules/@babel/helper-module-transforms": { 159 | "version": "7.24.5", 160 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", 161 | "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", 162 | "dev": true, 163 | "dependencies": { 164 | "@babel/helper-environment-visitor": "^7.22.20", 165 | "@babel/helper-module-imports": "^7.24.3", 166 | "@babel/helper-simple-access": "^7.24.5", 167 | "@babel/helper-split-export-declaration": "^7.24.5", 168 | "@babel/helper-validator-identifier": "^7.24.5" 169 | }, 170 | "engines": { 171 | "node": ">=6.9.0" 172 | }, 173 | "peerDependencies": { 174 | "@babel/core": "^7.0.0" 175 | } 176 | }, 177 | "node_modules/@babel/helper-plugin-utils": { 178 | "version": "7.24.5", 179 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", 180 | "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", 181 | "dev": true, 182 | "engines": { 183 | "node": ">=6.9.0" 184 | } 185 | }, 186 | "node_modules/@babel/helper-simple-access": { 187 | "version": "7.24.5", 188 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", 189 | "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", 190 | "dev": true, 191 | "dependencies": { 192 | "@babel/types": "^7.24.5" 193 | }, 194 | "engines": { 195 | "node": ">=6.9.0" 196 | } 197 | }, 198 | "node_modules/@babel/helper-split-export-declaration": { 199 | "version": "7.24.5", 200 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", 201 | "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", 202 | "dev": true, 203 | "dependencies": { 204 | "@babel/types": "^7.24.5" 205 | }, 206 | "engines": { 207 | "node": ">=6.9.0" 208 | } 209 | }, 210 | "node_modules/@babel/helper-string-parser": { 211 | "version": "7.24.1", 212 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", 213 | "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", 214 | "dev": true, 215 | "engines": { 216 | "node": ">=6.9.0" 217 | } 218 | }, 219 | "node_modules/@babel/helper-validator-identifier": { 220 | "version": "7.24.5", 221 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", 222 | "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", 223 | "dev": true, 224 | "engines": { 225 | "node": ">=6.9.0" 226 | } 227 | }, 228 | "node_modules/@babel/helper-validator-option": { 229 | "version": "7.23.5", 230 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", 231 | "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", 232 | "dev": true, 233 | "engines": { 234 | "node": ">=6.9.0" 235 | } 236 | }, 237 | "node_modules/@babel/helpers": { 238 | "version": "7.24.5", 239 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", 240 | "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", 241 | "dev": true, 242 | "dependencies": { 243 | "@babel/template": "^7.24.0", 244 | "@babel/traverse": "^7.24.5", 245 | "@babel/types": "^7.24.5" 246 | }, 247 | "engines": { 248 | "node": ">=6.9.0" 249 | } 250 | }, 251 | "node_modules/@babel/highlight": { 252 | "version": "7.24.5", 253 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", 254 | "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", 255 | "dev": true, 256 | "dependencies": { 257 | "@babel/helper-validator-identifier": "^7.24.5", 258 | "chalk": "^2.4.2", 259 | "js-tokens": "^4.0.0", 260 | "picocolors": "^1.0.0" 261 | }, 262 | "engines": { 263 | "node": ">=6.9.0" 264 | } 265 | }, 266 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 267 | "version": "3.2.1", 268 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 269 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 270 | "dev": true, 271 | "dependencies": { 272 | "color-convert": "^1.9.0" 273 | }, 274 | "engines": { 275 | "node": ">=4" 276 | } 277 | }, 278 | "node_modules/@babel/highlight/node_modules/chalk": { 279 | "version": "2.4.2", 280 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 281 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 282 | "dev": true, 283 | "dependencies": { 284 | "ansi-styles": "^3.2.1", 285 | "escape-string-regexp": "^1.0.5", 286 | "supports-color": "^5.3.0" 287 | }, 288 | "engines": { 289 | "node": ">=4" 290 | } 291 | }, 292 | "node_modules/@babel/highlight/node_modules/color-convert": { 293 | "version": "1.9.3", 294 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 295 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 296 | "dev": true, 297 | "dependencies": { 298 | "color-name": "1.1.3" 299 | } 300 | }, 301 | "node_modules/@babel/highlight/node_modules/color-name": { 302 | "version": "1.1.3", 303 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 304 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 305 | "dev": true 306 | }, 307 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 308 | "version": "1.0.5", 309 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 310 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 311 | "dev": true, 312 | "engines": { 313 | "node": ">=0.8.0" 314 | } 315 | }, 316 | "node_modules/@babel/highlight/node_modules/has-flag": { 317 | "version": "3.0.0", 318 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 319 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 320 | "dev": true, 321 | "engines": { 322 | "node": ">=4" 323 | } 324 | }, 325 | "node_modules/@babel/highlight/node_modules/supports-color": { 326 | "version": "5.5.0", 327 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 328 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 329 | "dev": true, 330 | "dependencies": { 331 | "has-flag": "^3.0.0" 332 | }, 333 | "engines": { 334 | "node": ">=4" 335 | } 336 | }, 337 | "node_modules/@babel/parser": { 338 | "version": "7.24.5", 339 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 340 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", 341 | "dev": true, 342 | "bin": { 343 | "parser": "bin/babel-parser.js" 344 | }, 345 | "engines": { 346 | "node": ">=6.0.0" 347 | } 348 | }, 349 | "node_modules/@babel/plugin-syntax-async-generators": { 350 | "version": "7.8.4", 351 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 352 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 353 | "dev": true, 354 | "dependencies": { 355 | "@babel/helper-plugin-utils": "^7.8.0" 356 | }, 357 | "peerDependencies": { 358 | "@babel/core": "^7.0.0-0" 359 | } 360 | }, 361 | "node_modules/@babel/plugin-syntax-bigint": { 362 | "version": "7.8.3", 363 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", 364 | "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", 365 | "dev": true, 366 | "dependencies": { 367 | "@babel/helper-plugin-utils": "^7.8.0" 368 | }, 369 | "peerDependencies": { 370 | "@babel/core": "^7.0.0-0" 371 | } 372 | }, 373 | "node_modules/@babel/plugin-syntax-class-properties": { 374 | "version": "7.12.13", 375 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", 376 | "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", 377 | "dev": true, 378 | "dependencies": { 379 | "@babel/helper-plugin-utils": "^7.12.13" 380 | }, 381 | "peerDependencies": { 382 | "@babel/core": "^7.0.0-0" 383 | } 384 | }, 385 | "node_modules/@babel/plugin-syntax-import-meta": { 386 | "version": "7.10.4", 387 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", 388 | "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", 389 | "dev": true, 390 | "dependencies": { 391 | "@babel/helper-plugin-utils": "^7.10.4" 392 | }, 393 | "peerDependencies": { 394 | "@babel/core": "^7.0.0-0" 395 | } 396 | }, 397 | "node_modules/@babel/plugin-syntax-json-strings": { 398 | "version": "7.8.3", 399 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 400 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 401 | "dev": true, 402 | "dependencies": { 403 | "@babel/helper-plugin-utils": "^7.8.0" 404 | }, 405 | "peerDependencies": { 406 | "@babel/core": "^7.0.0-0" 407 | } 408 | }, 409 | "node_modules/@babel/plugin-syntax-jsx": { 410 | "version": "7.24.1", 411 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", 412 | "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", 413 | "dev": true, 414 | "dependencies": { 415 | "@babel/helper-plugin-utils": "^7.24.0" 416 | }, 417 | "engines": { 418 | "node": ">=6.9.0" 419 | }, 420 | "peerDependencies": { 421 | "@babel/core": "^7.0.0-0" 422 | } 423 | }, 424 | "node_modules/@babel/plugin-syntax-logical-assignment-operators": { 425 | "version": "7.10.4", 426 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", 427 | "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", 428 | "dev": true, 429 | "dependencies": { 430 | "@babel/helper-plugin-utils": "^7.10.4" 431 | }, 432 | "peerDependencies": { 433 | "@babel/core": "^7.0.0-0" 434 | } 435 | }, 436 | "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { 437 | "version": "7.8.3", 438 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 439 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 440 | "dev": true, 441 | "dependencies": { 442 | "@babel/helper-plugin-utils": "^7.8.0" 443 | }, 444 | "peerDependencies": { 445 | "@babel/core": "^7.0.0-0" 446 | } 447 | }, 448 | "node_modules/@babel/plugin-syntax-numeric-separator": { 449 | "version": "7.10.4", 450 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", 451 | "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", 452 | "dev": true, 453 | "dependencies": { 454 | "@babel/helper-plugin-utils": "^7.10.4" 455 | }, 456 | "peerDependencies": { 457 | "@babel/core": "^7.0.0-0" 458 | } 459 | }, 460 | "node_modules/@babel/plugin-syntax-object-rest-spread": { 461 | "version": "7.8.3", 462 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 463 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 464 | "dev": true, 465 | "dependencies": { 466 | "@babel/helper-plugin-utils": "^7.8.0" 467 | }, 468 | "peerDependencies": { 469 | "@babel/core": "^7.0.0-0" 470 | } 471 | }, 472 | "node_modules/@babel/plugin-syntax-optional-catch-binding": { 473 | "version": "7.8.3", 474 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 475 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 476 | "dev": true, 477 | "dependencies": { 478 | "@babel/helper-plugin-utils": "^7.8.0" 479 | }, 480 | "peerDependencies": { 481 | "@babel/core": "^7.0.0-0" 482 | } 483 | }, 484 | "node_modules/@babel/plugin-syntax-optional-chaining": { 485 | "version": "7.8.3", 486 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 487 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 488 | "dev": true, 489 | "dependencies": { 490 | "@babel/helper-plugin-utils": "^7.8.0" 491 | }, 492 | "peerDependencies": { 493 | "@babel/core": "^7.0.0-0" 494 | } 495 | }, 496 | "node_modules/@babel/plugin-syntax-top-level-await": { 497 | "version": "7.14.5", 498 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", 499 | "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", 500 | "dev": true, 501 | "dependencies": { 502 | "@babel/helper-plugin-utils": "^7.14.5" 503 | }, 504 | "engines": { 505 | "node": ">=6.9.0" 506 | }, 507 | "peerDependencies": { 508 | "@babel/core": "^7.0.0-0" 509 | } 510 | }, 511 | "node_modules/@babel/plugin-syntax-typescript": { 512 | "version": "7.24.1", 513 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", 514 | "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", 515 | "dev": true, 516 | "dependencies": { 517 | "@babel/helper-plugin-utils": "^7.24.0" 518 | }, 519 | "engines": { 520 | "node": ">=6.9.0" 521 | }, 522 | "peerDependencies": { 523 | "@babel/core": "^7.0.0-0" 524 | } 525 | }, 526 | "node_modules/@babel/template": { 527 | "version": "7.24.0", 528 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", 529 | "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", 530 | "dev": true, 531 | "dependencies": { 532 | "@babel/code-frame": "^7.23.5", 533 | "@babel/parser": "^7.24.0", 534 | "@babel/types": "^7.24.0" 535 | }, 536 | "engines": { 537 | "node": ">=6.9.0" 538 | } 539 | }, 540 | "node_modules/@babel/traverse": { 541 | "version": "7.24.5", 542 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", 543 | "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", 544 | "dev": true, 545 | "dependencies": { 546 | "@babel/code-frame": "^7.24.2", 547 | "@babel/generator": "^7.24.5", 548 | "@babel/helper-environment-visitor": "^7.22.20", 549 | "@babel/helper-function-name": "^7.23.0", 550 | "@babel/helper-hoist-variables": "^7.22.5", 551 | "@babel/helper-split-export-declaration": "^7.24.5", 552 | "@babel/parser": "^7.24.5", 553 | "@babel/types": "^7.24.5", 554 | "debug": "^4.3.1", 555 | "globals": "^11.1.0" 556 | }, 557 | "engines": { 558 | "node": ">=6.9.0" 559 | } 560 | }, 561 | "node_modules/@babel/types": { 562 | "version": "7.24.5", 563 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", 564 | "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", 565 | "dev": true, 566 | "dependencies": { 567 | "@babel/helper-string-parser": "^7.24.1", 568 | "@babel/helper-validator-identifier": "^7.24.5", 569 | "to-fast-properties": "^2.0.0" 570 | }, 571 | "engines": { 572 | "node": ">=6.9.0" 573 | } 574 | }, 575 | "node_modules/@bcoe/v8-coverage": { 576 | "version": "0.2.3", 577 | "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", 578 | "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", 579 | "dev": true 580 | }, 581 | "node_modules/@istanbuljs/load-nyc-config": { 582 | "version": "1.1.0", 583 | "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", 584 | "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", 585 | "dev": true, 586 | "dependencies": { 587 | "camelcase": "^5.3.1", 588 | "find-up": "^4.1.0", 589 | "get-package-type": "^0.1.0", 590 | "js-yaml": "^3.13.1", 591 | "resolve-from": "^5.0.0" 592 | }, 593 | "engines": { 594 | "node": ">=8" 595 | } 596 | }, 597 | "node_modules/@istanbuljs/schema": { 598 | "version": "0.1.3", 599 | "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", 600 | "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", 601 | "dev": true, 602 | "engines": { 603 | "node": ">=8" 604 | } 605 | }, 606 | "node_modules/@jest/console": { 607 | "version": "29.7.0", 608 | "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", 609 | "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", 610 | "dev": true, 611 | "dependencies": { 612 | "@jest/types": "^29.6.3", 613 | "@types/node": "*", 614 | "chalk": "^4.0.0", 615 | "jest-message-util": "^29.7.0", 616 | "jest-util": "^29.7.0", 617 | "slash": "^3.0.0" 618 | }, 619 | "engines": { 620 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 621 | } 622 | }, 623 | "node_modules/@jest/core": { 624 | "version": "29.7.0", 625 | "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", 626 | "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", 627 | "dev": true, 628 | "dependencies": { 629 | "@jest/console": "^29.7.0", 630 | "@jest/reporters": "^29.7.0", 631 | "@jest/test-result": "^29.7.0", 632 | "@jest/transform": "^29.7.0", 633 | "@jest/types": "^29.6.3", 634 | "@types/node": "*", 635 | "ansi-escapes": "^4.2.1", 636 | "chalk": "^4.0.0", 637 | "ci-info": "^3.2.0", 638 | "exit": "^0.1.2", 639 | "graceful-fs": "^4.2.9", 640 | "jest-changed-files": "^29.7.0", 641 | "jest-config": "^29.7.0", 642 | "jest-haste-map": "^29.7.0", 643 | "jest-message-util": "^29.7.0", 644 | "jest-regex-util": "^29.6.3", 645 | "jest-resolve": "^29.7.0", 646 | "jest-resolve-dependencies": "^29.7.0", 647 | "jest-runner": "^29.7.0", 648 | "jest-runtime": "^29.7.0", 649 | "jest-snapshot": "^29.7.0", 650 | "jest-util": "^29.7.0", 651 | "jest-validate": "^29.7.0", 652 | "jest-watcher": "^29.7.0", 653 | "micromatch": "^4.0.4", 654 | "pretty-format": "^29.7.0", 655 | "slash": "^3.0.0", 656 | "strip-ansi": "^6.0.0" 657 | }, 658 | "engines": { 659 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 660 | }, 661 | "peerDependencies": { 662 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 663 | }, 664 | "peerDependenciesMeta": { 665 | "node-notifier": { 666 | "optional": true 667 | } 668 | } 669 | }, 670 | "node_modules/@jest/environment": { 671 | "version": "29.7.0", 672 | "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", 673 | "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", 674 | "dev": true, 675 | "dependencies": { 676 | "@jest/fake-timers": "^29.7.0", 677 | "@jest/types": "^29.6.3", 678 | "@types/node": "*", 679 | "jest-mock": "^29.7.0" 680 | }, 681 | "engines": { 682 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 683 | } 684 | }, 685 | "node_modules/@jest/expect": { 686 | "version": "29.7.0", 687 | "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", 688 | "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", 689 | "dev": true, 690 | "dependencies": { 691 | "expect": "^29.7.0", 692 | "jest-snapshot": "^29.7.0" 693 | }, 694 | "engines": { 695 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 696 | } 697 | }, 698 | "node_modules/@jest/expect-utils": { 699 | "version": "29.7.0", 700 | "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", 701 | "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", 702 | "dev": true, 703 | "dependencies": { 704 | "jest-get-type": "^29.6.3" 705 | }, 706 | "engines": { 707 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 708 | } 709 | }, 710 | "node_modules/@jest/fake-timers": { 711 | "version": "29.7.0", 712 | "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", 713 | "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", 714 | "dev": true, 715 | "dependencies": { 716 | "@jest/types": "^29.6.3", 717 | "@sinonjs/fake-timers": "^10.0.2", 718 | "@types/node": "*", 719 | "jest-message-util": "^29.7.0", 720 | "jest-mock": "^29.7.0", 721 | "jest-util": "^29.7.0" 722 | }, 723 | "engines": { 724 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 725 | } 726 | }, 727 | "node_modules/@jest/globals": { 728 | "version": "29.7.0", 729 | "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", 730 | "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", 731 | "dev": true, 732 | "dependencies": { 733 | "@jest/environment": "^29.7.0", 734 | "@jest/expect": "^29.7.0", 735 | "@jest/types": "^29.6.3", 736 | "jest-mock": "^29.7.0" 737 | }, 738 | "engines": { 739 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 740 | } 741 | }, 742 | "node_modules/@jest/reporters": { 743 | "version": "29.7.0", 744 | "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", 745 | "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", 746 | "dev": true, 747 | "dependencies": { 748 | "@bcoe/v8-coverage": "^0.2.3", 749 | "@jest/console": "^29.7.0", 750 | "@jest/test-result": "^29.7.0", 751 | "@jest/transform": "^29.7.0", 752 | "@jest/types": "^29.6.3", 753 | "@jridgewell/trace-mapping": "^0.3.18", 754 | "@types/node": "*", 755 | "chalk": "^4.0.0", 756 | "collect-v8-coverage": "^1.0.0", 757 | "exit": "^0.1.2", 758 | "glob": "^7.1.3", 759 | "graceful-fs": "^4.2.9", 760 | "istanbul-lib-coverage": "^3.0.0", 761 | "istanbul-lib-instrument": "^6.0.0", 762 | "istanbul-lib-report": "^3.0.0", 763 | "istanbul-lib-source-maps": "^4.0.0", 764 | "istanbul-reports": "^3.1.3", 765 | "jest-message-util": "^29.7.0", 766 | "jest-util": "^29.7.0", 767 | "jest-worker": "^29.7.0", 768 | "slash": "^3.0.0", 769 | "string-length": "^4.0.1", 770 | "strip-ansi": "^6.0.0", 771 | "v8-to-istanbul": "^9.0.1" 772 | }, 773 | "engines": { 774 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 775 | }, 776 | "peerDependencies": { 777 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 778 | }, 779 | "peerDependenciesMeta": { 780 | "node-notifier": { 781 | "optional": true 782 | } 783 | } 784 | }, 785 | "node_modules/@jest/schemas": { 786 | "version": "29.6.3", 787 | "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", 788 | "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", 789 | "dev": true, 790 | "dependencies": { 791 | "@sinclair/typebox": "^0.27.8" 792 | }, 793 | "engines": { 794 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 795 | } 796 | }, 797 | "node_modules/@jest/source-map": { 798 | "version": "29.6.3", 799 | "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", 800 | "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", 801 | "dev": true, 802 | "dependencies": { 803 | "@jridgewell/trace-mapping": "^0.3.18", 804 | "callsites": "^3.0.0", 805 | "graceful-fs": "^4.2.9" 806 | }, 807 | "engines": { 808 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 809 | } 810 | }, 811 | "node_modules/@jest/test-result": { 812 | "version": "29.7.0", 813 | "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", 814 | "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", 815 | "dev": true, 816 | "dependencies": { 817 | "@jest/console": "^29.7.0", 818 | "@jest/types": "^29.6.3", 819 | "@types/istanbul-lib-coverage": "^2.0.0", 820 | "collect-v8-coverage": "^1.0.0" 821 | }, 822 | "engines": { 823 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 824 | } 825 | }, 826 | "node_modules/@jest/test-sequencer": { 827 | "version": "29.7.0", 828 | "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", 829 | "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", 830 | "dev": true, 831 | "dependencies": { 832 | "@jest/test-result": "^29.7.0", 833 | "graceful-fs": "^4.2.9", 834 | "jest-haste-map": "^29.7.0", 835 | "slash": "^3.0.0" 836 | }, 837 | "engines": { 838 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 839 | } 840 | }, 841 | "node_modules/@jest/transform": { 842 | "version": "29.7.0", 843 | "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", 844 | "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", 845 | "dev": true, 846 | "dependencies": { 847 | "@babel/core": "^7.11.6", 848 | "@jest/types": "^29.6.3", 849 | "@jridgewell/trace-mapping": "^0.3.18", 850 | "babel-plugin-istanbul": "^6.1.1", 851 | "chalk": "^4.0.0", 852 | "convert-source-map": "^2.0.0", 853 | "fast-json-stable-stringify": "^2.1.0", 854 | "graceful-fs": "^4.2.9", 855 | "jest-haste-map": "^29.7.0", 856 | "jest-regex-util": "^29.6.3", 857 | "jest-util": "^29.7.0", 858 | "micromatch": "^4.0.4", 859 | "pirates": "^4.0.4", 860 | "slash": "^3.0.0", 861 | "write-file-atomic": "^4.0.2" 862 | }, 863 | "engines": { 864 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 865 | } 866 | }, 867 | "node_modules/@jest/types": { 868 | "version": "29.6.3", 869 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", 870 | "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", 871 | "dev": true, 872 | "dependencies": { 873 | "@jest/schemas": "^29.6.3", 874 | "@types/istanbul-lib-coverage": "^2.0.0", 875 | "@types/istanbul-reports": "^3.0.0", 876 | "@types/node": "*", 877 | "@types/yargs": "^17.0.8", 878 | "chalk": "^4.0.0" 879 | }, 880 | "engines": { 881 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 882 | } 883 | }, 884 | "node_modules/@jridgewell/gen-mapping": { 885 | "version": "0.3.5", 886 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 887 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 888 | "dev": true, 889 | "dependencies": { 890 | "@jridgewell/set-array": "^1.2.1", 891 | "@jridgewell/sourcemap-codec": "^1.4.10", 892 | "@jridgewell/trace-mapping": "^0.3.24" 893 | }, 894 | "engines": { 895 | "node": ">=6.0.0" 896 | } 897 | }, 898 | "node_modules/@jridgewell/resolve-uri": { 899 | "version": "3.1.2", 900 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 901 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 902 | "dev": true, 903 | "engines": { 904 | "node": ">=6.0.0" 905 | } 906 | }, 907 | "node_modules/@jridgewell/set-array": { 908 | "version": "1.2.1", 909 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 910 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 911 | "dev": true, 912 | "engines": { 913 | "node": ">=6.0.0" 914 | } 915 | }, 916 | "node_modules/@jridgewell/sourcemap-codec": { 917 | "version": "1.4.15", 918 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 919 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 920 | "dev": true 921 | }, 922 | "node_modules/@jridgewell/trace-mapping": { 923 | "version": "0.3.25", 924 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 925 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 926 | "dev": true, 927 | "dependencies": { 928 | "@jridgewell/resolve-uri": "^3.1.0", 929 | "@jridgewell/sourcemap-codec": "^1.4.14" 930 | } 931 | }, 932 | "node_modules/@sinclair/typebox": { 933 | "version": "0.27.8", 934 | "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", 935 | "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", 936 | "dev": true 937 | }, 938 | "node_modules/@sinonjs/commons": { 939 | "version": "3.0.1", 940 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", 941 | "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", 942 | "dev": true, 943 | "dependencies": { 944 | "type-detect": "4.0.8" 945 | } 946 | }, 947 | "node_modules/@sinonjs/fake-timers": { 948 | "version": "10.3.0", 949 | "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", 950 | "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", 951 | "dev": true, 952 | "dependencies": { 953 | "@sinonjs/commons": "^3.0.0" 954 | } 955 | }, 956 | "node_modules/@types/babel__core": { 957 | "version": "7.20.5", 958 | "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", 959 | "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", 960 | "dev": true, 961 | "dependencies": { 962 | "@babel/parser": "^7.20.7", 963 | "@babel/types": "^7.20.7", 964 | "@types/babel__generator": "*", 965 | "@types/babel__template": "*", 966 | "@types/babel__traverse": "*" 967 | } 968 | }, 969 | "node_modules/@types/babel__generator": { 970 | "version": "7.6.8", 971 | "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", 972 | "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", 973 | "dev": true, 974 | "dependencies": { 975 | "@babel/types": "^7.0.0" 976 | } 977 | }, 978 | "node_modules/@types/babel__template": { 979 | "version": "7.4.4", 980 | "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", 981 | "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", 982 | "dev": true, 983 | "dependencies": { 984 | "@babel/parser": "^7.1.0", 985 | "@babel/types": "^7.0.0" 986 | } 987 | }, 988 | "node_modules/@types/babel__traverse": { 989 | "version": "7.20.5", 990 | "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", 991 | "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", 992 | "dev": true, 993 | "dependencies": { 994 | "@babel/types": "^7.20.7" 995 | } 996 | }, 997 | "node_modules/@types/graceful-fs": { 998 | "version": "4.1.9", 999 | "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", 1000 | "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", 1001 | "dev": true, 1002 | "dependencies": { 1003 | "@types/node": "*" 1004 | } 1005 | }, 1006 | "node_modules/@types/istanbul-lib-coverage": { 1007 | "version": "2.0.6", 1008 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", 1009 | "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", 1010 | "dev": true 1011 | }, 1012 | "node_modules/@types/istanbul-lib-report": { 1013 | "version": "3.0.3", 1014 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", 1015 | "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", 1016 | "dev": true, 1017 | "dependencies": { 1018 | "@types/istanbul-lib-coverage": "*" 1019 | } 1020 | }, 1021 | "node_modules/@types/istanbul-reports": { 1022 | "version": "3.0.4", 1023 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", 1024 | "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", 1025 | "dev": true, 1026 | "dependencies": { 1027 | "@types/istanbul-lib-report": "*" 1028 | } 1029 | }, 1030 | "node_modules/@types/node": { 1031 | "version": "20.12.10", 1032 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", 1033 | "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", 1034 | "dev": true, 1035 | "dependencies": { 1036 | "undici-types": "~5.26.4" 1037 | } 1038 | }, 1039 | "node_modules/@types/stack-utils": { 1040 | "version": "2.0.3", 1041 | "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", 1042 | "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", 1043 | "dev": true 1044 | }, 1045 | "node_modules/@types/yargs": { 1046 | "version": "17.0.32", 1047 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", 1048 | "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", 1049 | "dev": true, 1050 | "dependencies": { 1051 | "@types/yargs-parser": "*" 1052 | } 1053 | }, 1054 | "node_modules/@types/yargs-parser": { 1055 | "version": "21.0.3", 1056 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", 1057 | "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", 1058 | "dev": true 1059 | }, 1060 | "node_modules/ansi-escapes": { 1061 | "version": "4.3.2", 1062 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 1063 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 1064 | "dev": true, 1065 | "dependencies": { 1066 | "type-fest": "^0.21.3" 1067 | }, 1068 | "engines": { 1069 | "node": ">=8" 1070 | }, 1071 | "funding": { 1072 | "url": "https://github.com/sponsors/sindresorhus" 1073 | } 1074 | }, 1075 | "node_modules/ansi-regex": { 1076 | "version": "5.0.1", 1077 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1078 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1079 | "dev": true, 1080 | "engines": { 1081 | "node": ">=8" 1082 | } 1083 | }, 1084 | "node_modules/ansi-styles": { 1085 | "version": "4.3.0", 1086 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1087 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1088 | "dev": true, 1089 | "dependencies": { 1090 | "color-convert": "^2.0.1" 1091 | }, 1092 | "engines": { 1093 | "node": ">=8" 1094 | }, 1095 | "funding": { 1096 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1097 | } 1098 | }, 1099 | "node_modules/anymatch": { 1100 | "version": "3.1.3", 1101 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1102 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1103 | "dev": true, 1104 | "dependencies": { 1105 | "normalize-path": "^3.0.0", 1106 | "picomatch": "^2.0.4" 1107 | }, 1108 | "engines": { 1109 | "node": ">= 8" 1110 | } 1111 | }, 1112 | "node_modules/argparse": { 1113 | "version": "1.0.10", 1114 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 1115 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 1116 | "dev": true, 1117 | "dependencies": { 1118 | "sprintf-js": "~1.0.2" 1119 | } 1120 | }, 1121 | "node_modules/babel-jest": { 1122 | "version": "29.7.0", 1123 | "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", 1124 | "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "@jest/transform": "^29.7.0", 1128 | "@types/babel__core": "^7.1.14", 1129 | "babel-plugin-istanbul": "^6.1.1", 1130 | "babel-preset-jest": "^29.6.3", 1131 | "chalk": "^4.0.0", 1132 | "graceful-fs": "^4.2.9", 1133 | "slash": "^3.0.0" 1134 | }, 1135 | "engines": { 1136 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1137 | }, 1138 | "peerDependencies": { 1139 | "@babel/core": "^7.8.0" 1140 | } 1141 | }, 1142 | "node_modules/babel-plugin-istanbul": { 1143 | "version": "6.1.1", 1144 | "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", 1145 | "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", 1146 | "dev": true, 1147 | "dependencies": { 1148 | "@babel/helper-plugin-utils": "^7.0.0", 1149 | "@istanbuljs/load-nyc-config": "^1.0.0", 1150 | "@istanbuljs/schema": "^0.1.2", 1151 | "istanbul-lib-instrument": "^5.0.4", 1152 | "test-exclude": "^6.0.0" 1153 | }, 1154 | "engines": { 1155 | "node": ">=8" 1156 | } 1157 | }, 1158 | "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { 1159 | "version": "5.2.1", 1160 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", 1161 | "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", 1162 | "dev": true, 1163 | "dependencies": { 1164 | "@babel/core": "^7.12.3", 1165 | "@babel/parser": "^7.14.7", 1166 | "@istanbuljs/schema": "^0.1.2", 1167 | "istanbul-lib-coverage": "^3.2.0", 1168 | "semver": "^6.3.0" 1169 | }, 1170 | "engines": { 1171 | "node": ">=8" 1172 | } 1173 | }, 1174 | "node_modules/babel-plugin-jest-hoist": { 1175 | "version": "29.6.3", 1176 | "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", 1177 | "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", 1178 | "dev": true, 1179 | "dependencies": { 1180 | "@babel/template": "^7.3.3", 1181 | "@babel/types": "^7.3.3", 1182 | "@types/babel__core": "^7.1.14", 1183 | "@types/babel__traverse": "^7.0.6" 1184 | }, 1185 | "engines": { 1186 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1187 | } 1188 | }, 1189 | "node_modules/babel-preset-current-node-syntax": { 1190 | "version": "1.0.1", 1191 | "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", 1192 | "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", 1193 | "dev": true, 1194 | "dependencies": { 1195 | "@babel/plugin-syntax-async-generators": "^7.8.4", 1196 | "@babel/plugin-syntax-bigint": "^7.8.3", 1197 | "@babel/plugin-syntax-class-properties": "^7.8.3", 1198 | "@babel/plugin-syntax-import-meta": "^7.8.3", 1199 | "@babel/plugin-syntax-json-strings": "^7.8.3", 1200 | "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", 1201 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", 1202 | "@babel/plugin-syntax-numeric-separator": "^7.8.3", 1203 | "@babel/plugin-syntax-object-rest-spread": "^7.8.3", 1204 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", 1205 | "@babel/plugin-syntax-optional-chaining": "^7.8.3", 1206 | "@babel/plugin-syntax-top-level-await": "^7.8.3" 1207 | }, 1208 | "peerDependencies": { 1209 | "@babel/core": "^7.0.0" 1210 | } 1211 | }, 1212 | "node_modules/babel-preset-jest": { 1213 | "version": "29.6.3", 1214 | "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", 1215 | "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", 1216 | "dev": true, 1217 | "dependencies": { 1218 | "babel-plugin-jest-hoist": "^29.6.3", 1219 | "babel-preset-current-node-syntax": "^1.0.0" 1220 | }, 1221 | "engines": { 1222 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1223 | }, 1224 | "peerDependencies": { 1225 | "@babel/core": "^7.0.0" 1226 | } 1227 | }, 1228 | "node_modules/balanced-match": { 1229 | "version": "1.0.2", 1230 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1231 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1232 | "dev": true 1233 | }, 1234 | "node_modules/brace-expansion": { 1235 | "version": "1.1.11", 1236 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 1237 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 1238 | "dev": true, 1239 | "dependencies": { 1240 | "balanced-match": "^1.0.0", 1241 | "concat-map": "0.0.1" 1242 | } 1243 | }, 1244 | "node_modules/braces": { 1245 | "version": "3.0.2", 1246 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 1247 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 1248 | "dev": true, 1249 | "dependencies": { 1250 | "fill-range": "^7.0.1" 1251 | }, 1252 | "engines": { 1253 | "node": ">=8" 1254 | } 1255 | }, 1256 | "node_modules/browserslist": { 1257 | "version": "4.23.0", 1258 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", 1259 | "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", 1260 | "dev": true, 1261 | "funding": [ 1262 | { 1263 | "type": "opencollective", 1264 | "url": "https://opencollective.com/browserslist" 1265 | }, 1266 | { 1267 | "type": "tidelift", 1268 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1269 | }, 1270 | { 1271 | "type": "github", 1272 | "url": "https://github.com/sponsors/ai" 1273 | } 1274 | ], 1275 | "dependencies": { 1276 | "caniuse-lite": "^1.0.30001587", 1277 | "electron-to-chromium": "^1.4.668", 1278 | "node-releases": "^2.0.14", 1279 | "update-browserslist-db": "^1.0.13" 1280 | }, 1281 | "bin": { 1282 | "browserslist": "cli.js" 1283 | }, 1284 | "engines": { 1285 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1286 | } 1287 | }, 1288 | "node_modules/bser": { 1289 | "version": "2.1.1", 1290 | "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", 1291 | "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", 1292 | "dev": true, 1293 | "dependencies": { 1294 | "node-int64": "^0.4.0" 1295 | } 1296 | }, 1297 | "node_modules/buffer-from": { 1298 | "version": "1.1.2", 1299 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 1300 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 1301 | "dev": true 1302 | }, 1303 | "node_modules/callsites": { 1304 | "version": "3.1.0", 1305 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 1306 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 1307 | "dev": true, 1308 | "engines": { 1309 | "node": ">=6" 1310 | } 1311 | }, 1312 | "node_modules/camelcase": { 1313 | "version": "5.3.1", 1314 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 1315 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 1316 | "dev": true, 1317 | "engines": { 1318 | "node": ">=6" 1319 | } 1320 | }, 1321 | "node_modules/caniuse-lite": { 1322 | "version": "1.0.30001616", 1323 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", 1324 | "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", 1325 | "dev": true, 1326 | "funding": [ 1327 | { 1328 | "type": "opencollective", 1329 | "url": "https://opencollective.com/browserslist" 1330 | }, 1331 | { 1332 | "type": "tidelift", 1333 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1334 | }, 1335 | { 1336 | "type": "github", 1337 | "url": "https://github.com/sponsors/ai" 1338 | } 1339 | ] 1340 | }, 1341 | "node_modules/chalk": { 1342 | "version": "4.1.2", 1343 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 1344 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 1345 | "dev": true, 1346 | "dependencies": { 1347 | "ansi-styles": "^4.1.0", 1348 | "supports-color": "^7.1.0" 1349 | }, 1350 | "engines": { 1351 | "node": ">=10" 1352 | }, 1353 | "funding": { 1354 | "url": "https://github.com/chalk/chalk?sponsor=1" 1355 | } 1356 | }, 1357 | "node_modules/char-regex": { 1358 | "version": "1.0.2", 1359 | "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", 1360 | "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", 1361 | "dev": true, 1362 | "engines": { 1363 | "node": ">=10" 1364 | } 1365 | }, 1366 | "node_modules/ci-info": { 1367 | "version": "3.9.0", 1368 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", 1369 | "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", 1370 | "dev": true, 1371 | "funding": [ 1372 | { 1373 | "type": "github", 1374 | "url": "https://github.com/sponsors/sibiraj-s" 1375 | } 1376 | ], 1377 | "engines": { 1378 | "node": ">=8" 1379 | } 1380 | }, 1381 | "node_modules/cjs-module-lexer": { 1382 | "version": "1.3.1", 1383 | "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", 1384 | "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", 1385 | "dev": true 1386 | }, 1387 | "node_modules/cliui": { 1388 | "version": "8.0.1", 1389 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 1390 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 1391 | "dev": true, 1392 | "dependencies": { 1393 | "string-width": "^4.2.0", 1394 | "strip-ansi": "^6.0.1", 1395 | "wrap-ansi": "^7.0.0" 1396 | }, 1397 | "engines": { 1398 | "node": ">=12" 1399 | } 1400 | }, 1401 | "node_modules/co": { 1402 | "version": "4.6.0", 1403 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 1404 | "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", 1405 | "dev": true, 1406 | "engines": { 1407 | "iojs": ">= 1.0.0", 1408 | "node": ">= 0.12.0" 1409 | } 1410 | }, 1411 | "node_modules/collect-v8-coverage": { 1412 | "version": "1.0.2", 1413 | "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", 1414 | "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", 1415 | "dev": true 1416 | }, 1417 | "node_modules/color-convert": { 1418 | "version": "2.0.1", 1419 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1420 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1421 | "dev": true, 1422 | "dependencies": { 1423 | "color-name": "~1.1.4" 1424 | }, 1425 | "engines": { 1426 | "node": ">=7.0.0" 1427 | } 1428 | }, 1429 | "node_modules/color-name": { 1430 | "version": "1.1.4", 1431 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1432 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1433 | "dev": true 1434 | }, 1435 | "node_modules/concat-map": { 1436 | "version": "0.0.1", 1437 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1438 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1439 | "dev": true 1440 | }, 1441 | "node_modules/convert-source-map": { 1442 | "version": "2.0.0", 1443 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1444 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1445 | "dev": true 1446 | }, 1447 | "node_modules/create-jest": { 1448 | "version": "29.7.0", 1449 | "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", 1450 | "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", 1451 | "dev": true, 1452 | "dependencies": { 1453 | "@jest/types": "^29.6.3", 1454 | "chalk": "^4.0.0", 1455 | "exit": "^0.1.2", 1456 | "graceful-fs": "^4.2.9", 1457 | "jest-config": "^29.7.0", 1458 | "jest-util": "^29.7.0", 1459 | "prompts": "^2.0.1" 1460 | }, 1461 | "bin": { 1462 | "create-jest": "bin/create-jest.js" 1463 | }, 1464 | "engines": { 1465 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1466 | } 1467 | }, 1468 | "node_modules/cross-spawn": { 1469 | "version": "7.0.3", 1470 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 1471 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 1472 | "dev": true, 1473 | "dependencies": { 1474 | "path-key": "^3.1.0", 1475 | "shebang-command": "^2.0.0", 1476 | "which": "^2.0.1" 1477 | }, 1478 | "engines": { 1479 | "node": ">= 8" 1480 | } 1481 | }, 1482 | "node_modules/debug": { 1483 | "version": "4.3.4", 1484 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1485 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1486 | "dev": true, 1487 | "dependencies": { 1488 | "ms": "2.1.2" 1489 | }, 1490 | "engines": { 1491 | "node": ">=6.0" 1492 | }, 1493 | "peerDependenciesMeta": { 1494 | "supports-color": { 1495 | "optional": true 1496 | } 1497 | } 1498 | }, 1499 | "node_modules/dedent": { 1500 | "version": "1.5.3", 1501 | "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", 1502 | "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", 1503 | "dev": true, 1504 | "peerDependencies": { 1505 | "babel-plugin-macros": "^3.1.0" 1506 | }, 1507 | "peerDependenciesMeta": { 1508 | "babel-plugin-macros": { 1509 | "optional": true 1510 | } 1511 | } 1512 | }, 1513 | "node_modules/deepmerge": { 1514 | "version": "4.3.1", 1515 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 1516 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 1517 | "dev": true, 1518 | "engines": { 1519 | "node": ">=0.10.0" 1520 | } 1521 | }, 1522 | "node_modules/detect-newline": { 1523 | "version": "3.1.0", 1524 | "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", 1525 | "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", 1526 | "dev": true, 1527 | "engines": { 1528 | "node": ">=8" 1529 | } 1530 | }, 1531 | "node_modules/diff-sequences": { 1532 | "version": "29.6.3", 1533 | "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", 1534 | "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", 1535 | "dev": true, 1536 | "engines": { 1537 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1538 | } 1539 | }, 1540 | "node_modules/electron-to-chromium": { 1541 | "version": "1.4.757", 1542 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz", 1543 | "integrity": "sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw==", 1544 | "dev": true 1545 | }, 1546 | "node_modules/emittery": { 1547 | "version": "0.13.1", 1548 | "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", 1549 | "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", 1550 | "dev": true, 1551 | "engines": { 1552 | "node": ">=12" 1553 | }, 1554 | "funding": { 1555 | "url": "https://github.com/sindresorhus/emittery?sponsor=1" 1556 | } 1557 | }, 1558 | "node_modules/emoji-regex": { 1559 | "version": "8.0.0", 1560 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1561 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1562 | "dev": true 1563 | }, 1564 | "node_modules/error-ex": { 1565 | "version": "1.3.2", 1566 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 1567 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 1568 | "dev": true, 1569 | "dependencies": { 1570 | "is-arrayish": "^0.2.1" 1571 | } 1572 | }, 1573 | "node_modules/escalade": { 1574 | "version": "3.1.2", 1575 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 1576 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 1577 | "dev": true, 1578 | "engines": { 1579 | "node": ">=6" 1580 | } 1581 | }, 1582 | "node_modules/escape-string-regexp": { 1583 | "version": "2.0.0", 1584 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", 1585 | "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", 1586 | "dev": true, 1587 | "engines": { 1588 | "node": ">=8" 1589 | } 1590 | }, 1591 | "node_modules/esprima": { 1592 | "version": "4.0.1", 1593 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1594 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1595 | "dev": true, 1596 | "bin": { 1597 | "esparse": "bin/esparse.js", 1598 | "esvalidate": "bin/esvalidate.js" 1599 | }, 1600 | "engines": { 1601 | "node": ">=4" 1602 | } 1603 | }, 1604 | "node_modules/execa": { 1605 | "version": "5.1.1", 1606 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 1607 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 1608 | "dev": true, 1609 | "dependencies": { 1610 | "cross-spawn": "^7.0.3", 1611 | "get-stream": "^6.0.0", 1612 | "human-signals": "^2.1.0", 1613 | "is-stream": "^2.0.0", 1614 | "merge-stream": "^2.0.0", 1615 | "npm-run-path": "^4.0.1", 1616 | "onetime": "^5.1.2", 1617 | "signal-exit": "^3.0.3", 1618 | "strip-final-newline": "^2.0.0" 1619 | }, 1620 | "engines": { 1621 | "node": ">=10" 1622 | }, 1623 | "funding": { 1624 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 1625 | } 1626 | }, 1627 | "node_modules/exit": { 1628 | "version": "0.1.2", 1629 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 1630 | "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", 1631 | "dev": true, 1632 | "engines": { 1633 | "node": ">= 0.8.0" 1634 | } 1635 | }, 1636 | "node_modules/expect": { 1637 | "version": "29.7.0", 1638 | "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", 1639 | "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", 1640 | "dev": true, 1641 | "dependencies": { 1642 | "@jest/expect-utils": "^29.7.0", 1643 | "jest-get-type": "^29.6.3", 1644 | "jest-matcher-utils": "^29.7.0", 1645 | "jest-message-util": "^29.7.0", 1646 | "jest-util": "^29.7.0" 1647 | }, 1648 | "engines": { 1649 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 1650 | } 1651 | }, 1652 | "node_modules/fast-json-stable-stringify": { 1653 | "version": "2.1.0", 1654 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1655 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1656 | "dev": true 1657 | }, 1658 | "node_modules/fb-watchman": { 1659 | "version": "2.0.2", 1660 | "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", 1661 | "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", 1662 | "dev": true, 1663 | "dependencies": { 1664 | "bser": "2.1.1" 1665 | } 1666 | }, 1667 | "node_modules/fill-range": { 1668 | "version": "7.0.1", 1669 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1670 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1671 | "dev": true, 1672 | "dependencies": { 1673 | "to-regex-range": "^5.0.1" 1674 | }, 1675 | "engines": { 1676 | "node": ">=8" 1677 | } 1678 | }, 1679 | "node_modules/find-up": { 1680 | "version": "4.1.0", 1681 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 1682 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 1683 | "dev": true, 1684 | "dependencies": { 1685 | "locate-path": "^5.0.0", 1686 | "path-exists": "^4.0.0" 1687 | }, 1688 | "engines": { 1689 | "node": ">=8" 1690 | } 1691 | }, 1692 | "node_modules/fs.realpath": { 1693 | "version": "1.0.0", 1694 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1695 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 1696 | "dev": true 1697 | }, 1698 | "node_modules/fsevents": { 1699 | "version": "2.3.3", 1700 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1701 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1702 | "dev": true, 1703 | "hasInstallScript": true, 1704 | "optional": true, 1705 | "os": [ 1706 | "darwin" 1707 | ], 1708 | "engines": { 1709 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1710 | } 1711 | }, 1712 | "node_modules/function-bind": { 1713 | "version": "1.1.2", 1714 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1715 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1716 | "dev": true, 1717 | "funding": { 1718 | "url": "https://github.com/sponsors/ljharb" 1719 | } 1720 | }, 1721 | "node_modules/gensync": { 1722 | "version": "1.0.0-beta.2", 1723 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1724 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1725 | "dev": true, 1726 | "engines": { 1727 | "node": ">=6.9.0" 1728 | } 1729 | }, 1730 | "node_modules/get-caller-file": { 1731 | "version": "2.0.5", 1732 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1733 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1734 | "dev": true, 1735 | "engines": { 1736 | "node": "6.* || 8.* || >= 10.*" 1737 | } 1738 | }, 1739 | "node_modules/get-package-type": { 1740 | "version": "0.1.0", 1741 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 1742 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 1743 | "dev": true, 1744 | "engines": { 1745 | "node": ">=8.0.0" 1746 | } 1747 | }, 1748 | "node_modules/get-stream": { 1749 | "version": "6.0.1", 1750 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 1751 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 1752 | "dev": true, 1753 | "engines": { 1754 | "node": ">=10" 1755 | }, 1756 | "funding": { 1757 | "url": "https://github.com/sponsors/sindresorhus" 1758 | } 1759 | }, 1760 | "node_modules/glob": { 1761 | "version": "7.2.3", 1762 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 1763 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 1764 | "dev": true, 1765 | "dependencies": { 1766 | "fs.realpath": "^1.0.0", 1767 | "inflight": "^1.0.4", 1768 | "inherits": "2", 1769 | "minimatch": "^3.1.1", 1770 | "once": "^1.3.0", 1771 | "path-is-absolute": "^1.0.0" 1772 | }, 1773 | "engines": { 1774 | "node": "*" 1775 | }, 1776 | "funding": { 1777 | "url": "https://github.com/sponsors/isaacs" 1778 | } 1779 | }, 1780 | "node_modules/globals": { 1781 | "version": "11.12.0", 1782 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1783 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1784 | "dev": true, 1785 | "engines": { 1786 | "node": ">=4" 1787 | } 1788 | }, 1789 | "node_modules/graceful-fs": { 1790 | "version": "4.2.11", 1791 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1792 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1793 | "dev": true 1794 | }, 1795 | "node_modules/has-flag": { 1796 | "version": "4.0.0", 1797 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1798 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1799 | "dev": true, 1800 | "engines": { 1801 | "node": ">=8" 1802 | } 1803 | }, 1804 | "node_modules/hasown": { 1805 | "version": "2.0.2", 1806 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1807 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1808 | "dev": true, 1809 | "dependencies": { 1810 | "function-bind": "^1.1.2" 1811 | }, 1812 | "engines": { 1813 | "node": ">= 0.4" 1814 | } 1815 | }, 1816 | "node_modules/html-escaper": { 1817 | "version": "2.0.2", 1818 | "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", 1819 | "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", 1820 | "dev": true 1821 | }, 1822 | "node_modules/human-signals": { 1823 | "version": "2.1.0", 1824 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 1825 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 1826 | "dev": true, 1827 | "engines": { 1828 | "node": ">=10.17.0" 1829 | } 1830 | }, 1831 | "node_modules/import-local": { 1832 | "version": "3.1.0", 1833 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", 1834 | "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", 1835 | "dev": true, 1836 | "dependencies": { 1837 | "pkg-dir": "^4.2.0", 1838 | "resolve-cwd": "^3.0.0" 1839 | }, 1840 | "bin": { 1841 | "import-local-fixture": "fixtures/cli.js" 1842 | }, 1843 | "engines": { 1844 | "node": ">=8" 1845 | }, 1846 | "funding": { 1847 | "url": "https://github.com/sponsors/sindresorhus" 1848 | } 1849 | }, 1850 | "node_modules/imurmurhash": { 1851 | "version": "0.1.4", 1852 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1853 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1854 | "dev": true, 1855 | "engines": { 1856 | "node": ">=0.8.19" 1857 | } 1858 | }, 1859 | "node_modules/inflight": { 1860 | "version": "1.0.6", 1861 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1862 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1863 | "dev": true, 1864 | "dependencies": { 1865 | "once": "^1.3.0", 1866 | "wrappy": "1" 1867 | } 1868 | }, 1869 | "node_modules/inherits": { 1870 | "version": "2.0.4", 1871 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1872 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1873 | "dev": true 1874 | }, 1875 | "node_modules/is-arrayish": { 1876 | "version": "0.2.1", 1877 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1878 | "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", 1879 | "dev": true 1880 | }, 1881 | "node_modules/is-core-module": { 1882 | "version": "2.13.1", 1883 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1884 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1885 | "dev": true, 1886 | "dependencies": { 1887 | "hasown": "^2.0.0" 1888 | }, 1889 | "funding": { 1890 | "url": "https://github.com/sponsors/ljharb" 1891 | } 1892 | }, 1893 | "node_modules/is-fullwidth-code-point": { 1894 | "version": "3.0.0", 1895 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1896 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1897 | "dev": true, 1898 | "engines": { 1899 | "node": ">=8" 1900 | } 1901 | }, 1902 | "node_modules/is-generator-fn": { 1903 | "version": "2.1.0", 1904 | "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", 1905 | "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", 1906 | "dev": true, 1907 | "engines": { 1908 | "node": ">=6" 1909 | } 1910 | }, 1911 | "node_modules/is-number": { 1912 | "version": "7.0.0", 1913 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1914 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1915 | "dev": true, 1916 | "engines": { 1917 | "node": ">=0.12.0" 1918 | } 1919 | }, 1920 | "node_modules/is-stream": { 1921 | "version": "2.0.1", 1922 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1923 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1924 | "dev": true, 1925 | "engines": { 1926 | "node": ">=8" 1927 | }, 1928 | "funding": { 1929 | "url": "https://github.com/sponsors/sindresorhus" 1930 | } 1931 | }, 1932 | "node_modules/isexe": { 1933 | "version": "2.0.0", 1934 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1935 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1936 | "dev": true 1937 | }, 1938 | "node_modules/istanbul-lib-coverage": { 1939 | "version": "3.2.2", 1940 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", 1941 | "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", 1942 | "dev": true, 1943 | "engines": { 1944 | "node": ">=8" 1945 | } 1946 | }, 1947 | "node_modules/istanbul-lib-instrument": { 1948 | "version": "6.0.2", 1949 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", 1950 | "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", 1951 | "dev": true, 1952 | "dependencies": { 1953 | "@babel/core": "^7.23.9", 1954 | "@babel/parser": "^7.23.9", 1955 | "@istanbuljs/schema": "^0.1.3", 1956 | "istanbul-lib-coverage": "^3.2.0", 1957 | "semver": "^7.5.4" 1958 | }, 1959 | "engines": { 1960 | "node": ">=10" 1961 | } 1962 | }, 1963 | "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { 1964 | "version": "6.0.0", 1965 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1966 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1967 | "dev": true, 1968 | "dependencies": { 1969 | "yallist": "^4.0.0" 1970 | }, 1971 | "engines": { 1972 | "node": ">=10" 1973 | } 1974 | }, 1975 | "node_modules/istanbul-lib-instrument/node_modules/semver": { 1976 | "version": "7.6.0", 1977 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 1978 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 1979 | "dev": true, 1980 | "dependencies": { 1981 | "lru-cache": "^6.0.0" 1982 | }, 1983 | "bin": { 1984 | "semver": "bin/semver.js" 1985 | }, 1986 | "engines": { 1987 | "node": ">=10" 1988 | } 1989 | }, 1990 | "node_modules/istanbul-lib-instrument/node_modules/yallist": { 1991 | "version": "4.0.0", 1992 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1993 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1994 | "dev": true 1995 | }, 1996 | "node_modules/istanbul-lib-report": { 1997 | "version": "3.0.1", 1998 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", 1999 | "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", 2000 | "dev": true, 2001 | "dependencies": { 2002 | "istanbul-lib-coverage": "^3.0.0", 2003 | "make-dir": "^4.0.0", 2004 | "supports-color": "^7.1.0" 2005 | }, 2006 | "engines": { 2007 | "node": ">=10" 2008 | } 2009 | }, 2010 | "node_modules/istanbul-lib-source-maps": { 2011 | "version": "4.0.1", 2012 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", 2013 | "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", 2014 | "dev": true, 2015 | "dependencies": { 2016 | "debug": "^4.1.1", 2017 | "istanbul-lib-coverage": "^3.0.0", 2018 | "source-map": "^0.6.1" 2019 | }, 2020 | "engines": { 2021 | "node": ">=10" 2022 | } 2023 | }, 2024 | "node_modules/istanbul-reports": { 2025 | "version": "3.1.7", 2026 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", 2027 | "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", 2028 | "dev": true, 2029 | "dependencies": { 2030 | "html-escaper": "^2.0.0", 2031 | "istanbul-lib-report": "^3.0.0" 2032 | }, 2033 | "engines": { 2034 | "node": ">=8" 2035 | } 2036 | }, 2037 | "node_modules/jest": { 2038 | "version": "29.7.0", 2039 | "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", 2040 | "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", 2041 | "dev": true, 2042 | "dependencies": { 2043 | "@jest/core": "^29.7.0", 2044 | "@jest/types": "^29.6.3", 2045 | "import-local": "^3.0.2", 2046 | "jest-cli": "^29.7.0" 2047 | }, 2048 | "bin": { 2049 | "jest": "bin/jest.js" 2050 | }, 2051 | "engines": { 2052 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2053 | }, 2054 | "peerDependencies": { 2055 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2056 | }, 2057 | "peerDependenciesMeta": { 2058 | "node-notifier": { 2059 | "optional": true 2060 | } 2061 | } 2062 | }, 2063 | "node_modules/jest-changed-files": { 2064 | "version": "29.7.0", 2065 | "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", 2066 | "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", 2067 | "dev": true, 2068 | "dependencies": { 2069 | "execa": "^5.0.0", 2070 | "jest-util": "^29.7.0", 2071 | "p-limit": "^3.1.0" 2072 | }, 2073 | "engines": { 2074 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2075 | } 2076 | }, 2077 | "node_modules/jest-circus": { 2078 | "version": "29.7.0", 2079 | "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", 2080 | "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", 2081 | "dev": true, 2082 | "dependencies": { 2083 | "@jest/environment": "^29.7.0", 2084 | "@jest/expect": "^29.7.0", 2085 | "@jest/test-result": "^29.7.0", 2086 | "@jest/types": "^29.6.3", 2087 | "@types/node": "*", 2088 | "chalk": "^4.0.0", 2089 | "co": "^4.6.0", 2090 | "dedent": "^1.0.0", 2091 | "is-generator-fn": "^2.0.0", 2092 | "jest-each": "^29.7.0", 2093 | "jest-matcher-utils": "^29.7.0", 2094 | "jest-message-util": "^29.7.0", 2095 | "jest-runtime": "^29.7.0", 2096 | "jest-snapshot": "^29.7.0", 2097 | "jest-util": "^29.7.0", 2098 | "p-limit": "^3.1.0", 2099 | "pretty-format": "^29.7.0", 2100 | "pure-rand": "^6.0.0", 2101 | "slash": "^3.0.0", 2102 | "stack-utils": "^2.0.3" 2103 | }, 2104 | "engines": { 2105 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2106 | } 2107 | }, 2108 | "node_modules/jest-cli": { 2109 | "version": "29.7.0", 2110 | "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", 2111 | "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", 2112 | "dev": true, 2113 | "dependencies": { 2114 | "@jest/core": "^29.7.0", 2115 | "@jest/test-result": "^29.7.0", 2116 | "@jest/types": "^29.6.3", 2117 | "chalk": "^4.0.0", 2118 | "create-jest": "^29.7.0", 2119 | "exit": "^0.1.2", 2120 | "import-local": "^3.0.2", 2121 | "jest-config": "^29.7.0", 2122 | "jest-util": "^29.7.0", 2123 | "jest-validate": "^29.7.0", 2124 | "yargs": "^17.3.1" 2125 | }, 2126 | "bin": { 2127 | "jest": "bin/jest.js" 2128 | }, 2129 | "engines": { 2130 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2131 | }, 2132 | "peerDependencies": { 2133 | "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" 2134 | }, 2135 | "peerDependenciesMeta": { 2136 | "node-notifier": { 2137 | "optional": true 2138 | } 2139 | } 2140 | }, 2141 | "node_modules/jest-config": { 2142 | "version": "29.7.0", 2143 | "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", 2144 | "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", 2145 | "dev": true, 2146 | "dependencies": { 2147 | "@babel/core": "^7.11.6", 2148 | "@jest/test-sequencer": "^29.7.0", 2149 | "@jest/types": "^29.6.3", 2150 | "babel-jest": "^29.7.0", 2151 | "chalk": "^4.0.0", 2152 | "ci-info": "^3.2.0", 2153 | "deepmerge": "^4.2.2", 2154 | "glob": "^7.1.3", 2155 | "graceful-fs": "^4.2.9", 2156 | "jest-circus": "^29.7.0", 2157 | "jest-environment-node": "^29.7.0", 2158 | "jest-get-type": "^29.6.3", 2159 | "jest-regex-util": "^29.6.3", 2160 | "jest-resolve": "^29.7.0", 2161 | "jest-runner": "^29.7.0", 2162 | "jest-util": "^29.7.0", 2163 | "jest-validate": "^29.7.0", 2164 | "micromatch": "^4.0.4", 2165 | "parse-json": "^5.2.0", 2166 | "pretty-format": "^29.7.0", 2167 | "slash": "^3.0.0", 2168 | "strip-json-comments": "^3.1.1" 2169 | }, 2170 | "engines": { 2171 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2172 | }, 2173 | "peerDependencies": { 2174 | "@types/node": "*", 2175 | "ts-node": ">=9.0.0" 2176 | }, 2177 | "peerDependenciesMeta": { 2178 | "@types/node": { 2179 | "optional": true 2180 | }, 2181 | "ts-node": { 2182 | "optional": true 2183 | } 2184 | } 2185 | }, 2186 | "node_modules/jest-diff": { 2187 | "version": "29.7.0", 2188 | "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", 2189 | "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", 2190 | "dev": true, 2191 | "dependencies": { 2192 | "chalk": "^4.0.0", 2193 | "diff-sequences": "^29.6.3", 2194 | "jest-get-type": "^29.6.3", 2195 | "pretty-format": "^29.7.0" 2196 | }, 2197 | "engines": { 2198 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2199 | } 2200 | }, 2201 | "node_modules/jest-docblock": { 2202 | "version": "29.7.0", 2203 | "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", 2204 | "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", 2205 | "dev": true, 2206 | "dependencies": { 2207 | "detect-newline": "^3.0.0" 2208 | }, 2209 | "engines": { 2210 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2211 | } 2212 | }, 2213 | "node_modules/jest-each": { 2214 | "version": "29.7.0", 2215 | "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", 2216 | "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", 2217 | "dev": true, 2218 | "dependencies": { 2219 | "@jest/types": "^29.6.3", 2220 | "chalk": "^4.0.0", 2221 | "jest-get-type": "^29.6.3", 2222 | "jest-util": "^29.7.0", 2223 | "pretty-format": "^29.7.0" 2224 | }, 2225 | "engines": { 2226 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2227 | } 2228 | }, 2229 | "node_modules/jest-environment-node": { 2230 | "version": "29.7.0", 2231 | "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", 2232 | "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", 2233 | "dev": true, 2234 | "dependencies": { 2235 | "@jest/environment": "^29.7.0", 2236 | "@jest/fake-timers": "^29.7.0", 2237 | "@jest/types": "^29.6.3", 2238 | "@types/node": "*", 2239 | "jest-mock": "^29.7.0", 2240 | "jest-util": "^29.7.0" 2241 | }, 2242 | "engines": { 2243 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2244 | } 2245 | }, 2246 | "node_modules/jest-expect-message": { 2247 | "version": "1.1.3", 2248 | "resolved": "https://registry.npmjs.org/jest-expect-message/-/jest-expect-message-1.1.3.tgz", 2249 | "integrity": "sha512-bTK77T4P+zto+XepAX3low8XVQxDgaEqh3jSTQOG8qvPpD69LsIdyJTa+RmnJh3HNSzJng62/44RPPc7OIlFxg==", 2250 | "dev": true 2251 | }, 2252 | "node_modules/jest-get-type": { 2253 | "version": "29.6.3", 2254 | "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", 2255 | "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", 2256 | "dev": true, 2257 | "engines": { 2258 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2259 | } 2260 | }, 2261 | "node_modules/jest-haste-map": { 2262 | "version": "29.7.0", 2263 | "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", 2264 | "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", 2265 | "dev": true, 2266 | "dependencies": { 2267 | "@jest/types": "^29.6.3", 2268 | "@types/graceful-fs": "^4.1.3", 2269 | "@types/node": "*", 2270 | "anymatch": "^3.0.3", 2271 | "fb-watchman": "^2.0.0", 2272 | "graceful-fs": "^4.2.9", 2273 | "jest-regex-util": "^29.6.3", 2274 | "jest-util": "^29.7.0", 2275 | "jest-worker": "^29.7.0", 2276 | "micromatch": "^4.0.4", 2277 | "walker": "^1.0.8" 2278 | }, 2279 | "engines": { 2280 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2281 | }, 2282 | "optionalDependencies": { 2283 | "fsevents": "^2.3.2" 2284 | } 2285 | }, 2286 | "node_modules/jest-leak-detector": { 2287 | "version": "29.7.0", 2288 | "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", 2289 | "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", 2290 | "dev": true, 2291 | "dependencies": { 2292 | "jest-get-type": "^29.6.3", 2293 | "pretty-format": "^29.7.0" 2294 | }, 2295 | "engines": { 2296 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2297 | } 2298 | }, 2299 | "node_modules/jest-matcher-utils": { 2300 | "version": "29.7.0", 2301 | "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", 2302 | "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", 2303 | "dev": true, 2304 | "dependencies": { 2305 | "chalk": "^4.0.0", 2306 | "jest-diff": "^29.7.0", 2307 | "jest-get-type": "^29.6.3", 2308 | "pretty-format": "^29.7.0" 2309 | }, 2310 | "engines": { 2311 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2312 | } 2313 | }, 2314 | "node_modules/jest-message-util": { 2315 | "version": "29.7.0", 2316 | "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", 2317 | "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", 2318 | "dev": true, 2319 | "dependencies": { 2320 | "@babel/code-frame": "^7.12.13", 2321 | "@jest/types": "^29.6.3", 2322 | "@types/stack-utils": "^2.0.0", 2323 | "chalk": "^4.0.0", 2324 | "graceful-fs": "^4.2.9", 2325 | "micromatch": "^4.0.4", 2326 | "pretty-format": "^29.7.0", 2327 | "slash": "^3.0.0", 2328 | "stack-utils": "^2.0.3" 2329 | }, 2330 | "engines": { 2331 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2332 | } 2333 | }, 2334 | "node_modules/jest-mock": { 2335 | "version": "29.7.0", 2336 | "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", 2337 | "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", 2338 | "dev": true, 2339 | "dependencies": { 2340 | "@jest/types": "^29.6.3", 2341 | "@types/node": "*", 2342 | "jest-util": "^29.7.0" 2343 | }, 2344 | "engines": { 2345 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2346 | } 2347 | }, 2348 | "node_modules/jest-pnp-resolver": { 2349 | "version": "1.2.3", 2350 | "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", 2351 | "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", 2352 | "dev": true, 2353 | "engines": { 2354 | "node": ">=6" 2355 | }, 2356 | "peerDependencies": { 2357 | "jest-resolve": "*" 2358 | }, 2359 | "peerDependenciesMeta": { 2360 | "jest-resolve": { 2361 | "optional": true 2362 | } 2363 | } 2364 | }, 2365 | "node_modules/jest-regex-util": { 2366 | "version": "29.6.3", 2367 | "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", 2368 | "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", 2369 | "dev": true, 2370 | "engines": { 2371 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2372 | } 2373 | }, 2374 | "node_modules/jest-resolve": { 2375 | "version": "29.7.0", 2376 | "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", 2377 | "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", 2378 | "dev": true, 2379 | "dependencies": { 2380 | "chalk": "^4.0.0", 2381 | "graceful-fs": "^4.2.9", 2382 | "jest-haste-map": "^29.7.0", 2383 | "jest-pnp-resolver": "^1.2.2", 2384 | "jest-util": "^29.7.0", 2385 | "jest-validate": "^29.7.0", 2386 | "resolve": "^1.20.0", 2387 | "resolve.exports": "^2.0.0", 2388 | "slash": "^3.0.0" 2389 | }, 2390 | "engines": { 2391 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2392 | } 2393 | }, 2394 | "node_modules/jest-resolve-dependencies": { 2395 | "version": "29.7.0", 2396 | "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", 2397 | "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", 2398 | "dev": true, 2399 | "dependencies": { 2400 | "jest-regex-util": "^29.6.3", 2401 | "jest-snapshot": "^29.7.0" 2402 | }, 2403 | "engines": { 2404 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2405 | } 2406 | }, 2407 | "node_modules/jest-runner": { 2408 | "version": "29.7.0", 2409 | "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", 2410 | "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", 2411 | "dev": true, 2412 | "dependencies": { 2413 | "@jest/console": "^29.7.0", 2414 | "@jest/environment": "^29.7.0", 2415 | "@jest/test-result": "^29.7.0", 2416 | "@jest/transform": "^29.7.0", 2417 | "@jest/types": "^29.6.3", 2418 | "@types/node": "*", 2419 | "chalk": "^4.0.0", 2420 | "emittery": "^0.13.1", 2421 | "graceful-fs": "^4.2.9", 2422 | "jest-docblock": "^29.7.0", 2423 | "jest-environment-node": "^29.7.0", 2424 | "jest-haste-map": "^29.7.0", 2425 | "jest-leak-detector": "^29.7.0", 2426 | "jest-message-util": "^29.7.0", 2427 | "jest-resolve": "^29.7.0", 2428 | "jest-runtime": "^29.7.0", 2429 | "jest-util": "^29.7.0", 2430 | "jest-watcher": "^29.7.0", 2431 | "jest-worker": "^29.7.0", 2432 | "p-limit": "^3.1.0", 2433 | "source-map-support": "0.5.13" 2434 | }, 2435 | "engines": { 2436 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2437 | } 2438 | }, 2439 | "node_modules/jest-runtime": { 2440 | "version": "29.7.0", 2441 | "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", 2442 | "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", 2443 | "dev": true, 2444 | "dependencies": { 2445 | "@jest/environment": "^29.7.0", 2446 | "@jest/fake-timers": "^29.7.0", 2447 | "@jest/globals": "^29.7.0", 2448 | "@jest/source-map": "^29.6.3", 2449 | "@jest/test-result": "^29.7.0", 2450 | "@jest/transform": "^29.7.0", 2451 | "@jest/types": "^29.6.3", 2452 | "@types/node": "*", 2453 | "chalk": "^4.0.0", 2454 | "cjs-module-lexer": "^1.0.0", 2455 | "collect-v8-coverage": "^1.0.0", 2456 | "glob": "^7.1.3", 2457 | "graceful-fs": "^4.2.9", 2458 | "jest-haste-map": "^29.7.0", 2459 | "jest-message-util": "^29.7.0", 2460 | "jest-mock": "^29.7.0", 2461 | "jest-regex-util": "^29.6.3", 2462 | "jest-resolve": "^29.7.0", 2463 | "jest-snapshot": "^29.7.0", 2464 | "jest-util": "^29.7.0", 2465 | "slash": "^3.0.0", 2466 | "strip-bom": "^4.0.0" 2467 | }, 2468 | "engines": { 2469 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2470 | } 2471 | }, 2472 | "node_modules/jest-snapshot": { 2473 | "version": "29.7.0", 2474 | "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", 2475 | "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", 2476 | "dev": true, 2477 | "dependencies": { 2478 | "@babel/core": "^7.11.6", 2479 | "@babel/generator": "^7.7.2", 2480 | "@babel/plugin-syntax-jsx": "^7.7.2", 2481 | "@babel/plugin-syntax-typescript": "^7.7.2", 2482 | "@babel/types": "^7.3.3", 2483 | "@jest/expect-utils": "^29.7.0", 2484 | "@jest/transform": "^29.7.0", 2485 | "@jest/types": "^29.6.3", 2486 | "babel-preset-current-node-syntax": "^1.0.0", 2487 | "chalk": "^4.0.0", 2488 | "expect": "^29.7.0", 2489 | "graceful-fs": "^4.2.9", 2490 | "jest-diff": "^29.7.0", 2491 | "jest-get-type": "^29.6.3", 2492 | "jest-matcher-utils": "^29.7.0", 2493 | "jest-message-util": "^29.7.0", 2494 | "jest-util": "^29.7.0", 2495 | "natural-compare": "^1.4.0", 2496 | "pretty-format": "^29.7.0", 2497 | "semver": "^7.5.3" 2498 | }, 2499 | "engines": { 2500 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2501 | } 2502 | }, 2503 | "node_modules/jest-snapshot/node_modules/lru-cache": { 2504 | "version": "6.0.0", 2505 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2506 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2507 | "dev": true, 2508 | "dependencies": { 2509 | "yallist": "^4.0.0" 2510 | }, 2511 | "engines": { 2512 | "node": ">=10" 2513 | } 2514 | }, 2515 | "node_modules/jest-snapshot/node_modules/semver": { 2516 | "version": "7.6.0", 2517 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 2518 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 2519 | "dev": true, 2520 | "dependencies": { 2521 | "lru-cache": "^6.0.0" 2522 | }, 2523 | "bin": { 2524 | "semver": "bin/semver.js" 2525 | }, 2526 | "engines": { 2527 | "node": ">=10" 2528 | } 2529 | }, 2530 | "node_modules/jest-snapshot/node_modules/yallist": { 2531 | "version": "4.0.0", 2532 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2533 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2534 | "dev": true 2535 | }, 2536 | "node_modules/jest-util": { 2537 | "version": "29.7.0", 2538 | "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", 2539 | "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", 2540 | "dev": true, 2541 | "dependencies": { 2542 | "@jest/types": "^29.6.3", 2543 | "@types/node": "*", 2544 | "chalk": "^4.0.0", 2545 | "ci-info": "^3.2.0", 2546 | "graceful-fs": "^4.2.9", 2547 | "picomatch": "^2.2.3" 2548 | }, 2549 | "engines": { 2550 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2551 | } 2552 | }, 2553 | "node_modules/jest-validate": { 2554 | "version": "29.7.0", 2555 | "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", 2556 | "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", 2557 | "dev": true, 2558 | "dependencies": { 2559 | "@jest/types": "^29.6.3", 2560 | "camelcase": "^6.2.0", 2561 | "chalk": "^4.0.0", 2562 | "jest-get-type": "^29.6.3", 2563 | "leven": "^3.1.0", 2564 | "pretty-format": "^29.7.0" 2565 | }, 2566 | "engines": { 2567 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2568 | } 2569 | }, 2570 | "node_modules/jest-validate/node_modules/camelcase": { 2571 | "version": "6.3.0", 2572 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 2573 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 2574 | "dev": true, 2575 | "engines": { 2576 | "node": ">=10" 2577 | }, 2578 | "funding": { 2579 | "url": "https://github.com/sponsors/sindresorhus" 2580 | } 2581 | }, 2582 | "node_modules/jest-watcher": { 2583 | "version": "29.7.0", 2584 | "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", 2585 | "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", 2586 | "dev": true, 2587 | "dependencies": { 2588 | "@jest/test-result": "^29.7.0", 2589 | "@jest/types": "^29.6.3", 2590 | "@types/node": "*", 2591 | "ansi-escapes": "^4.2.1", 2592 | "chalk": "^4.0.0", 2593 | "emittery": "^0.13.1", 2594 | "jest-util": "^29.7.0", 2595 | "string-length": "^4.0.1" 2596 | }, 2597 | "engines": { 2598 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2599 | } 2600 | }, 2601 | "node_modules/jest-worker": { 2602 | "version": "29.7.0", 2603 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", 2604 | "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", 2605 | "dev": true, 2606 | "dependencies": { 2607 | "@types/node": "*", 2608 | "jest-util": "^29.7.0", 2609 | "merge-stream": "^2.0.0", 2610 | "supports-color": "^8.0.0" 2611 | }, 2612 | "engines": { 2613 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 2614 | } 2615 | }, 2616 | "node_modules/jest-worker/node_modules/supports-color": { 2617 | "version": "8.1.1", 2618 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 2619 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 2620 | "dev": true, 2621 | "dependencies": { 2622 | "has-flag": "^4.0.0" 2623 | }, 2624 | "engines": { 2625 | "node": ">=10" 2626 | }, 2627 | "funding": { 2628 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2629 | } 2630 | }, 2631 | "node_modules/js-tokens": { 2632 | "version": "4.0.0", 2633 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2634 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2635 | "dev": true 2636 | }, 2637 | "node_modules/js-yaml": { 2638 | "version": "3.14.1", 2639 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 2640 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 2641 | "dev": true, 2642 | "dependencies": { 2643 | "argparse": "^1.0.7", 2644 | "esprima": "^4.0.0" 2645 | }, 2646 | "bin": { 2647 | "js-yaml": "bin/js-yaml.js" 2648 | } 2649 | }, 2650 | "node_modules/jsesc": { 2651 | "version": "2.5.2", 2652 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 2653 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 2654 | "dev": true, 2655 | "bin": { 2656 | "jsesc": "bin/jsesc" 2657 | }, 2658 | "engines": { 2659 | "node": ">=4" 2660 | } 2661 | }, 2662 | "node_modules/json-parse-even-better-errors": { 2663 | "version": "2.3.1", 2664 | "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", 2665 | "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", 2666 | "dev": true 2667 | }, 2668 | "node_modules/json5": { 2669 | "version": "2.2.3", 2670 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2671 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2672 | "dev": true, 2673 | "bin": { 2674 | "json5": "lib/cli.js" 2675 | }, 2676 | "engines": { 2677 | "node": ">=6" 2678 | } 2679 | }, 2680 | "node_modules/kleur": { 2681 | "version": "3.0.3", 2682 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 2683 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 2684 | "dev": true, 2685 | "engines": { 2686 | "node": ">=6" 2687 | } 2688 | }, 2689 | "node_modules/leven": { 2690 | "version": "3.1.0", 2691 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 2692 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 2693 | "dev": true, 2694 | "engines": { 2695 | "node": ">=6" 2696 | } 2697 | }, 2698 | "node_modules/lines-and-columns": { 2699 | "version": "1.2.4", 2700 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2701 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2702 | "dev": true 2703 | }, 2704 | "node_modules/locate-path": { 2705 | "version": "5.0.0", 2706 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 2707 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 2708 | "dev": true, 2709 | "dependencies": { 2710 | "p-locate": "^4.1.0" 2711 | }, 2712 | "engines": { 2713 | "node": ">=8" 2714 | } 2715 | }, 2716 | "node_modules/lru-cache": { 2717 | "version": "5.1.1", 2718 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2719 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2720 | "dev": true, 2721 | "dependencies": { 2722 | "yallist": "^3.0.2" 2723 | } 2724 | }, 2725 | "node_modules/make-dir": { 2726 | "version": "4.0.0", 2727 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", 2728 | "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", 2729 | "dev": true, 2730 | "dependencies": { 2731 | "semver": "^7.5.3" 2732 | }, 2733 | "engines": { 2734 | "node": ">=10" 2735 | }, 2736 | "funding": { 2737 | "url": "https://github.com/sponsors/sindresorhus" 2738 | } 2739 | }, 2740 | "node_modules/make-dir/node_modules/lru-cache": { 2741 | "version": "6.0.0", 2742 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 2743 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 2744 | "dev": true, 2745 | "dependencies": { 2746 | "yallist": "^4.0.0" 2747 | }, 2748 | "engines": { 2749 | "node": ">=10" 2750 | } 2751 | }, 2752 | "node_modules/make-dir/node_modules/semver": { 2753 | "version": "7.6.0", 2754 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 2755 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 2756 | "dev": true, 2757 | "dependencies": { 2758 | "lru-cache": "^6.0.0" 2759 | }, 2760 | "bin": { 2761 | "semver": "bin/semver.js" 2762 | }, 2763 | "engines": { 2764 | "node": ">=10" 2765 | } 2766 | }, 2767 | "node_modules/make-dir/node_modules/yallist": { 2768 | "version": "4.0.0", 2769 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2770 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 2771 | "dev": true 2772 | }, 2773 | "node_modules/makeerror": { 2774 | "version": "1.0.12", 2775 | "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", 2776 | "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", 2777 | "dev": true, 2778 | "dependencies": { 2779 | "tmpl": "1.0.5" 2780 | } 2781 | }, 2782 | "node_modules/merge-stream": { 2783 | "version": "2.0.0", 2784 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 2785 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 2786 | "dev": true 2787 | }, 2788 | "node_modules/micromatch": { 2789 | "version": "4.0.5", 2790 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 2791 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 2792 | "dev": true, 2793 | "dependencies": { 2794 | "braces": "^3.0.2", 2795 | "picomatch": "^2.3.1" 2796 | }, 2797 | "engines": { 2798 | "node": ">=8.6" 2799 | } 2800 | }, 2801 | "node_modules/mimic-fn": { 2802 | "version": "2.1.0", 2803 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2804 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 2805 | "dev": true, 2806 | "engines": { 2807 | "node": ">=6" 2808 | } 2809 | }, 2810 | "node_modules/minimatch": { 2811 | "version": "3.1.2", 2812 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2813 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2814 | "dev": true, 2815 | "dependencies": { 2816 | "brace-expansion": "^1.1.7" 2817 | }, 2818 | "engines": { 2819 | "node": "*" 2820 | } 2821 | }, 2822 | "node_modules/ms": { 2823 | "version": "2.1.2", 2824 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2825 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2826 | "dev": true 2827 | }, 2828 | "node_modules/natural-compare": { 2829 | "version": "1.4.0", 2830 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2831 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 2832 | "dev": true 2833 | }, 2834 | "node_modules/node-int64": { 2835 | "version": "0.4.0", 2836 | "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", 2837 | "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", 2838 | "dev": true 2839 | }, 2840 | "node_modules/node-releases": { 2841 | "version": "2.0.14", 2842 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 2843 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", 2844 | "dev": true 2845 | }, 2846 | "node_modules/normalize-path": { 2847 | "version": "3.0.0", 2848 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2849 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2850 | "dev": true, 2851 | "engines": { 2852 | "node": ">=0.10.0" 2853 | } 2854 | }, 2855 | "node_modules/npm-run-path": { 2856 | "version": "4.0.1", 2857 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2858 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2859 | "dev": true, 2860 | "dependencies": { 2861 | "path-key": "^3.0.0" 2862 | }, 2863 | "engines": { 2864 | "node": ">=8" 2865 | } 2866 | }, 2867 | "node_modules/once": { 2868 | "version": "1.4.0", 2869 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2870 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2871 | "dev": true, 2872 | "dependencies": { 2873 | "wrappy": "1" 2874 | } 2875 | }, 2876 | "node_modules/onetime": { 2877 | "version": "5.1.2", 2878 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2879 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2880 | "dev": true, 2881 | "dependencies": { 2882 | "mimic-fn": "^2.1.0" 2883 | }, 2884 | "engines": { 2885 | "node": ">=6" 2886 | }, 2887 | "funding": { 2888 | "url": "https://github.com/sponsors/sindresorhus" 2889 | } 2890 | }, 2891 | "node_modules/p-limit": { 2892 | "version": "3.1.0", 2893 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2894 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2895 | "dev": true, 2896 | "dependencies": { 2897 | "yocto-queue": "^0.1.0" 2898 | }, 2899 | "engines": { 2900 | "node": ">=10" 2901 | }, 2902 | "funding": { 2903 | "url": "https://github.com/sponsors/sindresorhus" 2904 | } 2905 | }, 2906 | "node_modules/p-locate": { 2907 | "version": "4.1.0", 2908 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2909 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2910 | "dev": true, 2911 | "dependencies": { 2912 | "p-limit": "^2.2.0" 2913 | }, 2914 | "engines": { 2915 | "node": ">=8" 2916 | } 2917 | }, 2918 | "node_modules/p-locate/node_modules/p-limit": { 2919 | "version": "2.3.0", 2920 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2921 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2922 | "dev": true, 2923 | "dependencies": { 2924 | "p-try": "^2.0.0" 2925 | }, 2926 | "engines": { 2927 | "node": ">=6" 2928 | }, 2929 | "funding": { 2930 | "url": "https://github.com/sponsors/sindresorhus" 2931 | } 2932 | }, 2933 | "node_modules/p-try": { 2934 | "version": "2.2.0", 2935 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2936 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 2937 | "dev": true, 2938 | "engines": { 2939 | "node": ">=6" 2940 | } 2941 | }, 2942 | "node_modules/parse-json": { 2943 | "version": "5.2.0", 2944 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", 2945 | "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", 2946 | "dev": true, 2947 | "dependencies": { 2948 | "@babel/code-frame": "^7.0.0", 2949 | "error-ex": "^1.3.1", 2950 | "json-parse-even-better-errors": "^2.3.0", 2951 | "lines-and-columns": "^1.1.6" 2952 | }, 2953 | "engines": { 2954 | "node": ">=8" 2955 | }, 2956 | "funding": { 2957 | "url": "https://github.com/sponsors/sindresorhus" 2958 | } 2959 | }, 2960 | "node_modules/path-exists": { 2961 | "version": "4.0.0", 2962 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2963 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2964 | "dev": true, 2965 | "engines": { 2966 | "node": ">=8" 2967 | } 2968 | }, 2969 | "node_modules/path-is-absolute": { 2970 | "version": "1.0.1", 2971 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2972 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2973 | "dev": true, 2974 | "engines": { 2975 | "node": ">=0.10.0" 2976 | } 2977 | }, 2978 | "node_modules/path-key": { 2979 | "version": "3.1.1", 2980 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2981 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2982 | "dev": true, 2983 | "engines": { 2984 | "node": ">=8" 2985 | } 2986 | }, 2987 | "node_modules/path-parse": { 2988 | "version": "1.0.7", 2989 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2990 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2991 | "dev": true 2992 | }, 2993 | "node_modules/picocolors": { 2994 | "version": "1.0.0", 2995 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2996 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 2997 | "dev": true 2998 | }, 2999 | "node_modules/picomatch": { 3000 | "version": "2.3.1", 3001 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3002 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3003 | "dev": true, 3004 | "engines": { 3005 | "node": ">=8.6" 3006 | }, 3007 | "funding": { 3008 | "url": "https://github.com/sponsors/jonschlinkert" 3009 | } 3010 | }, 3011 | "node_modules/pirates": { 3012 | "version": "4.0.6", 3013 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 3014 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 3015 | "dev": true, 3016 | "engines": { 3017 | "node": ">= 6" 3018 | } 3019 | }, 3020 | "node_modules/pkg-dir": { 3021 | "version": "4.2.0", 3022 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 3023 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 3024 | "dev": true, 3025 | "dependencies": { 3026 | "find-up": "^4.0.0" 3027 | }, 3028 | "engines": { 3029 | "node": ">=8" 3030 | } 3031 | }, 3032 | "node_modules/pretty-format": { 3033 | "version": "29.7.0", 3034 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", 3035 | "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", 3036 | "dev": true, 3037 | "dependencies": { 3038 | "@jest/schemas": "^29.6.3", 3039 | "ansi-styles": "^5.0.0", 3040 | "react-is": "^18.0.0" 3041 | }, 3042 | "engines": { 3043 | "node": "^14.15.0 || ^16.10.0 || >=18.0.0" 3044 | } 3045 | }, 3046 | "node_modules/pretty-format/node_modules/ansi-styles": { 3047 | "version": "5.2.0", 3048 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 3049 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 3050 | "dev": true, 3051 | "engines": { 3052 | "node": ">=10" 3053 | }, 3054 | "funding": { 3055 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3056 | } 3057 | }, 3058 | "node_modules/prompts": { 3059 | "version": "2.4.2", 3060 | "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", 3061 | "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", 3062 | "dev": true, 3063 | "dependencies": { 3064 | "kleur": "^3.0.3", 3065 | "sisteransi": "^1.0.5" 3066 | }, 3067 | "engines": { 3068 | "node": ">= 6" 3069 | } 3070 | }, 3071 | "node_modules/pure-rand": { 3072 | "version": "6.1.0", 3073 | "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", 3074 | "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", 3075 | "dev": true, 3076 | "funding": [ 3077 | { 3078 | "type": "individual", 3079 | "url": "https://github.com/sponsors/dubzzz" 3080 | }, 3081 | { 3082 | "type": "opencollective", 3083 | "url": "https://opencollective.com/fast-check" 3084 | } 3085 | ] 3086 | }, 3087 | "node_modules/react-is": { 3088 | "version": "18.3.1", 3089 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", 3090 | "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", 3091 | "dev": true 3092 | }, 3093 | "node_modules/require-directory": { 3094 | "version": "2.1.1", 3095 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 3096 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 3097 | "dev": true, 3098 | "engines": { 3099 | "node": ">=0.10.0" 3100 | } 3101 | }, 3102 | "node_modules/resolve": { 3103 | "version": "1.22.8", 3104 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 3105 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 3106 | "dev": true, 3107 | "dependencies": { 3108 | "is-core-module": "^2.13.0", 3109 | "path-parse": "^1.0.7", 3110 | "supports-preserve-symlinks-flag": "^1.0.0" 3111 | }, 3112 | "bin": { 3113 | "resolve": "bin/resolve" 3114 | }, 3115 | "funding": { 3116 | "url": "https://github.com/sponsors/ljharb" 3117 | } 3118 | }, 3119 | "node_modules/resolve-cwd": { 3120 | "version": "3.0.0", 3121 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 3122 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", 3123 | "dev": true, 3124 | "dependencies": { 3125 | "resolve-from": "^5.0.0" 3126 | }, 3127 | "engines": { 3128 | "node": ">=8" 3129 | } 3130 | }, 3131 | "node_modules/resolve-from": { 3132 | "version": "5.0.0", 3133 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 3134 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 3135 | "dev": true, 3136 | "engines": { 3137 | "node": ">=8" 3138 | } 3139 | }, 3140 | "node_modules/resolve.exports": { 3141 | "version": "2.0.2", 3142 | "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", 3143 | "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", 3144 | "dev": true, 3145 | "engines": { 3146 | "node": ">=10" 3147 | } 3148 | }, 3149 | "node_modules/semver": { 3150 | "version": "6.3.1", 3151 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 3152 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 3153 | "dev": true, 3154 | "bin": { 3155 | "semver": "bin/semver.js" 3156 | } 3157 | }, 3158 | "node_modules/shebang-command": { 3159 | "version": "2.0.0", 3160 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 3161 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 3162 | "dev": true, 3163 | "dependencies": { 3164 | "shebang-regex": "^3.0.0" 3165 | }, 3166 | "engines": { 3167 | "node": ">=8" 3168 | } 3169 | }, 3170 | "node_modules/shebang-regex": { 3171 | "version": "3.0.0", 3172 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 3173 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 3174 | "dev": true, 3175 | "engines": { 3176 | "node": ">=8" 3177 | } 3178 | }, 3179 | "node_modules/signal-exit": { 3180 | "version": "3.0.7", 3181 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 3182 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 3183 | "dev": true 3184 | }, 3185 | "node_modules/sisteransi": { 3186 | "version": "1.0.5", 3187 | "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", 3188 | "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", 3189 | "dev": true 3190 | }, 3191 | "node_modules/slash": { 3192 | "version": "3.0.0", 3193 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3194 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3195 | "dev": true, 3196 | "engines": { 3197 | "node": ">=8" 3198 | } 3199 | }, 3200 | "node_modules/source-map": { 3201 | "version": "0.6.1", 3202 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3203 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3204 | "dev": true, 3205 | "engines": { 3206 | "node": ">=0.10.0" 3207 | } 3208 | }, 3209 | "node_modules/source-map-support": { 3210 | "version": "0.5.13", 3211 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", 3212 | "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", 3213 | "dev": true, 3214 | "dependencies": { 3215 | "buffer-from": "^1.0.0", 3216 | "source-map": "^0.6.0" 3217 | } 3218 | }, 3219 | "node_modules/sprintf-js": { 3220 | "version": "1.0.3", 3221 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3222 | "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", 3223 | "dev": true 3224 | }, 3225 | "node_modules/stack-utils": { 3226 | "version": "2.0.6", 3227 | "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", 3228 | "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", 3229 | "dev": true, 3230 | "dependencies": { 3231 | "escape-string-regexp": "^2.0.0" 3232 | }, 3233 | "engines": { 3234 | "node": ">=10" 3235 | } 3236 | }, 3237 | "node_modules/string-length": { 3238 | "version": "4.0.2", 3239 | "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", 3240 | "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", 3241 | "dev": true, 3242 | "dependencies": { 3243 | "char-regex": "^1.0.2", 3244 | "strip-ansi": "^6.0.0" 3245 | }, 3246 | "engines": { 3247 | "node": ">=10" 3248 | } 3249 | }, 3250 | "node_modules/string-width": { 3251 | "version": "4.2.3", 3252 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3253 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3254 | "dev": true, 3255 | "dependencies": { 3256 | "emoji-regex": "^8.0.0", 3257 | "is-fullwidth-code-point": "^3.0.0", 3258 | "strip-ansi": "^6.0.1" 3259 | }, 3260 | "engines": { 3261 | "node": ">=8" 3262 | } 3263 | }, 3264 | "node_modules/strip-ansi": { 3265 | "version": "6.0.1", 3266 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3267 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3268 | "dev": true, 3269 | "dependencies": { 3270 | "ansi-regex": "^5.0.1" 3271 | }, 3272 | "engines": { 3273 | "node": ">=8" 3274 | } 3275 | }, 3276 | "node_modules/strip-bom": { 3277 | "version": "4.0.0", 3278 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", 3279 | "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", 3280 | "dev": true, 3281 | "engines": { 3282 | "node": ">=8" 3283 | } 3284 | }, 3285 | "node_modules/strip-final-newline": { 3286 | "version": "2.0.0", 3287 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3288 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 3289 | "dev": true, 3290 | "engines": { 3291 | "node": ">=6" 3292 | } 3293 | }, 3294 | "node_modules/strip-json-comments": { 3295 | "version": "3.1.1", 3296 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 3297 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 3298 | "dev": true, 3299 | "engines": { 3300 | "node": ">=8" 3301 | }, 3302 | "funding": { 3303 | "url": "https://github.com/sponsors/sindresorhus" 3304 | } 3305 | }, 3306 | "node_modules/supports-color": { 3307 | "version": "7.2.0", 3308 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 3309 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 3310 | "dev": true, 3311 | "dependencies": { 3312 | "has-flag": "^4.0.0" 3313 | }, 3314 | "engines": { 3315 | "node": ">=8" 3316 | } 3317 | }, 3318 | "node_modules/supports-preserve-symlinks-flag": { 3319 | "version": "1.0.0", 3320 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3321 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3322 | "dev": true, 3323 | "engines": { 3324 | "node": ">= 0.4" 3325 | }, 3326 | "funding": { 3327 | "url": "https://github.com/sponsors/ljharb" 3328 | } 3329 | }, 3330 | "node_modules/test-exclude": { 3331 | "version": "6.0.0", 3332 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", 3333 | "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", 3334 | "dev": true, 3335 | "dependencies": { 3336 | "@istanbuljs/schema": "^0.1.2", 3337 | "glob": "^7.1.4", 3338 | "minimatch": "^3.0.4" 3339 | }, 3340 | "engines": { 3341 | "node": ">=8" 3342 | } 3343 | }, 3344 | "node_modules/tmpl": { 3345 | "version": "1.0.5", 3346 | "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", 3347 | "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", 3348 | "dev": true 3349 | }, 3350 | "node_modules/to-fast-properties": { 3351 | "version": "2.0.0", 3352 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3353 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3354 | "dev": true, 3355 | "engines": { 3356 | "node": ">=4" 3357 | } 3358 | }, 3359 | "node_modules/to-regex-range": { 3360 | "version": "5.0.1", 3361 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3362 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3363 | "dev": true, 3364 | "dependencies": { 3365 | "is-number": "^7.0.0" 3366 | }, 3367 | "engines": { 3368 | "node": ">=8.0" 3369 | } 3370 | }, 3371 | "node_modules/type-detect": { 3372 | "version": "4.0.8", 3373 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 3374 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 3375 | "dev": true, 3376 | "engines": { 3377 | "node": ">=4" 3378 | } 3379 | }, 3380 | "node_modules/type-fest": { 3381 | "version": "0.21.3", 3382 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 3383 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 3384 | "dev": true, 3385 | "engines": { 3386 | "node": ">=10" 3387 | }, 3388 | "funding": { 3389 | "url": "https://github.com/sponsors/sindresorhus" 3390 | } 3391 | }, 3392 | "node_modules/undici-types": { 3393 | "version": "5.26.5", 3394 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 3395 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 3396 | "dev": true 3397 | }, 3398 | "node_modules/update-browserslist-db": { 3399 | "version": "1.0.15", 3400 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", 3401 | "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", 3402 | "dev": true, 3403 | "funding": [ 3404 | { 3405 | "type": "opencollective", 3406 | "url": "https://opencollective.com/browserslist" 3407 | }, 3408 | { 3409 | "type": "tidelift", 3410 | "url": "https://tidelift.com/funding/github/npm/browserslist" 3411 | }, 3412 | { 3413 | "type": "github", 3414 | "url": "https://github.com/sponsors/ai" 3415 | } 3416 | ], 3417 | "dependencies": { 3418 | "escalade": "^3.1.2", 3419 | "picocolors": "^1.0.0" 3420 | }, 3421 | "bin": { 3422 | "update-browserslist-db": "cli.js" 3423 | }, 3424 | "peerDependencies": { 3425 | "browserslist": ">= 4.21.0" 3426 | } 3427 | }, 3428 | "node_modules/v8-to-istanbul": { 3429 | "version": "9.2.0", 3430 | "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", 3431 | "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", 3432 | "dev": true, 3433 | "dependencies": { 3434 | "@jridgewell/trace-mapping": "^0.3.12", 3435 | "@types/istanbul-lib-coverage": "^2.0.1", 3436 | "convert-source-map": "^2.0.0" 3437 | }, 3438 | "engines": { 3439 | "node": ">=10.12.0" 3440 | } 3441 | }, 3442 | "node_modules/walker": { 3443 | "version": "1.0.8", 3444 | "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", 3445 | "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", 3446 | "dev": true, 3447 | "dependencies": { 3448 | "makeerror": "1.0.12" 3449 | } 3450 | }, 3451 | "node_modules/which": { 3452 | "version": "2.0.2", 3453 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3454 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3455 | "dev": true, 3456 | "dependencies": { 3457 | "isexe": "^2.0.0" 3458 | }, 3459 | "bin": { 3460 | "node-which": "bin/node-which" 3461 | }, 3462 | "engines": { 3463 | "node": ">= 8" 3464 | } 3465 | }, 3466 | "node_modules/wrap-ansi": { 3467 | "version": "7.0.0", 3468 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3469 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3470 | "dev": true, 3471 | "dependencies": { 3472 | "ansi-styles": "^4.0.0", 3473 | "string-width": "^4.1.0", 3474 | "strip-ansi": "^6.0.0" 3475 | }, 3476 | "engines": { 3477 | "node": ">=10" 3478 | }, 3479 | "funding": { 3480 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3481 | } 3482 | }, 3483 | "node_modules/wrappy": { 3484 | "version": "1.0.2", 3485 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3486 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3487 | "dev": true 3488 | }, 3489 | "node_modules/write-file-atomic": { 3490 | "version": "4.0.2", 3491 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", 3492 | "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", 3493 | "dev": true, 3494 | "dependencies": { 3495 | "imurmurhash": "^0.1.4", 3496 | "signal-exit": "^3.0.7" 3497 | }, 3498 | "engines": { 3499 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 3500 | } 3501 | }, 3502 | "node_modules/y18n": { 3503 | "version": "5.0.8", 3504 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3505 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3506 | "dev": true, 3507 | "engines": { 3508 | "node": ">=10" 3509 | } 3510 | }, 3511 | "node_modules/yallist": { 3512 | "version": "3.1.1", 3513 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3514 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3515 | "dev": true 3516 | }, 3517 | "node_modules/yargs": { 3518 | "version": "17.7.2", 3519 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 3520 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 3521 | "dev": true, 3522 | "dependencies": { 3523 | "cliui": "^8.0.1", 3524 | "escalade": "^3.1.1", 3525 | "get-caller-file": "^2.0.5", 3526 | "require-directory": "^2.1.1", 3527 | "string-width": "^4.2.3", 3528 | "y18n": "^5.0.5", 3529 | "yargs-parser": "^21.1.1" 3530 | }, 3531 | "engines": { 3532 | "node": ">=12" 3533 | } 3534 | }, 3535 | "node_modules/yargs-parser": { 3536 | "version": "21.1.1", 3537 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 3538 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 3539 | "dev": true, 3540 | "engines": { 3541 | "node": ">=12" 3542 | } 3543 | }, 3544 | "node_modules/yocto-queue": { 3545 | "version": "0.1.0", 3546 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3547 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3548 | "dev": true, 3549 | "engines": { 3550 | "node": ">=10" 3551 | }, 3552 | "funding": { 3553 | "url": "https://github.com/sponsors/sindresorhus" 3554 | } 3555 | } 3556 | } 3557 | } 3558 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "node-color-log", 3 | "version": "12.0.1", 4 | "description": "The more powerful JavaScript logger for NodeJS and browsers.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "bash ./test/test_main.sh", 8 | "test-windows": "powershell -File test/test_main.ps1", 9 | "jest": "jest" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/tigercosmos/node-color-log.git" 14 | }, 15 | "keywords": [ 16 | "color", 17 | "log", 18 | "js", 19 | "logger" 20 | ], 21 | "author": "tigercosmos", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/tigercosmos/node-color-log/issues" 25 | }, 26 | "homepage": "https://github.com/tigercosmos/node-color-log", 27 | "devDependencies": { 28 | "jest": "^29.7.0", 29 | "jest-expect-message": "^1.1.3" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /test/jest/environmentVariable.spec.js: -------------------------------------------------------------------------------- 1 | process.env.LOGGER = 'info' 2 | const logger = require('../../index'); 3 | const { 4 | getLevelLogMessage, 5 | createLevelLogMessage 6 | } = require('./utils/levelLogUtils'); 7 | 8 | logger._customizedConsole.error = () => {} 9 | 10 | describe('Environment Variable LOGGER', () => { 11 | test('LOGGER=info, debug and success level will not show', () => { 12 | logger.info('info show'); 13 | logger.debug('debug will not show'); 14 | logger.success('success will not show'); 15 | 16 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('info', 'info show')); 17 | }) 18 | }) -------------------------------------------------------------------------------- /test/jest/levelLog.spec.js: -------------------------------------------------------------------------------- 1 | const logger = require('../../index'); 2 | const { 3 | getLevelLogMessage, 4 | createLevelLogMessage 5 | } = require('./utils/levelLogUtils'); 6 | 7 | logger._customizedConsole.error = () => {} 8 | 9 | describe('Common Level Log', () => { 10 | test('This is debug mode', () => { 11 | logger.debug('This is debug mode'); 12 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('debug', 'This is debug mode')); 13 | }) 14 | 15 | test('This is error mode', () => { 16 | logger.error('This is error mode'); 17 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('error', 'This is error mode')); 18 | }) 19 | 20 | test('This is info mode', () => { 21 | logger.info('This is info mode'); 22 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('info', 'This is info mode')); 23 | }) 24 | 25 | test('This is warn mode', () => { 26 | logger.warn('This is warn mode'); 27 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('warn', 'This is warn mode')); 28 | }) 29 | 30 | test('This is success mode', () => { 31 | logger.success('This is success mode'); 32 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('success', 'This is success mode')); 33 | }) 34 | }) 35 | 36 | describe('Set Level', () => { 37 | test('set level to debug', () => { 38 | logger.setLevel('debug'); 39 | expect(logger.level).toBe('debug'); 40 | 41 | logger.error('error show'); 42 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('error', 'error show')); 43 | 44 | logger.warn('warn show'); 45 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('warn', 'warn show')); 46 | 47 | logger.info('info show'); 48 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('info', 'info show')); 49 | 50 | logger.debug('debug show'); 51 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('debug', 'debug show')); 52 | 53 | logger.level = undefined 54 | }) 55 | 56 | test('set level to info', () => { 57 | logger.setLevel('info'); 58 | expect(logger.level).toBe('info'); 59 | 60 | logger.error('error show'); 61 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('error', 'error show')); 62 | 63 | logger.warn('warn show'); 64 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('warn', 'warn show')); 65 | 66 | logger.info('info show'); 67 | logger.debug('debug will not show'); 68 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('info', 'info show')); 69 | 70 | logger.level = undefined 71 | }) 72 | 73 | test('set level to warn', () => { 74 | logger.setLevel('warn'); 75 | expect(logger.level).toBe('warn'); 76 | 77 | logger.error('error show'); 78 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('error', 'error show')); 79 | 80 | logger.warn('warn show'); 81 | logger.info('info will not show'); 82 | logger.debug('debug will not show'); 83 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('warn', 'warn show')); 84 | 85 | logger.level = undefined 86 | }) 87 | 88 | test('set level to error', () => { 89 | logger.setLevel('error'); 90 | expect(logger.level).toBe('error'); 91 | 92 | logger.error('error show'); 93 | logger.warn('warn will not show'); 94 | logger.info('info will not show'); 95 | logger.debug('debug will not show'); 96 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(createLevelLogMessage('error', 'error show')); 97 | 98 | logger.level = undefined 99 | }) 100 | }) 101 | 102 | describe('Level No Color', () => { 103 | test('set level no color', () => { 104 | logger.setLevelNoColor(); 105 | expect(logger.noColor).toBe(true); 106 | 107 | logger.error('error show'); 108 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(' [ERROR] error show'); 109 | 110 | logger.warn('warn show'); 111 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(' [WARN] warn show'); 112 | 113 | logger.info('info show'); 114 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(' [INFO] info show'); 115 | 116 | logger.debug('debug show'); 117 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch').toBe(' [DEBUG] debug show'); 118 | 119 | logger.noColor = false 120 | }) 121 | }) 122 | 123 | describe('Level Multiple Arguments', () => { 124 | test('error show', () => { 125 | logger.error('error show', 'error show 2'); 126 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch') 127 | .toBe(createLevelLogMessage('error', `error show error show 2`)); 128 | }) 129 | 130 | 131 | test('warn show json', () => { 132 | logger.warn('warn show', {a: 1, b: 2}); 133 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch') 134 | .toBe(createLevelLogMessage('warn', `warn show ${JSON.stringify({a: 1, b: 2})}`)); 135 | }) 136 | 137 | test('info show json', () => { 138 | logger.info('info show', {a: [1, 2, 4]}, [4, 4, 4]); 139 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch') 140 | .toBe(createLevelLogMessage('info', `info show ${JSON.stringify({a: [1, 2, 4]})} ${JSON.stringify([4, 4, 4])}`)); 141 | }) 142 | 143 | test('debug show json', () => { 144 | logger.debug('debug show', [1, 2, 3]); 145 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch') 146 | .toBe(createLevelLogMessage('debug', `debug show ${JSON.stringify([1, 2, 3])}`)); 147 | }) 148 | }) 149 | 150 | describe('Date Format', () => { 151 | test('set date format', () => { 152 | const fixedDate = new Date() 153 | logger.setDate(() => fixedDate.toLocaleTimeString()); 154 | logger.info("This is an info message"); 155 | 156 | const logFirstSpaceIndex = logger.lastCommand.indexOf(' ', 10); // xx:xx:xx AM/PM (....) 157 | const logDateStr = logger.lastCommand.slice(0, logFirstSpaceIndex); 158 | 159 | expect(logDateStr).toBe(fixedDate.toLocaleTimeString()); 160 | 161 | logger.setDate(() => (new Date()).toISOString()); 162 | }) 163 | }) 164 | 165 | describe('Special Object', () => { 166 | test('Should print "[object Object]" and not throw an error:', () => { 167 | const object = {} 168 | object.x = object 169 | logger.info('Should print "[object Object]" and not throw an error:', object); 170 | 171 | expect(getLevelLogMessage(logger.lastCommand), 'Message mismatch') 172 | .toBe(createLevelLogMessage('info', `Should print "[object Object]" and not throw an error: ${object.toString()}`)); 173 | }) 174 | }) 175 | 176 | describe('Named Level Log', () => { 177 | test('create named log', () => { 178 | const namedLogger = logger.createNamedLogger('myLog') 179 | 180 | namedLogger.error('error show'); 181 | expect(getLevelLogMessage(namedLogger.lastCommand), 'Message mismatch').toBe(`[myLog] ${createLevelLogMessage('error', 'error show')}`); 182 | 183 | namedLogger.warn('warn show'); 184 | expect(getLevelLogMessage(namedLogger.lastCommand), 'Message mismatch').toBe(`[myLog] ${createLevelLogMessage('warn', 'warn show')}`); 185 | 186 | namedLogger.info('info show'); 187 | expect(getLevelLogMessage(namedLogger.lastCommand), 'Message mismatch').toBe(`[myLog] ${createLevelLogMessage('info', 'info show')}`); 188 | }) 189 | }) 190 | -------------------------------------------------------------------------------- /test/jest/logChain.spec.js: -------------------------------------------------------------------------------- 1 | const logger = require('../../index'); 2 | 3 | logger._customizedConsole.error = () => {} 4 | 5 | describe('Common Log Chain', () => { 6 | test('blue and underscore.', () => { 7 | logger.color('blue').underscore().log('blue and underscore.'); 8 | 9 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[4mblue and underscore.\x1b[0m'); 10 | }); 11 | 12 | test('blue and reverse.', () => { 13 | logger.color('blue').reverse().log('blue and reverse.'); 14 | 15 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[7mblue and reverse.\x1b[0m'); 16 | }); 17 | 18 | test('blue and dim.', () => { 19 | logger.color('blue').dim().log('blue and dim.'); 20 | 21 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[2mblue and dim.\x1b[0m'); 22 | }); 23 | 24 | test('blue and italic.', () => { 25 | logger.color('blue').italic().log('blue and italic.'); 26 | 27 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[3mblue and italic.\x1b[0m'); 28 | }); 29 | 30 | test('blue and strikethrough.', () => { 31 | logger.color('blue').strikethrough().log('blue and strikethrough.'); 32 | 33 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[9mblue and strikethrough.\x1b[0m'); 34 | }); 35 | 36 | test('Red and Bold.', () => { 37 | logger.color('red').bold().log('Red and Bold.'); 38 | 39 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31m\x1b[1mRed and Bold.\x1b[0m'); 40 | }); 41 | 42 | test('blue, yellow, bold, italic.', () => { 43 | logger.color('blue').bgColor('yellow').bold().italic().log('blue, yellow, bold, italic.'); 44 | 45 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[43m\x1b[1m\x1b[3mblue, yellow, bold, italic.\x1b[0m'); 46 | }); 47 | 48 | test('this should be normal.', () => { 49 | logger.log('this should be normal.') 50 | 51 | expect(logger.lastCommand, 'Message mismatch').toBe('this should be normal.\x1b[0m'); 52 | }); 53 | 54 | test('bold, italic, blue, yellow.', () => { 55 | logger.bold().italic().color('blue').bgColor('yellow').log('bold, italic, blue, yellow.'); 56 | 57 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[3m\x1b[34m\x1b[43mbold, italic, blue, yellow.\x1b[0m'); 58 | }); 59 | }); 60 | 61 | // deprecated joint 62 | describe('Joint', () => { 63 | test('1 joint', () => { 64 | logger 65 | .color('yellow').log('font in yellow,') 66 | .joint().bgColor('red').log('background in red,'); 67 | 68 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1A\x1b[33mfont in yellow,\x1b[0m\x1b[41mbackground in red,\x1b[0m'); 69 | }); 70 | 71 | test('2 joint', () => { 72 | logger 73 | .color('yellow').log('font in yellow,').joint() 74 | .bgColor('red').log('background in red,').joint() 75 | .color('yellow').log('font in yellow'); 76 | 77 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1A\x1b[33mfont in yellow,\x1b[0m\x1b[41mbackground in red,\x1b[0m\x1b[33mfont in yellow\x1b[0m'); 78 | }); 79 | }) 80 | 81 | describe('Append', () => { 82 | test('1 append', () => { 83 | logger.color('yellow').append('font in yellow,').bgColor('red').log('background in red'); 84 | 85 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[33mfont in yellow,\x1b[41mbackground in red\x1b[0m'); 86 | }) 87 | 88 | test('2 append', () => { 89 | logger.color('yellow').append('font in yellow,') 90 | .bgColor('red').append('background in red,').reset() 91 | .color('yellow').log('font in yellow'); 92 | 93 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[33mfont in yellow,\x1b[41mbackground in red,\x1b[0m\x1b[33mfont in yellow\x1b[0m'); 94 | }) 95 | }) -------------------------------------------------------------------------------- /test/jest/stream.spec.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const logger = require('../../index'); 3 | const { createLevelLogMessage } = require('./utils/levelLogUtils') 4 | 5 | const FILE_NAME = 'stream_log.test.log' 6 | 7 | describe('Write File', () => { 8 | test('write log to file', (done) => { 9 | const fileStream = fs.createWriteStream(FILE_NAME); 10 | logger.setLogStream(fileStream); 11 | const fixedDate = new Date(); 12 | logger.setDate(() => fixedDate.toISOString()); 13 | 14 | logger.log("hello"); 15 | logger.log("hello", "world"); 16 | logger.debug("hello", "world"); 17 | logger.success("hello", "world"); 18 | logger.info("hello", "world"); 19 | logger.warn("hello", "world"); 20 | logger.error("hello", "world"); 21 | 22 | fileStream.close(() => { 23 | const fileContent = fs.readFileSync('stream_log.test.log', 'utf8'); 24 | const expectedFileContent = 25 | 'hello\x1B[0m\n' + 26 | 'hello world\x1B[0m\n' + 27 | `${fixedDate.toISOString()} ${createLevelLogMessage('debug', 'hello world')}\n` + 28 | `${fixedDate.toISOString()} ${createLevelLogMessage('success', 'hello world')}\n` + 29 | `${fixedDate.toISOString()} ${createLevelLogMessage('info', 'hello world')}\n` + 30 | `${fixedDate.toISOString()} ${createLevelLogMessage('warn', 'hello world')}\n` + 31 | `${fixedDate.toISOString()} ${createLevelLogMessage('error', 'hello world')}\n`; 32 | 33 | expect(fileContent, 'File content mismatch').toBe(expectedFileContent); 34 | 35 | fs.unlinkSync(FILE_NAME); 36 | logger.setDate(() => (new Date()).toISOString()); 37 | logger._customizedConsole = console 38 | done(); 39 | }); 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /test/jest/utility.spec.js: -------------------------------------------------------------------------------- 1 | const logger = require('../../index'); 2 | 3 | logger._customizedConsole.error = () => {} 4 | 5 | describe('fontColorLog()', () => { 6 | test('Font in red.', () => { 7 | logger.fontColorLog('red', 'Font in red.'); 8 | 9 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31mFont in red.\x1b[0m'); 10 | }) 11 | 12 | test('Font in black.', () => { 13 | logger.fontColorLog('black', 'Font in black.'); 14 | 15 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[30mFont in black.\x1b[0m'); 16 | }) 17 | 18 | test('Font in green.', () => { 19 | logger.fontColorLog('green', 'Font in green.'); 20 | 21 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[32mFont in green.\x1b[0m'); 22 | }) 23 | 24 | test('Font in yellow.', () => { 25 | logger.fontColorLog('yellow', 'Font in yellow.'); 26 | 27 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[33mFont in yellow.\x1b[0m'); 28 | }) 29 | 30 | test('Font in blue.', () => { 31 | logger.fontColorLog('blue', 'Font in blue.'); 32 | 33 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34mFont in blue.\x1b[0m'); 34 | }) 35 | 36 | test('Font in magenta.', () => { 37 | logger.fontColorLog('magenta', 'Font in magenta.'); 38 | 39 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[35mFont in magenta.\x1b[0m'); 40 | }) 41 | 42 | test('Font in cyan.', () => { 43 | logger.fontColorLog('cyan', 'Font in cyan.'); 44 | 45 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[36mFont in cyan.\x1b[0m'); 46 | }) 47 | 48 | test('Font in white.', () => { 49 | logger.fontColorLog('white', 'Font in white.'); 50 | 51 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[37mFont in white.\x1b[0m'); 52 | }) 53 | 54 | test('Bold, blue, italic', () => { 55 | logger.fontColorLog('blue', 'Bold, blue, italic', { 56 | bold: true, 57 | underscore: false, 58 | italic: true 59 | }); 60 | 61 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[3m\x1b[34mBold, blue, italic\x1b[0m'); 62 | }) 63 | 64 | test('Bold, dim, underscore, reverse', () => { 65 | logger.fontColorLog('blue', 'Bold, dim, underscore, reverse', { 66 | bold: true, 67 | dim: true, 68 | underscore: true, 69 | reverse: true, 70 | }); 71 | 72 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[2m\x1b[4m\x1b[7m\x1b[34mBold, dim, underscore, reverse\x1b[0m'); 73 | }) 74 | 75 | test('Bold, underscore, blue.', () => { 76 | logger.fontColorLog('blue', 'Bold, underscore, blue.', { 77 | bold: true, 78 | dim: false, 79 | underscore: true, 80 | reverse: false, 81 | }); 82 | 83 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[4m\x1b[34mBold, underscore, blue.\x1b[0m'); 84 | }) 85 | }) 86 | 87 | describe('bgColorLog()', () => { 88 | test('Background in red.', () => { 89 | logger.bgColorLog('red', 'Background in red.'); 90 | 91 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[41mBackground in red.\x1b[0m'); 92 | }) 93 | 94 | test('Background in black.', () => { 95 | logger.bgColorLog('black', 'Background in black.'); 96 | 97 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[40mBackground in black.\x1b[0m'); 98 | }) 99 | 100 | test('Background in green.', () => { 101 | logger.bgColorLog('green', 'Background in green.'); 102 | 103 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[42mBackground in green.\x1b[0m'); 104 | }) 105 | 106 | test('Background in yellow.', () => { 107 | logger.bgColorLog('yellow', 'Background in yellow.'); 108 | 109 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[43mBackground in yellow.\x1b[0m'); 110 | }) 111 | 112 | test('Background in blue.', () => { 113 | logger.bgColorLog('blue', 'Background in blue.'); 114 | 115 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[44mBackground in blue.\x1b[0m'); 116 | }) 117 | 118 | test('Background in magenta.', () => { 119 | logger.bgColorLog('magenta', 'Background in magenta.'); 120 | 121 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[45mBackground in magenta.\x1b[0m'); 122 | }) 123 | 124 | test('Background in cyan.', () => { 125 | logger.bgColorLog('cyan', 'Background in cyan.'); 126 | 127 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[46mBackground in cyan.\x1b[0m'); 128 | }) 129 | 130 | test('Background in white.', () => { 131 | logger.bgColorLog('white', 'Background in white.'); 132 | 133 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[47mBackground in white.\x1b[0m'); 134 | }) 135 | 136 | test('Bold, blue', () => { 137 | logger.bgColorLog('blue', 'Bold, blue', { 138 | bold: true, 139 | underscore: false, 140 | }); 141 | 142 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[44mBold, blue\x1b[0m'); 143 | }) 144 | 145 | test('Bold, dim, underscore, reverse', () => { 146 | logger.bgColorLog('blue', 'Bold, dim, underscore, reverse', { 147 | bold: true, 148 | dim: true, 149 | underscore: true, 150 | reverse: true, 151 | }); 152 | 153 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[2m\x1b[4m\x1b[7m\x1b[44mBold, dim, underscore, reverse\x1b[0m'); 154 | }) 155 | 156 | test('Bold, underscore, blue.', () => { 157 | logger.bgColorLog('blue', 'Bold, underscore, blue.', { 158 | bold: true, 159 | dim: false, 160 | underscore: true, 161 | reverse: false, 162 | }); 163 | 164 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[4m\x1b[44mBold, underscore, blue.\x1b[0m'); 165 | }) 166 | }) 167 | 168 | describe('colorLog()', () => { 169 | test('Red font in black background.', () => { 170 | logger.colorLog({ 171 | font: 'red', 172 | bg: 'black' 173 | }, 'Red font in black background.'); 174 | 175 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31m\x1b[40mRed font in black background.\x1b[0m'); 176 | }) 177 | 178 | test('blue font in yellow background.', () => { 179 | logger.colorLog({ 180 | font: 'blue', 181 | bg: 'yellow' 182 | }, 'blue font in yellow background.'); 183 | 184 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[34m\x1b[43mblue font in yellow background.\x1b[0m'); 185 | }) 186 | 187 | test('blue font in yellow background.', () => { 188 | logger.colorLog({ 189 | font: 'red', 190 | bg: 'green' 191 | }, 'Red font in green background.'); 192 | 193 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31m\x1b[42mRed font in green background.\x1b[0m'); 194 | }) 195 | 196 | test('blue font in yellow background.', () => { 197 | logger.colorLog({ 198 | font: 'red', 199 | bg: 'green' 200 | }, 'Red font in green background, underscore, strikethrough.', { 201 | underscore: true, 202 | reverse: false, 203 | strikethrough: true 204 | }); 205 | 206 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[4m\x1b[9m\x1b[31m\x1b[42mRed font in green background, underscore, strikethrough.\x1b[0m'); 207 | }) 208 | 209 | test('Red font in green background, bold, underscore, reverse, strikethrough.', () => { 210 | logger.colorLog({ 211 | font: 'red', 212 | bg: 'green' 213 | }, 'Red font in green background, bold, underscore, reverse, strikethrough.', { 214 | bold: true, 215 | dim: false, 216 | underscore: true, 217 | reverse: true, 218 | strikethrough: true 219 | }); 220 | 221 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[1m\x1b[4m\x1b[7m\x1b[9m\x1b[31m\x1b[42mRed font in green background, bold, underscore, reverse, strikethrough.\x1b[0m'); 222 | }) 223 | }) 224 | 225 | afterEach(() => { 226 | // restore the spy created with spyOn 227 | jest.restoreAllMocks(); 228 | }); 229 | 230 | describe('Wrong Usage', () => { 231 | test('Pass wrong font color string to fontColorLog()', () => { 232 | jest.spyOn(console, 'error'); 233 | 234 | logger.fontColorLog('test', 'Should be no color.'); 235 | 236 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Font color not found! Use the default.'); 237 | expect(logger.lastCommand, 'Message mismatch').toBe('Should be no color.\x1b[0m'); 238 | }) 239 | 240 | test('Pass wrong background color string to bgColorLog()', () => { 241 | jest.spyOn(console, 'error'); 242 | 243 | logger.bgColorLog('test', 'Should be no color.'); 244 | 245 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Background color not found! Use the default.'); 246 | expect(logger.lastCommand, 'Message mismatch').toBe('Should be no color.\x1b[0m'); 247 | }) 248 | 249 | test('Pass wrong font color string to colorLog()', () => { 250 | jest.spyOn(console, 'error'); 251 | 252 | logger.colorLog({ 253 | font: 'test', 254 | bg: 'blue' 255 | }, 'Font color warning.'); 256 | 257 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Font color not found! Use the default.'); 258 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[44mFont color warning.\x1b[0m'); 259 | }) 260 | 261 | test('Pass wrong background color string to colorLog()', () => { 262 | jest.spyOn(console, 'error'); 263 | 264 | logger.colorLog({ 265 | font: 'red', 266 | bg: 'test' 267 | }, 'Background color warning.'); 268 | 269 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Background color not found! Use the default.'); 270 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31mBackground color warning.\x1b[0m'); 271 | }) 272 | 273 | test('Pass wrong font color string and background color string to colorLog()', () => { 274 | jest.spyOn(console, 'error'); 275 | 276 | logger.colorLog({ 277 | font: 'test', 278 | bg: 'test' 279 | }, 'Font and background color warning.'); 280 | 281 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Font color not found! Use the default.'); 282 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: Background color not found! Use the default.'); 283 | expect(logger.lastCommand, 'Message mismatch').toBe('Font and background color warning.\x1b[0m'); 284 | }) 285 | 286 | test('Pass wrong setting to fontColorLog()', () => { 287 | jest.spyOn(console, 'error'); 288 | 289 | logger.fontColorLog('red', 'Wrong setting.', { 290 | width: true, 291 | }); 292 | 293 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith(`node-color-log warning: width is not valid in setting.`); 294 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[31mWrong setting.\x1b[0m'); 295 | }) 296 | 297 | test('Pass wrong setting to bgColorLog()', () => { 298 | jest.spyOn(console, 'error'); 299 | 300 | logger.bgColorLog('red', 'Wrong setting.', { 301 | dim: 'true', 302 | }); 303 | 304 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: The value dim should be boolean.'); 305 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[41mWrong setting.\x1b[0m'); 306 | }) 307 | 308 | test('Pass wrong setting to bgColorLog()', () => { 309 | jest.spyOn(console, 'error'); 310 | 311 | logger.bgColorLog('red', 'Wrong setting.', { 312 | bold: 4 313 | }); 314 | 315 | expect(console.error, 'Error message wrong').toHaveBeenCalledWith('node-color-log warning: The value bold should be boolean.'); 316 | expect(logger.lastCommand, 'Message mismatch').toBe('\x1b[41mWrong setting.\x1b[0m'); 317 | }) 318 | }) -------------------------------------------------------------------------------- /test/jest/utils/levelLogUtils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {string} command 3 | * @returns {string} 4 | */ 5 | const getLevelLogMessage = (command) => { 6 | const logFirstSpaceIndex = command.indexOf(' '); 7 | const logMessage = command.slice(logFirstSpaceIndex + 1); 8 | return logMessage; 9 | } 10 | 11 | /** 12 | * @param {'success'|'debug'|'info'|'warn'|'error'} level 13 | * @param {string} message 14 | * @returns {string} 15 | */ 16 | const createLevelLogMessage = (level, message) => { 17 | switch(level) { 18 | case 'success': 19 | return `\x1b[42m\x1b[30m[SUCCESS]\x1b[0m \x1b[32m${message}\x1b[0m`; 20 | case 'debug': 21 | return `\x1b[46m\x1b[30m[DEBUG]\x1b[0m \x1b[36m${message}\x1b[0m`; 22 | case 'info': 23 | return `\x1b[42m\x1b[30m[INFO]\x1b[0m \x1b[32m${message}\x1b[0m`; 24 | case 'warn': 25 | return `\x1b[43m\x1b[30m[WARN]\x1b[0m \x1b[33m${message}\x1b[0m`; 26 | case 'error': 27 | return `\x1b[41m[ERROR]\x1b[0m \x1b[31m${message}\x1b[0m`; 28 | default: 29 | return ''; 30 | } 31 | } 32 | 33 | module.exports = { 34 | getLevelLogMessage, 35 | createLevelLogMessage 36 | } -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | logger.log('****************'); 4 | logger.log('*** Test log ***'); 5 | logger.log('****************'); 6 | logger.color('blue').underscore().log('blue and underscore.'); 7 | logger.color('blue').reverse().log('blue and reverse.'); 8 | logger.color('blue').dim().log('blue and dim.'); 9 | logger.color('blue').italic().log('blue and italic.'); 10 | logger.color('blue').strikethrough().log('blue and strikethrough.'); 11 | logger.color('red').bold().log('Red and Bold.'); 12 | logger.color('blue').bgColor('yellow').bold().italic().log('blue, yellow, bold, italic, '); 13 | logger.log('this should be normal.') 14 | logger.bold().italic().color('blue').bgColor('yellow').log('bold, italic, blue, yellow.'); 15 | // deprecated joint 16 | logger.color('yellow').log('font in yellow,').joint().bgColor('red').log('background in red,'); 17 | logger.color('yellow').log('font in yellow,').joint() 18 | .bgColor('red').log('background in red,').joint() 19 | .color('yellow').log('font in yellow'); 20 | // test append 21 | logger.color('yellow').append('font in yellow,').bgColor('red').log('background in red'); 22 | logger.color('yellow').append('font in yellow,') 23 | .bgColor('red').append('background in red,').reset() 24 | .color('yellow').log('font in yellow'); 25 | logger.log('\n'); 26 | 27 | logger.log('**************************'); 28 | logger.log('*** Test fontColorLog ****'); 29 | logger.log('**************************'); 30 | logger.fontColorLog('red', 'Font in red.'); 31 | logger.fontColorLog('black', 'Font in black.'); 32 | logger.fontColorLog('green', 'Font in green.'); 33 | logger.fontColorLog('yellow', 'Font in yellow.'); 34 | logger.fontColorLog('blue', 'Font in blue.'); 35 | logger.fontColorLog('magenta', 'Font in magenta.'); 36 | logger.fontColorLog('cyan', 'Font in cyan.'); 37 | logger.fontColorLog('white', 'Font in white.'); 38 | logger.fontColorLog('blue', 'Bold, blue, italic', { 39 | bold: true, 40 | underscore: false, 41 | italic: true 42 | }); 43 | logger.fontColorLog('blue', 'Bold, dim, underscore, reverse', { 44 | bold: true, 45 | dim: true, 46 | underscore: true, 47 | reverse: true, 48 | }); 49 | logger.fontColorLog('blue', 'Bold, underscore, blue.', { 50 | bold: true, 51 | dim: false, 52 | underscore: true, 53 | reverse: false, 54 | }); 55 | logger.log('\n'); 56 | 57 | logger.log('************************'); 58 | logger.log('*** Test bgColorLog ****'); 59 | logger.log('************************'); 60 | logger.bgColorLog('red', 'Background in red.'); 61 | logger.bgColorLog('black', 'Background in black.'); 62 | logger.bgColorLog('green', 'Background in green.'); 63 | logger.bgColorLog('yellow', 'Background in yellow.'); 64 | logger.bgColorLog('blue', 'Background in blue.'); 65 | logger.bgColorLog('magenta', 'Background in magenta.'); 66 | logger.bgColorLog('cyan', 'Background in cyan.'); 67 | logger.bgColorLog('white', 'Background in white.'); 68 | logger.bgColorLog('blue', 'Bold, blue', { 69 | bold: true, 70 | underscore: false, 71 | }); 72 | logger.bgColorLog('blue', 'Bold, dim, underscore, reverse', { 73 | bold: true, 74 | dim: true, 75 | underscore: true, 76 | reverse: true, 77 | }); 78 | logger.bgColorLog('blue', 'Bold, underscore, blue.', { 79 | bold: true, 80 | dim: false, 81 | underscore: true, 82 | reverse: false, 83 | }); 84 | logger.log('\n'); 85 | 86 | logger.log('*************************'); 87 | logger.log('*** Test colorLog ****'); 88 | logger.log('*************************'); 89 | logger.colorLog({ 90 | font: 'red', 91 | bg: 'black' 92 | }, 'Red font in black background.'); 93 | logger.colorLog({ 94 | font: 'blue', 95 | bg: 'yellow' 96 | }, 'blue font in yellow background.'); 97 | logger.colorLog({ 98 | font: 'red', 99 | bg: 'green' 100 | }, 'Red font in green background.'); 101 | logger.colorLog({ 102 | font: 'red', 103 | bg: 'green' 104 | }, 'Red font in green background, underscore, strikethrough.', { 105 | underscore: true, 106 | reverse: false, 107 | strikethrough: true 108 | }); 109 | logger.colorLog({ 110 | font: 'red', 111 | bg: 'green' 112 | }, 'Red font in green background, bold, underscore, reverse, strikethrough.', { 113 | bold: true, 114 | dim: false, 115 | underscore: true, 116 | reverse: true, 117 | strikethrough: true 118 | }); 119 | logger.log('\n'); 120 | 121 | logger.log('**********************'); 122 | logger.log('*** Test Level Log ***'); 123 | logger.log('**********************'); 124 | logger.debug('This is debug mode'); 125 | logger.error('This is error mode'); 126 | logger.info('This is info mode'); 127 | logger.warn('This is warn mode'); 128 | logger.log('\n'); 129 | 130 | logger.log('*************************'); 131 | logger.log('*** Test Wrong Usage ****'); 132 | logger.log('*************************'); 133 | logger.fontColorLog('test', 'Should be no color.'); 134 | logger.bgColorLog('test', 'Should be no color.'); 135 | logger.colorLog({ 136 | font: 'test', 137 | bg: 'blue' 138 | }, 'Font color warning.'); 139 | logger.colorLog({ 140 | font: 'red', 141 | bg: 'test' 142 | }, 'Background color warning.'); 143 | logger.colorLog({ 144 | font: 'test', 145 | bg: 'test' 146 | }, 'Font and background color warning.'); 147 | logger.fontColorLog('red', 'Wrong setting.', { 148 | width: true, 149 | }); 150 | logger.bgColorLog('red', 'Wrong setting.', { 151 | dim: 'true', 152 | }); 153 | logger.bgColorLog('red', 'Wrong setting.', { 154 | bold: 4 155 | }); 156 | 157 | logger.log('*************************'); 158 | logger.log('*** Test Level Usage ****'); 159 | logger.log('*************************'); 160 | logger.log('Set level to debug:'); 161 | logger.setLevel("debug"); 162 | logger.error('error show'); 163 | logger.warn('warn show'); 164 | logger.info('info show'); 165 | logger.debug('debug show'); 166 | 167 | logger.log('Set level to info:'); 168 | logger.setLevel("info"); 169 | logger.error('error show'); 170 | logger.warn('warn show'); 171 | logger.info('info show'); 172 | logger.debug('debug will not show'); 173 | 174 | logger.log('Set level to warn:'); 175 | logger.setLevel("warn"); 176 | logger.error('error show'); 177 | logger.warn('warn show'); 178 | logger.info('info will not show'); 179 | logger.debug('debug will not show'); 180 | 181 | logger.log('Set level to error:'); 182 | logger.setLevel("error"); 183 | logger.error('error show'); 184 | logger.warn('warn will not show'); 185 | logger.info('info will not show'); 186 | logger.debug('debug will not show'); 187 | 188 | logger.log('****************************'); 189 | logger.log('*** Test Level No Color ****'); 190 | logger.log('****************************'); 191 | logger.setLevelNoColor(); 192 | logger.setLevel("debug"); 193 | logger.error('error show'); 194 | logger.warn('warn show'); 195 | logger.info('info show'); 196 | logger.debug('debug show'); 197 | 198 | logger.log('*************************************'); 199 | logger.log('*** Test Level Multiple Arguments ***'); 200 | logger.log('*************************************'); 201 | logger.setLevelColor(); 202 | logger.error('error show', 'error show 2'); 203 | logger.warn('warn show', {a: 1, b: 2}); 204 | logger.info('info show', {a: [1, 2, 4]}, [4, 4, 4]); 205 | logger.debug('debug show', [1, 2, 3]); 206 | 207 | logger.log('*************************************'); 208 | logger.log('*** Test Date Format ***'); 209 | logger.log('*************************************'); 210 | logger.setLevel("info"); 211 | logger.setDate(() => (new Date()).toLocaleTimeString()) 212 | logger.info("This is an info message") // 5:17:59 pm [INFO] This is an info message 213 | -------------------------------------------------------------------------------- /test/test2.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | // $ LOGGER=info node test2.js 4 | logger.log('****************************************'); 5 | logger.log('*** Test Environment Variable LOGGER ***'); 6 | logger.log('****************************************'); 7 | logger.log("LOGGER=info, debug level will not show"); 8 | logger.error('error show'); 9 | logger.warn('warn show'); 10 | logger.info('info show'); 11 | logger.debug('debug will not show'); 12 | logger.success('success show'); 13 | -------------------------------------------------------------------------------- /test/test3.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index'); 2 | 3 | const object = {} 4 | object.x = object 5 | // $ LOGGER=info node test3.js 6 | logger.info("Should print \"[object Object]\" and not throw an error:", object); 7 | -------------------------------------------------------------------------------- /test/test4.js: -------------------------------------------------------------------------------- 1 | const logger = require('../index').createNamedLogger("Test 4"); 2 | 3 | // $ LOGGER=info node test4.js 4 | logger.log('****************************************'); 5 | logger.log('*** Test Environment Variable LOGGER ***'); 6 | logger.log('****************************************'); 7 | logger.log("LOGGER=info, debug level will not show"); 8 | logger.error('error show'); 9 | logger.warn('warn show'); 10 | logger.info('info show'); 11 | logger.debug('debug will not show'); 12 | logger.success('success show'); -------------------------------------------------------------------------------- /test/test_main.ps1: -------------------------------------------------------------------------------- 1 | node test\test.js 2 | 3 | $env:LOGGER = "info" 4 | node test\test2.js 5 | 6 | node test\test3.js 7 | 8 | $env:LOGGER = "info" 9 | node test\test4.js 10 | 11 | node test\test_stream.js -------------------------------------------------------------------------------- /test/test_main.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/bash 2 | 3 | node test/test.js 4 | 5 | LOGGER=info node test/test2.js 6 | 7 | node test/test3.js 8 | 9 | LOGGER=info node test/test4.js 10 | 11 | node test/test_stream.js 12 | -------------------------------------------------------------------------------- /test/test_stream.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | const logger = require('../index'); 4 | 5 | fileStream = fs.createWriteStream('stream_log.test.log'), 6 | 7 | logger.setLogStream(fileStream) 8 | 9 | logger.log("hello"); 10 | logger.log("hello", "world"); 11 | logger.debug("hello", "world"); 12 | logger.success("hello", "world"); 13 | logger.info("hello", "world"); 14 | logger.warn("hello", "world"); 15 | logger.error("hello", "world"); 16 | 17 | fileStream.close() 18 | --------------------------------------------------------------------------------