From e68c1942b2531b50ac3ca403eb16057dd7b93a06 Mon Sep 17 00:00:00 2001 From: andreivladbrg Date: Mon, 15 Jan 2024 17:13:31 +0200 Subject: [PATCH] :boom: upgrade project to a newer version --- .editorconfig | 5 +- .env.example | 3 + .github/workflows/ci.yml | 107 +++++++-- .gitignore | 27 ++- .gitmodules | 3 - .prettierignore | 21 +- .prettierrc.yml | 7 + .solhint.json | 13 +- .vscode/settings.json | 5 +- LICENSE.md | 29 +-- README.md | 16 +- bun.lockb | Bin 0 -> 28128 bytes foundry.toml | 53 +++-- lib/forge-std | 1 - package.json | 27 +-- remappings.txt | 4 +- script/Base.s.sol | 41 ++++ script/DeployContract.s.sol | 14 +- src/Contract.sol | 4 +- test/Contract.t.sol | 10 +- yarn.lock | 462 ------------------------------------ 21 files changed, 252 insertions(+), 600 deletions(-) create mode 100644 .env.example delete mode 100644 .gitmodules create mode 100644 .prettierrc.yml create mode 100755 bun.lockb delete mode 160000 lib/forge-std create mode 100644 script/Base.s.sol delete mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig index 7ae879d..746ae31 100644 --- a/.editorconfig +++ b/.editorconfig @@ -12,5 +12,8 @@ indent_style = space insert_final_newline = true trim_trailing_whitespace = true -[*.{sol}] +[*.sol] indent_size = 4 + +[*.tree] +indent_size = 1 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0e98a76 --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +export API_KEY_INFURA="YOUR_API_KEY_INFURA" +export MNEMONIC="YOUR_MNEMONIC" + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5f5264..f44f30b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,38 +1,97 @@ -name: CI +name: "CI" on: + workflow_dispatch: pull_request: - branches: - - main push: branches: - - main - -env: - FOUNDRY_PROFILE: ci + - "main" jobs: - run-ci: - runs-on: ubuntu-latest + lint: + runs-on: "ubuntu-latest" steps: - - uses: "actions/checkout@v3" - with: - submodules: "recursive" + - name: "Check out the repo" + uses: "actions/checkout@v4" - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly + - name: "Install Foundry" + uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Install Bun" + uses: "oven-sh/setup-bun@v1" + + - name: "Install the Node.js dependencies" + run: "bun install" - - name: Build the contracts + - name: "Lint the code" + run: "bun run lint" + + - name: "Add lint summary" run: | - forge --version - forge build --sizes + echo "## Lint result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + build: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + + - name: "Install Foundry" + uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Install Bun" + uses: "oven-sh/setup-bun@v1" + + - name: "Install the Node.js dependencies" + run: "bun install" + + - name: "Build the contracts and print their size" + run: "forge build --sizes" + + - name: "Add build summary" + run: | + echo "## Build result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY + + - name: "Cache the build and the node modules so that they can be re-used by the other jobs" + uses: "actions/cache/save@v3" + with: + key: "build-and-modules-${{ github.sha }}" + path: | + cache + node_modules + out + out-optimized + + test: + needs: ["lint", "build"] + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + + - name: "Install Foundry" + uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Install Bun" + uses: "oven-sh/setup-bun@v1" + + - name: "Restore the cached build and the node modules" + uses: "actions/cache/restore@v3" + with: + fail-on-cache-miss: true + key: "build-and-modules-${{ github.sha }}" + path: | + cache + node_modules + out + out-optimized - - name: Run tests - run: forge test + - name: "Run the tests" + run: "forge test" - - name: Add test summary + - name: "Add test summary" run: | - echo ## Tests >> $GITHUB_STEP_SUMMARY - echo ✅ Passed >> $GITHUB_STEP_SUMMARY + echo "## Tests result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index 1a35c5a..e108b40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,20 @@ -# MacOS -.DS_Store - -# Foundry -/cache +# directories +cache +coverage +node_modules +out -# Node -/node_modules +# files +*.env +*.log +.DS_Store +.pnp.* +lcov.info +package-lock.json +pnpm-lock.yaml +yarn.lock -# Dapptools -/out +# broadcasts +!broadcast +broadcast/* +broadcast/*/31337/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 888d42d..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lib/forge-std"] - path = lib/forge-std - url = https://github.com/foundry-rs/forge-std diff --git a/.prettierignore b/.prettierignore index b80611c..3996d20 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,10 +1,17 @@ # directories -/broadcast -/cache -/lib -/node_modules -/out +broadcast +cache +coverage +node_modules +out # files -.env -yarn.lock \ No newline at end of file +*.env +*.log +.DS_Store +.pnp.* +bun.lockb +lcov.info +package-lock.json +pnpm-lock.yaml +yarn.lock diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..a1ecdbb --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,7 @@ +bracketSpacing: true +printWidth: 120 +proseWrap: "always" +singleQuote: false +tabWidth: 2 +trailingComma: "all" +useTabs: false diff --git a/.solhint.json b/.solhint.json index 54acd3f..7a15ca0 100644 --- a/.solhint.json +++ b/.solhint.json @@ -1,17 +1,14 @@ { "extends": "solhint:recommended", "rules": { - "avoid-low-level-calls": "off", - "code-complexity": ["error", 9], - "compiler-version": ["error", ">=0.8.4"], - "contract-name-camelcase": "off", - "const-name-snakecase": "off", + "code-complexity": ["error", 8], + "compiler-version": ["error", ">=0.8.23"], "func-name-mixedcase": "off", "func-visibility": ["error", { "ignoreConstructors": true }], - "max-line-length": ["error", 123], + "max-line-length": ["error", 120], "named-parameters-mapping": "warn", - "no-empty-blocks": "off", + "no-console": "off", "not-rely-on-time": "off", - "var-name-mixedcase": "off" + "one-contract-per-file": "off" } } diff --git a/.vscode/settings.json b/.vscode/settings.json index 8bddaa3..241108b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,9 +2,8 @@ "[solidity]": { "editor.defaultFormatter": "NomicFoundation.hardhat-solidity" }, - "files.associations": { - ".gas-snapshot": "julia" + "[toml]": { + "editor.defaultFormatter": "tamasfe.even-better-toml" }, - "editor.formatOnSave": true, "solidity.formatter": "forge" } diff --git a/LICENSE.md b/LICENSE.md index 13c67b1..83181ab 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,21 +1,16 @@ -MIT License +This is free and unencumbered software released into the public domain. -Copyright (c) 2022 Andrei Vlad Birgaoanu +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or +as a compiled binary, for any purpose, commercial or non-commercial, and by any means. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright +interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the +detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of +all present and future rights to this software under copyright law. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT +OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +For more information, please refer to diff --git a/README.md b/README.md index bff6ec6..b84a2d0 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,24 @@ -# Foundry Template [![Github Actions][gha-badge]][gha] [![Foundry][foundry-badge]][foundry] [![License: MIT][license-badge]][license] +# Foundry Template [![Github Actions][gha-badge]][gha] [![Foundry][foundry-badge]][foundry] [gha]: https://github.com/andreivladbrg/foundry-template/actions [gha-badge]: https://github.com/andreivladbrg/foundry-template/actions/workflows/ci.yml/badge.svg [foundry]: https://getfoundry.sh/ [foundry-badge]: https://img.shields.io/badge/Built%20with-Foundry-FFDB1C.svg -[license]: https://opensource.org/licenses/MIT -[license-badge]: https://img.shields.io/badge/License-MIT-blue.svg +[license]: http://unlicense.org/ -Ethereum smart contracts template with foundry. +Ethereum smart contracts template with [Foundry](https://github.com/foundry-rs/foundry). -It requires [Foundry](https://github.com/foundry-rs/foundry) installed to run. You can find instructions here [Foundry installation](https://book.getfoundry.sh/getting-started/installation). +It requires [Foundry](https://book.getfoundry.sh/getting-started/installation) and +[Bun](https://bun.sh/docs/installation) installed to run. + +Inspired from [here](https://github.com/paulrberg/foundry-template). ## Getting started ``` git clone https://github.com/andreivladbrg/foundry-template.git cd foundry-template -forge install -yarn install +bun install ``` ## Commands @@ -26,4 +27,3 @@ yarn install - `forge clean` - remove compiled files - `forge test` - run tests - `forge test -vvv` - run tests and display failing tests -- `forge test --gas-report` - run tests and show gas report diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..4cb5b04265eafdffb3bfbc697ee631360175c212 GIT binary patch literal 28128 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≪}a$CNz#(7`5X z*F;vv12dIXK|>$%M+85~XMOFGS8)A&+n3w!E_hhGHM99r8+G?vgO(a~<37t<)pNfZ z<0B9ed2IXEHy{ym5mR4

~>tAEx`-#4#k0bd9K#I+x7ETIY(+AJbz@{mCuR; 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 LxKH|j@BjY;XT?{- literal 0 HcmV?d00001 diff --git a/foundry.toml b/foundry.toml index 4e7afbb..14e2172 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,23 +1,38 @@ -# Full reference https://github.com/foundry-rs/foundry/tree/master/config +# Full reference https://github.com/foundry-rs/foundry/tree/master/crates/config [profile.default] -auto_detect_solc = false -bytecode_hash = "none" -gas_reports = ["*"] -optimizer = true -optimizer_runs = 10_000 -solc = "0.8.17" - -[profile.ci] -fuzz_runs = 10_000 -verbosity = 4 + auto_detect_solc = false + block_timestamp = 1_704_067_200 # January 1, 2024 at 00:00 GMT + bytecode_hash = "none" + evm_version = "paris" # See https://www.evmdiff.com/features?name=PUSH0&kind=opcode + fuzz = { runs = 1_000 } + gas_reports = ["*"] + optimizer = true + optimizer_runs = 10_000 + out = "out" + script = "script" + solc = "0.8.23" + src = "src" + test = "test" +libs = ["node_modules", "lib"] [fmt] -bracket_spacing = true -int_types = "long" -line_length = 120 -multiline_func_header = "all" -number_underscore = "thousands" -quote_style = "double" -tab_width = 4 -wrap_comments = true \ No newline at end of file + bracket_spacing = true + int_types = "long" + line_length = 120 + multiline_func_header = "all" + number_underscore = "thousands" + quote_style = "double" + tab_width = 4 + wrap_comments = true + +[rpc_endpoints] + arbitrum = "https://arbitrum-mainnet.infura.io/v3/${API_KEY_INFURA}" + avalanche = "https://avalanche-mainnet.infura.io/v3/${API_KEY_INFURA}" + bnb_smart_chain = "https://bsc-dataseed.binance.org" + gnosis_chain = "https://rpc.gnosischain.com" + localhost = "http://localhost:8545" + mainnet = "https://mainnet.infura.io/v3/${API_KEY_INFURA}" + optimism = "https://optimism-mainnet.infura.io/v3/${API_KEY_INFURA}" + polygon = "https://polygon-mainnet.infura.io/v3/${API_KEY_INFURA}" + sepolia = "https://sepolia.infura.io/v3/${API_KEY_INFURA}" diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index a2edd39..0000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a2edd39db95df7e9dd3f9ef9edc8c55fefddb6df diff --git a/package.json b/package.json index 35c8478..4501242 100644 --- a/package.json +++ b/package.json @@ -1,29 +1,14 @@ { - "name": "foundry-template", - "description": "Ethereum smart contracts template with foundry", - "version": "1.0.0", - "author": { - "name": "Andrei Vlad Birgaoanu", - "url": "https://github.com/andreivladbrg" - }, "devDependencies": { + "ds-test": "github:dapphub/ds-test#e282159d5170298eb2455a6c05280ab5a73a4ef0", + "forge-std": "github:foundry-rs/forge-std#v1.7.5", "prettier": "^2.8.7", "solhint": "^3.4.1" }, - "keywords": [ - "blockchain", - "ethereum", - "forge", - "foundry", - "smart-contracts", - "solidity", - "template" - ], "scripts": { - "clean": "rm -rf cache out", - "lint": "yarn lint:sol && yarn prettier:check", - "lint:sol": "solhint \"{src,test}/**/*.sol\"", - "prettier:check": "prettier --check \"**/*.{json,md,yml}\"", - "prettier:write": "prettier --write \"**/*.{json,md,yml}\"" + "lint": "bun run lint:sol && bun run prettier:check", + "lint:sol": "forge fmt --check && bun solhint {script,src,test}/**/*.sol", + "prettier:check": "prettier --check **/*.{json,md,yml} --ignore-path=.prettierignore", + "prettier:write": "prettier --write **/*.{json,md,yml} --ignore-path=.prettierignore", } } diff --git a/remappings.txt b/remappings.txt index ded46a7..5112f6b 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,2 +1,2 @@ -forge-std/=lib/forge-std/src/ -src/=src/ \ No newline at end of file +forge-std/=node_modules/forge-std/ +ds-test/=node_modules/ds-test/src/ diff --git a/script/Base.s.sol b/script/Base.s.sol new file mode 100644 index 0000000..2a2e0c4 --- /dev/null +++ b/script/Base.s.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.23 <0.9.0; + +import { Script } from "forge-std/src/Script.sol"; + +abstract contract BaseScript is Script { + /// @dev Included to enable compilation of the script without a $MNEMONIC environment variable. + string internal constant TEST_MNEMONIC = "test test test test test test test test test test test junk"; + + /// @dev Needed for the deterministic deployments. + bytes32 internal constant ZERO_SALT = bytes32(0); + + /// @dev The address of the transaction broadcaster. + address internal broadcaster; + + /// @dev Used to derive the broadcaster's address if $ETH_FROM is not defined. + string internal mnemonic; + + /// @dev Initializes the transaction broadcaster like this: + /// + /// - If $ETH_FROM is defined, use it. + /// - Otherwise, derive the broadcaster address from $MNEMONIC. + /// - If $MNEMONIC is not defined, default to a test mnemonic. + /// + /// The use case for $ETH_FROM is to specify the broadcaster key and its address via the command line. + constructor() { + address from = vm.envOr({ name: "ETH_FROM", defaultValue: address(0) }); + if (from != address(0)) { + broadcaster = from; + } else { + mnemonic = vm.envOr({ name: "MNEMONIC", defaultValue: TEST_MNEMONIC }); + (broadcaster,) = deriveRememberKey({ mnemonic: mnemonic, index: 0 }); + } + } + + modifier broadcast() { + vm.startBroadcast(broadcaster); + _; + vm.stopBroadcast(); + } +} diff --git a/script/DeployContract.s.sol b/script/DeployContract.s.sol index ed3296a..314feb3 100644 --- a/script/DeployContract.s.sol +++ b/script/DeployContract.s.sol @@ -1,14 +1,12 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.23; -import { Script } from "forge-std/Script.sol"; +import { Contract } from "../src/Contract.sol"; -import { Contract } from "src/Contract.sol"; +import { BaseScript } from "./Base.s.sol"; -contract DeployContract is Script { - function run() public returns (Contract c) { - vm.startBroadcast(); +contract DeployContract is BaseScript { + function run() public broadcast returns (Contract c) { c = new Contract(); - vm.stopBroadcast(); } } diff --git a/src/Contract.sol b/src/Contract.sol index b21aba4..7d5d3c5 100644 --- a/src/Contract.sol +++ b/src/Contract.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.23; contract Contract { function foo(uint256 a) public pure returns (uint256) { diff --git a/test/Contract.t.sol b/test/Contract.t.sol index f0ae5bc..26ffd2a 100644 --- a/test/Contract.t.sol +++ b/test/Contract.t.sol @@ -1,7 +1,7 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.17; +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.8.23; -import { Test } from "forge-std/Test.sol"; +import { Test } from "forge-std/src/Test.sol"; import { Contract } from "src/Contract.sol"; @@ -12,11 +12,11 @@ contract TestContract is Test { c = new Contract(); } - function testFoo() public { + function test_Foo() public { assertEq(c.foo(1), 1); } - function testFooFuzz(uint256 a) public { + function testFuzz_Foo(uint256 a) public { vm.assume(a < type(uint256).max); assertEq(c.foo(a), a); } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index a85dfb0..0000000 --- a/yarn.lock +++ /dev/null @@ -1,462 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@^7.0.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@solidity-parser/parser@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.0.tgz#1fb418c816ca1fc3a1e94b08bcfe623ec4e1add4" - integrity sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -ajv@^6.12.6: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antlr4@^4.11.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/antlr4/-/antlr4-4.12.0.tgz#e2323fbb057c77068a174914b0533398aeaba56a" - integrity sha512-23iB5IzXJZRZeK9TigzUyrNc9pSmNqAerJRBcNq1ETrmttMWRgaYZzC561IgEO3ygKsDJTYDTozABXa4b/fTQQ== - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -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== - -ast-parents@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/ast-parents/-/ast-parents-0.0.1.tgz#508fd0f05d0c48775d9eccda2e174423261e8dd3" - integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -cosmiconfig@^8.0.0: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -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" - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.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== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -prettier@^2.8.3, prettier@^2.8.7: - version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" - integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -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== - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -solhint@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-3.4.1.tgz#8ea15b21c13d1be0b53fd46d605a24d0b36a0c46" - integrity sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg== - dependencies: - "@solidity-parser/parser" "^0.16.0" - ajv "^6.12.6" - antlr4 "^4.11.0" - ast-parents "^0.0.1" - chalk "^4.1.2" - commander "^10.0.0" - cosmiconfig "^8.0.0" - fast-diff "^1.2.0" - glob "^8.0.3" - ignore "^5.2.4" - js-yaml "^4.1.0" - lodash "^4.17.21" - pluralize "^8.0.0" - semver "^6.3.0" - strip-ansi "^6.0.1" - table "^6.8.1" - text-table "^0.2.0" - optionalDependencies: - prettier "^2.8.3" - -string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -table@^6.8.1: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -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== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==