From 1ffa69629c1a9d3d15e2e6d74f73fb7481f30b1f Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Sat, 25 Jun 2022 16:50:07 -0400 Subject: [PATCH 01/10] feat: update wagmi to version w/ foundry chain --- packages/app/package.json | 2 +- pnpm-lock.yaml | 47 +++++++++++++++++---------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 40a0638..eb1eb42 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -27,7 +27,7 @@ "react-dom": "17.0.2", "react-toastify": "^9.0.4", "urql": "^2.0.6", - "wagmi": "^0.4.10", + "wagmi": "^0.4.12", "zustand": "^3.6.7" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2712ccc..9fd9af1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,13 +51,13 @@ importers: tailwindcss: ^3.0.5 typescript: ^4.5.5 urql: ^2.0.6 - wagmi: ^0.4.10 + wagmi: ^0.4.12 zustand: ^3.6.7 dependencies: '@ethersproject/address': 5.5.0 '@ethersproject/contracts': 5.5.0 '@ethersproject/providers': 5.5.2 - '@rainbow-me/rainbowkit': 0.2.4_a9eac6539f9bbe06477ed71aa3d24861 + '@rainbow-me/rainbowkit': 0.2.4_a5d4781ac381284654d958225e5b4651 '@web3-scaffold/contracts': link:../contracts classnames: 2.3.1 ethers: 5.5.3 @@ -67,7 +67,7 @@ importers: react-dom: 17.0.2_react@17.0.2 react-toastify: 9.0.4_react-dom@17.0.2+react@17.0.2 urql: 2.0.6_graphql@16.2.0+react@17.0.2 - wagmi: 0.4.10_a97fe83bd71061f745f7de6a26ea7406 + wagmi: 0.4.12_a97fe83bd71061f745f7de6a26ea7406 zustand: 3.6.9_react@17.0.2 devDependencies: '@graphql-codegen/cli': 2.4.0_61400d08f1218e76329683cb2eddc55f @@ -211,9 +211,9 @@ packages: '@babel/helper-module-imports': 7.16.7 '@babel/helper-plugin-utils': 7.17.12 '@babel/traverse': 7.16.10 - debug: 4.3.3 + debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.21.1 + resolve: 1.22.0 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -723,7 +723,7 @@ packages: json-rpc-engine: 6.1.0 keccak: 3.0.2 preact: 10.7.3 - qs: 6.10.3 + qs: 6.10.5 rxjs: 6.6.7 stream-browserify: 3.0.0 transitivePeerDependencies: @@ -1751,7 +1751,7 @@ packages: resolution: {integrity: sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==} dev: false - /@rainbow-me/rainbowkit/0.2.4_a9eac6539f9bbe06477ed71aa3d24861: + /@rainbow-me/rainbowkit/0.2.4_a5d4781ac381284654d958225e5b4651: resolution: {integrity: sha512-pH17xw5uSvwyWLTNbDda/EtnSdpiLHEDsrOuxVmW2Zs9uhLMVK86ZHzFsDE4vaZQObuOTYo51y3q289IpiUQHQ==} engines: {node: '>=12.4'} peerDependencies: @@ -1769,7 +1769,7 @@ packages: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 react-remove-scroll: 2.5.3_cfedea9b3ed0faf0dded75c187406c5e - wagmi: 0.4.10_a97fe83bd71061f745f7de6a26ea7406 + wagmi: 0.4.12_a97fe83bd71061f745f7de6a26ea7406 transitivePeerDependencies: - '@types/react' dev: false @@ -2139,8 +2139,8 @@ packages: '@vanilla-extract/css': 1.7.0 dev: false - /@wagmi/core/0.3.7_8d97cdf704f0fbebd4c670c6ec12820f: - resolution: {integrity: sha512-RJAaypcQK0OA/ezpgNz4Smk4rUUMf9IXapLR2PtDLUWjJxI2Xw5l+Pq4t6xOvJt6fNO1GKM0iRjUaUN37py0+w==} + /@wagmi/core/0.3.8_8d97cdf704f0fbebd4c670c6ec12820f: + resolution: {integrity: sha512-9wsd8YGW2ivjFwpkgAETn7cRbKOAddZz91vuh2VmIP2bWGiDuFA6RXy5/KLV/tGpvIIiCyGFO0JXpx+n4hFhgQ==} peerDependencies: '@coinbase/wallet-sdk': '>=3.2.0' '@walletconnect/ethereum-provider': '>=1.7.5' @@ -5432,12 +5432,12 @@ packages: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: has: 1.0.3 + dev: true /is-core-module/2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 - dev: true /is-date-object/1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -5476,7 +5476,7 @@ packages: is-extglob: 2.1.1 /is-hex-prefixed/1.0.0: - resolution: {integrity: sha1-fY035q135dEnFIkTxXPggtd39VQ=} + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} engines: {node: '>=6.5.0', npm: '>=3'} dev: false @@ -6590,7 +6590,7 @@ packages: dev: false /nano-time/1.0.0: - resolution: {integrity: sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=} + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} dependencies: big-integer: 1.6.51 dev: false @@ -7351,13 +7351,6 @@ packages: yargs: 15.4.1 dev: false - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - /qs/6.10.5: resolution: {integrity: sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==} engines: {node: '>=0.6'} @@ -7648,7 +7641,7 @@ packages: dev: true /remove-accents/0.4.2: - resolution: {integrity: sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U=} + resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==} dev: false /remove-trailing-separator/1.1.0: @@ -7714,6 +7707,7 @@ packages: is-core-module: 2.8.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /resolve/1.22.0: resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} @@ -7722,7 +7716,6 @@ packages: is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /resolve/2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} @@ -8188,7 +8181,7 @@ packages: dev: false /strip-hex-prefix/1.0.0: - resolution: {integrity: sha1-DF8VX+8RUTczd96du1iNoFUA428=} + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 @@ -8459,7 +8452,7 @@ packages: is-number: 7.0.0 /toggle-selection/1.0.6: - resolution: {integrity: sha1-bkWxJj8gF/oKzH2J14sVuL932jI=} + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false /tough-cookie/2.5.0: @@ -8803,14 +8796,14 @@ packages: extsprintf: 1.3.0 dev: false - /wagmi/0.4.10_a97fe83bd71061f745f7de6a26ea7406: - resolution: {integrity: sha512-/RyAYvOdKc+AXni2VNwLqz83N4tw2hNU0pSY9TOgXmrr5uRtzdy2MSqCMGrmyoIjMPx4ilop1X7WJ4JdPu2jbw==} + /wagmi/0.4.12_a97fe83bd71061f745f7de6a26ea7406: + resolution: {integrity: sha512-YfpRAJyGL9YvtecYDf6cUT6yaIBksHK9JZyq3WlVMUfeTleFmsqCiIaIaKhlPcE+NZxSsUHz1jbZw8KLWTcwvA==} peerDependencies: ethers: '>=5.5.1' react: '>=17.0.0' dependencies: '@coinbase/wallet-sdk': 3.2.0 - '@wagmi/core': 0.3.7_8d97cdf704f0fbebd4c670c6ec12820f + '@wagmi/core': 0.3.8_8d97cdf704f0fbebd4c670c6ec12820f '@walletconnect/ethereum-provider': 1.7.8 ethers: 5.5.3 react: 17.0.2 From dcc64dbda9244202bb948836e22a401e1044a399 Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Sat, 25 Jun 2022 16:52:00 -0400 Subject: [PATCH 02/10] feat: specify chain by slug instead of id --- packages/app/.env | 2 +- packages/app/src/EthereumProviders.tsx | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/app/.env b/packages/app/.env index 536104b..f8b7813 100644 --- a/packages/app/.env +++ b/packages/app/.env @@ -1,2 +1,2 @@ -CHAIN_ID=5 +NEXT_PUBLIC_CHAIN_SLUG= NEXT_PUBLIC_ALCHEMY_API_KEY= diff --git a/packages/app/src/EthereumProviders.tsx b/packages/app/src/EthereumProviders.tsx index 77bae56..d17d846 100644 --- a/packages/app/src/EthereumProviders.tsx +++ b/packages/app/src/EthereumProviders.tsx @@ -5,10 +5,17 @@ import { chain, configureChains, createClient, WagmiConfig } from "wagmi"; import { alchemyProvider } from "wagmi/providers/alchemy"; import { publicProvider } from "wagmi/providers/public"; -export const targetChainId = parseInt(process.env.CHAIN_ID!) || 5; +const targetChainSlug = process.env + .NEXT_PUBLIC_CHAIN_SLUG as keyof typeof chain; + +const targetChain = chain[targetChainSlug] + ? chain[targetChainSlug] + : chain.goerli; + +export const targetChainId = targetChain.id; export const { chains, provider, webSocketProvider } = configureChains( - targetChainId === 1 ? [chain.mainnet] : [chain.goerli], + [targetChain], [ alchemyProvider({ alchemyId: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY! }), publicProvider(), From e6ff869241448f8d4c9ea70bf135a9b99c1c53a6 Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Sat, 25 Jun 2022 16:53:12 -0400 Subject: [PATCH 03/10] feat: (wip) add example foundry deploy --- packages/app/src/contracts.ts | 7 ++++--- packages/contracts/deploys/foundry/ExampleNFT.json | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 packages/contracts/deploys/foundry/ExampleNFT.json diff --git a/packages/app/src/contracts.ts b/packages/app/src/contracts.ts index fd24d9d..a766348 100644 --- a/packages/app/src/contracts.ts +++ b/packages/app/src/contracts.ts @@ -1,4 +1,5 @@ -import ExampleNFTGoerli from "@web3-scaffold/contracts/deploys/goerli/ExampleNFT.json"; +import ExampleNFTFoundry from "@web3-scaffold/contracts/deploys/foundry/ExampleNFT.json"; +// import ExampleNFTGoerli from "@web3-scaffold/contracts/deploys/goerli/ExampleNFT.json"; import { ExampleNFT__factory } from "@web3-scaffold/contracts/types"; import { useContractRead } from "wagmi"; @@ -14,11 +15,11 @@ import { provider, targetChainId } from "./EthereumProviders"; // ) as ExampleNFT; export const exampleNFTContract = ExampleNFT__factory.connect( - ExampleNFTGoerli.deployedTo, + ExampleNFTFoundry.deployedTo, provider({ chainId: targetChainId }) ); export const useExampleNFTContractRead = useContractRead.bind(null, { - addressOrName: ExampleNFTGoerli.deployedTo, + addressOrName: ExampleNFTFoundry.deployedTo, contractInterface: ExampleNFT__factory.abi, }); diff --git a/packages/contracts/deploys/foundry/ExampleNFT.json b/packages/contracts/deploys/foundry/ExampleNFT.json new file mode 100644 index 0000000..f45e59b --- /dev/null +++ b/packages/contracts/deploys/foundry/ExampleNFT.json @@ -0,0 +1,5 @@ +{ + "deployedTo": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "deployer": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "transactionHash": "0x1e46f02b55c070063b76cf84bfbc81fea73fb6e6b50ef8d37d5de628d71e6890" +} From 0dbea961ef13169dacc8d743c45a3b7c2e79cd5a Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Sun, 26 Jun 2022 12:29:12 -0400 Subject: [PATCH 04/10] feat: (wip) add example of local graph node --- packages/app/src/pages/_app.tsx | 3 ++- packages/subgraph/package.json | 1 + packages/subgraph/subgraph-foundry.yaml | 24 ++++++++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 packages/subgraph/subgraph-foundry.yaml diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index ac234d4..b03f08c 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -11,8 +11,9 @@ import { import { EthereumProviders } from "../EthereumProviders"; +// @TODO Set the Graph Node hostname via environment variable? export const graphClient = createGraphClient({ - url: "https://api.thegraph.com/subgraphs/name/holic/example-nft", + url: "http://127.0.0.1:8000/subgraphs/name/holic/example-nft", }); const MyApp = ({ Component, pageProps }: AppProps) => { diff --git a/packages/subgraph/package.json b/packages/subgraph/package.json index 108882b..b8265e3 100644 --- a/packages/subgraph/package.json +++ b/packages/subgraph/package.json @@ -9,6 +9,7 @@ "codegen": "graph codegen subgraph*.yaml", "build": "pnpm codegen && graph build subgraph*.yaml", "deploy:goerli": "graph deploy --node https://api.thegraph.com/deploy/ holic/example-nft subgraph-goerli.yaml", + "deploy:local": "graph deploy --ipfs http://127.0.0.1:5001 --node http://127.0.0.1:8020 holic/example-nft subgraph-foundry.yaml", "prettier": "prettier --write src" }, "dependencies": { diff --git a/packages/subgraph/subgraph-foundry.yaml b/packages/subgraph/subgraph-foundry.yaml new file mode 100644 index 0000000..cba263e --- /dev/null +++ b/packages/subgraph/subgraph-foundry.yaml @@ -0,0 +1,24 @@ +specVersion: 0.0.4 +schema: + file: ./schema.graphql +dataSources: + - kind: ethereum + name: ExampleNFT + network: foundry + source: + abi: ExampleNFT + address: "0x5fbdb2315678afecb367f032d93f642f64180aa3" + startBlock: 0 + mapping: + kind: ethereum/events + apiVersion: 0.0.5 + language: wasm/assemblyscript + entities: + - NFT + abis: + - name: ExampleNFT + file: ../contracts/out/ExampleNFT.sol/ExampleNFT.abi.json + eventHandlers: + - event: Transfer(indexed address,indexed address,indexed uint256) + handler: handleTransfer + file: ./src/mapping.ts From 1e69de18ae64dd5fd289baaff229cb18d3ca9bdf Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 4 Jul 2022 17:30:40 -0400 Subject: [PATCH 05/10] feat: improve handling of multi chain configs --- packages/app/.env | 3 +- packages/app/jest.config.js | 8 + packages/app/package.json | 6 +- packages/app/src/EthereumProviders.tsx | 18 +- packages/app/src/pages/index.tsx | 3 +- .../app/src/utils/getChainStatus.test.tsx | 24 + packages/app/src/utils/getChainStatus.tsx | 14 + packages/app/src/utils/getChains.test.tsx | 30 + packages/app/src/utils/getChains.tsx | 32 + pnpm-lock.yaml | 1459 +++++++++++++++-- 10 files changed, 1493 insertions(+), 104 deletions(-) create mode 100644 packages/app/jest.config.js create mode 100644 packages/app/src/utils/getChainStatus.test.tsx create mode 100644 packages/app/src/utils/getChainStatus.tsx create mode 100644 packages/app/src/utils/getChains.test.tsx create mode 100644 packages/app/src/utils/getChains.tsx diff --git a/packages/app/.env b/packages/app/.env index f8b7813..0b4f9d5 100644 --- a/packages/app/.env +++ b/packages/app/.env @@ -1,2 +1,3 @@ -NEXT_PUBLIC_CHAIN_SLUG= +NEXT_PUBLIC_CHAIN_SLUGS= +NEXT_PUBLIC_CHAIN_STATUS= NEXT_PUBLIC_ALCHEMY_API_KEY= diff --git a/packages/app/jest.config.js b/packages/app/jest.config.js new file mode 100644 index 0000000..412082b --- /dev/null +++ b/packages/app/jest.config.js @@ -0,0 +1,8 @@ +module.exports = { + preset: "ts-jest", + testEnvironment: "node", + transform: { + "^.+\\.ts?$": "ts-jest", + }, + transformIgnorePatterns: ["/node_modules/"], +}; diff --git a/packages/app/package.json b/packages/app/package.json index 2477bc9..60eef23 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,21 +11,25 @@ "start": "next start", "lint": "eslint .", "codegen": "graphql-codegen", - "prettier": "prettier --write src" + "prettier": "prettier --write src", + "test": "jest" }, "dependencies": { "@ethersproject/address": "^5.5.0", "@ethersproject/contracts": "^5.5.0", "@ethersproject/providers": "^5.5.0", "@rainbow-me/rainbowkit": "^0.4.1", + "@types/jest": "^28.1.4", "@web3-scaffold/contracts": "workspace:*", "classnames": "^2.3.1", "ethers": "^5.5.2", "graphql": "^16.2.0", + "jest": "^28.1.2", "next": "12.1.0", "react": "17.0.2", "react-dom": "17.0.2", "react-toastify": "^9.0.4", + "ts-jest": "^28.0.5", "urql": "^2.0.6", "wagmi": "^0.5.5", "zustand": "^3.6.7" diff --git a/packages/app/src/EthereumProviders.tsx b/packages/app/src/EthereumProviders.tsx index d17d846..62cabee 100644 --- a/packages/app/src/EthereumProviders.tsx +++ b/packages/app/src/EthereumProviders.tsx @@ -1,23 +1,23 @@ import "@rainbow-me/rainbowkit/styles.css"; import { getDefaultWallets, RainbowKitProvider } from "@rainbow-me/rainbowkit"; -import { chain, configureChains, createClient, WagmiConfig } from "wagmi"; +import { configureChains, createClient, WagmiConfig } from "wagmi"; import { alchemyProvider } from "wagmi/providers/alchemy"; import { publicProvider } from "wagmi/providers/public"; -const targetChainSlug = process.env - .NEXT_PUBLIC_CHAIN_SLUG as keyof typeof chain; +import { getChains } from "./utils/getChains"; -const targetChain = chain[targetChainSlug] - ? chain[targetChainSlug] - : chain.goerli; +const targetChains = getChains(); -export const targetChainId = targetChain.id; +// Use the first chain specified as target chain. Maybe in the future this can be configurable. +export const targetChainId = targetChains[0].id; export const { chains, provider, webSocketProvider } = configureChains( - [targetChain], + targetChains, [ - alchemyProvider({ alchemyId: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY! }), + alchemyProvider({ + alchemyId: process.env.NEXT_PUBLIC_ALCHEMY_API_KEY, + }), publicProvider(), ] ); diff --git a/packages/app/src/pages/index.tsx b/packages/app/src/pages/index.tsx index edcdf22..cce4e5f 100644 --- a/packages/app/src/pages/index.tsx +++ b/packages/app/src/pages/index.tsx @@ -5,6 +5,7 @@ import { useExampleNFTContractRead } from "../contracts"; import { Inventory } from "../Inventory"; import { MintButton } from "../MintButton"; import { useIsMounted } from "../useIsMounted"; +import { getChainStatus } from "../utils/getChainStatus"; const HomePage: NextPage = () => { const totalSupply = useExampleNFTContractRead({ @@ -18,7 +19,7 @@ const HomePage: NextPage = () => { return (
- +

Example NFT

diff --git a/packages/app/src/utils/getChainStatus.test.tsx b/packages/app/src/utils/getChainStatus.test.tsx new file mode 100644 index 0000000..2910256 --- /dev/null +++ b/packages/app/src/utils/getChainStatus.test.tsx @@ -0,0 +1,24 @@ +import { getChainStatus } from "./getChainStatus"; + +describe("getChainStatus", () => { + const env = process.env; + + it("should get default chain status when env is empty", () => { + process.env = { ...env, NEXT_PUBLIC_CHAIN_STATUS: "" }; + expect(getChainStatus()).toStrictEqual("icon"); + }); + + it("should get chain status env is set", () => { + process.env = { ...env, NEXT_PUBLIC_CHAIN_STATUS: "none" }; + expect(getChainStatus()).toStrictEqual("none"); + }); + + it("should ignore invalid chain status when set", () => { + process.env = { ...env, NEXT_PUBLIC_CHAIN_STATUS: "fakestatus" }; + expect(getChainStatus()).toStrictEqual("icon"); + }); + + afterEach(() => { + process.env = env; + }); +}); diff --git a/packages/app/src/utils/getChainStatus.tsx b/packages/app/src/utils/getChainStatus.tsx new file mode 100644 index 0000000..210d741 --- /dev/null +++ b/packages/app/src/utils/getChainStatus.tsx @@ -0,0 +1,14 @@ +// Note: If RainbowKit ever adds more chain status options, add them here. +const chainStatuses = ["full", "icon", "name", "none"] as const; +type ChainStatus = typeof chainStatuses[number]; + +const isValidChainStatus = (value: string): value is ChainStatus => { + return chainStatuses.includes(value as ChainStatus); +}; + +export const getChainStatus = (): ChainStatus => { + return process.env.NEXT_PUBLIC_CHAIN_STATUS && + isValidChainStatus(process.env.NEXT_PUBLIC_CHAIN_STATUS) + ? process.env.NEXT_PUBLIC_CHAIN_STATUS + : "icon"; +}; diff --git a/packages/app/src/utils/getChains.test.tsx b/packages/app/src/utils/getChains.test.tsx new file mode 100644 index 0000000..1fca6da --- /dev/null +++ b/packages/app/src/utils/getChains.test.tsx @@ -0,0 +1,30 @@ +import { getChainSlugs } from "./getChains"; + +describe("getChains", () => { + const env = process.env; + + it("should get default chains when chain slugs is empty", () => { + process.env = { ...env, NEXT_PUBLIC_CHAIN_SLUGS: "" }; + expect(getChainSlugs()).toStrictEqual(["goerli", "mainnet"]); + }); + + it("should get chains when chain slugs is set", () => { + process.env = { + ...env, + NEXT_PUBLIC_CHAIN_SLUGS: "foundry, mainnet,optimism", + }; + expect(getChainSlugs()).toStrictEqual(["foundry", "mainnet", "optimism"]); + }); + + it("should ignore invalid chain slugs when set", () => { + process.env = { + ...env, + NEXT_PUBLIC_CHAIN_SLUGS: "foundry, mainnet,fakechain", + }; + expect(getChainSlugs()).toStrictEqual(["foundry", "mainnet"]); + }); + + afterEach(() => { + process.env = env; + }); +}); diff --git a/packages/app/src/utils/getChains.tsx b/packages/app/src/utils/getChains.tsx new file mode 100644 index 0000000..474674c --- /dev/null +++ b/packages/app/src/utils/getChains.tsx @@ -0,0 +1,32 @@ +import { chain } from "wagmi"; + +const isValidChain = (value: string): value is keyof typeof chain => { + return [ + "mainnet", + "ropsten", + "rinkeby", + "goerli", + "kovan", + "optimism", + "optimismKovan", + "polygon", + "polygonMumbai", + "arbitrum", + "arbitrumRinkeby", + "localhost", + "hardhat", + "foundry", + ].includes(value); +}; + +export const getChainSlugs = () => { + const targetChainSlugs = process.env.NEXT_PUBLIC_CHAIN_SLUGS + ? process.env.NEXT_PUBLIC_CHAIN_SLUGS.split(",").map((slug) => slug.trim()) + : ["goerli", "mainnet"]; + return targetChainSlugs.filter(isValidChain); +}; + +export const getChains = () => { + const chainSlugs = getChainSlugs(); + return chainSlugs.map((chainSlug) => chain[chainSlug]); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2554b04..2f610c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,7 @@ importers: '@graphql-codegen/typescript-operations': ^2.2.2 '@graphql-codegen/typescript-urql': ^3.4.2 '@rainbow-me/rainbowkit': ^0.4.1 + '@types/jest': ^28.1.4 '@types/node': 17.0.0 '@types/react': 17.0.37 '@web3-scaffold/contracts': workspace:* @@ -45,12 +46,14 @@ importers: eslint-plugin-react-hooks: ^4.6.0 ethers: ^5.5.2 graphql: ^16.2.0 + jest: ^28.1.2 next: 12.1.0 postcss: ^8.4.5 react: 17.0.2 react-dom: 17.0.2 react-toastify: ^9.0.4 tailwindcss: ^3.0.5 + ts-jest: ^28.0.5 typescript: ^4.5.5 urql: ^2.0.6 wagmi: ^0.5.5 @@ -60,14 +63,17 @@ importers: '@ethersproject/contracts': 5.5.0 '@ethersproject/providers': 5.5.2 '@rainbow-me/rainbowkit': 0.4.1_d6gtvicq6w7tiz3gubl2caxqoi + '@types/jest': 28.1.4 '@web3-scaffold/contracts': link:../contracts classnames: 2.3.1 ethers: 5.5.3 graphql: 16.2.0 + jest: 28.1.2_@types+node@17.0.0 next: 12.1.0_sfoxds7t5ydpegc3knd667wn6m react: 17.0.2 react-dom: 17.0.2_react@17.0.2 react-toastify: 9.0.4_sfoxds7t5ydpegc3knd667wn6m + ts-jest: 28.0.5_burdcpru4gmol7mmtlcoahzthu urql: 2.0.6_idcs52lku4c45q42wkfxnvdmwq wagmi: 0.5.5_vf76qo6xcbq7orpx3zvcn2tuay zustand: 3.6.9_react@17.0.2 @@ -143,14 +149,13 @@ packages: '@babel/traverse': 7.16.10 '@babel/types': 7.16.8 convert-source-map: 1.8.0 - debug: 4.3.3 + debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.0 + json5: 2.2.1 semver: 6.3.0 source-map: 0.5.7 transitivePeerDependencies: - supports-color - dev: true /@babel/generator/7.16.8: resolution: {integrity: sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==} @@ -190,7 +195,6 @@ packages: '@babel/helper-validator-option': 7.16.7 browserslist: 4.19.1 semver: 6.3.0 - dev: true /@babel/helper-create-class-features-plugin/7.16.10_@babel+core@7.16.10: resolution: {integrity: sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==} @@ -280,7 +284,6 @@ packages: '@babel/types': 7.16.8 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-optimise-call-expression/7.16.7: resolution: {integrity: sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==} @@ -292,13 +295,17 @@ packages: /@babel/helper-plugin-utils/7.16.7: resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-plugin-utils/7.17.12: resolution: {integrity: sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==} engines: {node: '>=6.9.0'} dev: false + /@babel/helper-plugin-utils/7.18.6: + resolution: {integrity: sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-replace-supers/7.16.7: resolution: {integrity: sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==} engines: {node: '>=6.9.0'} @@ -317,7 +324,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.16.8 - dev: true /@babel/helper-skip-transparent-expression-wrappers/7.16.0: resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} @@ -349,7 +355,6 @@ packages: '@babel/types': 7.16.8 transitivePeerDependencies: - supports-color - dev: true /@babel/highlight/7.17.12: resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==} @@ -393,6 +398,24 @@ packages: '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.10 dev: true + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.16.10: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.16.10: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.16.10: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -400,7 +423,6 @@ packages: dependencies: '@babel/core': 7.16.10 '@babel/helper-plugin-utils': 7.16.7 - dev: true /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.16.10: resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} @@ -412,6 +434,24 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.16.10: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.16.10: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.16.10: resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} engines: {node: '>=6.9.0'} @@ -422,6 +462,33 @@ packages: '@babel/helper-plugin-utils': 7.16.7 dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.16.10: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.16.10: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.16.10: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.16.10: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -429,7 +496,44 @@ packages: dependencies: '@babel/core': 7.16.10 '@babel/helper-plugin-utils': 7.16.7 - dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.16.10: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.16.10: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.16.10: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false + + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.16.10: + resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.10 + '@babel/helper-plugin-utils': 7.18.6 + dev: false /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.10: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} @@ -718,6 +822,10 @@ packages: '@babel/helper-validator-identifier': 7.16.7 to-fast-properties: 2.0.0 + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: false + /@coinbase/wallet-sdk/3.3.0: resolution: {integrity: sha512-Prmxs5eYRxe5i+kDSsny97oPG4Pa5PhLmNDx8f7UQrvlPowGy5Tg0gHOqCie6ck2shVMdW8sKJ+RCLIRZ9kIjA==} engines: {node: '>= 10.0.0'} @@ -1592,6 +1700,252 @@ packages: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} dev: true + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.13.1 + resolve-from: 5.0.0 + dev: false + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: false + + /@jest/console/28.1.1: + resolution: {integrity: sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + chalk: 4.1.2 + jest-message-util: 28.1.1 + jest-util: 28.1.1 + slash: 3.0.0 + dev: false + + /@jest/core/28.1.2: + resolution: {integrity: sha512-Xo4E+Sb/nZODMGOPt2G3cMmCBqL4/W2Ijwr7/mrXlq4jdJwcFQ/9KrrJZT2adQRk2otVBXXOz1GRQ4Z5iOgvRQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 28.1.1 + '@jest/reporters': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.3.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 28.0.2 + jest-config: 28.1.2_@types+node@17.0.0 + jest-haste-map: 28.1.1 + jest-message-util: 28.1.1 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-resolve-dependencies: 28.1.2 + jest-runner: 28.1.2 + jest-runtime: 28.1.2 + jest-snapshot: 28.1.2 + jest-util: 28.1.1 + jest-validate: 28.1.1 + jest-watcher: 28.1.1 + micromatch: 4.0.5 + pretty-format: 28.1.1 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: false + + /@jest/environment/28.1.2: + resolution: {integrity: sha512-I0CR1RUMmOzd0tRpz10oUfaChBWs+/Hrvn5xYhMEF/ZqrDaaeHwS8yDBqEWCrEnkH2g+WE/6g90oBv3nKpcm8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/fake-timers': 28.1.2 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + jest-mock: 28.1.1 + dev: false + + /@jest/expect-utils/28.1.1: + resolution: {integrity: sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + dev: false + + /@jest/expect/28.1.2: + resolution: {integrity: sha512-HBzyZBeFBiOelNbBKN0pilWbbrGvwDUwAqMC46NVJmWm8AVkuE58NbG1s7DR4cxFt4U5cVLxofAoHxgvC5MyOw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + expect: 28.1.1 + jest-snapshot: 28.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/fake-timers/28.1.2: + resolution: {integrity: sha512-xSYEI7Y0D5FbZN2LsCUj/EKRR1zfQYmGuAUVh6xTqhx7V5JhjgMcK5Pa0iR6WIk0GXiHDe0Ke4A+yERKE9saqg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 17.0.0 + jest-message-util: 28.1.1 + jest-mock: 28.1.1 + jest-util: 28.1.1 + dev: false + + /@jest/globals/28.1.2: + resolution: {integrity: sha512-cz0lkJVDOtDaYhvT3Fv2U1B6FtBnV+OpEyJCzTHM1fdoTsU4QNLAt/H4RkiwEUU+dL4g/MFsoTuHeT2pvbo4Hg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.2 + '@jest/expect': 28.1.2 + '@jest/types': 28.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/reporters/28.1.2: + resolution: {integrity: sha512-/whGLhiwAqeCTmQEouSigUZJPVl7sW8V26EiboImL+UyXznnr1a03/YZ2BX8OlFw0n+Zlwu+EZAITZtaeRTxyA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 28.1.1 + '@jest/test-result': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + '@jridgewell/trace-mapping': 0.3.14 + '@types/node': 17.0.0 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.4 + jest-message-util: 28.1.1 + jest-util: 28.1.1 + jest-worker: 28.1.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + terminal-link: 2.1.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/schemas/28.0.2: + resolution: {integrity: sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@sinclair/typebox': 0.23.5 + dev: false + + /@jest/source-map/28.1.2: + resolution: {integrity: sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.14 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: false + + /@jest/test-result/28.1.1: + resolution: {integrity: sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/console': 28.1.1 + '@jest/types': 28.1.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: false + + /@jest/test-sequencer/28.1.1: + resolution: {integrity: sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/test-result': 28.1.1 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.1 + slash: 3.0.0 + dev: false + + /@jest/transform/28.1.2: + resolution: {integrity: sha512-3o+lKF6iweLeJFHBlMJysdaPbpoMmtbHEFsjzSv37HIq/wWt5ijTeO2Yf7MO5yyczCopD507cNwNLeX8Y/CuIg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/core': 7.16.10 + '@jest/types': 28.1.1 + '@jridgewell/trace-mapping': 0.3.14 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.8.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.1 + jest-regex-util: 28.0.2 + jest-util: 28.1.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@jest/types/28.1.1: + resolution: {integrity: sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.0.2 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 17.0.0 + '@types/yargs': 17.0.10 + chalk: 4.1.2 + dev: false + + /@jridgewell/resolve-uri/3.0.8: + resolution: {integrity: sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: false + + /@jridgewell/trace-mapping/0.3.14: + resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==} + dependencies: + '@jridgewell/resolve-uri': 3.0.8 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + /@json-rpc-tools/provider/1.7.6: resolution: {integrity: sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA==} dependencies: @@ -1797,11 +2151,27 @@ packages: - zenObservable dev: true + /@sinclair/typebox/0.23.5: + resolution: {integrity: sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==} + dev: false + /@sindresorhus/is/0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} dev: true + /@sinonjs/commons/1.8.3: + resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} + dependencies: + type-detect: 4.0.8 + dev: false + + /@sinonjs/fake-timers/9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.3 + dev: false + /@solidity-parser/parser/0.14.2: resolution: {integrity: sha512-10cr0s+MtRtqjEw0WFJrm2rwULN30xx7btd/v9cmqME2617/2M5MbHDkFIGIGTa7lwNw4bN9mVGfhlLzrYw8pA==} dependencies: @@ -1840,6 +2210,35 @@ packages: typescript: 4.7.3 dev: true + /@types/babel__core/7.1.19: + resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} + dependencies: + '@babel/parser': 7.16.10 + '@babel/types': 7.16.8 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.17.1 + dev: false + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.16.8 + dev: false + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.16.10 + '@babel/types': 7.16.8 + dev: false + + /@types/babel__traverse/7.17.1: + resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==} + dependencies: + '@babel/types': 7.16.8 + dev: false + /@types/bn.js/4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} dependencies: @@ -1878,6 +2277,35 @@ packages: '@types/node': 17.0.0 dev: false + /@types/graceful-fs/4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 17.0.0 + dev: false + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: false + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: false + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: false + + /@types/jest/28.1.4: + resolution: {integrity: sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA==} + dependencies: + jest-matcher-utils: 28.1.1 + pretty-format: 28.1.1 + dev: false + /@types/js-yaml/4.0.5: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: true @@ -1936,7 +2364,6 @@ packages: /@types/prettier/2.4.3: resolution: {integrity: sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==} - dev: true /@types/prop-types/15.7.4: resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} @@ -1971,6 +2398,10 @@ packages: '@types/node': 17.0.0 dev: false + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: false + /@types/use-sync-external-store/0.0.3: resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} dev: false @@ -1987,6 +2418,16 @@ packages: '@types/node': 17.0.0 dev: true + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: false + + /@types/yargs/17.0.10: + resolution: {integrity: sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: false + /@typescript-eslint/eslint-plugin/5.27.1_aq7uryhocdbvbqum33pitcm3y4: resolution: {integrity: sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2495,7 +2936,6 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - dev: true /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} @@ -2531,6 +2971,11 @@ packages: dependencies: color-convert: 2.0.1 + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: false + /antlr4/4.7.1: resolution: {integrity: sha512-haHyTW7Y9joE5MVs37P2lNYfU2RWBLfcRDD8OWldcdZm5TiCE91B5Xl1oWSwiDUSd4rlExpt2pu1fksYQjRBYQ==} dev: true @@ -2772,12 +3217,53 @@ packages: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} dev: true + /babel-jest/28.1.2_@babel+core@7.16.10: + resolution: {integrity: sha512-pfmoo6sh4L/+5/G2OOfQrGJgvH7fTa1oChnuYH2G/6gA+JwDvO8PELwvwnofKBMNrQsam0Wy/Rw+QSrBNewq2Q==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.16.10 + '@jest/transform': 28.1.2 + '@types/babel__core': 7.1.19 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 28.1.1_@babel+core@7.16.10 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-dynamic-import-node/2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: object.assign: 4.1.2 dev: true + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.18.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /babel-plugin-jest-hoist/28.1.1: + resolution: {integrity: sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/template': 7.16.7 + '@babel/types': 7.16.8 + '@types/babel__core': 7.1.19 + '@types/babel__traverse': 7.17.1 + dev: false + /babel-plugin-polyfill-corejs2/0.3.1: resolution: {integrity: sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==} peerDependencies: @@ -2815,6 +3301,26 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.16.10: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.10 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.10 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.10 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.16.10 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.10 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.10 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.10 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.10 + dev: false + /babel-preset-fbjs/3.4.0_@babel+core@7.16.10: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: @@ -2852,6 +3358,17 @@ packages: - supports-color dev: true + /babel-preset-jest/28.1.1_@babel+core@7.16.10: + resolution: {integrity: sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.10 + babel-plugin-jest-hoist: 28.1.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.10 + dev: false + /backo2/1.0.2: resolution: {integrity: sha1-MasayLEpNjRj41s+u2n038+6eUc=} dev: true @@ -3036,6 +3553,13 @@ packages: picocolors: 1.0.0 dev: false + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: false + /bs58/4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} dependencies: @@ -3054,7 +3578,6 @@ packages: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 - dev: true /btoa/1.2.1: resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} @@ -3163,6 +3686,11 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: false + /caniuse-lite/1.0.30001301: resolution: {integrity: sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA==} @@ -3248,6 +3776,11 @@ packages: tslib: 2.3.1 dev: true + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: false + /chardet/0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true @@ -3291,6 +3824,10 @@ packages: engines: {node: '>=10'} dev: false + /ci-info/3.3.2: + resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} + dev: false + /cids/0.7.5: resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==} engines: {node: '>=4.0.0', npm: '>=3.0.0'} @@ -3322,6 +3859,10 @@ packages: safe-buffer: 5.2.1 dev: false + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: false + /class-is/1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} dev: false @@ -3395,7 +3936,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-response/1.0.2: resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} @@ -3417,11 +3957,20 @@ packages: engines: {node: '>=6'} dev: false + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + /code-point-at/1.1.0: resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=} engines: {node: '>=0.10.0'} dev: true + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: false + /color-convert/1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -3515,7 +4064,6 @@ packages: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} dependencies: safe-buffer: 5.1.2 - dev: true /copy-to-clipboard/3.3.1: resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==} @@ -3767,6 +4315,10 @@ packages: mimic-response: 1.0.1 dev: true + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: false + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -3827,6 +4379,11 @@ packages: engines: {node: '>=8'} dev: true + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: false + /detect-node-es/1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -3849,6 +4406,11 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true + /diff-sequences/28.1.1: + resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: false + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -3993,6 +4555,11 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + /emittery/0.10.2: + resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} + engines: {node: '>=12'} + dev: false + /emoji-regex/10.1.0: resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} dev: true @@ -4096,6 +4663,11 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: false + /escape-string-regexp/4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -4772,6 +5344,37 @@ packages: strip-final-newline: 2.0.0 dev: false + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /expect/28.1.1: + resolution: {integrity: sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/expect-utils': 28.1.1 + jest-get-type: 28.0.2 + jest-matcher-utils: 28.1.1 + jest-message-util: 28.1.1 + jest-util: 28.1.1 + dev: false + /explain-error/1.0.4: resolution: {integrity: sha512-/wSgNMxFusiYRy1rd19LT2SQlIXDppHpumpWo06wxjflD1OYxDLbl6rMVw+U3bxD5Nuhex4TKqv9Aem4D0lVzQ==} dev: false @@ -4848,7 +5451,6 @@ packages: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: bser: 2.1.1 - dev: true /fbjs-css-vars/1.0.2: resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} @@ -5104,7 +5706,6 @@ packages: /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - dev: true /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -5122,6 +5723,11 @@ packages: engines: {node: '>=6'} dev: false + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: false + /get-port/3.2.0: resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} engines: {node: '>=4'} @@ -5140,6 +5746,11 @@ packages: dependencies: pump: 3.0.0 + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: false + /get-symbol-description/1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -5416,6 +6027,10 @@ packages: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: false + /http-basic/8.1.3: resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} engines: {node: '>=6.0.0'} @@ -5471,6 +6086,11 @@ packages: engines: {node: '>=8.12.0'} dev: false + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: false + /husky/8.0.1: resolution: {integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==} engines: {node: '>=14'} @@ -5527,10 +6147,18 @@ packages: engines: {node: '>=12.2'} dev: true + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: false + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - dev: true /indent-string/3.2.0: resolution: {integrity: sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=} @@ -5826,6 +6454,11 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: false + /is-generator-function/1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -5996,88 +6629,540 @@ packages: engines: {node: '>=0.10.0'} dev: true - /isarray/0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isarray/2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: false + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iso-random-stream/1.1.2: + resolution: {integrity: sha512-7y0tsBBgQs544iTYjyrMp5xvgrbYR8b+plQq1Bryp+03p0LssrxC9C1M0oHv4QESDt7d95c74XvMk/yawKqX+A==} + engines: {node: '>=8'} + dependencies: + buffer: 6.0.3 + readable-stream: 3.6.0 + dev: false + + /iso-stream-http/0.1.2: + resolution: {integrity: sha512-oHEDNOysIMTNypbg2f1SlydqRBvjl4ZbSE9+0awVxnkx3K2stGTFwB/kpVqnB6UEfF8QD36kAjDwZvqyXBLMnQ==} + dependencies: + builtin-status-codes: 3.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /iso-url/0.4.7: + resolution: {integrity: sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==} + engines: {node: '>=10'} + dev: false + + /isomorphic-fetch/3.0.0: + resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + dependencies: + node-fetch: 2.6.7 + whatwg-fetch: 3.6.2 + transitivePeerDependencies: + - encoding + dev: true + + /isomorphic-ws/4.0.1_ws@8.4.2: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.4.2 + dev: true + + /isstream/0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: false + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: false + + /istanbul-lib-instrument/5.2.0: + resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.16.10 + '@babel/parser': 7.16.10 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: false + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: false + + /istanbul-reports/3.1.4: + resolution: {integrity: sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: false + + /iterable-ndjson/1.1.0: + resolution: {integrity: sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg==} + dependencies: + string_decoder: 1.3.0 + dev: false + + /iterall/1.3.0: + resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} + dev: true + + /jayson/3.2.0: + resolution: {integrity: sha512-DZQnwA57GcStw4soSYB2VntWXFfoWvmSarlaWePDYOWhjxT72PBM4atEBomaTaS1uqk3jFC9UO9AyWjlujo3xw==} + hasBin: true + dependencies: + '@types/connect': 3.4.35 + '@types/express-serve-static-core': 4.17.28 + '@types/lodash': 4.14.182 + '@types/node': 12.20.55 + commander: 2.20.3 + es6-promisify: 5.0.0 + eyes: 0.1.8 + json-stringify-safe: 5.0.1 + JSONStream: 1.3.5 + lodash: 4.17.21 + uuid: 3.4.0 + dev: false + + /jest-changed-files/28.0.2: + resolution: {integrity: sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + execa: 5.1.1 + throat: 6.0.1 + dev: false + + /jest-circus/28.1.2: + resolution: {integrity: sha512-E2vdPIJG5/69EMpslFhaA46WkcrN74LI5V/cSJ59L7uS8UNoXbzTxmwhpi9XrIL3zqvMt5T0pl5k2l2u2GwBNQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.2 + '@jest/expect': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 28.1.1 + jest-matcher-utils: 28.1.1 + jest-message-util: 28.1.1 + jest-runtime: 28.1.2 + jest-snapshot: 28.1.2 + jest-util: 28.1.1 + pretty-format: 28.1.1 + slash: 3.0.0 + stack-utils: 2.0.5 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-cli/28.1.2_@types+node@17.0.0: + resolution: {integrity: sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/types': 28.1.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 28.1.2_@types+node@17.0.0 + jest-util: 28.1.1 + jest-validate: 28.1.1 + prompts: 2.4.2 + yargs: 17.3.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: false + + /jest-config/28.1.2_@types+node@17.0.0: + resolution: {integrity: sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.10 + '@jest/test-sequencer': 28.1.1 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + babel-jest: 28.1.2_@babel+core@7.16.10 + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 28.1.2 + jest-environment-node: 28.1.2 + jest-get-type: 28.0.2 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-runner: 28.1.2 + jest-util: 28.1.1 + jest-validate: 28.1.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 28.1.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-diff/28.1.1: + resolution: {integrity: sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.1 + dev: false + + /jest-docblock/28.1.1: + resolution: {integrity: sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + detect-newline: 3.1.0 + dev: false + + /jest-each/28.1.1: + resolution: {integrity: sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + chalk: 4.1.2 + jest-get-type: 28.0.2 + jest-util: 28.1.1 + pretty-format: 28.1.1 + dev: false + + /jest-environment-node/28.1.2: + resolution: {integrity: sha512-oYsZz9Qw27XKmOgTtnl0jW7VplJkN2oeof+SwAwKFQacq3CLlG9u4kTGuuLWfvu3J7bVutWlrbEQMOCL/jughw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.2 + '@jest/fake-timers': 28.1.2 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + jest-mock: 28.1.1 + jest-util: 28.1.1 + dev: false + + /jest-get-type/28.0.2: + resolution: {integrity: sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dev: false + + /jest-haste-map/28.1.1: + resolution: {integrity: sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@types/graceful-fs': 4.1.5 + '@types/node': 17.0.0 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.10 + jest-regex-util: 28.0.2 + jest-util: 28.1.1 + jest-worker: 28.1.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /jest-leak-detector/28.1.1: + resolution: {integrity: sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-get-type: 28.0.2 + pretty-format: 28.1.1 + dev: false + + /jest-matcher-utils/28.1.1: + resolution: {integrity: sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 28.1.1 + jest-get-type: 28.0.2 + pretty-format: 28.1.1 + dev: false + + /jest-message-util/28.1.1: + resolution: {integrity: sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@babel/code-frame': 7.16.7 + '@jest/types': 28.1.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 28.1.1 + slash: 3.0.0 + stack-utils: 2.0.5 + dev: false + + /jest-mock/28.1.1: + resolution: {integrity: sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + '@types/node': 17.0.0 dev: false - /isarray/1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + /jest-pnp-resolver/1.2.2_jest-resolve@28.1.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 28.1.1 dev: false - /isarray/2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + /jest-regex-util/28.0.2: + resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dev: false - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /jest-resolve-dependencies/28.1.2: + resolution: {integrity: sha512-OXw4vbOZuyRTBi3tapWBqdyodU+T33ww5cPZORuTWkg+Y8lmsxQlVu3MWtJh6NMlKRTHQetF96yGPv01Ye7Mbg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + jest-regex-util: 28.0.2 + jest-snapshot: 28.1.2 + transitivePeerDependencies: + - supports-color + dev: false - /iso-random-stream/1.1.2: - resolution: {integrity: sha512-7y0tsBBgQs544iTYjyrMp5xvgrbYR8b+plQq1Bryp+03p0LssrxC9C1M0oHv4QESDt7d95c74XvMk/yawKqX+A==} - engines: {node: '>=8'} + /jest-resolve/28.1.1: + resolution: {integrity: sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - buffer: 6.0.3 - readable-stream: 3.6.0 + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.1 + jest-pnp-resolver: 1.2.2_jest-resolve@28.1.1 + jest-util: 28.1.1 + jest-validate: 28.1.1 + resolve: 1.22.0 + resolve.exports: 1.1.0 + slash: 3.0.0 dev: false - /iso-stream-http/0.1.2: - resolution: {integrity: sha512-oHEDNOysIMTNypbg2f1SlydqRBvjl4ZbSE9+0awVxnkx3K2stGTFwB/kpVqnB6UEfF8QD36kAjDwZvqyXBLMnQ==} + /jest-runner/28.1.2: + resolution: {integrity: sha512-6/k3DlAsAEr5VcptCMdhtRhOoYClZQmxnVMZvZ/quvPGRpN7OBQYPIC32tWSgOnbgqLXNs5RAniC+nkdFZpD4A==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - builtin-status-codes: 3.0.0 - inherits: 2.0.4 - readable-stream: 3.6.0 + '@jest/console': 28.1.1 + '@jest/environment': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + chalk: 4.1.2 + emittery: 0.10.2 + graceful-fs: 4.2.10 + jest-docblock: 28.1.1 + jest-environment-node: 28.1.2 + jest-haste-map: 28.1.1 + jest-leak-detector: 28.1.1 + jest-message-util: 28.1.1 + jest-resolve: 28.1.1 + jest-runtime: 28.1.2 + jest-util: 28.1.1 + jest-watcher: 28.1.1 + jest-worker: 28.1.1 + source-map-support: 0.5.13 + throat: 6.0.1 + transitivePeerDependencies: + - supports-color dev: false - /iso-url/0.4.7: - resolution: {integrity: sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog==} - engines: {node: '>=10'} + /jest-runtime/28.1.2: + resolution: {integrity: sha512-i4w93OsWzLOeMXSi9epmakb2+3z0AchZtUQVF1hesBmcQQy4vtaql5YdVe9KexdJaVRyPDw8DoBR0j3lYsZVYw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/environment': 28.1.2 + '@jest/fake-timers': 28.1.2 + '@jest/globals': 28.1.2 + '@jest/source-map': 28.1.2 + '@jest/test-result': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 28.1.1 + jest-message-util: 28.1.1 + jest-mock: 28.1.1 + jest-regex-util: 28.0.2 + jest-resolve: 28.1.1 + jest-snapshot: 28.1.2 + jest-util: 28.1.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color dev: false - /isomorphic-fetch/3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} + /jest-snapshot/28.1.2: + resolution: {integrity: sha512-wzrieFttZYfLvrCVRJxX+jwML2YTArOUqFpCoSVy1QUapx+LlV9uLbV/mMEhYj4t7aMeE9aSQFHSvV/oNoDAMA==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - node-fetch: 2.6.7 - whatwg-fetch: 3.6.2 + '@babel/core': 7.16.10 + '@babel/generator': 7.16.8 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.16.10 + '@babel/traverse': 7.16.10 + '@babel/types': 7.16.8 + '@jest/expect-utils': 28.1.1 + '@jest/transform': 28.1.2 + '@jest/types': 28.1.1 + '@types/babel__traverse': 7.17.1 + '@types/prettier': 2.4.3 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.10 + chalk: 4.1.2 + expect: 28.1.1 + graceful-fs: 4.2.10 + jest-diff: 28.1.1 + jest-get-type: 28.0.2 + jest-haste-map: 28.1.1 + jest-matcher-utils: 28.1.1 + jest-message-util: 28.1.1 + jest-util: 28.1.1 + natural-compare: 1.4.0 + pretty-format: 28.1.1 + semver: 7.3.7 transitivePeerDependencies: - - encoding - dev: true + - supports-color + dev: false - /isomorphic-ws/4.0.1_ws@8.4.2: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' + /jest-util/28.1.1: + resolution: {integrity: sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - ws: 8.4.2 - dev: true + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + chalk: 4.1.2 + ci-info: 3.3.2 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: false - /isstream/0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + /jest-validate/28.1.1: + resolution: {integrity: sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/types': 28.1.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 28.0.2 + leven: 3.1.0 + pretty-format: 28.1.1 dev: false - /iterable-ndjson/1.1.0: - resolution: {integrity: sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg==} + /jest-watcher/28.1.1: + resolution: {integrity: sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} dependencies: - string_decoder: 1.3.0 + '@jest/test-result': 28.1.1 + '@jest/types': 28.1.1 + '@types/node': 17.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.10.2 + jest-util: 28.1.1 + string-length: 4.0.2 dev: false - /iterall/1.3.0: - resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} - dev: true + /jest-worker/28.1.1: + resolution: {integrity: sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@types/node': 17.0.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: false - /jayson/3.2.0: - resolution: {integrity: sha512-DZQnwA57GcStw4soSYB2VntWXFfoWvmSarlaWePDYOWhjxT72PBM4atEBomaTaS1uqk3jFC9UO9AyWjlujo3xw==} + /jest/28.1.2_@types+node@17.0.0: + resolution: {integrity: sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - '@types/connect': 3.4.35 - '@types/express-serve-static-core': 4.17.28 - '@types/lodash': 4.14.182 - '@types/node': 12.20.55 - commander: 2.20.3 - es6-promisify: 5.0.0 - eyes: 0.1.8 - json-stringify-safe: 5.0.1 - JSONStream: 1.3.5 - lodash: 4.17.21 - uuid: 3.4.0 + '@jest/core': 28.1.2 + '@jest/types': 28.1.1 + import-local: 3.1.0 + jest-cli: 28.1.2_@types+node@17.0.0 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node dev: false /js-sha256/0.9.0: @@ -6184,13 +7269,10 @@ packages: minimist: 1.2.6 dev: true - /json5/2.2.0: - resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} engines: {node: '>=6'} hasBin: true - dependencies: - minimist: 1.2.5 - dev: true /jsonfile/4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -6300,6 +7382,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + /ky-universal/0.2.2_ky@0.11.2: resolution: {integrity: sha512-fb32o/fKy/ux2ALWa9HU2hvGtfOq7/vn2nH0FpVE+jwNzyTeORlAbj3Fiw+WLMbUlmVqZIWupnLZ2USHvqwZHw==} engines: {node: '>=8'} @@ -6335,6 +7422,11 @@ packages: package-json: 6.5.0 dev: true + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: false + /levn/0.3.0: resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} engines: {node: '>= 0.8.0'} @@ -6513,6 +7605,10 @@ packages: resolution: {integrity: sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==} dev: false + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: false + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -6659,9 +7755,21 @@ packages: multiaddr: 7.5.0 dev: false + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: false + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: false /map-cache/0.2.2: resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} @@ -6718,7 +7826,6 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: true /microseconds/0.2.0: resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} @@ -6985,7 +8092,6 @@ packages: /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true /next/12.1.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-s885kWvnIlxsUFHq9UGyIyLiuD0G3BUC/xrH0CEnH5lHEWkwQcHOORgbDF0hbrW9vr/7am4ETfX4A7M6DjrE7Q==} @@ -7075,8 +8181,7 @@ packages: dev: false /node-int64/0.4.0: - resolution: {integrity: sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=} - dev: true + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} /node-releases/2.0.1: resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} @@ -7532,6 +8637,18 @@ packages: engines: {node: '>=10'} dev: false + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: false + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + /pkginfo/0.4.1: resolution: {integrity: sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==} engines: {node: '>= 0.4.0'} @@ -7666,6 +8783,16 @@ packages: hasBin: true dev: true + /pretty-format/28.1.1: + resolution: {integrity: sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dependencies: + '@jest/schemas': 28.0.2 + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: false + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false @@ -7704,6 +8831,14 @@ packages: dev: false bundledDependencies: [] + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -7862,6 +8997,10 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: false + /react-query/4.0.0-beta.23_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-e6mNBVAYGy0M1OwX0mhRB/lCkOedKeqTUrbPjNCqvm8hQGUsJJobqfHVvTv8o6JJaOO2MFcxKF4vZM+PEKbHZA==} peerDependencies: @@ -8130,6 +9269,13 @@ packages: /require-main-filename/2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: false + /resolve-from/3.0.0: resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} engines: {node: '>=4'} @@ -8142,7 +9288,11 @@ packages: /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true + + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: false /resolve/1.21.1: resolution: {integrity: sha512-lfEImVbnolPuaSZuLQ52cAxPBHeI77sPwCOWRdy12UG/CNa8an7oBHH1R+Fp1/mUqSJi4c8TIP6FOIPSZAUrEQ==} @@ -8420,10 +9570,13 @@ packages: resolution: {integrity: sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo=} dev: true + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + /slash/3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: true /slice-ansi/0.0.4: resolution: {integrity: sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=} @@ -8488,6 +9641,13 @@ packages: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + /source-map-support/0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -8502,7 +9662,6 @@ packages: /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /split-ca/1.0.1: resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} @@ -8548,6 +9707,13 @@ packages: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} dev: false + /stack-utils/2.0.5: + resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: false + /stream-browserify/3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} dependencies: @@ -8575,6 +9741,14 @@ packages: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} dev: true + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: false + /string-width/1.0.2: resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} engines: {node: '>=0.10.0'} @@ -8679,6 +9853,11 @@ packages: engines: {node: '>=4'} dev: true + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: false + /strip-final-newline/2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -8699,7 +9878,6 @@ packages: /strip-json-comments/3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: true /styled-jsx/5.0.0_react@17.0.2: resolution: {integrity: sha512-qUqsWoBquEdERe10EW8vLp3jT25s/ssG1/qX5gZ4wu15OZpmSMFI2v+fWlRhLfykA5rFtlJ1ME8A8pm/peV4WA==} @@ -8749,6 +9927,21 @@ packages: dependencies: has-flag: 4.0.0 + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: false + + /supports-hyperlinks/2.2.0: + resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: false + /supports-preserve-symlinks-flag/1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -8888,6 +10081,23 @@ packages: yallist: 4.0.0 dev: false + /terminal-link/2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.2.0 + dev: false + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: false + /text-table/0.2.0: resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=} dev: true @@ -8909,6 +10119,10 @@ packages: qs: 6.10.5 dev: false + /throat/6.0.1: + resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} + dev: false + /through/2.3.8: resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} @@ -8945,6 +10159,10 @@ packages: rimraf: 3.0.2 dev: false + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: false + /to-buffer/1.1.1: resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} dev: false @@ -8997,6 +10215,36 @@ packages: typescript: 4.7.3 dev: true + /ts-jest/28.0.5_burdcpru4gmol7mmtlcoahzthu: + resolution: {integrity: sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ==} + engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + babel-jest: ^28.0.0 + esbuild: '*' + jest: ^28.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 28.1.2_@types+node@17.0.0 + jest-util: 28.1.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.7.3 + yargs-parser: 21.0.1 + dev: false + /ts-log/2.2.4: resolution: {integrity: sha512-DEQrfv6l7IvN2jlzc/VTdZJYsWUnQNCsueYjMkC/iXoEoi5fNan6MjeDqkvhfzbmHgdz9UxDUluX3V5HdjTydQ==} dev: true @@ -9070,6 +10318,11 @@ packages: prelude-ls: 1.2.1 dev: true + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: false + /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -9078,7 +10331,6 @@ packages: /type-fest/0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - dev: true /typechain/8.1.0_typescript@4.7.3: resolution: {integrity: sha512-5jToLgKTjHdI1VKqs/K8BLYy42Sr3o8bV5ojh4MnR9ExHO83cyyUdw+7+vMJCpKXUiVUvARM4qmHTFuyaCMAZQ==} @@ -9115,7 +10367,6 @@ packages: resolution: {integrity: sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /typical/4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} @@ -9303,6 +10554,15 @@ packages: resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} dev: true + /v8-to-istanbul/9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.14 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.8.0 + dev: false + /valid-url/1.0.9: resolution: {integrity: sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=} dev: true @@ -9350,6 +10610,12 @@ packages: - utf-8-validate dev: false + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: false + /wcwidth/1.0.1: resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=} dependencies: @@ -9491,11 +10757,18 @@ packages: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true /wrappy/1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + /write-file-atomic/4.0.1: + resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: false + /write/1.0.3: resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} engines: {node: '>=4'} @@ -9563,7 +10836,6 @@ packages: /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -9611,7 +10883,11 @@ packages: /yargs-parser/21.0.0: resolution: {integrity: sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==} engines: {node: '>=12'} - dev: true + + /yargs-parser/21.0.1: + resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + engines: {node: '>=12'} + dev: false /yargs/13.3.2: resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} @@ -9655,7 +10931,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.0.0 - dev: true /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} From 8792e225ccf3a2cd2f52e0b18714f8d8c033a46c Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 4 Jul 2022 18:11:08 -0400 Subject: [PATCH 06/10] feat: add helper for get graph host --- packages/app/.env | 1 + packages/app/src/pages/_app.tsx | 6 ++++-- packages/app/src/utils/getGraphHost.test.tsx | 19 +++++++++++++++++++ packages/app/src/utils/getGraphHost.tsx | 5 +++++ 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 packages/app/src/utils/getGraphHost.test.tsx create mode 100644 packages/app/src/utils/getGraphHost.tsx diff --git a/packages/app/.env b/packages/app/.env index 0b4f9d5..df7d497 100644 --- a/packages/app/.env +++ b/packages/app/.env @@ -1,3 +1,4 @@ NEXT_PUBLIC_CHAIN_SLUGS= NEXT_PUBLIC_CHAIN_STATUS= +NEXT_PUBLIC_GRAPH_HOST= NEXT_PUBLIC_ALCHEMY_API_KEY= diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index b03f08c..ad824b2 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -10,10 +10,12 @@ import { } from "urql"; import { EthereumProviders } from "../EthereumProviders"; +import { getGraphHost } from "../utils/getGraphHost"; + +const graphHost = getGraphHost(); -// @TODO Set the Graph Node hostname via environment variable? export const graphClient = createGraphClient({ - url: "http://127.0.0.1:8000/subgraphs/name/holic/example-nft", + url: `${graphHost}/subgraphs/name/holic/example-nft`, }); const MyApp = ({ Component, pageProps }: AppProps) => { diff --git a/packages/app/src/utils/getGraphHost.test.tsx b/packages/app/src/utils/getGraphHost.test.tsx new file mode 100644 index 0000000..d536e8d --- /dev/null +++ b/packages/app/src/utils/getGraphHost.test.tsx @@ -0,0 +1,19 @@ +import { getGraphHost } from "./getGraphHost"; + +describe("getGraphHost", () => { + const env = process.env; + + it("should get default graph host", () => { + process.env = { ...env, NEXT_PUBLIC_GRAPH_HOST: "" }; + expect(getGraphHost()).toBe("https://api.thegraph.com"); + }); + + it("should get graph host from env when set", () => { + process.env = { ...env, NEXT_PUBLIC_GRAPH_HOST: "http://127.0.0.1:8000" }; + expect(getGraphHost()).toBe("http://127.0.0.1:8000"); + }); + + afterEach(() => { + process.env = env; + }); +}); diff --git a/packages/app/src/utils/getGraphHost.tsx b/packages/app/src/utils/getGraphHost.tsx new file mode 100644 index 0000000..b3b54ee --- /dev/null +++ b/packages/app/src/utils/getGraphHost.tsx @@ -0,0 +1,5 @@ +export const getGraphHost = (): string => { + return process.env.NEXT_PUBLIC_GRAPH_HOST + ? process.env.NEXT_PUBLIC_GRAPH_HOST + : "https://api.thegraph.com"; +}; From fa0bc1c88c67412424b14ff415b9218228746bd8 Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 18 Jul 2022 10:47:44 -0400 Subject: [PATCH 07/10] feat: allow subgraph url to be configured, not just host --- packages/app/.env | 4 +-- packages/app/src/pages/_app.tsx | 4 +-- packages/app/src/utils/getGraphHost.test.tsx | 19 ------------- packages/app/src/utils/getGraphHost.tsx | 5 ---- .../app/src/utils/getSubgraphURL.test.tsx | 27 +++++++++++++++++++ packages/app/src/utils/getSubgraphURL.tsx | 5 ++++ 6 files changed, 36 insertions(+), 28 deletions(-) delete mode 100644 packages/app/src/utils/getGraphHost.test.tsx delete mode 100644 packages/app/src/utils/getGraphHost.tsx create mode 100644 packages/app/src/utils/getSubgraphURL.test.tsx create mode 100644 packages/app/src/utils/getSubgraphURL.tsx diff --git a/packages/app/.env b/packages/app/.env index 4950fc8..8edc7e7 100644 --- a/packages/app/.env +++ b/packages/app/.env @@ -20,5 +20,5 @@ NEXT_PUBLIC_CHAIN_STATUS= # Provide your ALCHEMY API Key here NEXT_PUBLIC_ALCHEMY_API_KEY= -# Provide your hostname for The Graph here, such as if you are using a local node -NEXT_PUBLIC_GRAPH_HOST= +# Provide your subgraph URL for The Graph here, such as if you are using a local node +NEXT_PUBLIC_SUBGRAPH_URL= diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index ad824b2..6ba08f1 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -10,9 +10,9 @@ import { } from "urql"; import { EthereumProviders } from "../EthereumProviders"; -import { getGraphHost } from "../utils/getGraphHost"; +import { getSubgraphURL } from "../utils/getSubgraphURL"; -const graphHost = getGraphHost(); +const graphHost = getSubgraphURL(); export const graphClient = createGraphClient({ url: `${graphHost}/subgraphs/name/holic/example-nft`, diff --git a/packages/app/src/utils/getGraphHost.test.tsx b/packages/app/src/utils/getGraphHost.test.tsx deleted file mode 100644 index d536e8d..0000000 --- a/packages/app/src/utils/getGraphHost.test.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { getGraphHost } from "./getGraphHost"; - -describe("getGraphHost", () => { - const env = process.env; - - it("should get default graph host", () => { - process.env = { ...env, NEXT_PUBLIC_GRAPH_HOST: "" }; - expect(getGraphHost()).toBe("https://api.thegraph.com"); - }); - - it("should get graph host from env when set", () => { - process.env = { ...env, NEXT_PUBLIC_GRAPH_HOST: "http://127.0.0.1:8000" }; - expect(getGraphHost()).toBe("http://127.0.0.1:8000"); - }); - - afterEach(() => { - process.env = env; - }); -}); diff --git a/packages/app/src/utils/getGraphHost.tsx b/packages/app/src/utils/getGraphHost.tsx deleted file mode 100644 index b3b54ee..0000000 --- a/packages/app/src/utils/getGraphHost.tsx +++ /dev/null @@ -1,5 +0,0 @@ -export const getGraphHost = (): string => { - return process.env.NEXT_PUBLIC_GRAPH_HOST - ? process.env.NEXT_PUBLIC_GRAPH_HOST - : "https://api.thegraph.com"; -}; diff --git a/packages/app/src/utils/getSubgraphURL.test.tsx b/packages/app/src/utils/getSubgraphURL.test.tsx new file mode 100644 index 0000000..8c47418 --- /dev/null +++ b/packages/app/src/utils/getSubgraphURL.test.tsx @@ -0,0 +1,27 @@ +import { getSubgraphURL } from "./getSubgraphURL"; + +describe("getSubgraphURL", () => { + const env = process.env; + + it("should get default graph host", () => { + process.env = { ...env, NEXT_PUBLIC_SUBGRAPH_URL: "" }; + expect(getSubgraphURL()).toBe( + "https://api.thegraph.com/subgraphs/name/holic/example-nft" + ); + }); + + it("should get graph host from env when set", () => { + process.env = { + ...env, + NEXT_PUBLIC_SUBGRAPH_URL: + "http://127.0.0.1:8000/subgraphs/name/holic/example-nft", + }; + expect(getSubgraphURL()).toBe( + "http://127.0.0.1:8000/subgraphs/name/holic/example-nft" + ); + }); + + afterEach(() => { + process.env = env; + }); +}); diff --git a/packages/app/src/utils/getSubgraphURL.tsx b/packages/app/src/utils/getSubgraphURL.tsx new file mode 100644 index 0000000..a116c64 --- /dev/null +++ b/packages/app/src/utils/getSubgraphURL.tsx @@ -0,0 +1,5 @@ +export const getSubgraphURL = (): string => { + return process.env.NEXT_PUBLIC_SUBGRAPH_URL + ? process.env.NEXT_PUBLIC_SUBGRAPH_URL + : "https://api.thegraph.com/subgraphs/name/holic/example-nft"; +}; From c641540b787e7adae858104e5646249dec6d8aae Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 18 Jul 2022 10:53:22 -0400 Subject: [PATCH 08/10] feat: use new subgraph URL for graph client --- packages/app/src/pages/_app.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/app/src/pages/_app.tsx b/packages/app/src/pages/_app.tsx index 6ba08f1..a20bd44 100644 --- a/packages/app/src/pages/_app.tsx +++ b/packages/app/src/pages/_app.tsx @@ -12,10 +12,10 @@ import { import { EthereumProviders } from "../EthereumProviders"; import { getSubgraphURL } from "../utils/getSubgraphURL"; -const graphHost = getSubgraphURL(); +const subgraphURL = getSubgraphURL(); export const graphClient = createGraphClient({ - url: `${graphHost}/subgraphs/name/holic/example-nft`, + url: subgraphURL, }); const MyApp = ({ Component, pageProps }: AppProps) => { From 5f6d9801cc5bf01404c8801949451417c35e3fe1 Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 18 Jul 2022 11:10:09 -0400 Subject: [PATCH 09/10] feat: allow contract address to be set as env --- packages/app/.env | 3 +++ packages/app/src/contracts.ts | 11 ++++---- .../app/src/utils/getContractAddress.test.tsx | 27 +++++++++++++++++++ packages/app/src/utils/getContractAddress.tsx | 5 ++++ .../contracts/deploys/foundry/ExampleNFT.json | 5 ---- 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 packages/app/src/utils/getContractAddress.test.tsx create mode 100644 packages/app/src/utils/getContractAddress.tsx delete mode 100644 packages/contracts/deploys/foundry/ExampleNFT.json diff --git a/packages/app/.env b/packages/app/.env index 8edc7e7..a49df6b 100644 --- a/packages/app/.env +++ b/packages/app/.env @@ -22,3 +22,6 @@ NEXT_PUBLIC_ALCHEMY_API_KEY= # Provide your subgraph URL for The Graph here, such as if you are using a local node NEXT_PUBLIC_SUBGRAPH_URL= + +# Provide your contract address here +NEXT_PUBLIC_CONTRACT_ADDRESS= diff --git a/packages/app/src/contracts.ts b/packages/app/src/contracts.ts index 1e717af..489d407 100644 --- a/packages/app/src/contracts.ts +++ b/packages/app/src/contracts.ts @@ -1,21 +1,22 @@ -import ExampleNFTFoundry from "@web3-scaffold/contracts/deploys/foundry/ExampleNFT.json"; -// import ExampleNFTGoerli from "@web3-scaffold/contracts/deploys/goerli/ExampleNFT.json"; import { ExampleNFT__factory } from "@web3-scaffold/contracts/types"; import { useContractRead } from "wagmi"; import { provider, targetChainId } from "./EthereumProviders"; +import { getContractAddress } from "./utils/getContractAddress"; // I would have used `ExampleNFT__factory.connect` to create this, but we may // not have a provider ready to go. Any interactions with this contract should // use `exampleNFTContract.connect(providerOrSigner)` first. // export const exampleNFTContract = new Contract( -// ExampleNFTGoerli.deployedTo, +// getContractAddress(), // ExampleNFT__factory.abi // ) as ExampleNFT; +const contractAddress = getContractAddress(); + export const exampleNFTContract = ExampleNFT__factory.connect( - ExampleNFTFoundry.deployedTo, + contractAddress, provider({ chainId: targetChainId }) ); @@ -27,6 +28,6 @@ export const useExampleNFTContractRead = ( ) => useContractRead({ ...readConfig, - addressOrName: ExampleNFTFoundry.deployedTo, + addressOrName: contractAddress, contractInterface: ExampleNFT__factory.abi, }); diff --git a/packages/app/src/utils/getContractAddress.test.tsx b/packages/app/src/utils/getContractAddress.test.tsx new file mode 100644 index 0000000..529e53a --- /dev/null +++ b/packages/app/src/utils/getContractAddress.test.tsx @@ -0,0 +1,27 @@ +import { getContractAddress } from "./getContractAddress"; + +describe("getContractAddress", () => { + const env = process.env; + + it("should get default contract address", () => { + process.env = { ...env, NEXT_PUBLIC_CONTRACT_ADDRESS: "" }; + expect(getContractAddress()).toBe( + "0xe584409f2ba1ade9895485d90587fd46baa3c0d8" + ); + }); + + it("should get contract address from env when set", () => { + process.env = { + ...env, + NEXT_PUBLIC_CONTRACT_ADDRESS: + "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + expect(getContractAddress()).toBe( + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + afterEach(() => { + process.env = env; + }); +}); diff --git a/packages/app/src/utils/getContractAddress.tsx b/packages/app/src/utils/getContractAddress.tsx new file mode 100644 index 0000000..6f8deeb --- /dev/null +++ b/packages/app/src/utils/getContractAddress.tsx @@ -0,0 +1,5 @@ +export const getContractAddress = (): string => { + return process.env.NEXT_PUBLIC_CONTRACT_ADDRESS + ? process.env.NEXT_PUBLIC_CONTRACT_ADDRESS + : "0xe584409f2ba1ade9895485d90587fd46baa3c0d8"; +}; diff --git a/packages/contracts/deploys/foundry/ExampleNFT.json b/packages/contracts/deploys/foundry/ExampleNFT.json deleted file mode 100644 index f45e59b..0000000 --- a/packages/contracts/deploys/foundry/ExampleNFT.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "deployedTo": "0x5fbdb2315678afecb367f032d93f642f64180aa3", - "deployer": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "transactionHash": "0x1e46f02b55c070063b76cf84bfbc81fea73fb6e6b50ef8d37d5de628d71e6890" -} From ee0643741e36d9dce0a4b228ec50d032d96a8253 Mon Sep 17 00:00:00 2001 From: Davis Shaver Date: Mon, 18 Jul 2022 11:19:12 -0400 Subject: [PATCH 10/10] feat: use standard address format --- packages/subgraph/subgraph-foundry.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/subgraph/subgraph-foundry.yaml b/packages/subgraph/subgraph-foundry.yaml index cba263e..16d70fe 100644 --- a/packages/subgraph/subgraph-foundry.yaml +++ b/packages/subgraph/subgraph-foundry.yaml @@ -7,7 +7,7 @@ dataSources: network: foundry source: abi: ExampleNFT - address: "0x5fbdb2315678afecb367f032d93f642f64180aa3" + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3" startBlock: 0 mapping: kind: ethereum/events