├── .eslintrc.json ├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── .husky └── prepare-commit-msg ├── .prettierrc.json ├── LICENSE ├── README.md ├── bin └── git-scribe.js ├── hero.webp ├── jest.config.json ├── lib ├── assistant │ ├── examples.js │ ├── examples.test.js │ ├── index.js │ └── index.test.js ├── clients │ ├── openai-api.js │ └── openai-api.test.js ├── constants │ └── index.js ├── index.js ├── index.test.js └── utils │ ├── commit-message.js │ ├── commit-message.test.js │ ├── git.js │ ├── git.test.js │ ├── openai-api-key.js │ ├── openai-api-key.test.js │ ├── spinner.js │ └── spinner.test.js ├── package.json └── pnpm-lock.yaml /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es2022": true, 4 | "jest": true, 5 | "node": true 6 | }, 7 | "extends": ["eslint:recommended", "prettier"], 8 | "parserOptions": { 9 | "sourceType": "module" 10 | }, 11 | "rules": { 12 | "no-console": "off" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: ['main'] 6 | pull_request: 7 | branches: ['main'] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | strategy: 14 | matrix: 15 | node-version: [16.x, 18.x, 20.x] 16 | 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Install pnpm 20 | uses: pnpm/action-setup@v2 21 | with: 22 | version: 8 23 | - name: Use Node.js ${{ matrix.node-version }} 24 | uses: actions/setup-node@v3 25 | with: 26 | node-version: ${{ matrix.node-version }} 27 | cache: 'pnpm' 28 | - name: Install dependencies 29 | run: pnpm install 30 | - name: Run tests 31 | run: pnpm run test:cov 32 | - name: Upload coverage reports to Codecov 33 | uses: codecov/codecov-action@v3 34 | env: 35 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /.husky/prepare-commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | ./bin/git-scribe.js "$1" "$2" 5 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true 3 | } 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Matías Olivera 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 | # Git Scribe 2 | 3 |
4 | Git Scribe illustration 5 |
6 | 7 |
8 | 9 |
10 | Your AI copilot for crafting insightful Git commit messages 11 |
12 | 13 |
14 | 15 |
16 | 17 | GitHub CI Workflow 18 | 19 | 20 | Codecov 21 | 22 | 23 | npm 24 | 25 |
26 | 27 |
28 | 29 | Git Scribe streamlines your development process by translating code diffs into concise narratives ✍️ 30 | 31 | Whenever you need inspiration, execute `git commit` and Git Scribe will suggest a message for you ✨ 32 | 33 | ## Getting Started 34 | 35 | Follow these steps to add Git Scribe to your repository: 36 | 37 | 1. Install `git-scribe` and [`husky`](https://typicode.github.io/husky): 38 | 39 | ```sh 40 | $ npm install --save-dev git-scribe husky 41 | ``` 42 | 43 | 2. Enable Git hooks: 44 | 45 | ```sh 46 | $ npx husky install 47 | ``` 48 | 49 | 3. Add the [`prepare-commit-msg`](https://git-scm.com/docs/githooks#_prepare_commit_msg) hook: 50 | 51 | ```sh 52 | $ npx husky add .husky/prepare-commit-msg 'git-scribe "$1" "$2"' 53 | ``` 54 | 55 | Profit! 56 | 57 | ## Data Privacy 58 | 59 | Git Scribe uses OpenAI API behind the scenes. If you have any concerns, you can review OpenAI's API data privacy policies [here](https://openai.com/api-data-privacy). 60 | -------------------------------------------------------------------------------- /bin/git-scribe.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { prepareCommitMessage } from '../lib/index.js'; 4 | 5 | prepareCommitMessage(process.argv[2], process.argv[3]); 6 | -------------------------------------------------------------------------------- /hero.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/olistic/git-scribe/21fdae0405481afa6646d0ccfdee52cccfa7fe30/hero.webp -------------------------------------------------------------------------------- /jest.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "clearMocks": true, 3 | "transform": {} 4 | } 5 | -------------------------------------------------------------------------------- /lib/assistant/examples.js: -------------------------------------------------------------------------------- 1 | import { getCommitMessage, getGitDiff } from '../utils/git.js'; 2 | 3 | const exampleCount = 3; 4 | 5 | export async function getExamples() { 6 | const commitsAndDiffs = []; 7 | 8 | for (let i = 0; i < exampleCount; i++) { 9 | const reference = `HEAD~${i}`; 10 | const commitMessage = await getCommitMessage(reference); 11 | const commitDiff = await getGitDiff(reference); 12 | commitsAndDiffs.push({ message: commitMessage, diff: commitDiff }); 13 | } 14 | 15 | return commitsAndDiffs; 16 | } 17 | -------------------------------------------------------------------------------- /lib/assistant/examples.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('../utils/git.js', () => ({ 4 | getCommitMessage: jest.fn(), 5 | getGitDiff: jest.fn(), 6 | })); 7 | const { getCommitMessage, getGitDiff } = await import('../utils/git.js'); 8 | 9 | const { getExamples } = await import('./examples.js'); 10 | 11 | describe('getExamples', () => { 12 | it('returns the commit messages and diffs', async () => { 13 | getCommitMessage 14 | .mockResolvedValueOnce('first commit') 15 | .mockResolvedValueOnce('second commit') 16 | .mockResolvedValueOnce('third commit'); 17 | getGitDiff 18 | .mockResolvedValueOnce('first diff') 19 | .mockResolvedValueOnce('second diff') 20 | .mockResolvedValueOnce('third diff'); 21 | 22 | const examples = await getExamples(); 23 | 24 | expect(getCommitMessage).toHaveBeenNthCalledWith(1, 'HEAD~0'); 25 | expect(getCommitMessage).toHaveBeenNthCalledWith(2, 'HEAD~1'); 26 | expect(getCommitMessage).toHaveBeenNthCalledWith(3, 'HEAD~2'); 27 | expect(getGitDiff).toHaveBeenNthCalledWith(1, 'HEAD~0'); 28 | expect(getGitDiff).toHaveBeenNthCalledWith(2, 'HEAD~1'); 29 | expect(getGitDiff).toHaveBeenNthCalledWith(3, 'HEAD~2'); 30 | expect(examples).toEqual([ 31 | { message: 'first commit', diff: 'first diff' }, 32 | { message: 'second commit', diff: 'second diff' }, 33 | { message: 'third commit', diff: 'third diff' }, 34 | ]); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /lib/assistant/index.js: -------------------------------------------------------------------------------- 1 | import { createChatCompletion } from '../clients/openai-api.js'; 2 | import { 3 | sanitizeCommitMessage, 4 | validateCommitMessage, 5 | } from '../utils/commit-message.js'; 6 | import { getGitDiffStaged } from '../utils/git.js'; 7 | import { getExamples } from './examples.js'; 8 | 9 | const maxAttempts = 3; 10 | const systemMessage = 11 | 'You are an assistant that helps developers write commit messages. You will be provided with a git diff of the changes that are about to be committed. Write a commit message that describes the changes. Be extremely concise. Use imperative mood.'; 12 | 13 | export async function generateCommitMessage() { 14 | const examples = await getExamples(); 15 | 16 | const prompt = await getGitDiffStaged(); 17 | 18 | let attempts = 0; 19 | while (attempts < maxAttempts) { 20 | const conversation = [ 21 | { role: 'system', content: systemMessage }, 22 | ...examples.flatMap(({ diff, message }) => [ 23 | { role: 'user', content: diff }, 24 | { role: 'assistant', content: message }, 25 | ]), 26 | { role: 'user', content: prompt }, 27 | ]; 28 | const unsanitizedMessage = await createChatCompletion(conversation); 29 | const message = sanitizeCommitMessage(unsanitizedMessage); 30 | if (validateCommitMessage(message)) { 31 | return message; 32 | } 33 | 34 | attempts += 1; 35 | } 36 | 37 | return null; 38 | } 39 | -------------------------------------------------------------------------------- /lib/assistant/index.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('../clients/openai-api.js', () => ({ 4 | createChatCompletion: jest.fn(), 5 | })); 6 | const { createChatCompletion } = await import('../clients/openai-api.js'); 7 | jest.unstable_mockModule('../utils/commit-message.js', () => ({ 8 | sanitizeCommitMessage: jest.fn(), 9 | validateCommitMessage: jest.fn(), 10 | })); 11 | const { sanitizeCommitMessage, validateCommitMessage } = await import( 12 | '../utils/commit-message.js' 13 | ); 14 | jest.unstable_mockModule('../utils/git.js', () => ({ 15 | getGitDiffStaged: jest.fn(), 16 | })); 17 | const { getGitDiffStaged } = await import('../utils/git.js'); 18 | jest.unstable_mockModule('./examples.js', () => ({ 19 | getExamples: jest.fn(), 20 | })); 21 | const { getExamples } = await import('./examples.js'); 22 | 23 | const { generateCommitMessage } = await import('./index.js'); 24 | 25 | describe('generateCommitMessage', () => { 26 | it('returns the commit message', async () => { 27 | getExamples.mockResolvedValueOnce([ 28 | { message: 'first commit', diff: 'first diff' }, 29 | { message: 'second commit', diff: 'second diff' }, 30 | ]); 31 | getGitDiffStaged.mockResolvedValueOnce('staged diff'); 32 | createChatCompletion.mockResolvedValueOnce('some unsanitized message'); 33 | sanitizeCommitMessage.mockReturnValueOnce('some message'); 34 | validateCommitMessage.mockReturnValueOnce(true); 35 | 36 | const message = await generateCommitMessage(); 37 | 38 | expect(createChatCompletion).toHaveBeenCalledWith([ 39 | { 40 | role: 'system', 41 | content: 42 | 'You are an assistant that helps developers write commit messages. You will be provided with a git diff of the changes that are about to be committed. Write a commit message that describes the changes. Be extremely concise. Use imperative mood.', 43 | }, 44 | { role: 'user', content: 'first diff' }, 45 | { role: 'assistant', content: 'first commit' }, 46 | { role: 'user', content: 'second diff' }, 47 | { role: 'assistant', content: 'second commit' }, 48 | { role: 'user', content: 'staged diff' }, 49 | ]); 50 | expect(sanitizeCommitMessage).toHaveBeenCalledWith( 51 | 'some unsanitized message', 52 | ); 53 | expect(validateCommitMessage).toHaveBeenCalledWith('some message'); 54 | expect(message).toBe('some message'); 55 | }); 56 | 57 | it('returns null if the commit message is invalid after three attempts', async () => { 58 | getExamples.mockResolvedValueOnce([ 59 | { message: 'first commit', diff: 'first diff' }, 60 | { message: 'second commit', diff: 'second diff' }, 61 | ]); 62 | getGitDiffStaged.mockResolvedValueOnce('staged diff'); 63 | createChatCompletion.mockResolvedValue('some unsanitized message'); 64 | sanitizeCommitMessage.mockReturnValue('some invalid message'); 65 | validateCommitMessage.mockReturnValue(false); 66 | 67 | const message = await generateCommitMessage(); 68 | 69 | expect(createChatCompletion).toHaveBeenCalledTimes(3); 70 | expect(sanitizeCommitMessage).toHaveBeenCalledTimes(3); 71 | expect(validateCommitMessage).toHaveBeenCalledTimes(3); 72 | expect(message).toBe(null); 73 | }); 74 | }); 75 | -------------------------------------------------------------------------------- /lib/clients/openai-api.js: -------------------------------------------------------------------------------- 1 | import fetch from 'node-fetch'; 2 | 3 | import { OPENAI_API_BASE_URL } from '../constants/index.js'; 4 | import { getOpenAIAPIKey } from '../utils/openai-api-key.js'; 5 | 6 | const model = 'gpt-3.5-turbo'; 7 | const temperature = 0.5; 8 | 9 | async function makeRequest( 10 | endpoint, 11 | method = 'GET', 12 | body = null, 13 | apiKey = null, 14 | ) { 15 | apiKey = apiKey ?? (await getOpenAIAPIKey()); 16 | 17 | const response = await fetch(`${OPENAI_API_BASE_URL}${endpoint}`, { 18 | method, 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | Authorization: `Bearer ${apiKey}`, 22 | }, 23 | ...(body && { body: JSON.stringify(body) }), 24 | }); 25 | 26 | if (!response.ok) { 27 | throw new Error(`Request failed with status: ${response.status}`); 28 | } 29 | 30 | const data = await response.json(); 31 | return data; 32 | } 33 | 34 | export async function validateAPIKey(apiKey) { 35 | try { 36 | await makeRequest('/v1/models', 'GET', null, apiKey); 37 | } catch { 38 | return false; 39 | } 40 | 41 | return true; 42 | } 43 | 44 | export async function createChatCompletion(messages) { 45 | const data = await makeRequest('/v1/chat/completions', 'POST', { 46 | model, 47 | messages, 48 | temperature, 49 | }); 50 | return data.choices[0]?.message.content ?? null; 51 | } 52 | -------------------------------------------------------------------------------- /lib/clients/openai-api.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('node-fetch', () => ({ 4 | __esModule: true, 5 | default: jest.fn(), 6 | })); 7 | const { default: fetch } = await import('node-fetch'); 8 | jest.unstable_mockModule('../utils/openai-api-key', () => ({ 9 | getOpenAIAPIKey: jest.fn(), 10 | })); 11 | const { getOpenAIAPIKey } = await import('../utils/openai-api-key'); 12 | 13 | const { validateAPIKey, createChatCompletion } = await import( 14 | './openai-api.js' 15 | ); 16 | 17 | describe('validateAPIKey', () => { 18 | it('returns true if the API key is valid', async () => { 19 | fetch.mockResolvedValueOnce({ ok: true, json: jest.fn() }); 20 | 21 | const isValid = await validateAPIKey('foo'); 22 | 23 | expect(getOpenAIAPIKey).not.toHaveBeenCalled(); 24 | expect(fetch).toHaveBeenCalledWith('https://api.openai.com/v1/models', { 25 | method: 'GET', 26 | headers: { 27 | 'Content-Type': 'application/json', 28 | Authorization: 'Bearer foo', 29 | }, 30 | }); 31 | expect(isValid).toBe(true); 32 | }); 33 | 34 | it('returns false if the API key is invalid', async () => { 35 | fetch.mockResolvedValueOnce({ ok: false, json: jest.fn() }); 36 | 37 | const isValid = await validateAPIKey('foo'); 38 | 39 | expect(getOpenAIAPIKey).not.toHaveBeenCalled(); 40 | expect(fetch).toHaveBeenCalledWith('https://api.openai.com/v1/models', { 41 | method: 'GET', 42 | headers: { 43 | 'Content-Type': 'application/json', 44 | Authorization: 'Bearer foo', 45 | }, 46 | }); 47 | expect(isValid).toBe(false); 48 | }); 49 | }); 50 | 51 | describe('createChatCompletion', () => { 52 | it('returns the completion from the API', async () => { 53 | getOpenAIAPIKey.mockResolvedValueOnce('foo'); 54 | fetch.mockResolvedValueOnce({ 55 | ok: true, 56 | json: jest.fn().mockResolvedValueOnce({ 57 | choices: [{ message: { content: 'some completion' } }], 58 | }), 59 | }); 60 | 61 | const completion = await createChatCompletion(['some message']); 62 | 63 | expect(getOpenAIAPIKey).toHaveBeenCalled(); 64 | expect(fetch).toHaveBeenCalledWith( 65 | 'https://api.openai.com/v1/chat/completions', 66 | { 67 | method: 'POST', 68 | headers: { 69 | 'Content-Type': 'application/json', 70 | Authorization: 'Bearer foo', 71 | }, 72 | body: JSON.stringify({ 73 | model: 'gpt-3.5-turbo', 74 | messages: ['some message'], 75 | temperature: 0.5, 76 | }), 77 | }, 78 | ); 79 | expect(completion).toBe('some completion'); 80 | }); 81 | }); 82 | -------------------------------------------------------------------------------- /lib/constants/index.js: -------------------------------------------------------------------------------- 1 | export const OPENAI_API_BASE_URL = 'https://api.openai.com'; 2 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | import { generateCommitMessage } from './assistant/index.js'; 2 | import { writeCommitMessage } from './utils/commit-message.js'; 3 | import { withSpinner } from './utils/spinner.js'; 4 | 5 | export async function prepareCommitMessage(filePath, source) { 6 | if (source !== '') { 7 | // A message has been provided, nothing to do. 8 | return; 9 | } 10 | 11 | const message = await withSpinner( 12 | generateCommitMessage(), 13 | 'Generating commit message', 14 | ); 15 | if (message === null) { 16 | // The assistant failed to generate a message, nothing to do. 17 | return; 18 | } 19 | 20 | await writeCommitMessage(filePath, message); 21 | } 22 | -------------------------------------------------------------------------------- /lib/index.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('./assistant/index.js', () => ({ 4 | generateCommitMessage: jest.fn(), 5 | })); 6 | const { generateCommitMessage } = await import('./assistant/index.js'); 7 | jest.unstable_mockModule('./utils/commit-message.js', () => ({ 8 | writeCommitMessage: jest.fn(), 9 | })); 10 | const { writeCommitMessage } = await import('./utils/commit-message.js'); 11 | jest.unstable_mockModule('./utils/spinner.js', () => ({ 12 | withSpinner: jest.fn(), 13 | })); 14 | const { withSpinner } = await import('./utils/spinner.js'); 15 | 16 | const { prepareCommitMessage } = await import('./index.js'); 17 | 18 | describe('prepareCommitMessage', () => { 19 | it('generates and writes the commit message', async () => { 20 | generateCommitMessage.mockResolvedValueOnce('some message'); 21 | withSpinner.mockResolvedValueOnce('some message'); 22 | 23 | await prepareCommitMessage('some file path', ''); 24 | 25 | expect(generateCommitMessage).toHaveBeenCalled(); 26 | expect(writeCommitMessage).toHaveBeenCalledWith( 27 | 'some file path', 28 | 'some message', 29 | ); 30 | }); 31 | 32 | it('does nothing if a commit message has been provided', async () => { 33 | await prepareCommitMessage('some file path', 'message'); 34 | 35 | expect(generateCommitMessage).not.toHaveBeenCalled(); 36 | expect(writeCommitMessage).not.toHaveBeenCalled(); 37 | }); 38 | 39 | it('does nothing if the assistant fails to generate a commit message', async () => { 40 | generateCommitMessage.mockResolvedValueOnce(null); 41 | withSpinner.mockResolvedValueOnce(null); 42 | 43 | await prepareCommitMessage('some file path', ''); 44 | 45 | expect(generateCommitMessage).toHaveBeenCalled(); 46 | expect(writeCommitMessage).not.toHaveBeenCalled(); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /lib/utils/commit-message.js: -------------------------------------------------------------------------------- 1 | import { readFile, writeFile } from 'node:fs/promises'; 2 | 3 | export function sanitizeCommitMessage(message) { 4 | return ( 5 | message 6 | // Remove period at the end. 7 | .replace(/\.$/, '') 8 | ); 9 | } 10 | 11 | export function validateCommitMessage(message) { 12 | return message.length < 55; 13 | } 14 | 15 | export async function writeCommitMessage(filePath, message) { 16 | const template = await readFile(filePath, 'utf8'); 17 | const messageWithTemplate = `${message}\n${template}`; 18 | return writeFile(filePath, messageWithTemplate); 19 | } 20 | -------------------------------------------------------------------------------- /lib/utils/commit-message.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('node:fs/promises', () => ({ 4 | readFile: jest.fn(), 5 | writeFile: jest.fn(), 6 | })); 7 | const { readFile, writeFile } = await import('node:fs/promises'); 8 | 9 | const { sanitizeCommitMessage, validateCommitMessage, writeCommitMessage } = 10 | await import('./commit-message.js'); 11 | 12 | describe('sanitizeCommitMessage', () => { 13 | it('should remove a period from the end of the message', () => { 14 | const message = 'This is the way.'; 15 | const sanitizedMessage = sanitizeCommitMessage(message); 16 | expect(sanitizedMessage).toBe('This is the way'); 17 | }); 18 | 19 | it('should return the same message if there is no period at the end', () => { 20 | const message = 'A long time ago in a galaxy far, far away'; 21 | const sanitizedMessage = sanitizeCommitMessage(message); 22 | expect(sanitizedMessage).toBe(message); 23 | }); 24 | }); 25 | 26 | describe('validateCommitMessage', () => { 27 | it('should return true for messages shorter than 55 characters', () => { 28 | const message = 'Short message'; 29 | expect(validateCommitMessage(message)).toBe(true); 30 | }); 31 | 32 | it('should return false for messages that are 55 characters or longer', () => { 33 | const message = 'A'.repeat(55); 34 | expect(validateCommitMessage(message)).toBe(false); 35 | }); 36 | }); 37 | 38 | describe('writeCommitMessage', () => { 39 | it('should prepend the commit message to the file', async () => { 40 | const filePath = 'some file path'; 41 | const message = 'some message'; 42 | const template = 'some template'; 43 | const messageWithTemplate = `${message}\n${template}`; 44 | readFile.mockResolvedValueOnce(template); 45 | 46 | await writeCommitMessage(filePath, message); 47 | 48 | expect(readFile).toHaveBeenCalledWith(filePath, 'utf8'); 49 | expect(writeFile).toHaveBeenCalledWith(filePath, messageWithTemplate); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /lib/utils/git.js: -------------------------------------------------------------------------------- 1 | import { execa } from 'execa'; 2 | 3 | const contextLines = 5; 4 | const excludedFiles = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock']; 5 | 6 | export async function getCommitMessage(reference) { 7 | try { 8 | const { stdout } = await execa('git', [ 9 | 'log', 10 | '-1', // Get the latest commit. 11 | `--pretty=format:%s`, // Format to just the subject (commit message title). 12 | reference, 13 | ]); 14 | return stdout; 15 | } catch (err) { 16 | throw new Error(`Error fetching git commit message: ${err.message}`); 17 | } 18 | } 19 | 20 | export async function getGitDiff(reference) { 21 | try { 22 | const { stdout } = await execa('git', [ 23 | 'diff', 24 | `${reference}^..${reference}`, 25 | `--unified=${contextLines}`, 26 | '--', 27 | '.', 28 | ...excludedFiles.map((file) => `:!${file}`), 29 | ]); 30 | return stdout; 31 | } catch (err) { 32 | throw new Error(`Error fetching git diff: ${err.message}`); 33 | } 34 | } 35 | 36 | export async function getGitDiffStaged() { 37 | try { 38 | const { stdout } = await execa('git', [ 39 | 'diff', 40 | '--staged', 41 | `--unified=${contextLines}`, 42 | '--', 43 | '.', 44 | ...excludedFiles.map((file) => `:!${file}`), 45 | ]); 46 | return stdout; 47 | } catch (err) { 48 | throw new Error(`Error fetching git diff: ${err.message}`); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/utils/git.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('execa', () => ({ 4 | execa: jest.fn(), 5 | })); 6 | const { execa } = await import('execa'); 7 | 8 | const { getCommitMessage, getGitDiff, getGitDiffStaged } = await import( 9 | './git.js' 10 | ); 11 | 12 | describe('getCommitMessage', () => { 13 | it('should fetch the commit message successfully', async () => { 14 | const mockCommitMessage = 'some mocked commit message'; 15 | execa.mockResolvedValueOnce({ stdout: mockCommitMessage }); 16 | 17 | const result = await getCommitMessage('abcd123'); 18 | 19 | expect(execa).toHaveBeenCalledWith('git', [ 20 | 'log', 21 | '-1', 22 | '--pretty=format:%s', 23 | 'abcd123', 24 | ]); 25 | expect(result).toBe(mockCommitMessage); 26 | }); 27 | 28 | it('should throw an error if fetching git commit fails', async () => { 29 | const mockError = new Error('mocked error'); 30 | execa.mockRejectedValueOnce(mockError); 31 | 32 | await expect(getCommitMessage('abcd123')).rejects.toThrow( 33 | 'Error fetching git commit message: mocked error', 34 | ); 35 | }); 36 | }); 37 | 38 | describe('getGitDiff', () => { 39 | it('should fetch the git diff successfully', async () => { 40 | const mockDiff = 'some mocked git diff output'; 41 | execa.mockResolvedValueOnce({ stdout: mockDiff }); 42 | 43 | const result = await getGitDiff('abcd123'); 44 | 45 | expect(execa).toHaveBeenCalledWith('git', [ 46 | 'diff', 47 | 'abcd123^..abcd123', 48 | `--unified=5`, 49 | '--', 50 | '.', 51 | ':!package-lock.json', 52 | ':!pnpm-lock.yaml', 53 | ':!yarn.lock', 54 | ]); 55 | expect(result).toBe(mockDiff); 56 | }); 57 | 58 | it('should throw an error if fetching git diff fails', async () => { 59 | const mockError = new Error('mocked error'); 60 | execa.mockRejectedValueOnce(mockError); 61 | 62 | await expect(getGitDiff('abcd123')).rejects.toThrow( 63 | 'Error fetching git diff: mocked error', 64 | ); 65 | }); 66 | }); 67 | 68 | describe('getGitDiffStaged', () => { 69 | it('should fetch the git diff successfully', async () => { 70 | const mockDiff = 'some mocked git diff output'; 71 | execa.mockResolvedValueOnce({ stdout: mockDiff }); 72 | 73 | const result = await getGitDiffStaged(); 74 | 75 | expect(execa).toHaveBeenCalledWith('git', [ 76 | 'diff', 77 | '--staged', 78 | `--unified=5`, 79 | '--', 80 | '.', 81 | ':!package-lock.json', 82 | ':!pnpm-lock.yaml', 83 | ':!yarn.lock', 84 | ]); 85 | expect(result).toBe(mockDiff); 86 | }); 87 | 88 | it('should throw an error if fetching git diff fails', async () => { 89 | const mockError = new Error('mocked error'); 90 | execa.mockRejectedValueOnce(mockError); 91 | 92 | await expect(getGitDiffStaged()).rejects.toThrow( 93 | 'Error fetching git diff: mocked error', 94 | ); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /lib/utils/openai-api-key.js: -------------------------------------------------------------------------------- 1 | import { approve, fill, reject } from 'git-credential-node'; 2 | import inquirer from 'inquirer'; 3 | 4 | import { validateAPIKey } from '../clients/openai-api.js'; 5 | import { OPENAI_API_BASE_URL } from '../constants/index.js'; 6 | 7 | async function prompt() { 8 | const { apiKey } = await inquirer.prompt([ 9 | { 10 | name: 'apiKey', 11 | message: 'Enter your OpenAI API key:', 12 | validate: async (input) => { 13 | if (input.length === 0) { 14 | return 'Required.'; 15 | } 16 | 17 | if (!(await validateAPIKey(input))) { 18 | return 'Invalid API key.'; 19 | } 20 | 21 | return true; 22 | }, 23 | }, 24 | ]); 25 | return apiKey; 26 | } 27 | 28 | export async function getOpenAIAPIKey() { 29 | const credential = await fill(OPENAI_API_BASE_URL); 30 | if (credential) { 31 | const apiKey = credential.password; 32 | 33 | const isValid = await validateAPIKey(apiKey); 34 | if (!isValid) { 35 | // An invalid API key was stored, reject it and ask for a new one. 36 | await reject(OPENAI_API_BASE_URL); 37 | return getOpenAIAPIKey(); 38 | } 39 | 40 | return apiKey; 41 | } 42 | 43 | const apiKey = await prompt(); 44 | if (!apiKey) { 45 | // The user has dismissed the prompt. 46 | return null; 47 | } 48 | 49 | // Store the API key. 50 | await approve({ 51 | url: OPENAI_API_BASE_URL, 52 | username: 'waldo', // Not used. 53 | password: apiKey, 54 | }); 55 | 56 | return apiKey; 57 | } 58 | -------------------------------------------------------------------------------- /lib/utils/openai-api-key.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | jest.unstable_mockModule('git-credential-node', () => ({ 4 | approve: jest.fn(), 5 | fill: jest.fn(), 6 | reject: jest.fn(), 7 | })); 8 | const { approve, fill, reject } = await import('git-credential-node'); 9 | jest.unstable_mockModule('inquirer', () => ({ 10 | __esModule: true, 11 | default: { 12 | prompt: jest.fn(), 13 | }, 14 | })); 15 | const { default: inquirer } = await import('inquirer'); 16 | jest.unstable_mockModule('../clients/openai-api.js', () => ({ 17 | validateAPIKey: jest.fn(), 18 | })); 19 | const { validateAPIKey } = await import('../clients/openai-api.js'); 20 | 21 | const { getOpenAIAPIKey } = await import('./openai-api-key.js'); 22 | 23 | describe('getOpenAIAPIKey', () => { 24 | it('returns the API key from the credential helper', async () => { 25 | fill.mockResolvedValueOnce({ password: 'foo' }); 26 | validateAPIKey.mockResolvedValueOnce(true); 27 | 28 | const apiKey = await getOpenAIAPIKey(); 29 | 30 | expect(fill).toHaveBeenCalledWith('https://api.openai.com'); 31 | expect(validateAPIKey).toHaveBeenCalledWith('foo'); 32 | expect(apiKey).toBe('foo'); 33 | expect(inquirer.prompt).not.toHaveBeenCalled(); 34 | expect(approve).not.toHaveBeenCalled(); 35 | }); 36 | 37 | it('rejects an invalid API key from the credential helper', async () => { 38 | fill 39 | .mockResolvedValueOnce({ password: 'invalid' }) 40 | .mockResolvedValueOnce({ password: 'foo' }); 41 | validateAPIKey.mockResolvedValueOnce(false).mockResolvedValueOnce(true); 42 | 43 | const apiKey = await getOpenAIAPIKey(); 44 | 45 | expect(fill).toHaveBeenCalledWith('https://api.openai.com'); 46 | expect(validateAPIKey).toHaveBeenNthCalledWith(1, 'invalid'); 47 | expect(reject).toHaveBeenCalledWith('https://api.openai.com'); 48 | expect(validateAPIKey).toHaveBeenNthCalledWith(2, 'foo'); 49 | expect(apiKey).toBe('foo'); 50 | }); 51 | 52 | it('prompts the user for an API key if the credential helper does not have one', async () => { 53 | fill.mockResolvedValueOnce(null); 54 | inquirer.prompt.mockResolvedValueOnce({ apiKey: 'foo' }); 55 | 56 | const apiKey = await getOpenAIAPIKey(); 57 | 58 | expect(fill).toHaveBeenCalledWith('https://api.openai.com'); 59 | expect(inquirer.prompt).toHaveBeenCalled(); 60 | expect(approve).toHaveBeenCalledWith({ 61 | url: 'https://api.openai.com', 62 | username: 'waldo', 63 | password: 'foo', 64 | }); 65 | expect(apiKey).toBe('foo'); 66 | }); 67 | 68 | it('returns null if the user dismisses the prompt', async () => { 69 | fill.mockResolvedValueOnce(null); 70 | inquirer.prompt.mockResolvedValueOnce({ apiKey: undefined }); 71 | 72 | const apiKey = await getOpenAIAPIKey(); 73 | 74 | expect(fill).toHaveBeenCalledWith('https://api.openai.com'); 75 | expect(inquirer.prompt).toHaveBeenCalled(); 76 | expect(approve).not.toHaveBeenCalled(); 77 | expect(apiKey).toBeNull(); 78 | }); 79 | }); 80 | -------------------------------------------------------------------------------- /lib/utils/spinner.js: -------------------------------------------------------------------------------- 1 | import ora from 'ora'; 2 | 3 | export async function withSpinner(promise, message) { 4 | const spinner = ora(message).start(); 5 | try { 6 | return await promise; 7 | } finally { 8 | spinner.stop(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /lib/utils/spinner.test.js: -------------------------------------------------------------------------------- 1 | import { jest } from '@jest/globals'; 2 | 3 | const mockSpinner = { 4 | start: jest.fn(() => mockSpinner), 5 | stop: jest.fn(() => mockSpinner), 6 | }; 7 | jest.unstable_mockModule('ora', () => ({ 8 | __esModule: true, 9 | default: jest.fn(() => mockSpinner), 10 | })); 11 | const { default: ora } = await import('ora'); 12 | 13 | const { withSpinner } = await import('./spinner.js'); 14 | 15 | describe('withSpinner', () => { 16 | it('should start and stop the spinner', async () => { 17 | const mockPromise = Promise.resolve('some resolved value'); 18 | 19 | const result = await withSpinner(mockPromise, 'some message'); 20 | 21 | expect(ora).toHaveBeenCalledWith('some message'); 22 | expect(mockSpinner.start).toHaveBeenCalled(); 23 | expect(mockSpinner.stop).toHaveBeenCalled(); 24 | expect(result).toBe('some resolved value'); 25 | }); 26 | 27 | it('should stop the spinner even if promise rejects', async () => { 28 | const mockError = new Error('mocked error'); 29 | const mockPromise = Promise.reject(mockError); 30 | 31 | await expect(withSpinner(mockPromise, 'some message')).rejects.toThrow( 32 | 'mocked error', 33 | ); 34 | expect(mockSpinner.stop).toHaveBeenCalled(); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "git-scribe", 3 | "version": "0.3.0", 4 | "description": "AI copilot for crafting insightful Git commit messages", 5 | "bin": { 6 | "git-scribe": "./bin/git-scribe.js" 7 | }, 8 | "scripts": { 9 | "lint": "prettier --check '{*,**/*}.{js,json}' && eslint .", 10 | "lint:fix": "prettier --write '{*,**/*}.{js,json}' && eslint --fix .", 11 | "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js", 12 | "test:cov": "pnpm run test --coverage" 13 | }, 14 | "keywords": [ 15 | "ai", 16 | "copilot", 17 | "git", 18 | "commit", 19 | "hook" 20 | ], 21 | "author": "Matias Olivera ", 22 | "license": "MIT", 23 | "files": [ 24 | "bin", 25 | "lib" 26 | ], 27 | "type": "module", 28 | "engines": { 29 | "node": ">=16" 30 | }, 31 | "devDependencies": { 32 | "eslint": "^8.46.0", 33 | "eslint-config-prettier": "^9.0.0", 34 | "husky": "^8.0.3", 35 | "jest": "^29.6.2", 36 | "prettier": "3.0.1" 37 | }, 38 | "dependencies": { 39 | "execa": "^7.2.0", 40 | "git-credential-node": "^1.1.0", 41 | "inquirer": "^9.2.10", 42 | "node-fetch": "^3.3.2", 43 | "ora": "^7.0.1" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | execa: 9 | specifier: ^7.2.0 10 | version: 7.2.0 11 | git-credential-node: 12 | specifier: ^1.1.0 13 | version: 1.1.0 14 | inquirer: 15 | specifier: ^9.2.10 16 | version: 9.2.10 17 | node-fetch: 18 | specifier: ^3.3.2 19 | version: 3.3.2 20 | ora: 21 | specifier: ^7.0.1 22 | version: 7.0.1 23 | 24 | devDependencies: 25 | eslint: 26 | specifier: ^8.46.0 27 | version: 8.46.0 28 | eslint-config-prettier: 29 | specifier: ^9.0.0 30 | version: 9.0.0(eslint@8.46.0) 31 | husky: 32 | specifier: ^8.0.3 33 | version: 8.0.3 34 | jest: 35 | specifier: ^29.6.2 36 | version: 29.6.2 37 | prettier: 38 | specifier: 3.0.1 39 | version: 3.0.1 40 | 41 | packages: 42 | 43 | /@aashutoshrathi/word-wrap@1.2.6: 44 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 45 | engines: {node: '>=0.10.0'} 46 | dev: true 47 | 48 | /@ampproject/remapping@2.2.1: 49 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 50 | engines: {node: '>=6.0.0'} 51 | dependencies: 52 | '@jridgewell/gen-mapping': 0.3.3 53 | '@jridgewell/trace-mapping': 0.3.19 54 | dev: true 55 | 56 | /@babel/code-frame@7.22.10: 57 | resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} 58 | engines: {node: '>=6.9.0'} 59 | dependencies: 60 | '@babel/highlight': 7.22.10 61 | chalk: 2.4.2 62 | dev: true 63 | 64 | /@babel/compat-data@7.22.9: 65 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 66 | engines: {node: '>=6.9.0'} 67 | dev: true 68 | 69 | /@babel/core@7.22.10: 70 | resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} 71 | engines: {node: '>=6.9.0'} 72 | dependencies: 73 | '@ampproject/remapping': 2.2.1 74 | '@babel/code-frame': 7.22.10 75 | '@babel/generator': 7.22.10 76 | '@babel/helper-compilation-targets': 7.22.10 77 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) 78 | '@babel/helpers': 7.22.10 79 | '@babel/parser': 7.22.10 80 | '@babel/template': 7.22.5 81 | '@babel/traverse': 7.22.10 82 | '@babel/types': 7.22.10 83 | convert-source-map: 1.9.0 84 | debug: 4.3.4 85 | gensync: 1.0.0-beta.2 86 | json5: 2.2.3 87 | semver: 6.3.1 88 | transitivePeerDependencies: 89 | - supports-color 90 | dev: true 91 | 92 | /@babel/generator@7.22.10: 93 | resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} 94 | engines: {node: '>=6.9.0'} 95 | dependencies: 96 | '@babel/types': 7.22.10 97 | '@jridgewell/gen-mapping': 0.3.3 98 | '@jridgewell/trace-mapping': 0.3.19 99 | jsesc: 2.5.2 100 | dev: true 101 | 102 | /@babel/helper-compilation-targets@7.22.10: 103 | resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} 104 | engines: {node: '>=6.9.0'} 105 | dependencies: 106 | '@babel/compat-data': 7.22.9 107 | '@babel/helper-validator-option': 7.22.5 108 | browserslist: 4.21.10 109 | lru-cache: 5.1.1 110 | semver: 6.3.1 111 | dev: true 112 | 113 | /@babel/helper-environment-visitor@7.22.5: 114 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 115 | engines: {node: '>=6.9.0'} 116 | dev: true 117 | 118 | /@babel/helper-function-name@7.22.5: 119 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 120 | engines: {node: '>=6.9.0'} 121 | dependencies: 122 | '@babel/template': 7.22.5 123 | '@babel/types': 7.22.10 124 | dev: true 125 | 126 | /@babel/helper-hoist-variables@7.22.5: 127 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 128 | engines: {node: '>=6.9.0'} 129 | dependencies: 130 | '@babel/types': 7.22.10 131 | dev: true 132 | 133 | /@babel/helper-module-imports@7.22.5: 134 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 135 | engines: {node: '>=6.9.0'} 136 | dependencies: 137 | '@babel/types': 7.22.10 138 | dev: true 139 | 140 | /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): 141 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 142 | engines: {node: '>=6.9.0'} 143 | peerDependencies: 144 | '@babel/core': ^7.0.0 145 | dependencies: 146 | '@babel/core': 7.22.10 147 | '@babel/helper-environment-visitor': 7.22.5 148 | '@babel/helper-module-imports': 7.22.5 149 | '@babel/helper-simple-access': 7.22.5 150 | '@babel/helper-split-export-declaration': 7.22.6 151 | '@babel/helper-validator-identifier': 7.22.5 152 | dev: true 153 | 154 | /@babel/helper-plugin-utils@7.22.5: 155 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 156 | engines: {node: '>=6.9.0'} 157 | dev: true 158 | 159 | /@babel/helper-simple-access@7.22.5: 160 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 161 | engines: {node: '>=6.9.0'} 162 | dependencies: 163 | '@babel/types': 7.22.10 164 | dev: true 165 | 166 | /@babel/helper-split-export-declaration@7.22.6: 167 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 168 | engines: {node: '>=6.9.0'} 169 | dependencies: 170 | '@babel/types': 7.22.10 171 | dev: true 172 | 173 | /@babel/helper-string-parser@7.22.5: 174 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 175 | engines: {node: '>=6.9.0'} 176 | dev: true 177 | 178 | /@babel/helper-validator-identifier@7.22.5: 179 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 180 | engines: {node: '>=6.9.0'} 181 | dev: true 182 | 183 | /@babel/helper-validator-option@7.22.5: 184 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 185 | engines: {node: '>=6.9.0'} 186 | dev: true 187 | 188 | /@babel/helpers@7.22.10: 189 | resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} 190 | engines: {node: '>=6.9.0'} 191 | dependencies: 192 | '@babel/template': 7.22.5 193 | '@babel/traverse': 7.22.10 194 | '@babel/types': 7.22.10 195 | transitivePeerDependencies: 196 | - supports-color 197 | dev: true 198 | 199 | /@babel/highlight@7.22.10: 200 | resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} 201 | engines: {node: '>=6.9.0'} 202 | dependencies: 203 | '@babel/helper-validator-identifier': 7.22.5 204 | chalk: 2.4.2 205 | js-tokens: 4.0.0 206 | dev: true 207 | 208 | /@babel/parser@7.22.10: 209 | resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} 210 | engines: {node: '>=6.0.0'} 211 | hasBin: true 212 | dependencies: 213 | '@babel/types': 7.22.10 214 | dev: true 215 | 216 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): 217 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 218 | peerDependencies: 219 | '@babel/core': ^7.0.0-0 220 | dependencies: 221 | '@babel/core': 7.22.10 222 | '@babel/helper-plugin-utils': 7.22.5 223 | dev: true 224 | 225 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10): 226 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 227 | peerDependencies: 228 | '@babel/core': ^7.0.0-0 229 | dependencies: 230 | '@babel/core': 7.22.10 231 | '@babel/helper-plugin-utils': 7.22.5 232 | dev: true 233 | 234 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): 235 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 236 | peerDependencies: 237 | '@babel/core': ^7.0.0-0 238 | dependencies: 239 | '@babel/core': 7.22.10 240 | '@babel/helper-plugin-utils': 7.22.5 241 | dev: true 242 | 243 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): 244 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 245 | peerDependencies: 246 | '@babel/core': ^7.0.0-0 247 | dependencies: 248 | '@babel/core': 7.22.10 249 | '@babel/helper-plugin-utils': 7.22.5 250 | dev: true 251 | 252 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): 253 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 254 | peerDependencies: 255 | '@babel/core': ^7.0.0-0 256 | dependencies: 257 | '@babel/core': 7.22.10 258 | '@babel/helper-plugin-utils': 7.22.5 259 | dev: true 260 | 261 | /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.10): 262 | resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} 263 | engines: {node: '>=6.9.0'} 264 | peerDependencies: 265 | '@babel/core': ^7.0.0-0 266 | dependencies: 267 | '@babel/core': 7.22.10 268 | '@babel/helper-plugin-utils': 7.22.5 269 | dev: true 270 | 271 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): 272 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 273 | peerDependencies: 274 | '@babel/core': ^7.0.0-0 275 | dependencies: 276 | '@babel/core': 7.22.10 277 | '@babel/helper-plugin-utils': 7.22.5 278 | dev: true 279 | 280 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): 281 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 282 | peerDependencies: 283 | '@babel/core': ^7.0.0-0 284 | dependencies: 285 | '@babel/core': 7.22.10 286 | '@babel/helper-plugin-utils': 7.22.5 287 | dev: true 288 | 289 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): 290 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 291 | peerDependencies: 292 | '@babel/core': ^7.0.0-0 293 | dependencies: 294 | '@babel/core': 7.22.10 295 | '@babel/helper-plugin-utils': 7.22.5 296 | dev: true 297 | 298 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): 299 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 300 | peerDependencies: 301 | '@babel/core': ^7.0.0-0 302 | dependencies: 303 | '@babel/core': 7.22.10 304 | '@babel/helper-plugin-utils': 7.22.5 305 | dev: true 306 | 307 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): 308 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 309 | peerDependencies: 310 | '@babel/core': ^7.0.0-0 311 | dependencies: 312 | '@babel/core': 7.22.10 313 | '@babel/helper-plugin-utils': 7.22.5 314 | dev: true 315 | 316 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): 317 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 318 | peerDependencies: 319 | '@babel/core': ^7.0.0-0 320 | dependencies: 321 | '@babel/core': 7.22.10 322 | '@babel/helper-plugin-utils': 7.22.5 323 | dev: true 324 | 325 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): 326 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 327 | engines: {node: '>=6.9.0'} 328 | peerDependencies: 329 | '@babel/core': ^7.0.0-0 330 | dependencies: 331 | '@babel/core': 7.22.10 332 | '@babel/helper-plugin-utils': 7.22.5 333 | dev: true 334 | 335 | /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.10): 336 | resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} 337 | engines: {node: '>=6.9.0'} 338 | peerDependencies: 339 | '@babel/core': ^7.0.0-0 340 | dependencies: 341 | '@babel/core': 7.22.10 342 | '@babel/helper-plugin-utils': 7.22.5 343 | dev: true 344 | 345 | /@babel/template@7.22.5: 346 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 347 | engines: {node: '>=6.9.0'} 348 | dependencies: 349 | '@babel/code-frame': 7.22.10 350 | '@babel/parser': 7.22.10 351 | '@babel/types': 7.22.10 352 | dev: true 353 | 354 | /@babel/traverse@7.22.10: 355 | resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} 356 | engines: {node: '>=6.9.0'} 357 | dependencies: 358 | '@babel/code-frame': 7.22.10 359 | '@babel/generator': 7.22.10 360 | '@babel/helper-environment-visitor': 7.22.5 361 | '@babel/helper-function-name': 7.22.5 362 | '@babel/helper-hoist-variables': 7.22.5 363 | '@babel/helper-split-export-declaration': 7.22.6 364 | '@babel/parser': 7.22.10 365 | '@babel/types': 7.22.10 366 | debug: 4.3.4 367 | globals: 11.12.0 368 | transitivePeerDependencies: 369 | - supports-color 370 | dev: true 371 | 372 | /@babel/types@7.22.10: 373 | resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} 374 | engines: {node: '>=6.9.0'} 375 | dependencies: 376 | '@babel/helper-string-parser': 7.22.5 377 | '@babel/helper-validator-identifier': 7.22.5 378 | to-fast-properties: 2.0.0 379 | dev: true 380 | 381 | /@bcoe/v8-coverage@0.2.3: 382 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 383 | dev: true 384 | 385 | /@eslint-community/eslint-utils@4.4.0(eslint@8.46.0): 386 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 387 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 388 | peerDependencies: 389 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 390 | dependencies: 391 | eslint: 8.46.0 392 | eslint-visitor-keys: 3.4.2 393 | dev: true 394 | 395 | /@eslint-community/regexpp@4.6.2: 396 | resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} 397 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 398 | dev: true 399 | 400 | /@eslint/eslintrc@2.1.1: 401 | resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==} 402 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 403 | dependencies: 404 | ajv: 6.12.6 405 | debug: 4.3.4 406 | espree: 9.6.1 407 | globals: 13.20.0 408 | ignore: 5.2.4 409 | import-fresh: 3.3.0 410 | js-yaml: 4.1.0 411 | minimatch: 3.1.2 412 | strip-json-comments: 3.1.1 413 | transitivePeerDependencies: 414 | - supports-color 415 | dev: true 416 | 417 | /@eslint/js@8.46.0: 418 | resolution: {integrity: sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==} 419 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 420 | dev: true 421 | 422 | /@humanwhocodes/config-array@0.11.10: 423 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} 424 | engines: {node: '>=10.10.0'} 425 | dependencies: 426 | '@humanwhocodes/object-schema': 1.2.1 427 | debug: 4.3.4 428 | minimatch: 3.1.2 429 | transitivePeerDependencies: 430 | - supports-color 431 | dev: true 432 | 433 | /@humanwhocodes/module-importer@1.0.1: 434 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 435 | engines: {node: '>=12.22'} 436 | dev: true 437 | 438 | /@humanwhocodes/object-schema@1.2.1: 439 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 440 | dev: true 441 | 442 | /@istanbuljs/load-nyc-config@1.1.0: 443 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 444 | engines: {node: '>=8'} 445 | dependencies: 446 | camelcase: 5.3.1 447 | find-up: 4.1.0 448 | get-package-type: 0.1.0 449 | js-yaml: 3.14.1 450 | resolve-from: 5.0.0 451 | dev: true 452 | 453 | /@istanbuljs/schema@0.1.3: 454 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 455 | engines: {node: '>=8'} 456 | dev: true 457 | 458 | /@jest/console@29.6.2: 459 | resolution: {integrity: sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==} 460 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 461 | dependencies: 462 | '@jest/types': 29.6.1 463 | '@types/node': 20.4.9 464 | chalk: 4.1.2 465 | jest-message-util: 29.6.2 466 | jest-util: 29.6.2 467 | slash: 3.0.0 468 | dev: true 469 | 470 | /@jest/core@29.6.2: 471 | resolution: {integrity: sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==} 472 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 473 | peerDependencies: 474 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 475 | peerDependenciesMeta: 476 | node-notifier: 477 | optional: true 478 | dependencies: 479 | '@jest/console': 29.6.2 480 | '@jest/reporters': 29.6.2 481 | '@jest/test-result': 29.6.2 482 | '@jest/transform': 29.6.2 483 | '@jest/types': 29.6.1 484 | '@types/node': 20.4.9 485 | ansi-escapes: 4.3.2 486 | chalk: 4.1.2 487 | ci-info: 3.8.0 488 | exit: 0.1.2 489 | graceful-fs: 4.2.11 490 | jest-changed-files: 29.5.0 491 | jest-config: 29.6.2(@types/node@20.4.9) 492 | jest-haste-map: 29.6.2 493 | jest-message-util: 29.6.2 494 | jest-regex-util: 29.4.3 495 | jest-resolve: 29.6.2 496 | jest-resolve-dependencies: 29.6.2 497 | jest-runner: 29.6.2 498 | jest-runtime: 29.6.2 499 | jest-snapshot: 29.6.2 500 | jest-util: 29.6.2 501 | jest-validate: 29.6.2 502 | jest-watcher: 29.6.2 503 | micromatch: 4.0.5 504 | pretty-format: 29.6.2 505 | slash: 3.0.0 506 | strip-ansi: 6.0.1 507 | transitivePeerDependencies: 508 | - babel-plugin-macros 509 | - supports-color 510 | - ts-node 511 | dev: true 512 | 513 | /@jest/environment@29.6.2: 514 | resolution: {integrity: sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==} 515 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 516 | dependencies: 517 | '@jest/fake-timers': 29.6.2 518 | '@jest/types': 29.6.1 519 | '@types/node': 20.4.9 520 | jest-mock: 29.6.2 521 | dev: true 522 | 523 | /@jest/expect-utils@29.6.2: 524 | resolution: {integrity: sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==} 525 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 526 | dependencies: 527 | jest-get-type: 29.4.3 528 | dev: true 529 | 530 | /@jest/expect@29.6.2: 531 | resolution: {integrity: sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==} 532 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 533 | dependencies: 534 | expect: 29.6.2 535 | jest-snapshot: 29.6.2 536 | transitivePeerDependencies: 537 | - supports-color 538 | dev: true 539 | 540 | /@jest/fake-timers@29.6.2: 541 | resolution: {integrity: sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==} 542 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 543 | dependencies: 544 | '@jest/types': 29.6.1 545 | '@sinonjs/fake-timers': 10.3.0 546 | '@types/node': 20.4.9 547 | jest-message-util: 29.6.2 548 | jest-mock: 29.6.2 549 | jest-util: 29.6.2 550 | dev: true 551 | 552 | /@jest/globals@29.6.2: 553 | resolution: {integrity: sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==} 554 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 555 | dependencies: 556 | '@jest/environment': 29.6.2 557 | '@jest/expect': 29.6.2 558 | '@jest/types': 29.6.1 559 | jest-mock: 29.6.2 560 | transitivePeerDependencies: 561 | - supports-color 562 | dev: true 563 | 564 | /@jest/reporters@29.6.2: 565 | resolution: {integrity: sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==} 566 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 567 | peerDependencies: 568 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 569 | peerDependenciesMeta: 570 | node-notifier: 571 | optional: true 572 | dependencies: 573 | '@bcoe/v8-coverage': 0.2.3 574 | '@jest/console': 29.6.2 575 | '@jest/test-result': 29.6.2 576 | '@jest/transform': 29.6.2 577 | '@jest/types': 29.6.1 578 | '@jridgewell/trace-mapping': 0.3.19 579 | '@types/node': 20.4.9 580 | chalk: 4.1.2 581 | collect-v8-coverage: 1.0.2 582 | exit: 0.1.2 583 | glob: 7.2.3 584 | graceful-fs: 4.2.11 585 | istanbul-lib-coverage: 3.2.0 586 | istanbul-lib-instrument: 5.2.1 587 | istanbul-lib-report: 3.0.1 588 | istanbul-lib-source-maps: 4.0.1 589 | istanbul-reports: 3.1.6 590 | jest-message-util: 29.6.2 591 | jest-util: 29.6.2 592 | jest-worker: 29.6.2 593 | slash: 3.0.0 594 | string-length: 4.0.2 595 | strip-ansi: 6.0.1 596 | v8-to-istanbul: 9.1.0 597 | transitivePeerDependencies: 598 | - supports-color 599 | dev: true 600 | 601 | /@jest/schemas@29.6.0: 602 | resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} 603 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 604 | dependencies: 605 | '@sinclair/typebox': 0.27.8 606 | dev: true 607 | 608 | /@jest/source-map@29.6.0: 609 | resolution: {integrity: sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==} 610 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 611 | dependencies: 612 | '@jridgewell/trace-mapping': 0.3.19 613 | callsites: 3.1.0 614 | graceful-fs: 4.2.11 615 | dev: true 616 | 617 | /@jest/test-result@29.6.2: 618 | resolution: {integrity: sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==} 619 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 620 | dependencies: 621 | '@jest/console': 29.6.2 622 | '@jest/types': 29.6.1 623 | '@types/istanbul-lib-coverage': 2.0.4 624 | collect-v8-coverage: 1.0.2 625 | dev: true 626 | 627 | /@jest/test-sequencer@29.6.2: 628 | resolution: {integrity: sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==} 629 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 630 | dependencies: 631 | '@jest/test-result': 29.6.2 632 | graceful-fs: 4.2.11 633 | jest-haste-map: 29.6.2 634 | slash: 3.0.0 635 | dev: true 636 | 637 | /@jest/transform@29.6.2: 638 | resolution: {integrity: sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==} 639 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 640 | dependencies: 641 | '@babel/core': 7.22.10 642 | '@jest/types': 29.6.1 643 | '@jridgewell/trace-mapping': 0.3.19 644 | babel-plugin-istanbul: 6.1.1 645 | chalk: 4.1.2 646 | convert-source-map: 2.0.0 647 | fast-json-stable-stringify: 2.1.0 648 | graceful-fs: 4.2.11 649 | jest-haste-map: 29.6.2 650 | jest-regex-util: 29.4.3 651 | jest-util: 29.6.2 652 | micromatch: 4.0.5 653 | pirates: 4.0.6 654 | slash: 3.0.0 655 | write-file-atomic: 4.0.2 656 | transitivePeerDependencies: 657 | - supports-color 658 | dev: true 659 | 660 | /@jest/types@29.6.1: 661 | resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} 662 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 663 | dependencies: 664 | '@jest/schemas': 29.6.0 665 | '@types/istanbul-lib-coverage': 2.0.4 666 | '@types/istanbul-reports': 3.0.1 667 | '@types/node': 20.4.9 668 | '@types/yargs': 17.0.24 669 | chalk: 4.1.2 670 | dev: true 671 | 672 | /@jridgewell/gen-mapping@0.3.3: 673 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 674 | engines: {node: '>=6.0.0'} 675 | dependencies: 676 | '@jridgewell/set-array': 1.1.2 677 | '@jridgewell/sourcemap-codec': 1.4.15 678 | '@jridgewell/trace-mapping': 0.3.19 679 | dev: true 680 | 681 | /@jridgewell/resolve-uri@3.1.1: 682 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 683 | engines: {node: '>=6.0.0'} 684 | dev: true 685 | 686 | /@jridgewell/set-array@1.1.2: 687 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 688 | engines: {node: '>=6.0.0'} 689 | dev: true 690 | 691 | /@jridgewell/sourcemap-codec@1.4.15: 692 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 693 | dev: true 694 | 695 | /@jridgewell/trace-mapping@0.3.19: 696 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 697 | dependencies: 698 | '@jridgewell/resolve-uri': 3.1.1 699 | '@jridgewell/sourcemap-codec': 1.4.15 700 | dev: true 701 | 702 | /@ljharb/through@2.3.9: 703 | resolution: {integrity: sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==} 704 | engines: {node: '>= 0.4'} 705 | dev: false 706 | 707 | /@nodelib/fs.scandir@2.1.5: 708 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 709 | engines: {node: '>= 8'} 710 | dependencies: 711 | '@nodelib/fs.stat': 2.0.5 712 | run-parallel: 1.2.0 713 | dev: true 714 | 715 | /@nodelib/fs.stat@2.0.5: 716 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 717 | engines: {node: '>= 8'} 718 | dev: true 719 | 720 | /@nodelib/fs.walk@1.2.8: 721 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 722 | engines: {node: '>= 8'} 723 | dependencies: 724 | '@nodelib/fs.scandir': 2.1.5 725 | fastq: 1.15.0 726 | dev: true 727 | 728 | /@sinclair/typebox@0.27.8: 729 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 730 | dev: true 731 | 732 | /@sinonjs/commons@3.0.0: 733 | resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} 734 | dependencies: 735 | type-detect: 4.0.8 736 | dev: true 737 | 738 | /@sinonjs/fake-timers@10.3.0: 739 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 740 | dependencies: 741 | '@sinonjs/commons': 3.0.0 742 | dev: true 743 | 744 | /@types/babel__core@7.20.1: 745 | resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} 746 | dependencies: 747 | '@babel/parser': 7.22.10 748 | '@babel/types': 7.22.10 749 | '@types/babel__generator': 7.6.4 750 | '@types/babel__template': 7.4.1 751 | '@types/babel__traverse': 7.20.1 752 | dev: true 753 | 754 | /@types/babel__generator@7.6.4: 755 | resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} 756 | dependencies: 757 | '@babel/types': 7.22.10 758 | dev: true 759 | 760 | /@types/babel__template@7.4.1: 761 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} 762 | dependencies: 763 | '@babel/parser': 7.22.10 764 | '@babel/types': 7.22.10 765 | dev: true 766 | 767 | /@types/babel__traverse@7.20.1: 768 | resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} 769 | dependencies: 770 | '@babel/types': 7.22.10 771 | dev: true 772 | 773 | /@types/graceful-fs@4.1.6: 774 | resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} 775 | dependencies: 776 | '@types/node': 20.4.9 777 | dev: true 778 | 779 | /@types/istanbul-lib-coverage@2.0.4: 780 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 781 | dev: true 782 | 783 | /@types/istanbul-lib-report@3.0.0: 784 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 785 | dependencies: 786 | '@types/istanbul-lib-coverage': 2.0.4 787 | dev: true 788 | 789 | /@types/istanbul-reports@3.0.1: 790 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 791 | dependencies: 792 | '@types/istanbul-lib-report': 3.0.0 793 | dev: true 794 | 795 | /@types/node@20.4.9: 796 | resolution: {integrity: sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==} 797 | dev: true 798 | 799 | /@types/stack-utils@2.0.1: 800 | resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} 801 | dev: true 802 | 803 | /@types/yargs-parser@21.0.0: 804 | resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} 805 | dev: true 806 | 807 | /@types/yargs@17.0.24: 808 | resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} 809 | dependencies: 810 | '@types/yargs-parser': 21.0.0 811 | dev: true 812 | 813 | /acorn-jsx@5.3.2(acorn@8.10.0): 814 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 815 | peerDependencies: 816 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 817 | dependencies: 818 | acorn: 8.10.0 819 | dev: true 820 | 821 | /acorn@8.10.0: 822 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 823 | engines: {node: '>=0.4.0'} 824 | hasBin: true 825 | dev: true 826 | 827 | /ajv@6.12.6: 828 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 829 | dependencies: 830 | fast-deep-equal: 3.1.3 831 | fast-json-stable-stringify: 2.1.0 832 | json-schema-traverse: 0.4.1 833 | uri-js: 4.4.1 834 | dev: true 835 | 836 | /ansi-escapes@4.3.2: 837 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 838 | engines: {node: '>=8'} 839 | dependencies: 840 | type-fest: 0.21.3 841 | 842 | /ansi-regex@5.0.1: 843 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 844 | engines: {node: '>=8'} 845 | 846 | /ansi-regex@6.0.1: 847 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 848 | engines: {node: '>=12'} 849 | dev: false 850 | 851 | /ansi-styles@3.2.1: 852 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 853 | engines: {node: '>=4'} 854 | dependencies: 855 | color-convert: 1.9.3 856 | dev: true 857 | 858 | /ansi-styles@4.3.0: 859 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 860 | engines: {node: '>=8'} 861 | dependencies: 862 | color-convert: 2.0.1 863 | 864 | /ansi-styles@5.2.0: 865 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 866 | engines: {node: '>=10'} 867 | dev: true 868 | 869 | /anymatch@3.1.3: 870 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 871 | engines: {node: '>= 8'} 872 | dependencies: 873 | normalize-path: 3.0.0 874 | picomatch: 2.3.1 875 | dev: true 876 | 877 | /argparse@1.0.10: 878 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 879 | dependencies: 880 | sprintf-js: 1.0.3 881 | dev: true 882 | 883 | /argparse@2.0.1: 884 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 885 | dev: true 886 | 887 | /babel-jest@29.6.2(@babel/core@7.22.10): 888 | resolution: {integrity: sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==} 889 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 890 | peerDependencies: 891 | '@babel/core': ^7.8.0 892 | dependencies: 893 | '@babel/core': 7.22.10 894 | '@jest/transform': 29.6.2 895 | '@types/babel__core': 7.20.1 896 | babel-plugin-istanbul: 6.1.1 897 | babel-preset-jest: 29.5.0(@babel/core@7.22.10) 898 | chalk: 4.1.2 899 | graceful-fs: 4.2.11 900 | slash: 3.0.0 901 | transitivePeerDependencies: 902 | - supports-color 903 | dev: true 904 | 905 | /babel-plugin-istanbul@6.1.1: 906 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 907 | engines: {node: '>=8'} 908 | dependencies: 909 | '@babel/helper-plugin-utils': 7.22.5 910 | '@istanbuljs/load-nyc-config': 1.1.0 911 | '@istanbuljs/schema': 0.1.3 912 | istanbul-lib-instrument: 5.2.1 913 | test-exclude: 6.0.0 914 | transitivePeerDependencies: 915 | - supports-color 916 | dev: true 917 | 918 | /babel-plugin-jest-hoist@29.5.0: 919 | resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} 920 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 921 | dependencies: 922 | '@babel/template': 7.22.5 923 | '@babel/types': 7.22.10 924 | '@types/babel__core': 7.20.1 925 | '@types/babel__traverse': 7.20.1 926 | dev: true 927 | 928 | /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10): 929 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 930 | peerDependencies: 931 | '@babel/core': ^7.0.0 932 | dependencies: 933 | '@babel/core': 7.22.10 934 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) 935 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10) 936 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) 937 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) 938 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) 939 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) 940 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) 941 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) 942 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) 943 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) 944 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) 945 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) 946 | dev: true 947 | 948 | /babel-preset-jest@29.5.0(@babel/core@7.22.10): 949 | resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} 950 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 951 | peerDependencies: 952 | '@babel/core': ^7.0.0 953 | dependencies: 954 | '@babel/core': 7.22.10 955 | babel-plugin-jest-hoist: 29.5.0 956 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) 957 | dev: true 958 | 959 | /balanced-match@1.0.2: 960 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 961 | dev: true 962 | 963 | /base64-js@1.5.1: 964 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 965 | dev: false 966 | 967 | /bl@4.1.0: 968 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 969 | dependencies: 970 | buffer: 5.7.1 971 | inherits: 2.0.4 972 | readable-stream: 3.6.2 973 | dev: false 974 | 975 | /bl@5.1.0: 976 | resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} 977 | dependencies: 978 | buffer: 6.0.3 979 | inherits: 2.0.4 980 | readable-stream: 3.6.2 981 | dev: false 982 | 983 | /brace-expansion@1.1.11: 984 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 985 | dependencies: 986 | balanced-match: 1.0.2 987 | concat-map: 0.0.1 988 | dev: true 989 | 990 | /braces@3.0.2: 991 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 992 | engines: {node: '>=8'} 993 | dependencies: 994 | fill-range: 7.0.1 995 | dev: true 996 | 997 | /browserslist@4.21.10: 998 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 999 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1000 | hasBin: true 1001 | dependencies: 1002 | caniuse-lite: 1.0.30001519 1003 | electron-to-chromium: 1.4.490 1004 | node-releases: 2.0.13 1005 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 1006 | dev: true 1007 | 1008 | /bser@2.1.1: 1009 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1010 | dependencies: 1011 | node-int64: 0.4.0 1012 | dev: true 1013 | 1014 | /buffer-from@1.1.2: 1015 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1016 | dev: true 1017 | 1018 | /buffer@5.7.1: 1019 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 1020 | dependencies: 1021 | base64-js: 1.5.1 1022 | ieee754: 1.2.1 1023 | dev: false 1024 | 1025 | /buffer@6.0.3: 1026 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 1027 | dependencies: 1028 | base64-js: 1.5.1 1029 | ieee754: 1.2.1 1030 | dev: false 1031 | 1032 | /callsites@3.1.0: 1033 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1034 | engines: {node: '>=6'} 1035 | dev: true 1036 | 1037 | /camelcase@5.3.1: 1038 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1039 | engines: {node: '>=6'} 1040 | dev: true 1041 | 1042 | /camelcase@6.3.0: 1043 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1044 | engines: {node: '>=10'} 1045 | dev: true 1046 | 1047 | /caniuse-lite@1.0.30001519: 1048 | resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} 1049 | dev: true 1050 | 1051 | /chalk@2.4.2: 1052 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1053 | engines: {node: '>=4'} 1054 | dependencies: 1055 | ansi-styles: 3.2.1 1056 | escape-string-regexp: 1.0.5 1057 | supports-color: 5.5.0 1058 | dev: true 1059 | 1060 | /chalk@4.1.2: 1061 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1062 | engines: {node: '>=10'} 1063 | dependencies: 1064 | ansi-styles: 4.3.0 1065 | supports-color: 7.2.0 1066 | 1067 | /chalk@5.3.0: 1068 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} 1069 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 1070 | dev: false 1071 | 1072 | /char-regex@1.0.2: 1073 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1074 | engines: {node: '>=10'} 1075 | dev: true 1076 | 1077 | /chardet@0.7.0: 1078 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 1079 | dev: false 1080 | 1081 | /ci-info@3.8.0: 1082 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 1083 | engines: {node: '>=8'} 1084 | dev: true 1085 | 1086 | /cjs-module-lexer@1.2.3: 1087 | resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} 1088 | dev: true 1089 | 1090 | /cli-cursor@3.1.0: 1091 | resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} 1092 | engines: {node: '>=8'} 1093 | dependencies: 1094 | restore-cursor: 3.1.0 1095 | dev: false 1096 | 1097 | /cli-cursor@4.0.0: 1098 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 1099 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1100 | dependencies: 1101 | restore-cursor: 4.0.0 1102 | dev: false 1103 | 1104 | /cli-spinners@2.9.0: 1105 | resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} 1106 | engines: {node: '>=6'} 1107 | dev: false 1108 | 1109 | /cli-width@4.1.0: 1110 | resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} 1111 | engines: {node: '>= 12'} 1112 | dev: false 1113 | 1114 | /cliui@8.0.1: 1115 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1116 | engines: {node: '>=12'} 1117 | dependencies: 1118 | string-width: 4.2.3 1119 | strip-ansi: 6.0.1 1120 | wrap-ansi: 7.0.0 1121 | dev: true 1122 | 1123 | /clone@1.0.4: 1124 | resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} 1125 | engines: {node: '>=0.8'} 1126 | dev: false 1127 | 1128 | /co@4.6.0: 1129 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 1130 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1131 | dev: true 1132 | 1133 | /collect-v8-coverage@1.0.2: 1134 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 1135 | dev: true 1136 | 1137 | /color-convert@1.9.3: 1138 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1139 | dependencies: 1140 | color-name: 1.1.3 1141 | dev: true 1142 | 1143 | /color-convert@2.0.1: 1144 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1145 | engines: {node: '>=7.0.0'} 1146 | dependencies: 1147 | color-name: 1.1.4 1148 | 1149 | /color-name@1.1.3: 1150 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1151 | dev: true 1152 | 1153 | /color-name@1.1.4: 1154 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1155 | 1156 | /concat-map@0.0.1: 1157 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1158 | dev: true 1159 | 1160 | /convert-source-map@1.9.0: 1161 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1162 | dev: true 1163 | 1164 | /convert-source-map@2.0.0: 1165 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1166 | dev: true 1167 | 1168 | /cross-spawn@5.1.0: 1169 | resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} 1170 | dependencies: 1171 | lru-cache: 4.1.5 1172 | shebang-command: 1.2.0 1173 | which: 1.3.1 1174 | dev: false 1175 | 1176 | /cross-spawn@7.0.3: 1177 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1178 | engines: {node: '>= 8'} 1179 | dependencies: 1180 | path-key: 3.1.1 1181 | shebang-command: 2.0.0 1182 | which: 2.0.2 1183 | 1184 | /data-uri-to-buffer@4.0.1: 1185 | resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} 1186 | engines: {node: '>= 12'} 1187 | dev: false 1188 | 1189 | /debug@4.3.4: 1190 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1191 | engines: {node: '>=6.0'} 1192 | peerDependencies: 1193 | supports-color: '*' 1194 | peerDependenciesMeta: 1195 | supports-color: 1196 | optional: true 1197 | dependencies: 1198 | ms: 2.1.2 1199 | dev: true 1200 | 1201 | /dedent@1.5.1: 1202 | resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} 1203 | peerDependencies: 1204 | babel-plugin-macros: ^3.1.0 1205 | peerDependenciesMeta: 1206 | babel-plugin-macros: 1207 | optional: true 1208 | dev: true 1209 | 1210 | /deep-is@0.1.4: 1211 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 1212 | dev: true 1213 | 1214 | /deepmerge@4.3.1: 1215 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1216 | engines: {node: '>=0.10.0'} 1217 | dev: true 1218 | 1219 | /defaults@1.0.4: 1220 | resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} 1221 | dependencies: 1222 | clone: 1.0.4 1223 | dev: false 1224 | 1225 | /detect-newline@3.1.0: 1226 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1227 | engines: {node: '>=8'} 1228 | dev: true 1229 | 1230 | /diff-sequences@29.4.3: 1231 | resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} 1232 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1233 | dev: true 1234 | 1235 | /doctrine@3.0.0: 1236 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 1237 | engines: {node: '>=6.0.0'} 1238 | dependencies: 1239 | esutils: 2.0.3 1240 | dev: true 1241 | 1242 | /eastasianwidth@0.2.0: 1243 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1244 | dev: false 1245 | 1246 | /electron-to-chromium@1.4.490: 1247 | resolution: {integrity: sha512-6s7NVJz+sATdYnIwhdshx/N/9O6rvMxmhVoDSDFdj6iA45gHR8EQje70+RYsF4GeB+k0IeNSBnP7yG9ZXJFr7A==} 1248 | dev: true 1249 | 1250 | /emittery@0.13.1: 1251 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 1252 | engines: {node: '>=12'} 1253 | dev: true 1254 | 1255 | /emoji-regex@10.2.1: 1256 | resolution: {integrity: sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==} 1257 | dev: false 1258 | 1259 | /emoji-regex@8.0.0: 1260 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1261 | 1262 | /error-ex@1.3.2: 1263 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1264 | dependencies: 1265 | is-arrayish: 0.2.1 1266 | dev: true 1267 | 1268 | /escalade@3.1.1: 1269 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1270 | engines: {node: '>=6'} 1271 | dev: true 1272 | 1273 | /escape-string-regexp@1.0.5: 1274 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1275 | engines: {node: '>=0.8.0'} 1276 | dev: true 1277 | 1278 | /escape-string-regexp@2.0.0: 1279 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1280 | engines: {node: '>=8'} 1281 | dev: true 1282 | 1283 | /escape-string-regexp@4.0.0: 1284 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1285 | engines: {node: '>=10'} 1286 | dev: true 1287 | 1288 | /escape-string-regexp@5.0.0: 1289 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 1290 | engines: {node: '>=12'} 1291 | dev: false 1292 | 1293 | /eslint-config-prettier@9.0.0(eslint@8.46.0): 1294 | resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} 1295 | hasBin: true 1296 | peerDependencies: 1297 | eslint: '>=7.0.0' 1298 | dependencies: 1299 | eslint: 8.46.0 1300 | dev: true 1301 | 1302 | /eslint-scope@7.2.2: 1303 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1304 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1305 | dependencies: 1306 | esrecurse: 4.3.0 1307 | estraverse: 5.3.0 1308 | dev: true 1309 | 1310 | /eslint-visitor-keys@3.4.2: 1311 | resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} 1312 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1313 | dev: true 1314 | 1315 | /eslint@8.46.0: 1316 | resolution: {integrity: sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==} 1317 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1318 | hasBin: true 1319 | dependencies: 1320 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.46.0) 1321 | '@eslint-community/regexpp': 4.6.2 1322 | '@eslint/eslintrc': 2.1.1 1323 | '@eslint/js': 8.46.0 1324 | '@humanwhocodes/config-array': 0.11.10 1325 | '@humanwhocodes/module-importer': 1.0.1 1326 | '@nodelib/fs.walk': 1.2.8 1327 | ajv: 6.12.6 1328 | chalk: 4.1.2 1329 | cross-spawn: 7.0.3 1330 | debug: 4.3.4 1331 | doctrine: 3.0.0 1332 | escape-string-regexp: 4.0.0 1333 | eslint-scope: 7.2.2 1334 | eslint-visitor-keys: 3.4.2 1335 | espree: 9.6.1 1336 | esquery: 1.5.0 1337 | esutils: 2.0.3 1338 | fast-deep-equal: 3.1.3 1339 | file-entry-cache: 6.0.1 1340 | find-up: 5.0.0 1341 | glob-parent: 6.0.2 1342 | globals: 13.20.0 1343 | graphemer: 1.4.0 1344 | ignore: 5.2.4 1345 | imurmurhash: 0.1.4 1346 | is-glob: 4.0.3 1347 | is-path-inside: 3.0.3 1348 | js-yaml: 4.1.0 1349 | json-stable-stringify-without-jsonify: 1.0.1 1350 | levn: 0.4.1 1351 | lodash.merge: 4.6.2 1352 | minimatch: 3.1.2 1353 | natural-compare: 1.4.0 1354 | optionator: 0.9.3 1355 | strip-ansi: 6.0.1 1356 | text-table: 0.2.0 1357 | transitivePeerDependencies: 1358 | - supports-color 1359 | dev: true 1360 | 1361 | /espree@9.6.1: 1362 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1363 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1364 | dependencies: 1365 | acorn: 8.10.0 1366 | acorn-jsx: 5.3.2(acorn@8.10.0) 1367 | eslint-visitor-keys: 3.4.2 1368 | dev: true 1369 | 1370 | /esprima@4.0.1: 1371 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1372 | engines: {node: '>=4'} 1373 | hasBin: true 1374 | dev: true 1375 | 1376 | /esquery@1.5.0: 1377 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1378 | engines: {node: '>=0.10'} 1379 | dependencies: 1380 | estraverse: 5.3.0 1381 | dev: true 1382 | 1383 | /esrecurse@4.3.0: 1384 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1385 | engines: {node: '>=4.0'} 1386 | dependencies: 1387 | estraverse: 5.3.0 1388 | dev: true 1389 | 1390 | /estraverse@5.3.0: 1391 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1392 | engines: {node: '>=4.0'} 1393 | dev: true 1394 | 1395 | /esutils@2.0.3: 1396 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1397 | engines: {node: '>=0.10.0'} 1398 | dev: true 1399 | 1400 | /execa@0.6.3: 1401 | resolution: {integrity: sha512-/teX3MDLFBdYUhRk8WCBYboIMUmqeizu0m9Z3YF3JWrbEh/SlZg00vLJSaAGWw3wrZ9tE0buNw79eaAPYhUuvg==} 1402 | engines: {node: '>=4'} 1403 | dependencies: 1404 | cross-spawn: 5.1.0 1405 | get-stream: 3.0.0 1406 | is-stream: 1.1.0 1407 | npm-run-path: 2.0.2 1408 | p-finally: 1.0.0 1409 | signal-exit: 3.0.7 1410 | strip-eof: 1.0.0 1411 | dev: false 1412 | 1413 | /execa@5.1.1: 1414 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1415 | engines: {node: '>=10'} 1416 | dependencies: 1417 | cross-spawn: 7.0.3 1418 | get-stream: 6.0.1 1419 | human-signals: 2.1.0 1420 | is-stream: 2.0.1 1421 | merge-stream: 2.0.0 1422 | npm-run-path: 4.0.1 1423 | onetime: 5.1.2 1424 | signal-exit: 3.0.7 1425 | strip-final-newline: 2.0.0 1426 | dev: true 1427 | 1428 | /execa@7.2.0: 1429 | resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} 1430 | engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} 1431 | dependencies: 1432 | cross-spawn: 7.0.3 1433 | get-stream: 6.0.1 1434 | human-signals: 4.3.1 1435 | is-stream: 3.0.0 1436 | merge-stream: 2.0.0 1437 | npm-run-path: 5.1.0 1438 | onetime: 6.0.0 1439 | signal-exit: 3.0.7 1440 | strip-final-newline: 3.0.0 1441 | dev: false 1442 | 1443 | /exit@0.1.2: 1444 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1445 | engines: {node: '>= 0.8.0'} 1446 | dev: true 1447 | 1448 | /expect@29.6.2: 1449 | resolution: {integrity: sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==} 1450 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1451 | dependencies: 1452 | '@jest/expect-utils': 29.6.2 1453 | '@types/node': 20.4.9 1454 | jest-get-type: 29.4.3 1455 | jest-matcher-utils: 29.6.2 1456 | jest-message-util: 29.6.2 1457 | jest-util: 29.6.2 1458 | dev: true 1459 | 1460 | /external-editor@3.1.0: 1461 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 1462 | engines: {node: '>=4'} 1463 | dependencies: 1464 | chardet: 0.7.0 1465 | iconv-lite: 0.4.24 1466 | tmp: 0.0.33 1467 | dev: false 1468 | 1469 | /fast-deep-equal@3.1.3: 1470 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1471 | dev: true 1472 | 1473 | /fast-json-stable-stringify@2.1.0: 1474 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1475 | dev: true 1476 | 1477 | /fast-levenshtein@2.0.6: 1478 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1479 | dev: true 1480 | 1481 | /fastq@1.15.0: 1482 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1483 | dependencies: 1484 | reusify: 1.0.4 1485 | dev: true 1486 | 1487 | /fb-watchman@2.0.2: 1488 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1489 | dependencies: 1490 | bser: 2.1.1 1491 | dev: true 1492 | 1493 | /fetch-blob@3.2.0: 1494 | resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} 1495 | engines: {node: ^12.20 || >= 14.13} 1496 | dependencies: 1497 | node-domexception: 1.0.0 1498 | web-streams-polyfill: 3.2.1 1499 | dev: false 1500 | 1501 | /figures@5.0.0: 1502 | resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} 1503 | engines: {node: '>=14'} 1504 | dependencies: 1505 | escape-string-regexp: 5.0.0 1506 | is-unicode-supported: 1.3.0 1507 | dev: false 1508 | 1509 | /file-entry-cache@6.0.1: 1510 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1511 | engines: {node: ^10.12.0 || >=12.0.0} 1512 | dependencies: 1513 | flat-cache: 3.0.4 1514 | dev: true 1515 | 1516 | /fill-range@7.0.1: 1517 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1518 | engines: {node: '>=8'} 1519 | dependencies: 1520 | to-regex-range: 5.0.1 1521 | dev: true 1522 | 1523 | /find-up@4.1.0: 1524 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1525 | engines: {node: '>=8'} 1526 | dependencies: 1527 | locate-path: 5.0.0 1528 | path-exists: 4.0.0 1529 | dev: true 1530 | 1531 | /find-up@5.0.0: 1532 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1533 | engines: {node: '>=10'} 1534 | dependencies: 1535 | locate-path: 6.0.0 1536 | path-exists: 4.0.0 1537 | dev: true 1538 | 1539 | /flat-cache@3.0.4: 1540 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1541 | engines: {node: ^10.12.0 || >=12.0.0} 1542 | dependencies: 1543 | flatted: 3.2.7 1544 | rimraf: 3.0.2 1545 | dev: true 1546 | 1547 | /flatted@3.2.7: 1548 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1549 | dev: true 1550 | 1551 | /formdata-polyfill@4.0.10: 1552 | resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} 1553 | engines: {node: '>=12.20.0'} 1554 | dependencies: 1555 | fetch-blob: 3.2.0 1556 | dev: false 1557 | 1558 | /fs.realpath@1.0.0: 1559 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1560 | dev: true 1561 | 1562 | /fsevents@2.3.2: 1563 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1564 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1565 | os: [darwin] 1566 | requiresBuild: true 1567 | dev: true 1568 | optional: true 1569 | 1570 | /function-bind@1.1.1: 1571 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1572 | dev: true 1573 | 1574 | /gensync@1.0.0-beta.2: 1575 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1576 | engines: {node: '>=6.9.0'} 1577 | dev: true 1578 | 1579 | /get-caller-file@2.0.5: 1580 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1581 | engines: {node: 6.* || 8.* || >= 10.*} 1582 | dev: true 1583 | 1584 | /get-package-type@0.1.0: 1585 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1586 | engines: {node: '>=8.0.0'} 1587 | dev: true 1588 | 1589 | /get-stream@3.0.0: 1590 | resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} 1591 | engines: {node: '>=4'} 1592 | dev: false 1593 | 1594 | /get-stream@6.0.1: 1595 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1596 | engines: {node: '>=10'} 1597 | 1598 | /git-credential-node@1.1.0: 1599 | resolution: {integrity: sha512-BcEwQz8djoeSFpcsbWxGRQmN5n2gA6890PBdM7LnapcsEoEpje3DBBTqwtFrJpmSQZvWwOQ9zytyXmrKSawB9A==} 1600 | engines: {node: '>=6'} 1601 | dependencies: 1602 | execa: 0.6.3 1603 | dev: false 1604 | 1605 | /glob-parent@6.0.2: 1606 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1607 | engines: {node: '>=10.13.0'} 1608 | dependencies: 1609 | is-glob: 4.0.3 1610 | dev: true 1611 | 1612 | /glob@7.2.3: 1613 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1614 | dependencies: 1615 | fs.realpath: 1.0.0 1616 | inflight: 1.0.6 1617 | inherits: 2.0.4 1618 | minimatch: 3.1.2 1619 | once: 1.4.0 1620 | path-is-absolute: 1.0.1 1621 | dev: true 1622 | 1623 | /globals@11.12.0: 1624 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1625 | engines: {node: '>=4'} 1626 | dev: true 1627 | 1628 | /globals@13.20.0: 1629 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 1630 | engines: {node: '>=8'} 1631 | dependencies: 1632 | type-fest: 0.20.2 1633 | dev: true 1634 | 1635 | /graceful-fs@4.2.11: 1636 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1637 | dev: true 1638 | 1639 | /graphemer@1.4.0: 1640 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1641 | dev: true 1642 | 1643 | /has-flag@3.0.0: 1644 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1645 | engines: {node: '>=4'} 1646 | dev: true 1647 | 1648 | /has-flag@4.0.0: 1649 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1650 | engines: {node: '>=8'} 1651 | 1652 | /has@1.0.3: 1653 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1654 | engines: {node: '>= 0.4.0'} 1655 | dependencies: 1656 | function-bind: 1.1.1 1657 | dev: true 1658 | 1659 | /html-escaper@2.0.2: 1660 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1661 | dev: true 1662 | 1663 | /human-signals@2.1.0: 1664 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1665 | engines: {node: '>=10.17.0'} 1666 | dev: true 1667 | 1668 | /human-signals@4.3.1: 1669 | resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} 1670 | engines: {node: '>=14.18.0'} 1671 | dev: false 1672 | 1673 | /husky@8.0.3: 1674 | resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} 1675 | engines: {node: '>=14'} 1676 | hasBin: true 1677 | dev: true 1678 | 1679 | /iconv-lite@0.4.24: 1680 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1681 | engines: {node: '>=0.10.0'} 1682 | dependencies: 1683 | safer-buffer: 2.1.2 1684 | dev: false 1685 | 1686 | /ieee754@1.2.1: 1687 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1688 | dev: false 1689 | 1690 | /ignore@5.2.4: 1691 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 1692 | engines: {node: '>= 4'} 1693 | dev: true 1694 | 1695 | /import-fresh@3.3.0: 1696 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1697 | engines: {node: '>=6'} 1698 | dependencies: 1699 | parent-module: 1.0.1 1700 | resolve-from: 4.0.0 1701 | dev: true 1702 | 1703 | /import-local@3.1.0: 1704 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 1705 | engines: {node: '>=8'} 1706 | hasBin: true 1707 | dependencies: 1708 | pkg-dir: 4.2.0 1709 | resolve-cwd: 3.0.0 1710 | dev: true 1711 | 1712 | /imurmurhash@0.1.4: 1713 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1714 | engines: {node: '>=0.8.19'} 1715 | dev: true 1716 | 1717 | /inflight@1.0.6: 1718 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1719 | dependencies: 1720 | once: 1.4.0 1721 | wrappy: 1.0.2 1722 | dev: true 1723 | 1724 | /inherits@2.0.4: 1725 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1726 | 1727 | /inquirer@9.2.10: 1728 | resolution: {integrity: sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA==} 1729 | engines: {node: '>=14.18.0'} 1730 | dependencies: 1731 | '@ljharb/through': 2.3.9 1732 | ansi-escapes: 4.3.2 1733 | chalk: 5.3.0 1734 | cli-cursor: 3.1.0 1735 | cli-width: 4.1.0 1736 | external-editor: 3.1.0 1737 | figures: 5.0.0 1738 | lodash: 4.17.21 1739 | mute-stream: 1.0.0 1740 | ora: 5.4.1 1741 | run-async: 3.0.0 1742 | rxjs: 7.8.1 1743 | string-width: 4.2.3 1744 | strip-ansi: 6.0.1 1745 | wrap-ansi: 6.2.0 1746 | dev: false 1747 | 1748 | /is-arrayish@0.2.1: 1749 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1750 | dev: true 1751 | 1752 | /is-core-module@2.13.0: 1753 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 1754 | dependencies: 1755 | has: 1.0.3 1756 | dev: true 1757 | 1758 | /is-extglob@2.1.1: 1759 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1760 | engines: {node: '>=0.10.0'} 1761 | dev: true 1762 | 1763 | /is-fullwidth-code-point@3.0.0: 1764 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1765 | engines: {node: '>=8'} 1766 | 1767 | /is-generator-fn@2.1.0: 1768 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1769 | engines: {node: '>=6'} 1770 | dev: true 1771 | 1772 | /is-glob@4.0.3: 1773 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1774 | engines: {node: '>=0.10.0'} 1775 | dependencies: 1776 | is-extglob: 2.1.1 1777 | dev: true 1778 | 1779 | /is-interactive@1.0.0: 1780 | resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} 1781 | engines: {node: '>=8'} 1782 | dev: false 1783 | 1784 | /is-interactive@2.0.0: 1785 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 1786 | engines: {node: '>=12'} 1787 | dev: false 1788 | 1789 | /is-number@7.0.0: 1790 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1791 | engines: {node: '>=0.12.0'} 1792 | dev: true 1793 | 1794 | /is-path-inside@3.0.3: 1795 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1796 | engines: {node: '>=8'} 1797 | dev: true 1798 | 1799 | /is-stream@1.1.0: 1800 | resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} 1801 | engines: {node: '>=0.10.0'} 1802 | dev: false 1803 | 1804 | /is-stream@2.0.1: 1805 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1806 | engines: {node: '>=8'} 1807 | dev: true 1808 | 1809 | /is-stream@3.0.0: 1810 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1811 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1812 | dev: false 1813 | 1814 | /is-unicode-supported@0.1.0: 1815 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 1816 | engines: {node: '>=10'} 1817 | dev: false 1818 | 1819 | /is-unicode-supported@1.3.0: 1820 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 1821 | engines: {node: '>=12'} 1822 | dev: false 1823 | 1824 | /isexe@2.0.0: 1825 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1826 | 1827 | /istanbul-lib-coverage@3.2.0: 1828 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 1829 | engines: {node: '>=8'} 1830 | dev: true 1831 | 1832 | /istanbul-lib-instrument@5.2.1: 1833 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1834 | engines: {node: '>=8'} 1835 | dependencies: 1836 | '@babel/core': 7.22.10 1837 | '@babel/parser': 7.22.10 1838 | '@istanbuljs/schema': 0.1.3 1839 | istanbul-lib-coverage: 3.2.0 1840 | semver: 6.3.1 1841 | transitivePeerDependencies: 1842 | - supports-color 1843 | dev: true 1844 | 1845 | /istanbul-lib-report@3.0.1: 1846 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1847 | engines: {node: '>=10'} 1848 | dependencies: 1849 | istanbul-lib-coverage: 3.2.0 1850 | make-dir: 4.0.0 1851 | supports-color: 7.2.0 1852 | dev: true 1853 | 1854 | /istanbul-lib-source-maps@4.0.1: 1855 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1856 | engines: {node: '>=10'} 1857 | dependencies: 1858 | debug: 4.3.4 1859 | istanbul-lib-coverage: 3.2.0 1860 | source-map: 0.6.1 1861 | transitivePeerDependencies: 1862 | - supports-color 1863 | dev: true 1864 | 1865 | /istanbul-reports@3.1.6: 1866 | resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} 1867 | engines: {node: '>=8'} 1868 | dependencies: 1869 | html-escaper: 2.0.2 1870 | istanbul-lib-report: 3.0.1 1871 | dev: true 1872 | 1873 | /jest-changed-files@29.5.0: 1874 | resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} 1875 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1876 | dependencies: 1877 | execa: 5.1.1 1878 | p-limit: 3.1.0 1879 | dev: true 1880 | 1881 | /jest-circus@29.6.2: 1882 | resolution: {integrity: sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==} 1883 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1884 | dependencies: 1885 | '@jest/environment': 29.6.2 1886 | '@jest/expect': 29.6.2 1887 | '@jest/test-result': 29.6.2 1888 | '@jest/types': 29.6.1 1889 | '@types/node': 20.4.9 1890 | chalk: 4.1.2 1891 | co: 4.6.0 1892 | dedent: 1.5.1 1893 | is-generator-fn: 2.1.0 1894 | jest-each: 29.6.2 1895 | jest-matcher-utils: 29.6.2 1896 | jest-message-util: 29.6.2 1897 | jest-runtime: 29.6.2 1898 | jest-snapshot: 29.6.2 1899 | jest-util: 29.6.2 1900 | p-limit: 3.1.0 1901 | pretty-format: 29.6.2 1902 | pure-rand: 6.0.2 1903 | slash: 3.0.0 1904 | stack-utils: 2.0.6 1905 | transitivePeerDependencies: 1906 | - babel-plugin-macros 1907 | - supports-color 1908 | dev: true 1909 | 1910 | /jest-cli@29.6.2: 1911 | resolution: {integrity: sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==} 1912 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1913 | hasBin: true 1914 | peerDependencies: 1915 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1916 | peerDependenciesMeta: 1917 | node-notifier: 1918 | optional: true 1919 | dependencies: 1920 | '@jest/core': 29.6.2 1921 | '@jest/test-result': 29.6.2 1922 | '@jest/types': 29.6.1 1923 | chalk: 4.1.2 1924 | exit: 0.1.2 1925 | graceful-fs: 4.2.11 1926 | import-local: 3.1.0 1927 | jest-config: 29.6.2(@types/node@20.4.9) 1928 | jest-util: 29.6.2 1929 | jest-validate: 29.6.2 1930 | prompts: 2.4.2 1931 | yargs: 17.7.2 1932 | transitivePeerDependencies: 1933 | - '@types/node' 1934 | - babel-plugin-macros 1935 | - supports-color 1936 | - ts-node 1937 | dev: true 1938 | 1939 | /jest-config@29.6.2(@types/node@20.4.9): 1940 | resolution: {integrity: sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==} 1941 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1942 | peerDependencies: 1943 | '@types/node': '*' 1944 | ts-node: '>=9.0.0' 1945 | peerDependenciesMeta: 1946 | '@types/node': 1947 | optional: true 1948 | ts-node: 1949 | optional: true 1950 | dependencies: 1951 | '@babel/core': 7.22.10 1952 | '@jest/test-sequencer': 29.6.2 1953 | '@jest/types': 29.6.1 1954 | '@types/node': 20.4.9 1955 | babel-jest: 29.6.2(@babel/core@7.22.10) 1956 | chalk: 4.1.2 1957 | ci-info: 3.8.0 1958 | deepmerge: 4.3.1 1959 | glob: 7.2.3 1960 | graceful-fs: 4.2.11 1961 | jest-circus: 29.6.2 1962 | jest-environment-node: 29.6.2 1963 | jest-get-type: 29.4.3 1964 | jest-regex-util: 29.4.3 1965 | jest-resolve: 29.6.2 1966 | jest-runner: 29.6.2 1967 | jest-util: 29.6.2 1968 | jest-validate: 29.6.2 1969 | micromatch: 4.0.5 1970 | parse-json: 5.2.0 1971 | pretty-format: 29.6.2 1972 | slash: 3.0.0 1973 | strip-json-comments: 3.1.1 1974 | transitivePeerDependencies: 1975 | - babel-plugin-macros 1976 | - supports-color 1977 | dev: true 1978 | 1979 | /jest-diff@29.6.2: 1980 | resolution: {integrity: sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==} 1981 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1982 | dependencies: 1983 | chalk: 4.1.2 1984 | diff-sequences: 29.4.3 1985 | jest-get-type: 29.4.3 1986 | pretty-format: 29.6.2 1987 | dev: true 1988 | 1989 | /jest-docblock@29.4.3: 1990 | resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} 1991 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1992 | dependencies: 1993 | detect-newline: 3.1.0 1994 | dev: true 1995 | 1996 | /jest-each@29.6.2: 1997 | resolution: {integrity: sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==} 1998 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1999 | dependencies: 2000 | '@jest/types': 29.6.1 2001 | chalk: 4.1.2 2002 | jest-get-type: 29.4.3 2003 | jest-util: 29.6.2 2004 | pretty-format: 29.6.2 2005 | dev: true 2006 | 2007 | /jest-environment-node@29.6.2: 2008 | resolution: {integrity: sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==} 2009 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2010 | dependencies: 2011 | '@jest/environment': 29.6.2 2012 | '@jest/fake-timers': 29.6.2 2013 | '@jest/types': 29.6.1 2014 | '@types/node': 20.4.9 2015 | jest-mock: 29.6.2 2016 | jest-util: 29.6.2 2017 | dev: true 2018 | 2019 | /jest-get-type@29.4.3: 2020 | resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} 2021 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2022 | dev: true 2023 | 2024 | /jest-haste-map@29.6.2: 2025 | resolution: {integrity: sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==} 2026 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2027 | dependencies: 2028 | '@jest/types': 29.6.1 2029 | '@types/graceful-fs': 4.1.6 2030 | '@types/node': 20.4.9 2031 | anymatch: 3.1.3 2032 | fb-watchman: 2.0.2 2033 | graceful-fs: 4.2.11 2034 | jest-regex-util: 29.4.3 2035 | jest-util: 29.6.2 2036 | jest-worker: 29.6.2 2037 | micromatch: 4.0.5 2038 | walker: 1.0.8 2039 | optionalDependencies: 2040 | fsevents: 2.3.2 2041 | dev: true 2042 | 2043 | /jest-leak-detector@29.6.2: 2044 | resolution: {integrity: sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==} 2045 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2046 | dependencies: 2047 | jest-get-type: 29.4.3 2048 | pretty-format: 29.6.2 2049 | dev: true 2050 | 2051 | /jest-matcher-utils@29.6.2: 2052 | resolution: {integrity: sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==} 2053 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2054 | dependencies: 2055 | chalk: 4.1.2 2056 | jest-diff: 29.6.2 2057 | jest-get-type: 29.4.3 2058 | pretty-format: 29.6.2 2059 | dev: true 2060 | 2061 | /jest-message-util@29.6.2: 2062 | resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} 2063 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2064 | dependencies: 2065 | '@babel/code-frame': 7.22.10 2066 | '@jest/types': 29.6.1 2067 | '@types/stack-utils': 2.0.1 2068 | chalk: 4.1.2 2069 | graceful-fs: 4.2.11 2070 | micromatch: 4.0.5 2071 | pretty-format: 29.6.2 2072 | slash: 3.0.0 2073 | stack-utils: 2.0.6 2074 | dev: true 2075 | 2076 | /jest-mock@29.6.2: 2077 | resolution: {integrity: sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==} 2078 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2079 | dependencies: 2080 | '@jest/types': 29.6.1 2081 | '@types/node': 20.4.9 2082 | jest-util: 29.6.2 2083 | dev: true 2084 | 2085 | /jest-pnp-resolver@1.2.3(jest-resolve@29.6.2): 2086 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 2087 | engines: {node: '>=6'} 2088 | peerDependencies: 2089 | jest-resolve: '*' 2090 | peerDependenciesMeta: 2091 | jest-resolve: 2092 | optional: true 2093 | dependencies: 2094 | jest-resolve: 29.6.2 2095 | dev: true 2096 | 2097 | /jest-regex-util@29.4.3: 2098 | resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} 2099 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2100 | dev: true 2101 | 2102 | /jest-resolve-dependencies@29.6.2: 2103 | resolution: {integrity: sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==} 2104 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2105 | dependencies: 2106 | jest-regex-util: 29.4.3 2107 | jest-snapshot: 29.6.2 2108 | transitivePeerDependencies: 2109 | - supports-color 2110 | dev: true 2111 | 2112 | /jest-resolve@29.6.2: 2113 | resolution: {integrity: sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==} 2114 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2115 | dependencies: 2116 | chalk: 4.1.2 2117 | graceful-fs: 4.2.11 2118 | jest-haste-map: 29.6.2 2119 | jest-pnp-resolver: 1.2.3(jest-resolve@29.6.2) 2120 | jest-util: 29.6.2 2121 | jest-validate: 29.6.2 2122 | resolve: 1.22.4 2123 | resolve.exports: 2.0.2 2124 | slash: 3.0.0 2125 | dev: true 2126 | 2127 | /jest-runner@29.6.2: 2128 | resolution: {integrity: sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==} 2129 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2130 | dependencies: 2131 | '@jest/console': 29.6.2 2132 | '@jest/environment': 29.6.2 2133 | '@jest/test-result': 29.6.2 2134 | '@jest/transform': 29.6.2 2135 | '@jest/types': 29.6.1 2136 | '@types/node': 20.4.9 2137 | chalk: 4.1.2 2138 | emittery: 0.13.1 2139 | graceful-fs: 4.2.11 2140 | jest-docblock: 29.4.3 2141 | jest-environment-node: 29.6.2 2142 | jest-haste-map: 29.6.2 2143 | jest-leak-detector: 29.6.2 2144 | jest-message-util: 29.6.2 2145 | jest-resolve: 29.6.2 2146 | jest-runtime: 29.6.2 2147 | jest-util: 29.6.2 2148 | jest-watcher: 29.6.2 2149 | jest-worker: 29.6.2 2150 | p-limit: 3.1.0 2151 | source-map-support: 0.5.13 2152 | transitivePeerDependencies: 2153 | - supports-color 2154 | dev: true 2155 | 2156 | /jest-runtime@29.6.2: 2157 | resolution: {integrity: sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==} 2158 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2159 | dependencies: 2160 | '@jest/environment': 29.6.2 2161 | '@jest/fake-timers': 29.6.2 2162 | '@jest/globals': 29.6.2 2163 | '@jest/source-map': 29.6.0 2164 | '@jest/test-result': 29.6.2 2165 | '@jest/transform': 29.6.2 2166 | '@jest/types': 29.6.1 2167 | '@types/node': 20.4.9 2168 | chalk: 4.1.2 2169 | cjs-module-lexer: 1.2.3 2170 | collect-v8-coverage: 1.0.2 2171 | glob: 7.2.3 2172 | graceful-fs: 4.2.11 2173 | jest-haste-map: 29.6.2 2174 | jest-message-util: 29.6.2 2175 | jest-mock: 29.6.2 2176 | jest-regex-util: 29.4.3 2177 | jest-resolve: 29.6.2 2178 | jest-snapshot: 29.6.2 2179 | jest-util: 29.6.2 2180 | slash: 3.0.0 2181 | strip-bom: 4.0.0 2182 | transitivePeerDependencies: 2183 | - supports-color 2184 | dev: true 2185 | 2186 | /jest-snapshot@29.6.2: 2187 | resolution: {integrity: sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==} 2188 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2189 | dependencies: 2190 | '@babel/core': 7.22.10 2191 | '@babel/generator': 7.22.10 2192 | '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.10) 2193 | '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.10) 2194 | '@babel/types': 7.22.10 2195 | '@jest/expect-utils': 29.6.2 2196 | '@jest/transform': 29.6.2 2197 | '@jest/types': 29.6.1 2198 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) 2199 | chalk: 4.1.2 2200 | expect: 29.6.2 2201 | graceful-fs: 4.2.11 2202 | jest-diff: 29.6.2 2203 | jest-get-type: 29.4.3 2204 | jest-matcher-utils: 29.6.2 2205 | jest-message-util: 29.6.2 2206 | jest-util: 29.6.2 2207 | natural-compare: 1.4.0 2208 | pretty-format: 29.6.2 2209 | semver: 7.5.4 2210 | transitivePeerDependencies: 2211 | - supports-color 2212 | dev: true 2213 | 2214 | /jest-util@29.6.2: 2215 | resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} 2216 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2217 | dependencies: 2218 | '@jest/types': 29.6.1 2219 | '@types/node': 20.4.9 2220 | chalk: 4.1.2 2221 | ci-info: 3.8.0 2222 | graceful-fs: 4.2.11 2223 | picomatch: 2.3.1 2224 | dev: true 2225 | 2226 | /jest-validate@29.6.2: 2227 | resolution: {integrity: sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==} 2228 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2229 | dependencies: 2230 | '@jest/types': 29.6.1 2231 | camelcase: 6.3.0 2232 | chalk: 4.1.2 2233 | jest-get-type: 29.4.3 2234 | leven: 3.1.0 2235 | pretty-format: 29.6.2 2236 | dev: true 2237 | 2238 | /jest-watcher@29.6.2: 2239 | resolution: {integrity: sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==} 2240 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2241 | dependencies: 2242 | '@jest/test-result': 29.6.2 2243 | '@jest/types': 29.6.1 2244 | '@types/node': 20.4.9 2245 | ansi-escapes: 4.3.2 2246 | chalk: 4.1.2 2247 | emittery: 0.13.1 2248 | jest-util: 29.6.2 2249 | string-length: 4.0.2 2250 | dev: true 2251 | 2252 | /jest-worker@29.6.2: 2253 | resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} 2254 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2255 | dependencies: 2256 | '@types/node': 20.4.9 2257 | jest-util: 29.6.2 2258 | merge-stream: 2.0.0 2259 | supports-color: 8.1.1 2260 | dev: true 2261 | 2262 | /jest@29.6.2: 2263 | resolution: {integrity: sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==} 2264 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2265 | hasBin: true 2266 | peerDependencies: 2267 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2268 | peerDependenciesMeta: 2269 | node-notifier: 2270 | optional: true 2271 | dependencies: 2272 | '@jest/core': 29.6.2 2273 | '@jest/types': 29.6.1 2274 | import-local: 3.1.0 2275 | jest-cli: 29.6.2 2276 | transitivePeerDependencies: 2277 | - '@types/node' 2278 | - babel-plugin-macros 2279 | - supports-color 2280 | - ts-node 2281 | dev: true 2282 | 2283 | /js-tokens@4.0.0: 2284 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2285 | dev: true 2286 | 2287 | /js-yaml@3.14.1: 2288 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2289 | hasBin: true 2290 | dependencies: 2291 | argparse: 1.0.10 2292 | esprima: 4.0.1 2293 | dev: true 2294 | 2295 | /js-yaml@4.1.0: 2296 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 2297 | hasBin: true 2298 | dependencies: 2299 | argparse: 2.0.1 2300 | dev: true 2301 | 2302 | /jsesc@2.5.2: 2303 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2304 | engines: {node: '>=4'} 2305 | hasBin: true 2306 | dev: true 2307 | 2308 | /json-parse-even-better-errors@2.3.1: 2309 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2310 | dev: true 2311 | 2312 | /json-schema-traverse@0.4.1: 2313 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 2314 | dev: true 2315 | 2316 | /json-stable-stringify-without-jsonify@1.0.1: 2317 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 2318 | dev: true 2319 | 2320 | /json5@2.2.3: 2321 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2322 | engines: {node: '>=6'} 2323 | hasBin: true 2324 | dev: true 2325 | 2326 | /kleur@3.0.3: 2327 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2328 | engines: {node: '>=6'} 2329 | dev: true 2330 | 2331 | /leven@3.1.0: 2332 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2333 | engines: {node: '>=6'} 2334 | dev: true 2335 | 2336 | /levn@0.4.1: 2337 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 2338 | engines: {node: '>= 0.8.0'} 2339 | dependencies: 2340 | prelude-ls: 1.2.1 2341 | type-check: 0.4.0 2342 | dev: true 2343 | 2344 | /lines-and-columns@1.2.4: 2345 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2346 | dev: true 2347 | 2348 | /locate-path@5.0.0: 2349 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2350 | engines: {node: '>=8'} 2351 | dependencies: 2352 | p-locate: 4.1.0 2353 | dev: true 2354 | 2355 | /locate-path@6.0.0: 2356 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 2357 | engines: {node: '>=10'} 2358 | dependencies: 2359 | p-locate: 5.0.0 2360 | dev: true 2361 | 2362 | /lodash.merge@4.6.2: 2363 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 2364 | dev: true 2365 | 2366 | /lodash@4.17.21: 2367 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2368 | dev: false 2369 | 2370 | /log-symbols@4.1.0: 2371 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 2372 | engines: {node: '>=10'} 2373 | dependencies: 2374 | chalk: 4.1.2 2375 | is-unicode-supported: 0.1.0 2376 | dev: false 2377 | 2378 | /log-symbols@5.1.0: 2379 | resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} 2380 | engines: {node: '>=12'} 2381 | dependencies: 2382 | chalk: 5.3.0 2383 | is-unicode-supported: 1.3.0 2384 | dev: false 2385 | 2386 | /lru-cache@4.1.5: 2387 | resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 2388 | dependencies: 2389 | pseudomap: 1.0.2 2390 | yallist: 2.1.2 2391 | dev: false 2392 | 2393 | /lru-cache@5.1.1: 2394 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2395 | dependencies: 2396 | yallist: 3.1.1 2397 | dev: true 2398 | 2399 | /lru-cache@6.0.0: 2400 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2401 | engines: {node: '>=10'} 2402 | dependencies: 2403 | yallist: 4.0.0 2404 | dev: true 2405 | 2406 | /make-dir@4.0.0: 2407 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2408 | engines: {node: '>=10'} 2409 | dependencies: 2410 | semver: 7.5.4 2411 | dev: true 2412 | 2413 | /makeerror@1.0.12: 2414 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2415 | dependencies: 2416 | tmpl: 1.0.5 2417 | dev: true 2418 | 2419 | /merge-stream@2.0.0: 2420 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2421 | 2422 | /micromatch@4.0.5: 2423 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2424 | engines: {node: '>=8.6'} 2425 | dependencies: 2426 | braces: 3.0.2 2427 | picomatch: 2.3.1 2428 | dev: true 2429 | 2430 | /mimic-fn@2.1.0: 2431 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2432 | engines: {node: '>=6'} 2433 | 2434 | /mimic-fn@4.0.0: 2435 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 2436 | engines: {node: '>=12'} 2437 | dev: false 2438 | 2439 | /minimatch@3.1.2: 2440 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2441 | dependencies: 2442 | brace-expansion: 1.1.11 2443 | dev: true 2444 | 2445 | /ms@2.1.2: 2446 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2447 | dev: true 2448 | 2449 | /mute-stream@1.0.0: 2450 | resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} 2451 | engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} 2452 | dev: false 2453 | 2454 | /natural-compare@1.4.0: 2455 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2456 | dev: true 2457 | 2458 | /node-domexception@1.0.0: 2459 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 2460 | engines: {node: '>=10.5.0'} 2461 | dev: false 2462 | 2463 | /node-fetch@3.3.2: 2464 | resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} 2465 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2466 | dependencies: 2467 | data-uri-to-buffer: 4.0.1 2468 | fetch-blob: 3.2.0 2469 | formdata-polyfill: 4.0.10 2470 | dev: false 2471 | 2472 | /node-int64@0.4.0: 2473 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2474 | dev: true 2475 | 2476 | /node-releases@2.0.13: 2477 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 2478 | dev: true 2479 | 2480 | /normalize-path@3.0.0: 2481 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2482 | engines: {node: '>=0.10.0'} 2483 | dev: true 2484 | 2485 | /npm-run-path@2.0.2: 2486 | resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} 2487 | engines: {node: '>=4'} 2488 | dependencies: 2489 | path-key: 2.0.1 2490 | dev: false 2491 | 2492 | /npm-run-path@4.0.1: 2493 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2494 | engines: {node: '>=8'} 2495 | dependencies: 2496 | path-key: 3.1.1 2497 | dev: true 2498 | 2499 | /npm-run-path@5.1.0: 2500 | resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 2501 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2502 | dependencies: 2503 | path-key: 4.0.0 2504 | dev: false 2505 | 2506 | /once@1.4.0: 2507 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2508 | dependencies: 2509 | wrappy: 1.0.2 2510 | dev: true 2511 | 2512 | /onetime@5.1.2: 2513 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2514 | engines: {node: '>=6'} 2515 | dependencies: 2516 | mimic-fn: 2.1.0 2517 | 2518 | /onetime@6.0.0: 2519 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 2520 | engines: {node: '>=12'} 2521 | dependencies: 2522 | mimic-fn: 4.0.0 2523 | dev: false 2524 | 2525 | /optionator@0.9.3: 2526 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2527 | engines: {node: '>= 0.8.0'} 2528 | dependencies: 2529 | '@aashutoshrathi/word-wrap': 1.2.6 2530 | deep-is: 0.1.4 2531 | fast-levenshtein: 2.0.6 2532 | levn: 0.4.1 2533 | prelude-ls: 1.2.1 2534 | type-check: 0.4.0 2535 | dev: true 2536 | 2537 | /ora@5.4.1: 2538 | resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} 2539 | engines: {node: '>=10'} 2540 | dependencies: 2541 | bl: 4.1.0 2542 | chalk: 4.1.2 2543 | cli-cursor: 3.1.0 2544 | cli-spinners: 2.9.0 2545 | is-interactive: 1.0.0 2546 | is-unicode-supported: 0.1.0 2547 | log-symbols: 4.1.0 2548 | strip-ansi: 6.0.1 2549 | wcwidth: 1.0.1 2550 | dev: false 2551 | 2552 | /ora@7.0.1: 2553 | resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} 2554 | engines: {node: '>=16'} 2555 | dependencies: 2556 | chalk: 5.3.0 2557 | cli-cursor: 4.0.0 2558 | cli-spinners: 2.9.0 2559 | is-interactive: 2.0.0 2560 | is-unicode-supported: 1.3.0 2561 | log-symbols: 5.1.0 2562 | stdin-discarder: 0.1.0 2563 | string-width: 6.1.0 2564 | strip-ansi: 7.1.0 2565 | dev: false 2566 | 2567 | /os-tmpdir@1.0.2: 2568 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 2569 | engines: {node: '>=0.10.0'} 2570 | dev: false 2571 | 2572 | /p-finally@1.0.0: 2573 | resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} 2574 | engines: {node: '>=4'} 2575 | dev: false 2576 | 2577 | /p-limit@2.3.0: 2578 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2579 | engines: {node: '>=6'} 2580 | dependencies: 2581 | p-try: 2.2.0 2582 | dev: true 2583 | 2584 | /p-limit@3.1.0: 2585 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2586 | engines: {node: '>=10'} 2587 | dependencies: 2588 | yocto-queue: 0.1.0 2589 | dev: true 2590 | 2591 | /p-locate@4.1.0: 2592 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2593 | engines: {node: '>=8'} 2594 | dependencies: 2595 | p-limit: 2.3.0 2596 | dev: true 2597 | 2598 | /p-locate@5.0.0: 2599 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2600 | engines: {node: '>=10'} 2601 | dependencies: 2602 | p-limit: 3.1.0 2603 | dev: true 2604 | 2605 | /p-try@2.2.0: 2606 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2607 | engines: {node: '>=6'} 2608 | dev: true 2609 | 2610 | /parent-module@1.0.1: 2611 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2612 | engines: {node: '>=6'} 2613 | dependencies: 2614 | callsites: 3.1.0 2615 | dev: true 2616 | 2617 | /parse-json@5.2.0: 2618 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2619 | engines: {node: '>=8'} 2620 | dependencies: 2621 | '@babel/code-frame': 7.22.10 2622 | error-ex: 1.3.2 2623 | json-parse-even-better-errors: 2.3.1 2624 | lines-and-columns: 1.2.4 2625 | dev: true 2626 | 2627 | /path-exists@4.0.0: 2628 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2629 | engines: {node: '>=8'} 2630 | dev: true 2631 | 2632 | /path-is-absolute@1.0.1: 2633 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2634 | engines: {node: '>=0.10.0'} 2635 | dev: true 2636 | 2637 | /path-key@2.0.1: 2638 | resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} 2639 | engines: {node: '>=4'} 2640 | dev: false 2641 | 2642 | /path-key@3.1.1: 2643 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2644 | engines: {node: '>=8'} 2645 | 2646 | /path-key@4.0.0: 2647 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 2648 | engines: {node: '>=12'} 2649 | dev: false 2650 | 2651 | /path-parse@1.0.7: 2652 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2653 | dev: true 2654 | 2655 | /picocolors@1.0.0: 2656 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2657 | dev: true 2658 | 2659 | /picomatch@2.3.1: 2660 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2661 | engines: {node: '>=8.6'} 2662 | dev: true 2663 | 2664 | /pirates@4.0.6: 2665 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2666 | engines: {node: '>= 6'} 2667 | dev: true 2668 | 2669 | /pkg-dir@4.2.0: 2670 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2671 | engines: {node: '>=8'} 2672 | dependencies: 2673 | find-up: 4.1.0 2674 | dev: true 2675 | 2676 | /prelude-ls@1.2.1: 2677 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2678 | engines: {node: '>= 0.8.0'} 2679 | dev: true 2680 | 2681 | /prettier@3.0.1: 2682 | resolution: {integrity: sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==} 2683 | engines: {node: '>=14'} 2684 | hasBin: true 2685 | dev: true 2686 | 2687 | /pretty-format@29.6.2: 2688 | resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} 2689 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2690 | dependencies: 2691 | '@jest/schemas': 29.6.0 2692 | ansi-styles: 5.2.0 2693 | react-is: 18.2.0 2694 | dev: true 2695 | 2696 | /prompts@2.4.2: 2697 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2698 | engines: {node: '>= 6'} 2699 | dependencies: 2700 | kleur: 3.0.3 2701 | sisteransi: 1.0.5 2702 | dev: true 2703 | 2704 | /pseudomap@1.0.2: 2705 | resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 2706 | dev: false 2707 | 2708 | /punycode@2.3.0: 2709 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 2710 | engines: {node: '>=6'} 2711 | dev: true 2712 | 2713 | /pure-rand@6.0.2: 2714 | resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} 2715 | dev: true 2716 | 2717 | /queue-microtask@1.2.3: 2718 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2719 | dev: true 2720 | 2721 | /react-is@18.2.0: 2722 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 2723 | dev: true 2724 | 2725 | /readable-stream@3.6.2: 2726 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 2727 | engines: {node: '>= 6'} 2728 | dependencies: 2729 | inherits: 2.0.4 2730 | string_decoder: 1.3.0 2731 | util-deprecate: 1.0.2 2732 | dev: false 2733 | 2734 | /require-directory@2.1.1: 2735 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2736 | engines: {node: '>=0.10.0'} 2737 | dev: true 2738 | 2739 | /resolve-cwd@3.0.0: 2740 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 2741 | engines: {node: '>=8'} 2742 | dependencies: 2743 | resolve-from: 5.0.0 2744 | dev: true 2745 | 2746 | /resolve-from@4.0.0: 2747 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2748 | engines: {node: '>=4'} 2749 | dev: true 2750 | 2751 | /resolve-from@5.0.0: 2752 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2753 | engines: {node: '>=8'} 2754 | dev: true 2755 | 2756 | /resolve.exports@2.0.2: 2757 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 2758 | engines: {node: '>=10'} 2759 | dev: true 2760 | 2761 | /resolve@1.22.4: 2762 | resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} 2763 | hasBin: true 2764 | dependencies: 2765 | is-core-module: 2.13.0 2766 | path-parse: 1.0.7 2767 | supports-preserve-symlinks-flag: 1.0.0 2768 | dev: true 2769 | 2770 | /restore-cursor@3.1.0: 2771 | resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} 2772 | engines: {node: '>=8'} 2773 | dependencies: 2774 | onetime: 5.1.2 2775 | signal-exit: 3.0.7 2776 | dev: false 2777 | 2778 | /restore-cursor@4.0.0: 2779 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 2780 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2781 | dependencies: 2782 | onetime: 5.1.2 2783 | signal-exit: 3.0.7 2784 | dev: false 2785 | 2786 | /reusify@1.0.4: 2787 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2788 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2789 | dev: true 2790 | 2791 | /rimraf@3.0.2: 2792 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2793 | hasBin: true 2794 | dependencies: 2795 | glob: 7.2.3 2796 | dev: true 2797 | 2798 | /run-async@3.0.0: 2799 | resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} 2800 | engines: {node: '>=0.12.0'} 2801 | dev: false 2802 | 2803 | /run-parallel@1.2.0: 2804 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2805 | dependencies: 2806 | queue-microtask: 1.2.3 2807 | dev: true 2808 | 2809 | /rxjs@7.8.1: 2810 | resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} 2811 | dependencies: 2812 | tslib: 2.6.1 2813 | dev: false 2814 | 2815 | /safe-buffer@5.2.1: 2816 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2817 | dev: false 2818 | 2819 | /safer-buffer@2.1.2: 2820 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2821 | dev: false 2822 | 2823 | /semver@6.3.1: 2824 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2825 | hasBin: true 2826 | dev: true 2827 | 2828 | /semver@7.5.4: 2829 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 2830 | engines: {node: '>=10'} 2831 | hasBin: true 2832 | dependencies: 2833 | lru-cache: 6.0.0 2834 | dev: true 2835 | 2836 | /shebang-command@1.2.0: 2837 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 2838 | engines: {node: '>=0.10.0'} 2839 | dependencies: 2840 | shebang-regex: 1.0.0 2841 | dev: false 2842 | 2843 | /shebang-command@2.0.0: 2844 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2845 | engines: {node: '>=8'} 2846 | dependencies: 2847 | shebang-regex: 3.0.0 2848 | 2849 | /shebang-regex@1.0.0: 2850 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 2851 | engines: {node: '>=0.10.0'} 2852 | dev: false 2853 | 2854 | /shebang-regex@3.0.0: 2855 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2856 | engines: {node: '>=8'} 2857 | 2858 | /signal-exit@3.0.7: 2859 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2860 | 2861 | /sisteransi@1.0.5: 2862 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2863 | dev: true 2864 | 2865 | /slash@3.0.0: 2866 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2867 | engines: {node: '>=8'} 2868 | dev: true 2869 | 2870 | /source-map-support@0.5.13: 2871 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 2872 | dependencies: 2873 | buffer-from: 1.1.2 2874 | source-map: 0.6.1 2875 | dev: true 2876 | 2877 | /source-map@0.6.1: 2878 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2879 | engines: {node: '>=0.10.0'} 2880 | dev: true 2881 | 2882 | /sprintf-js@1.0.3: 2883 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2884 | dev: true 2885 | 2886 | /stack-utils@2.0.6: 2887 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 2888 | engines: {node: '>=10'} 2889 | dependencies: 2890 | escape-string-regexp: 2.0.0 2891 | dev: true 2892 | 2893 | /stdin-discarder@0.1.0: 2894 | resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} 2895 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2896 | dependencies: 2897 | bl: 5.1.0 2898 | dev: false 2899 | 2900 | /string-length@4.0.2: 2901 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 2902 | engines: {node: '>=10'} 2903 | dependencies: 2904 | char-regex: 1.0.2 2905 | strip-ansi: 6.0.1 2906 | dev: true 2907 | 2908 | /string-width@4.2.3: 2909 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2910 | engines: {node: '>=8'} 2911 | dependencies: 2912 | emoji-regex: 8.0.0 2913 | is-fullwidth-code-point: 3.0.0 2914 | strip-ansi: 6.0.1 2915 | 2916 | /string-width@6.1.0: 2917 | resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} 2918 | engines: {node: '>=16'} 2919 | dependencies: 2920 | eastasianwidth: 0.2.0 2921 | emoji-regex: 10.2.1 2922 | strip-ansi: 7.1.0 2923 | dev: false 2924 | 2925 | /string_decoder@1.3.0: 2926 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2927 | dependencies: 2928 | safe-buffer: 5.2.1 2929 | dev: false 2930 | 2931 | /strip-ansi@6.0.1: 2932 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2933 | engines: {node: '>=8'} 2934 | dependencies: 2935 | ansi-regex: 5.0.1 2936 | 2937 | /strip-ansi@7.1.0: 2938 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2939 | engines: {node: '>=12'} 2940 | dependencies: 2941 | ansi-regex: 6.0.1 2942 | dev: false 2943 | 2944 | /strip-bom@4.0.0: 2945 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 2946 | engines: {node: '>=8'} 2947 | dev: true 2948 | 2949 | /strip-eof@1.0.0: 2950 | resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} 2951 | engines: {node: '>=0.10.0'} 2952 | dev: false 2953 | 2954 | /strip-final-newline@2.0.0: 2955 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2956 | engines: {node: '>=6'} 2957 | dev: true 2958 | 2959 | /strip-final-newline@3.0.0: 2960 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 2961 | engines: {node: '>=12'} 2962 | dev: false 2963 | 2964 | /strip-json-comments@3.1.1: 2965 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2966 | engines: {node: '>=8'} 2967 | dev: true 2968 | 2969 | /supports-color@5.5.0: 2970 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2971 | engines: {node: '>=4'} 2972 | dependencies: 2973 | has-flag: 3.0.0 2974 | dev: true 2975 | 2976 | /supports-color@7.2.0: 2977 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2978 | engines: {node: '>=8'} 2979 | dependencies: 2980 | has-flag: 4.0.0 2981 | 2982 | /supports-color@8.1.1: 2983 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2984 | engines: {node: '>=10'} 2985 | dependencies: 2986 | has-flag: 4.0.0 2987 | dev: true 2988 | 2989 | /supports-preserve-symlinks-flag@1.0.0: 2990 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2991 | engines: {node: '>= 0.4'} 2992 | dev: true 2993 | 2994 | /test-exclude@6.0.0: 2995 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 2996 | engines: {node: '>=8'} 2997 | dependencies: 2998 | '@istanbuljs/schema': 0.1.3 2999 | glob: 7.2.3 3000 | minimatch: 3.1.2 3001 | dev: true 3002 | 3003 | /text-table@0.2.0: 3004 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 3005 | dev: true 3006 | 3007 | /tmp@0.0.33: 3008 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 3009 | engines: {node: '>=0.6.0'} 3010 | dependencies: 3011 | os-tmpdir: 1.0.2 3012 | dev: false 3013 | 3014 | /tmpl@1.0.5: 3015 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 3016 | dev: true 3017 | 3018 | /to-fast-properties@2.0.0: 3019 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 3020 | engines: {node: '>=4'} 3021 | dev: true 3022 | 3023 | /to-regex-range@5.0.1: 3024 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3025 | engines: {node: '>=8.0'} 3026 | dependencies: 3027 | is-number: 7.0.0 3028 | dev: true 3029 | 3030 | /tslib@2.6.1: 3031 | resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} 3032 | dev: false 3033 | 3034 | /type-check@0.4.0: 3035 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 3036 | engines: {node: '>= 0.8.0'} 3037 | dependencies: 3038 | prelude-ls: 1.2.1 3039 | dev: true 3040 | 3041 | /type-detect@4.0.8: 3042 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 3043 | engines: {node: '>=4'} 3044 | dev: true 3045 | 3046 | /type-fest@0.20.2: 3047 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 3048 | engines: {node: '>=10'} 3049 | dev: true 3050 | 3051 | /type-fest@0.21.3: 3052 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 3053 | engines: {node: '>=10'} 3054 | 3055 | /update-browserslist-db@1.0.11(browserslist@4.21.10): 3056 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 3057 | hasBin: true 3058 | peerDependencies: 3059 | browserslist: '>= 4.21.0' 3060 | dependencies: 3061 | browserslist: 4.21.10 3062 | escalade: 3.1.1 3063 | picocolors: 1.0.0 3064 | dev: true 3065 | 3066 | /uri-js@4.4.1: 3067 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3068 | dependencies: 3069 | punycode: 2.3.0 3070 | dev: true 3071 | 3072 | /util-deprecate@1.0.2: 3073 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 3074 | dev: false 3075 | 3076 | /v8-to-istanbul@9.1.0: 3077 | resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} 3078 | engines: {node: '>=10.12.0'} 3079 | dependencies: 3080 | '@jridgewell/trace-mapping': 0.3.19 3081 | '@types/istanbul-lib-coverage': 2.0.4 3082 | convert-source-map: 1.9.0 3083 | dev: true 3084 | 3085 | /walker@1.0.8: 3086 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 3087 | dependencies: 3088 | makeerror: 1.0.12 3089 | dev: true 3090 | 3091 | /wcwidth@1.0.1: 3092 | resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} 3093 | dependencies: 3094 | defaults: 1.0.4 3095 | dev: false 3096 | 3097 | /web-streams-polyfill@3.2.1: 3098 | resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} 3099 | engines: {node: '>= 8'} 3100 | dev: false 3101 | 3102 | /which@1.3.1: 3103 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 3104 | hasBin: true 3105 | dependencies: 3106 | isexe: 2.0.0 3107 | dev: false 3108 | 3109 | /which@2.0.2: 3110 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3111 | engines: {node: '>= 8'} 3112 | hasBin: true 3113 | dependencies: 3114 | isexe: 2.0.0 3115 | 3116 | /wrap-ansi@6.2.0: 3117 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 3118 | engines: {node: '>=8'} 3119 | dependencies: 3120 | ansi-styles: 4.3.0 3121 | string-width: 4.2.3 3122 | strip-ansi: 6.0.1 3123 | dev: false 3124 | 3125 | /wrap-ansi@7.0.0: 3126 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3127 | engines: {node: '>=10'} 3128 | dependencies: 3129 | ansi-styles: 4.3.0 3130 | string-width: 4.2.3 3131 | strip-ansi: 6.0.1 3132 | dev: true 3133 | 3134 | /wrappy@1.0.2: 3135 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3136 | dev: true 3137 | 3138 | /write-file-atomic@4.0.2: 3139 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 3140 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3141 | dependencies: 3142 | imurmurhash: 0.1.4 3143 | signal-exit: 3.0.7 3144 | dev: true 3145 | 3146 | /y18n@5.0.8: 3147 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 3148 | engines: {node: '>=10'} 3149 | dev: true 3150 | 3151 | /yallist@2.1.2: 3152 | resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 3153 | dev: false 3154 | 3155 | /yallist@3.1.1: 3156 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3157 | dev: true 3158 | 3159 | /yallist@4.0.0: 3160 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3161 | dev: true 3162 | 3163 | /yargs-parser@21.1.1: 3164 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 3165 | engines: {node: '>=12'} 3166 | dev: true 3167 | 3168 | /yargs@17.7.2: 3169 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 3170 | engines: {node: '>=12'} 3171 | dependencies: 3172 | cliui: 8.0.1 3173 | escalade: 3.1.1 3174 | get-caller-file: 2.0.5 3175 | require-directory: 2.1.1 3176 | string-width: 4.2.3 3177 | y18n: 5.0.8 3178 | yargs-parser: 21.1.1 3179 | dev: true 3180 | 3181 | /yocto-queue@0.1.0: 3182 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3183 | engines: {node: '>=10'} 3184 | dev: true 3185 | --------------------------------------------------------------------------------