From 8637271b62be33c174e6d8b954c25dd3cbecf51a Mon Sep 17 00:00:00 2001 From: atticusofsparta Date: Tue, 12 Dec 2023 00:09:26 -0600 Subject: [PATCH] chore(tests): add unit tests to contract functions --- globals.d.ts | 16 + package.json | 12 +- src/actions/read/balance.test.ts | 58 ++ src/actions/read/balance.ts | 4 - src/actions/write/evolve.test.ts | 77 ++- src/actions/write/removeController.test.ts | 101 +++ src/actions/write/removeController.ts | 7 +- src/actions/write/removeRecord.test.ts | 153 +++++ src/actions/write/removeRecord.ts | 8 +- src/actions/write/setController.test.ts | 98 +++ src/actions/write/setName.test.ts | 79 +++ src/actions/write/setName.ts | 7 +- src/actions/write/setRecord.test.ts | 177 ++++++ src/actions/write/setRecord.ts | 7 +- src/actions/write/setTicker.test.ts | 80 +++ src/actions/write/setTicker.ts | 7 +- src/actions/write/transfer.test.ts | 127 ++++ src/actions/write/transferTokens.ts | 7 +- src/constants.ts | 1 + tests/utils/constants.ts | 29 + yarn.lock | 677 ++++++++++++++++++++- 21 files changed, 1665 insertions(+), 67 deletions(-) create mode 100644 src/actions/read/balance.test.ts create mode 100644 src/actions/write/removeController.test.ts create mode 100644 src/actions/write/removeRecord.test.ts create mode 100644 src/actions/write/setController.test.ts create mode 100644 src/actions/write/setName.test.ts create mode 100644 src/actions/write/setRecord.test.ts create mode 100644 src/actions/write/setTicker.test.ts create mode 100644 src/actions/write/transfer.test.ts diff --git a/globals.d.ts b/globals.d.ts index 4a6deee..cfdfa20 100644 --- a/globals.d.ts +++ b/globals.d.ts @@ -1,2 +1,18 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ declare let SmartWeave: any; declare let ContractError: any; diff --git a/package.json b/package.json index e1df547..b12204e 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ }, "devDependencies": { "@babel/preset-typescript": "^7.16.7", + "@commitlint/config-conventional": "^18.4.3", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/jest": "^27.4.0", "@types/node": "^20.10.3", @@ -26,6 +27,7 @@ "arbundles": "^0.6.18", "arlocal": "1.1.60", "arweave": "1.13.7", + "commitlint": "^18.4.3", "dotenv": "^16.3.1", "esbuild": "^0.17.12", "eslint": "^6.7.2", @@ -35,7 +37,8 @@ "eslint-plugin-prettier": "^3.3.1", "husky": "^8.0.3", "jest": "^29.7.0", - "prettier": "^3.1.0", + "lint-staged": "^15.2.0", + "prettier": "^3.1.1", "replace-in-file": "^6.2.0", "rimraf": "^5.0.5", "ts-jest": "^29.1.1", @@ -46,13 +49,10 @@ }, "lint-staged": { "**/*.{ts,js,json}": [ - "eslint --fix .", - "prettier --write ." + "eslint . --fix", + "prettier . --write" ] }, - "dependencies": { - "lint-staged": "^15.2.0" - }, "resolutions": { "arweave": "1.13.7" } diff --git a/src/actions/read/balance.test.ts b/src/actions/read/balance.test.ts new file mode 100644 index 0000000..e36e889 --- /dev/null +++ b/src/actions/read/balance.test.ts @@ -0,0 +1,58 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { ANTState, AntContractReadResult } from 'src/types'; + +import { + INVALID_INPUT_MESSAGE, + baselineAntState, +} from '../../../tests/utils/constants'; +import { balance } from './balance'; + +describe('balance', () => { + let state: ANTState = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each(['test', '?', false, Infinity, 0, -1, parseInt(''.padEnd(43, '1'))])( + 'should throw error on invalid address type', + async (user: any) => { + const _state = { ...state, balances: { [user]: 1 } }; + const result = await balance(_state, { + caller: 'test', + input: { + function: 'balance', + target: user, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }, + ); + + it('should return 0 for non-existent user', async () => { + const { result } = (await balance(state, { + caller: 'test', + input: { + function: 'balance', + target: ''.padEnd(43, '1'), + }, + })) as AntContractReadResult; + const { balance: _balance } = result as any; + expect(_balance).toEqual(0); + }); +}); diff --git a/src/actions/read/balance.ts b/src/actions/read/balance.ts index 4e682e2..d62df30 100644 --- a/src/actions/read/balance.ts +++ b/src/actions/read/balance.ts @@ -33,10 +33,6 @@ export const balance = async ( throw new ContractError(INVALID_INPUT_MESSAGE); } - if (typeof target !== 'string') { - throw new ContractError('Must specify target to get balance for'); - } - return { result: { target, ticker, balance: target === owner ? 1 : 0 }, }; diff --git a/src/actions/write/evolve.test.ts b/src/actions/write/evolve.test.ts index 9f21737..8348d5e 100644 --- a/src/actions/write/evolve.test.ts +++ b/src/actions/write/evolve.test.ts @@ -1,19 +1,27 @@ -import { INVALID_INPUT_MESSAGE } from '../../constants'; -import { ANTState } from '../../types'; +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { baselineAntState } from '../../../tests/utils/constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../constants'; +import { AntContractWriteResult } from '../../types'; import { evolve } from './evolve'; -const baselineAntState: ANTState = { - owner: 'test', - evolve: 'test', - controllers: ['test'], - balances: { - test: 1, - }, - name: 'test', - records: {}, - ticker: 'ANT-TEST', -}; - describe('evolve', () => { it.each([ { @@ -40,8 +48,43 @@ describe('evolve', () => { }, }).catch((e) => e); expect(error).toBeInstanceOf(Error); - expect(error.message).toEqual( - expect.stringContaining(INVALID_INPUT_MESSAGE), - ); + expect(error.message).toEqual(INVALID_INPUT_MESSAGE); }); + + it.each(['hacker'])( + 'should throw an error on bad caller', + async (badCaller: string) => { + const error: any = await evolve(baselineAntState, { + caller: badCaller, + input: { + function: 'evolve', + value: '1111111111111111111111111111111111111111111', + }, + }).catch((e) => e); + expect(error).toBeInstanceOf(Error); + expect(error.message).toEqual(NON_CONTRACT_OWNER_MESSAGE); + }, + ); + + it.each([ + { + value: '1111111111111111111111111111111111111111111', + }, + ])( + 'should evolve the contract with valid input', + async (goodInput: { value: string }) => { + const result = (await evolve(baselineAntState, { + caller: 'test', + input: { + function: 'evolve', + ...goodInput, + }, + })) as AntContractWriteResult; + + expect(result.state).toEqual({ + ...baselineAntState, + evolve: goodInput.value, + }); + }, + ); }); diff --git a/src/actions/write/removeController.test.ts b/src/actions/write/removeController.test.ts new file mode 100644 index 0000000..0ad10d2 --- /dev/null +++ b/src/actions/write/removeController.test.ts @@ -0,0 +1,101 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { AntContractWriteResult } from 'src/types'; + +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, + baselineAntState, +} from '../../../tests/utils/constants'; +import { removeController } from './removeController'; + +describe('removeController', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '?'.padEnd(42, '1'), + ''.padEnd(44, '1'), + ])('should throw on bad target', async (target: any) => { + const _state = { ...state, controllers: [target] }; + const result = await removeController(_state, { + caller: 'test', + input: { + function: 'removeController', + target, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should not remove controller as non-owner', + async (target: string) => { + const _state = { ...state, controllers: [target] }; + const result = await removeController(_state, { + caller: target, + input: { + function: 'removeController', + target, + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_MESSAGE); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should throw if target not a controller', + async (target: string) => { + const _state = { ...state, controllers: [] }; + const result = await removeController(_state, { + caller: 'test', + input: { + function: 'removeController', + target, + }, + }).catch((e) => e); + + expect(result.message).toContain('is not a controller'); + expect(result.message).toContain(target); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should remove controller', + async (target: string) => { + const _state = { ...state, controllers: [target] }; + const result = (await removeController(_state, { + caller: 'test', + input: { + function: 'removeController', + target, + }, + })) as AntContractWriteResult; + + expect(result.state).not.toContain(target); + }, + ); +}); diff --git a/src/actions/write/removeController.ts b/src/actions/write/removeController.ts index 7764539..0c0bdb3 100644 --- a/src/actions/write/removeController.ts +++ b/src/actions/write/removeController.ts @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { INVALID_INPUT_MESSAGE } from '../../constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; // composed by ajv at build import { validateRemoveController } from '../../validations'; @@ -34,7 +37,7 @@ export const removeController = async ( const owner = state.owner; if (caller !== owner) { - throw new ContractError(`Caller is not the token owner!`); + throw new ContractError(NON_CONTRACT_OWNER_MESSAGE); } if (!state.controllers.includes(target)) { diff --git a/src/actions/write/removeRecord.test.ts b/src/actions/write/removeRecord.test.ts new file mode 100644 index 0000000..f0d3821 --- /dev/null +++ b/src/actions/write/removeRecord.test.ts @@ -0,0 +1,153 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { AntContractWriteResult } from 'src/types'; + +import { + INVALID_INPUT_MESSAGE, + MAX_NAME_LENGTH, + MIN_TTL_LENGTH, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, + baselineAntState, +} from '../../../tests/utils/constants'; +import { removeRecord } from './removeRecord'; + +describe('removeRecord', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '$', + '%', + '=', + '?'.padEnd(MAX_NAME_LENGTH + 1, '1'), + ])('should throw on bad domain', async (subDomain: any) => { + const _state = { + ...state, + records: { + [subDomain]: { + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }, + }; + const result = await removeRecord(_state, { + caller: 'test', + input: { + function: 'removeRecord', + subDomain, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should not remove domain as non-owner or controller', + async (hacker: string) => { + const _state = { + ...state, + records: { + subDomain: { + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }, + }; + const result = await removeRecord(_state, { + caller: hacker, + input: { + function: 'removeRecord', + subDomain: 'subDomain', + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); + }, + ); + + it.each(['fibonachi', 'sequence1', 'tetra-hedron'])( + 'should throw if domain not a record', + async (subDomain: string) => { + const _state = { ...state, controllers: [] }; + const result = await removeRecord(_state, { + caller: 'test', + input: { + function: 'removeRecord', + subDomain, + }, + }).catch((e) => e); + + expect(result.message).toEqual('SubDomain does not exist in this ANT!'); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should remove domain as owner', + async (owner: string) => { + const _state = { + ...state, + owner, + records: { + subDomain: { + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }, + }; + const result = (await removeRecord(_state, { + caller: owner, + input: { + function: 'removeRecord', + subDomain: 'subDomain', + }, + })) as AntContractWriteResult; + expect(result.state.records).toEqual({}); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should remove domain as controller', + async (controller: string) => { + const _state = { + ...state, + controllers: [controller], + records: { + subDomain: { + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }, + }; + const result = (await removeRecord(_state, { + caller: controller, + input: { + function: 'removeRecord', + subDomain: 'subDomain', + }, + })) as AntContractWriteResult; + expect(result.state.records).toEqual({}); + }, + ); +}); diff --git a/src/actions/write/removeRecord.ts b/src/actions/write/removeRecord.ts index 51a833f..31ea300 100644 --- a/src/actions/write/removeRecord.ts +++ b/src/actions/write/removeRecord.ts @@ -14,7 +14,11 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { INVALID_INPUT_MESSAGE } from '../../constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; import { validateRemoveRecord } from '../../validations'; @@ -35,7 +39,7 @@ export const removeRecord = async ( } if (caller !== owner && !controllers.includes(caller)) { - throw new ContractError(`Caller is not the token owner or controller!`); + throw new ContractError(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); } if (subDomain in records) { diff --git a/src/actions/write/setController.test.ts b/src/actions/write/setController.test.ts new file mode 100644 index 0000000..736a488 --- /dev/null +++ b/src/actions/write/setController.test.ts @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../../src/constants'; +import { AntContractWriteResult } from '../../../src/types'; +import { baselineAntState } from '../../../tests/utils/constants'; +import { setController } from './setController'; + +describe('setController', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '?'.padEnd(42, '1'), + ''.padEnd(44, '2'), + ])('should throw on bad target', async (target: any) => { + const _state = { ...state, controllers: [] }; + const result = await setController(_state, { + caller: 'test', + input: { + function: 'setController', + target, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should not set controller if already set', + async (target: string) => { + const _state = { ...state, controllers: [target] }; + const result = await setController(_state, { + caller: 'test', + input: { + function: 'setController', + target, + }, + }).catch((e) => e); + expect(result.message).toContain(target); + expect(result.message).toContain('is already in the list of controllers'); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should not set controller as non-owner', + async (target: string) => { + const _state = { ...state, controllers: [] }; + const result = await setController(_state, { + caller: target, + input: { + function: 'setController', + target, + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_MESSAGE); + }, + ); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should set controller', + async (target: string) => { + const _state = { ...state, controllers: [] }; + const result = (await setController(_state, { + caller: 'test', + input: { + function: 'setController', + target, + }, + })) as AntContractWriteResult; + expect(result.state.controllers).toEqual([target]); + }, + ); +}); diff --git a/src/actions/write/setName.test.ts b/src/actions/write/setName.test.ts new file mode 100644 index 0000000..4b563d5 --- /dev/null +++ b/src/actions/write/setName.test.ts @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, +} from '../../../src/constants'; +import { AntContractWriteResult } from '../../../src/types'; +import { baselineAntState } from '../../../tests/utils/constants'; +import { setName } from './setName'; + +describe('setName', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it('should throw if not owner or controller', async () => { + const result = await setName(state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'setName', + name: 'muahahahaha i am a hacker and i am going to change your name without your permission', + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); + }); + + it.each([undefined, Infinity, 1, 0, -1, 1.1, true, false, null, {}, []])( + 'should throw on bad name', + async (name: any) => { + const result = await setName(state, { + caller: 'test', + input: { + function: 'setName', + name, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }, + ); + + it('should set name as owner', async () => { + const result = (await setName(state, { + caller: 'test', + input: { + function: 'setName', + name: 'test', + }, + })) as AntContractWriteResult; + expect(result.state.name).toEqual('test'); + }); + + it('should set name as controller', async () => { + const _state = { ...state, controllers: [''.padEnd(43, '1')] }; + const result = (await setName(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'setName', + name: 'test', + }, + })) as AntContractWriteResult; + expect(result.state.name).toEqual('test'); + }); +}); diff --git a/src/actions/write/setName.ts b/src/actions/write/setName.ts index b1868ab..025d4a2 100644 --- a/src/actions/write/setName.ts +++ b/src/actions/write/setName.ts @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { INVALID_INPUT_MESSAGE } from '../../constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, +} from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; // composed by ajv at build import { validateSetName } from '../../validations'; @@ -35,7 +38,7 @@ export const setName = async ( } if (caller !== owner && !controllers.includes(caller)) { - throw new ContractError(`Caller is not the token owner or controller!`); + throw new ContractError(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); } state.name = name; diff --git a/src/actions/write/setRecord.test.ts b/src/actions/write/setRecord.test.ts new file mode 100644 index 0000000..1912bb9 --- /dev/null +++ b/src/actions/write/setRecord.test.ts @@ -0,0 +1,177 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + INVALID_INPUT_MESSAGE, + MAX_NAME_LENGTH, + MIN_TTL_LENGTH, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, +} from '../../../src/constants'; +import { AntContractWriteResult } from '../../../src/types'; +import { baselineAntState } from '../../../tests/utils/constants'; +import { setRecord } from './setRecord'; + +describe('setRecord', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each([''.padEnd(43, '_'), ''.padEnd(43, 'a'), ''.padEnd(43, '1')])( + 'should throw if not owner or controller', + async (caller) => { + const result = await setRecord(state, { + caller, + input: { + function: 'setRecord', + subDomain: 'domain', + ttlSeconds: MIN_TTL_LENGTH, + transactionId: caller, + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); + }, + ); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '$', + '%', + '=', + '?'.padEnd(MAX_NAME_LENGTH + 1, '1'), + ])('should throw on bad subDomain', async (subDomain: any) => { + const result = await setRecord(state, { + caller: 'test', + input: { + function: 'setRecord', + subDomain, + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each(['www'])( + 'should throw on invalid or reserved subDomain', + async (subDomain: any) => { + const result = await setRecord(state, { + caller: 'test', + input: { + function: 'setRecord', + subDomain, + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }).catch((e) => e); + expect(result.message).toEqual('Invalid ArNS Record Subdomain'); + }, + ); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '$', + '%', + '=', + '?'.padEnd(MAX_NAME_LENGTH + 1, '1'), + ])('should throw on bad transactionId', async (transactionId: any) => { + const result = await setRecord(state, { + caller: 'test', + input: { + function: 'setRecord', + subDomain: 'domain', + transactionId, + ttlSeconds: MIN_TTL_LENGTH, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '$', + '%', + '=', + '?'.padEnd(MAX_NAME_LENGTH + 1, '1'), + ])('should throw on bad ttlSeconds', async (ttlSeconds: any) => { + const result = await setRecord(state, { + caller: 'test', + input: { + function: 'setRecord', + subDomain: 'domain', + transactionId: ''.padEnd(43, '1'), + ttlSeconds, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each([''.padEnd(43, '1'), ''.padEnd(43, 'a')])( + 'should set record as controller', + async (controller: string) => { + const _state = { + ...state, + controllers: [controller], + }; + const result = (await setRecord(_state, { + caller: controller, + input: { + function: 'setRecord', + subDomain: 'domain', + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + })) as AntContractWriteResult; + expect(result.state.records).toEqual({ + domain: { + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + }); + }, + ); + + it('should set record as owner', async () => { + const result = (await setRecord(state, { + caller: state.owner, + input: { + function: 'setRecord', + subDomain: 'domain', + transactionId: ''.padEnd(43, '1'), + ttlSeconds: MIN_TTL_LENGTH, + }, + })) as AntContractWriteResult; + expect(result.state.records).toEqual({ + domain: { transactionId: ''.padEnd(43, '1'), ttlSeconds: MIN_TTL_LENGTH }, + }); + }); +}); diff --git a/src/actions/write/setRecord.ts b/src/actions/write/setRecord.ts index 155cce8..1e6b9d8 100644 --- a/src/actions/write/setRecord.ts +++ b/src/actions/write/setRecord.ts @@ -16,10 +16,7 @@ */ import { INVALID_INPUT_MESSAGE, - MAX_NAME_LENGTH, - MIN_TTL_LENGTH, - NON_CONTRACT_OWNER_MESSAGE, - TX_ID_LENGTH, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, } from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; import { validateSetRecord } from '../../validations'; @@ -41,7 +38,7 @@ export const setRecord = async ( // ensure the owner owns this ANT if (caller !== owner && !controllers.includes(caller)) { - throw new ContractError(NON_CONTRACT_OWNER_MESSAGE); + throw new ContractError(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); } if (subDomain === 'www') { diff --git a/src/actions/write/setTicker.test.ts b/src/actions/write/setTicker.test.ts new file mode 100644 index 0000000..2cc58e0 --- /dev/null +++ b/src/actions/write/setTicker.test.ts @@ -0,0 +1,80 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, +} from '../../../src/constants'; +import { AntContractWriteResult } from '../../../src/types'; +import { baselineAntState } from '../../../tests/utils/constants'; +import { setTicker } from './setTicker'; + +describe('setTicker', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it('should throw if not owner or controller', async () => { + const result = await setTicker(state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'setTicker', + ticker: + 'muahahahaha i am a hacker and i am going to change your ticker without your permission', + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); + }); + + it.each([undefined, Infinity, 1, 0, -1, 1.1, true, false, null, {}, []])( + 'should throw on bad ticker', + async (ticker: any) => { + const result = await setTicker(state, { + caller: 'test', + input: { + function: 'setTicker', + ticker, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }, + ); + + it('should set ticker as owner', async () => { + const result = (await setTicker(state, { + caller: 'test', + input: { + function: 'setTicker', + ticker: 'test', + }, + })) as AntContractWriteResult; + expect(result.state.ticker).toEqual('test'); + }); + + it('should set ticker as controller', async () => { + const _state = { ...state, controllers: [''.padEnd(43, '1')] }; + const result = (await setTicker(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'setTicker', + ticker: 'test', + }, + })) as AntContractWriteResult; + expect(result.state.ticker).toEqual('test'); + }); +}); diff --git a/src/actions/write/setTicker.ts b/src/actions/write/setTicker.ts index 3e383f2..2d6c8be 100644 --- a/src/actions/write/setTicker.ts +++ b/src/actions/write/setTicker.ts @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { INVALID_INPUT_MESSAGE } from '../../constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_CONTROLLER_MESSAGE, +} from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; import { validateSetTicker } from '../../validations'; @@ -34,7 +37,7 @@ export const setTicker = async ( } if (caller !== owner && !controllers.includes(caller)) { - throw new ContractError(`Caller is not the token owner or controller!`); + throw new ContractError(NON_CONTRACT_OWNER_CONTROLLER_MESSAGE); } state.ticker = ticker; diff --git a/src/actions/write/transfer.test.ts b/src/actions/write/transfer.test.ts new file mode 100644 index 0000000..72c6200 --- /dev/null +++ b/src/actions/write/transfer.test.ts @@ -0,0 +1,127 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../../src/constants'; +import { AntContractWriteResult } from '../../../src/types'; +import { baselineAntState } from '../../../tests/utils/constants'; +import { transferTokens } from './transferTokens'; + +describe('transferTokens', () => { + let state = { ...baselineAntState }; + + beforeEach(() => { + state = { ...baselineAntState }; + }); + + it.each([ + undefined, + false, + 1, + 0, + Infinity, + -1, + '?'.padEnd(42, '1'), + ''.padEnd(44, '1'), + ])('should throw on invalid recipient address', async (target: any) => { + const _state = { ...state }; + const result = await transferTokens(_state, { + caller: 'test', + input: { + function: 'transfer', + target, + }, + }).catch((e) => e); + expect(result.message).toEqual(INVALID_INPUT_MESSAGE); + }); + + it.each(['23e', null, undefined])( + 'should throw on invalid balance type', + async (bal: any) => { + const _state = { + ...state, + owner: ''.padEnd(43, '1'), + balances: { [''.padEnd(43, '1')]: bal }, + }; + const result = await transferTokens(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'transfer', + target: ''.padEnd(43, '2'), + }, + }).catch((e) => e); + expect(result.message).toEqual(`Caller balance is not defined!`); + }, + ); + + it('should throw on insufficient balance', async () => { + const _state = { + ...state, + owner: ''.padEnd(43, '1'), + balances: { [''.padEnd(43, '1')]: 0.1 }, + }; + const result = await transferTokens(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'transfer', + target: ''.padEnd(43, '2'), + }, + }).catch((e) => e); + expect(result.message).toEqual(`Caller does not have a token balance!`); + }); + + it('should throw on transfer to self', async () => { + const _state = { + ...state, + owner: ''.padEnd(43, '1'), + balances: { [''.padEnd(43, '1')]: 1 }, + }; + const result = await transferTokens(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'transfer', + target: ''.padEnd(43, '1'), + }, + }).catch((e) => e); + expect(result.message).toEqual('Invalid token transfer'); + }); + + it('should throw if not contract owner', async () => { + const _state = { ...state, balances: { [''.padEnd(43, '1')]: 1 } }; + const result = await transferTokens(_state, { + caller: ''.padEnd(43, '1'), + input: { + function: 'transfer', + target: ''.padEnd(43, '2'), + }, + }).catch((e) => e); + expect(result.message).toEqual(NON_CONTRACT_OWNER_MESSAGE); + }); + + it('should transfer ownership', async () => { + const result = (await transferTokens(state, { + caller: state.owner, + input: { + function: 'transfer', + target: ''.padEnd(43, '1'), + }, + })) as AntContractWriteResult; + expect(result.state.owner).toEqual(''.padEnd(43, '1')); + expect(result.state.balances[''.padEnd(43, '1')]).toEqual(1); + }); +}); diff --git a/src/actions/write/transferTokens.ts b/src/actions/write/transferTokens.ts index 8653514..6a32196 100644 --- a/src/actions/write/transferTokens.ts +++ b/src/actions/write/transferTokens.ts @@ -14,7 +14,10 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import { INVALID_INPUT_MESSAGE } from '../../constants'; +import { + INVALID_INPUT_MESSAGE, + NON_CONTRACT_OWNER_MESSAGE, +} from '../../constants'; import { ANTState, AntAction, ContractResult } from '../../types'; // composed by ajv at build import { validateTransferTokens } from '../../validations'; @@ -39,7 +42,7 @@ export const transferTokens = async ( } if (caller !== owner) { - throw new ContractError(`Caller is not the token owner!`); + throw new ContractError(NON_CONTRACT_OWNER_MESSAGE); } if ( diff --git a/src/constants.ts b/src/constants.ts index c70a0e3..d44d813 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -22,3 +22,4 @@ export const ARWEAVE_ID_REGEX = new RegExp('^[a-zA-Z0-9_-]{43}$'); export const UNDERNAME_REGEX = new RegExp('^[a-zA-Z0-9_-]+$'); export const INVALID_INPUT_MESSAGE = 'Invalid input for interaction'; export const NON_CONTRACT_OWNER_MESSAGE = `Caller is not the owner of the ANT!`; +export const NON_CONTRACT_OWNER_CONTROLLER_MESSAGE = `Caller is not the owner or controller of the ANT!`; diff --git a/tests/utils/constants.ts b/tests/utils/constants.ts index 2a0c0d7..1554265 100644 --- a/tests/utils/constants.ts +++ b/tests/utils/constants.ts @@ -1,3 +1,20 @@ +/** + * Copyright (C) 2022-2024 Permanent Data Solutions, Inc. All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +import { ANTState } from '../../src/types'; import initialContractState from './initial-state.json'; export enum REGISTRATION_TYPES { @@ -27,4 +44,16 @@ export const CONTRACT_SETTINGS = { operatorStakeWithdrawLength: 5, }; // Also export all our other constants +export const baselineAntState: ANTState = { + owner: 'test', + evolve: 'test', + controllers: ['test'], + balances: { + test: 1, + }, + name: 'test', + records: {}, + ticker: 'ANT-TEST', +}; + export * from '../../src/constants'; diff --git a/yarn.lock b/yarn.lock index dd5a0ab..0ba887c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -528,6 +528,165 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@commitlint/cli@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.4.3.tgz#5b6112035f2cb17b76244cde5f1587ab853c2365" + integrity sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww== + dependencies: + "@commitlint/format" "^18.4.3" + "@commitlint/lint" "^18.4.3" + "@commitlint/load" "^18.4.3" + "@commitlint/read" "^18.4.3" + "@commitlint/types" "^18.4.3" + execa "^5.0.0" + lodash.isfunction "^3.0.9" + resolve-from "5.0.0" + resolve-global "1.0.0" + yargs "^17.0.0" + +"@commitlint/config-conventional@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.4.3.tgz#8158e6bd874a86ff46a6424f45acd803bc5fef1b" + integrity sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA== + dependencies: + conventional-changelog-conventionalcommits "^7.0.2" + +"@commitlint/config-validator@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.4.3.tgz#cf71d36383cd5241e3b74097e7110514d5d43860" + integrity sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA== + dependencies: + "@commitlint/types" "^18.4.3" + ajv "^8.11.0" + +"@commitlint/ensure@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.4.3.tgz#1193a6418fe05edc8d5eff91f3129db345fa1d38" + integrity sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg== + dependencies: + "@commitlint/types" "^18.4.3" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.4.3.tgz#4dca5412dc8fdeb4210432961f209d9eb65008f5" + integrity sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q== + +"@commitlint/format@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.4.3.tgz#3478bc2980eb178e13881834e290f12362ec6357" + integrity sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ== + dependencies: + "@commitlint/types" "^18.4.3" + chalk "^4.1.0" + +"@commitlint/is-ignored@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.4.3.tgz#443e1791af9a13a62299c54f836ad25da42f2663" + integrity sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg== + dependencies: + "@commitlint/types" "^18.4.3" + semver "7.5.4" + +"@commitlint/lint@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.4.3.tgz#1c5a912c2c3785e21d499821c4b70c58ff9a2cfb" + integrity sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA== + dependencies: + "@commitlint/is-ignored" "^18.4.3" + "@commitlint/parse" "^18.4.3" + "@commitlint/rules" "^18.4.3" + "@commitlint/types" "^18.4.3" + +"@commitlint/load@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.4.3.tgz#de156698ddf6e9719ecc49159890834490f61bff" + integrity sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q== + dependencies: + "@commitlint/config-validator" "^18.4.3" + "@commitlint/execute-rule" "^18.4.3" + "@commitlint/resolve-extends" "^18.4.3" + "@commitlint/types" "^18.4.3" + "@types/node" "^18.11.9" + chalk "^4.1.0" + cosmiconfig "^8.3.6" + cosmiconfig-typescript-loader "^5.0.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + resolve-from "^5.0.0" + +"@commitlint/message@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.4.3.tgz#1e0985ae7c751a620f01b2cfe8f0e875354805e2" + integrity sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how== + +"@commitlint/parse@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.4.3.tgz#f96515b0fa9b7a05dca52be8b214ab50eadfd9c9" + integrity sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA== + dependencies: + "@commitlint/types" "^18.4.3" + conventional-changelog-angular "^7.0.0" + conventional-commits-parser "^5.0.0" + +"@commitlint/read@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.4.3.tgz#269fb814bb914bf23c8719690bd01c9ad4a6c09a" + integrity sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ== + dependencies: + "@commitlint/top-level" "^18.4.3" + "@commitlint/types" "^18.4.3" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" + minimist "^1.2.6" + +"@commitlint/resolve-extends@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.4.3.tgz#741c42381ea48f4624209bfc0da0a15b5fba75b5" + integrity sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw== + dependencies: + "@commitlint/config-validator" "^18.4.3" + "@commitlint/types" "^18.4.3" + import-fresh "^3.0.0" + lodash.mergewith "^4.6.2" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/rules@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.4.3.tgz#2ae1f16ea1ede20e01ca81ad187fdc65ccc9a5f1" + integrity sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA== + dependencies: + "@commitlint/ensure" "^18.4.3" + "@commitlint/message" "^18.4.3" + "@commitlint/to-lines" "^18.4.3" + "@commitlint/types" "^18.4.3" + execa "^5.0.0" + +"@commitlint/to-lines@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.4.3.tgz#b6cac1eff3d93f0791791a9f8db7b13c6136a350" + integrity sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ== + +"@commitlint/top-level@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.4.3.tgz#f4c6fb8ab98de9240c3ed3e4b330d8c50a0fee3a" + integrity sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw== + dependencies: + find-up "^5.0.0" + +"@commitlint/types@^18.4.3": + version "18.4.3" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.4.3.tgz#bb50de49330ddff2adcc8ccabb840c8e660336b3" + integrity sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA== + dependencies: + chalk "^4.1.0" + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1814,6 +1973,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/minimist@^1.2.0": + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== + "@types/node@*": version "20.10.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.1.tgz#d2c96f356c3125fedc983d74c424910c3767141c" @@ -1826,6 +1990,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/node@^18.11.9": + version "18.19.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" + integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== + dependencies: + undici-types "~5.26.4" + "@types/node@^20.10.3": version "20.10.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.3.tgz#4900adcc7fc189d5af5bb41da8f543cea6962030" @@ -1833,6 +2004,11 @@ dependencies: undici-types "~5.26.4" +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + "@types/qs@*": version "6.9.10" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.10.tgz#0af26845b5067e1c9a622658a51f60a3934d51e8" @@ -1978,6 +2154,14 @@ resolved "https://registry.yarnpkg.com/@weavery/clarity/-/clarity-0.1.5.tgz#f06bbb0dac7c63c6e2ccd76cda3e8b32b57f82c2" integrity sha512-0ms2/sBx+uyW3EmXte5otIzNVAXpfJ3lBl6FS8JuLdWmPU6SxiAoGTMUT0N0SL3Ogiz2PZt6NV+mfApbSvYBaQ== +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -2061,7 +2245,7 @@ ajv@^6.10.0, ajv@^6.10.2: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.12.0: +ajv@^8.11.0, ajv@^8.12.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== @@ -2391,6 +2575,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arlocal@1.1.60: version "1.1.60" resolved "https://registry.yarnpkg.com/arlocal/-/arlocal-1.1.60.tgz#a5b52a360bb72bbc6eb64137bbb120d8d0a43ef0" @@ -2449,11 +2638,21 @@ arlocal@^1.1.59: sqlite3 "^5.0.3" tsc-watch "^4.6.0" +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + articles@~0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/articles/-/articles-0.2.2.tgz#cc6b429f8cfa811f41e7a08505abbb4e45503197" @@ -2933,6 +3132,15 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3185,6 +3393,22 @@ commander@^7.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commitlint@^18.4.3: + version "18.4.3" + resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-18.4.3.tgz#7c5936ee41eddb1ae031b1fa828f97f7c053bd57" + integrity sha512-xNAq3MpW4xZ3VyFH+WU0ykU8LmYcCT+0K4e1IOG5346XSGCb1xJyhFu0JFpq4LfJ7E0/bVxzPY98IsjUH2SQbQ== + dependencies: + "@commitlint/cli" "^18.4.3" + "@commitlint/types" "^18.4.3" + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + compress-commons@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" @@ -3227,6 +3451,30 @@ content-type@^1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== +conventional-changelog-angular@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-changelog-conventionalcommits@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" + integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== + dependencies: + compare-func "^2.0.0" + +conventional-commits-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" + integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== + dependencies: + JSONStream "^1.3.5" + is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" + convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -3250,6 +3498,23 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cosmiconfig-typescript-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" + integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== + dependencies: + jiti "^1.19.1" + +cosmiconfig@^8.3.6: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -3376,6 +3641,11 @@ d@~0.1.1: dependencies: es5-ext "~0.10.2" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== + debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -3390,6 +3660,19 @@ debug@4.3.2: dependencies: ms "2.1.2" +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -3533,6 +3816,13 @@ domain-browser@^4.22.0: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.23.0.tgz#427ebb91efcb070f05cffdfb8a4e9a6c25f8c94b" integrity sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA== +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + dotenv@^16.3.1: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" @@ -4180,6 +4470,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@^11.0.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -4288,6 +4587,17 @@ getopts@2.2.5: resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== +git-raw-commits@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" + integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== + dependencies: + dargs "^7.0.0" + lodash "^4.17.15" + meow "^8.0.0" + split2 "^3.0.0" + through2 "^4.0.0" + glob-parent@^5.0.0, glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4318,6 +4628,13 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.2.0, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== + dependencies: + ini "^1.3.4" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4366,7 +4683,7 @@ got@^11.0.0: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.2.0, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4383,6 +4700,11 @@ graphql@^16.2.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4460,6 +4782,18 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" + integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== + dependencies: + lru-cache "^6.0.0" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -4586,7 +4920,7 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.0.tgz#67418ae40d34d6999c95ff56016759c718c82f78" integrity sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg== -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -4635,6 +4969,11 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.4: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + inquirer@^7.0.0: version "7.3.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" @@ -4708,7 +5047,7 @@ is-callable@^1.1.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.13.0: +is-core-module@^2.13.0, is-core-module@^2.5.0: version "2.13.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== @@ -4784,6 +5123,16 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -4794,6 +5143,13 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + is-typed-array@^1.1.3: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" @@ -5271,6 +5627,11 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" +jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" @@ -5299,6 +5660,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -5351,6 +5719,20 @@ json5@^2.2.3: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + keccak@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" @@ -5374,6 +5756,11 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" +kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5593,6 +5980,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" @@ -5608,27 +6000,67 @@ lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + lodash.union@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5746,6 +6178,16 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -5787,6 +6229,28 @@ memory-level@^1.0.0: functional-red-black-tree "^1.0.1" module-error "^1.0.1" +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + +meow@^8.0.0: + version "8.1.2" + resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" + integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^3.0.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.18.0" + yargs-parser "^20.2.3" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -5855,6 +6319,11 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -5886,6 +6355,15 @@ minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -6137,6 +6615,26 @@ nopt@^5.0.0: dependencies: abbrev "1" +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6352,7 +6850,7 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.6: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" -parse-json@^5.2.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -6494,10 +6992,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.0.tgz#c6d16474a5f764ea1a4a373c593b779697744d5e" - integrity sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw== +prettier@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.1.1.tgz#6ba9f23165d690b6cbdaa88cb0807278f7019848" + integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw== pretty-format@^27.0.0, pretty-format@^27.5.1: version "27.5.1" @@ -6617,6 +7115,11 @@ queue-microtask@^1.2.2, queue-microtask@^1.2.3: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -6664,6 +7167,25 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.5: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -6677,7 +7199,7 @@ readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -6700,6 +7222,14 @@ rechoir@0.7.0: dependencies: resolve "^1.9.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -6741,22 +7271,29 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve-global@1.0.0, resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.17.0, resolve@^1.20.0, resolve@^1.9.0: +resolve@^1.10.0, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.9.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6909,23 +7446,23 @@ secp256k1@^4.0.2: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: +semver@7.5.4, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + sentencer@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/sentencer/-/sentencer-0.2.1.tgz#88a1f4767c14bb8cd148b07822e13b8b55897956" @@ -7106,6 +7643,44 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + split@0.3: version "0.3.3" resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" @@ -7295,6 +7870,13 @@ strip-final-newline@^3.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + strip-json-comments@^3.0.1, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -7378,12 +7960,24 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-extensions@^2.0.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" + integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through@2, through@^2.3.6, through@~2.3, through@~2.3.1: +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -7456,6 +8050,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + ts-jest@^29.1.1: version "29.1.1" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" @@ -7544,11 +8143,21 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" + integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== + type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -7613,6 +8222,11 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -7693,6 +8307,14 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^2.0.0" +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + value-or-promise@1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" @@ -7953,12 +8575,17 @@ yaml@2.3.4: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.4.tgz#53fc1d514be80aabf386dc6001eb29bf3b7523b2" integrity sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA== +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.2.1, yargs@^17.3.1, yargs@^17.5.1: +yargs@^17.0.0, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.5.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==