├── .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 | 
2 |
3 | [](https://github.com/tigercosmos/node-color-log/actions/workflows/test.yml)
4 | [](https://badge.fury.io/js/node-color-log)
5 | [](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 |
18 |
19 |
20 |
21 |
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 |
--------------------------------------------------------------------------------