From 64aa6a7ab3513914b13345dd593b7ff3f8beb3bb Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 23 Oct 2024 12:23:29 +0545 Subject: [PATCH 01/21] chore: remove Cypress test and Test-Metrics API --- tests/govtool-frontend/.gitignore | 4 - tests/govtool-frontend/README.md | 18 - tests/govtool-frontend/currents.config.js | 6 - tests/govtool-frontend/cypress.config.ts | 32 - .../cypress/constants/governanceActions.ts | 25 - .../cypress/constants/wallet.ts | 187 - .../cypress/e2e/0_bootstrap.cy.ts | 182 - .../e2e/1_user_story_wallet_connect.cy.ts | 59 - .../e2e/2_user_story_delegate_to_drep.cy.ts | 138 - .../e2e/3_user_story_drep_registration.cy.ts | 123 - ...r_story_governance_action_visibility.cy.ts | 114 - ...tory_governance_action_functionality.cy.ts | 177 - .../e2e/6_user_story_miscellaneous.cy.ts | 69 - .../cypress/e2e/actions/cleanUpActions.ts | 94 - .../cypress/e2e/actions/commonActions.ts | 216 - .../cypress/e2e/actions/dRepActions.ts | 41 - .../cypress/e2e/actions/delegateActions.ts | 59 - .../cypress/e2e/actions/governanceActions.ts | 58 - .../7.1_security_overflow_data_headers.cy.ts | 143 - .../e2e/security/7.3_security_xss.cy.ts | 72 - .../e2e/security/7.4_sql_injection.cy.ts | 111 - .../cypress/lib/logger/logger.ts | 13 - .../cypress/lib/wallet/blockfrost.ts | 104 - .../cypress/lib/wallet/cardanoWallet.ts | 329 -- .../cypress/lib/wallet/crypto.ts | 253 -- .../cypress/lib/wallet/mockWallet.ts | 102 - .../cypress/lib/wallet/setupWallet.ts | 67 - .../cypress/lib/wallet/types.ts | 92 - .../govtool-frontend/cypress/models/types.ts | 14 - .../cypress/services/apiService.ts | 151 - .../cypress/services/blockfrostService.ts | 106 - .../cypress/services/faucetService.ts | 28 - .../cypress/services/kuberService.ts | 347 -- .../cypress/services/types.ts | 7 - tests/govtool-frontend/cypress/state/store.ts | 1 - tests/govtool-frontend/cypress/state/type.ts | 25 - .../cypress/state/walletState.ts | 33 - .../cypress/support/command.d.ts | 18 - .../cypress/support/commands.ts | 28 - tests/govtool-frontend/cypress/support/e2e.ts | 21 - .../govtool-frontend/cypress/support/utils.ts | 164 - .../cypress/support/validations.ts | 61 - tests/govtool-frontend/package.json | 27 - tests/govtool-frontend/tsconfig.json | 8 - tests/govtool-frontend/yarn.lock | 3695 ----------------- tests/test-metrics-api/.env.example | 6 - tests/test-metrics-api/.gitignore | 159 - tests/test-metrics-api/.prettierrc.yaml | 6 - tests/test-metrics-api/Dockerfile | 22 - tests/test-metrics-api/README.md | 161 - tests/test-metrics-api/package.json | 32 - tests/test-metrics-api/src/config.ts | 42 - tests/test-metrics-api/src/db.ts | 64 - tests/test-metrics-api/src/index.ts | 49 - tests/test-metrics-api/src/types.ts | 40 - tests/test-metrics-api/tsconfig.json | 110 - tests/test-metrics-api/yarn.lock | 1247 ------ 57 files changed, 9560 deletions(-) delete mode 100644 tests/govtool-frontend/.gitignore delete mode 100644 tests/govtool-frontend/README.md delete mode 100644 tests/govtool-frontend/currents.config.js delete mode 100644 tests/govtool-frontend/cypress.config.ts delete mode 100644 tests/govtool-frontend/cypress/constants/governanceActions.ts delete mode 100644 tests/govtool-frontend/cypress/constants/wallet.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/0_bootstrap.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/1_user_story_wallet_connect.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/2_user_story_delegate_to_drep.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/3_user_story_drep_registration.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/4_user_story_governance_action_visibility.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/5_user_story_governance_action_functionality.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/6_user_story_miscellaneous.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/actions/cleanUpActions.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/actions/commonActions.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/actions/dRepActions.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/actions/delegateActions.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/actions/governanceActions.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/security/7.1_security_overflow_data_headers.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/security/7.3_security_xss.cy.ts delete mode 100644 tests/govtool-frontend/cypress/e2e/security/7.4_sql_injection.cy.ts delete mode 100644 tests/govtool-frontend/cypress/lib/logger/logger.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/blockfrost.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/cardanoWallet.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/crypto.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/mockWallet.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/setupWallet.ts delete mode 100644 tests/govtool-frontend/cypress/lib/wallet/types.ts delete mode 100644 tests/govtool-frontend/cypress/models/types.ts delete mode 100644 tests/govtool-frontend/cypress/services/apiService.ts delete mode 100644 tests/govtool-frontend/cypress/services/blockfrostService.ts delete mode 100644 tests/govtool-frontend/cypress/services/faucetService.ts delete mode 100644 tests/govtool-frontend/cypress/services/kuberService.ts delete mode 100644 tests/govtool-frontend/cypress/services/types.ts delete mode 100644 tests/govtool-frontend/cypress/state/store.ts delete mode 100644 tests/govtool-frontend/cypress/state/type.ts delete mode 100644 tests/govtool-frontend/cypress/state/walletState.ts delete mode 100644 tests/govtool-frontend/cypress/support/command.d.ts delete mode 100644 tests/govtool-frontend/cypress/support/commands.ts delete mode 100644 tests/govtool-frontend/cypress/support/e2e.ts delete mode 100644 tests/govtool-frontend/cypress/support/utils.ts delete mode 100644 tests/govtool-frontend/cypress/support/validations.ts delete mode 100644 tests/govtool-frontend/package.json delete mode 100644 tests/govtool-frontend/tsconfig.json delete mode 100644 tests/govtool-frontend/yarn.lock delete mode 100644 tests/test-metrics-api/.env.example delete mode 100644 tests/test-metrics-api/.gitignore delete mode 100644 tests/test-metrics-api/.prettierrc.yaml delete mode 100644 tests/test-metrics-api/Dockerfile delete mode 100644 tests/test-metrics-api/README.md delete mode 100644 tests/test-metrics-api/package.json delete mode 100644 tests/test-metrics-api/src/config.ts delete mode 100644 tests/test-metrics-api/src/db.ts delete mode 100644 tests/test-metrics-api/src/index.ts delete mode 100644 tests/test-metrics-api/src/types.ts delete mode 100644 tests/test-metrics-api/tsconfig.json delete mode 100644 tests/test-metrics-api/yarn.lock diff --git a/tests/govtool-frontend/.gitignore b/tests/govtool-frontend/.gitignore deleted file mode 100644 index 250e6b539..000000000 --- a/tests/govtool-frontend/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -videos -node_modules -screenshots -cypress/fixtures/ diff --git a/tests/govtool-frontend/README.md b/tests/govtool-frontend/README.md deleted file mode 100644 index 32b5389f5..000000000 --- a/tests/govtool-frontend/README.md +++ /dev/null @@ -1,18 +0,0 @@ -GovTool frontend Integration Test -============================= - -## Run tests - -```bash -# install dependencies -yarn - -# run cypress tests -yarn cypress run -``` - -## Run tests in dev environment - -``` -yarn cypress run --env baseUrl=http://localhost:5173,apiUrl=https://govtool.dev.byron.network -``` diff --git a/tests/govtool-frontend/currents.config.js b/tests/govtool-frontend/currents.config.js deleted file mode 100644 index 4ce504e77..000000000 --- a/tests/govtool-frontend/currents.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - projectId: "govtool-frontend", - recordKey: "2a3f6b8c-7d4e-5f1a-9b0c-6d2e3f4a5b6c", - // Sorry Cypress users - set the director service URL - cloudServiceUrl: "https://cypress-director.cardanoapi.io", -}; diff --git a/tests/govtool-frontend/cypress.config.ts b/tests/govtool-frontend/cypress.config.ts deleted file mode 100644 index 9d6301054..000000000 --- a/tests/govtool-frontend/cypress.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -//import { cloudPlugin } from "cypress-cloud/plugin"; - -module.exports = { - projectId: "wg4iq9", - chromeWebSecurity: false, - // experimentalModifyObstructiveThirdPartyCode: true, - env: { - baseUrl: "https://govtool-sanchonet.cardanoapi.io", - apiUrl: "http://govtool-sanchonet.cardanoapi.io/api", - disableSecurityTest: false, // set to true for github-ci - networkId: "testnet", - mobileViewportWidthBreakpoint: 414, - sanchoNet: true, - faucetApiUrl: "https://faucet.sanchonet.world.dev.cardano.org", - blockfrostUrl: "https://cardano-sanchonet.blockfrost.io/api/v0", - blockfrostApiKey: "xxxxxxxxxxxxxxxxxxxx", - kuberApiUrl: "https://sanchonet.kuber.cardanoapi.io", - kuberApiKey: "xxxxxxxxxxxxxx", - }, - e2e: { - supportFile: "./cypress/support/e2e.ts", - setupNodeEvents(on, config) { - on("before:browser:launch", (browser, launchOptions) => { - if (browser.name == "chrome") { - launchOptions.args.push("--disable-gpu"); - } - return launchOptions; - }); - //return cloudPlugin(on, config); - }, - }, -}; diff --git a/tests/govtool-frontend/cypress/constants/governanceActions.ts b/tests/govtool-frontend/cypress/constants/governanceActions.ts deleted file mode 100644 index c0f8e78b8..000000000 --- a/tests/govtool-frontend/cypress/constants/governanceActions.ts +++ /dev/null @@ -1,25 +0,0 @@ -export const governanceActions = [ - "Protocol Parameter Changes", - "New Constitutional Committee or Quorum Size", - "Hard Fork", - "No Confidence", - "Info Action", - "Treasury Withdrawals", - "Update to the Constitution", -]; - -export const governanceSorts = [ - "Soon to Expire", - "Newest First", - "Highest amount of 'Yes' votes", -]; - -export const govActionEnums = { - NewConstitution: "Update to the Constitution", - TreasuryWithdrawals: "Treasury Withdrawals", - HardForkInitiation: "Hard Fork", - ParameterChange: "Protocol Parameter Changes", - InfoAction: "Info Action", - NewCommittee: "New Constitutional Committee or Quorum Size", - NoConfidence: "No Confidence", -}; diff --git a/tests/govtool-frontend/cypress/constants/wallet.ts b/tests/govtool-frontend/cypress/constants/wallet.ts deleted file mode 100644 index 41541bfa4..000000000 --- a/tests/govtool-frontend/cypress/constants/wallet.ts +++ /dev/null @@ -1,187 +0,0 @@ -// Active test wallets - -import { StaticWallet } from "../lib/wallet/types"; - -interface DRepWallets { - dRep1: StaticWallet; - dRep2: StaticWallet; - votedDRep: StaticWallet; -} - -interface AdaHolderWallets { - adaHolder1: StaticWallet; - adaHolder2: StaticWallet; -} - -interface ReferenceWallets { - dRep1: StaticWallet; - dRep2: StaticWallet; -} -export const bootstrapWallet = { - type: "bootstrap", - payment: { - pkh: "b5187cdefbc5b49ddc17b423c079f0717721a03882a3b265bd4c12e0", - private: "11abec096ef0ea7edbeeee01a1a3f0e9f24a7225c2ee99687fb328146fe85ba6", - public: "b6a42d4ccc4d26adaec67e8578bf31f13b1b7e640527356248f2ec547f9de6e4", - }, - stake: { - pkh: "80f326af300273d19d5a541d45baa42ebc04265816735b026b5f34a4", - private: "283fd7625ef596f04f21b50ee14a9f4b49f8b1a6f17773cd2e1e69841a111bc1", - public: "86b08ee3d86cb72d026197a5a710e248d66f28fcff21b4467b75f876b4e6d050", - }, - dRepId: "drep1zg6zq3ku422ppvfm835rnvzf9ckxtzmy3ayjwylck6s4q9zr5ve", - address: - "addr_test1qz63slx7l0zmf8wuz76z8sre7pchwgdq8zp28vn9h4xp9cyq7vn27vqzw0ge6kj5r4zm4fpwhszzvkqkwddsy66lxjjqxnc9zk", -}; - -export const dRepWallets: DRepWallets = { - dRep1: { - type: "dRep", - payment: { - private: - "4f9e979cb0d2c089e319bf81926219957b227d30c5ec7388c2fd14965bdf02c6", - public: - "d06c0c27c1221e83dfe8e31b0f5c01b0d0a3522d6f25711fc02c2b82d4b49ecb", - pkh: "38be1948e77426eaca9f967becc5455b11d3d40fb06b99dd3a817d5e", - }, - stake: { - private: - "b1993b67216233b1a7e4bfccdc5f6677423e923a723d5982f493bc54adad8308", - public: - "cfd1df259612825c55803c6eb8f7ab9189eb9cb16e62f3ed6c238ed1cddfd246", - pkh: "75c7a5e1120727f24236cfb5981ec30fd50a2684a5aca866a123a136", - }, - dRepId: "drep1whr6tcgjqunlys3ke76es8krpl2s5f5y5kk2se4pywsnvnq50c2", - address: - "addr_test1qqutux2gua6zd6k2n7t8hmx9g4d3r575p7cxhxwa82qh6hn4c7j7zys8yleyydk0kkvpasc0659zdp994j5xdgfr5ymqyne2p2", - }, - dRep2: { - type: "dRep", - payment: { - private: - "fdab65ff51d676b549841c3547bbc4d3f692a369d5b7956e66fe93a9468c8475", - public: - "4be92e72827caaa2238954136ff36f8006b170206dde71c228c237916bcf2e63", - pkh: "bb17dbac8d4a3452dbb6d0c664e804deb14a0b95ded5274007189c36", - }, - stake: { - private: - "f0f1afbb745320ac2bbba1c0be816b4156e43c6568c48cc027e2aab4249320fc", - public: - "919d9725e9c97c555bafaf7370a49b0ba45a791cefe728908ed2398ceb47e7ab", - pkh: "41868c2b4e5289022a3a1f6f47f86823bc605c609d2c47a2db58e04a", - }, - dRepId: "", - address: - "addr_test1qza30kav349rg5kmkmgvve8gqn0tzjstjh0d2f6qquvfcdjps6xzknjj3ypz5wsldarls6prh3s9ccya93r69k6cup9qkdtk5x", - }, - votedDRep: { - // voted DRep - type: "dRep", - payment: { - private: - "d64e2f706e416d55fb541081a8852dfcbc7593261cf1526eea357e36772a2e9e", - public: - "f1804c8e90e2931d076ce184e16427f18a379b9da5200d91be862af0a9a3173a", - pkh: "f8e61d5f13ab575771af475ac599ad88c7116339f82d2ea969b0e601", - }, - stake: { - private: - "d24b92d38ad455cd952296ae37fe0d0d0e6458107d65d1b5862a87ccf4da880c", - public: - "17382aab5a8c9f97bf2fa666dadef945f55f81505a58b4199b0f578311dcbd85", - pkh: "d6d84c6a5b05cb8f89d24e9d46926975fa1dc08a58b3c26e96c06df7", - }, - dRepId: "drep16mvyc6jmqh9clzwjf6w5dynfwhapmsy2tzeuym5kcpklwp9myhm", - address: - "addr_test1qruwv82lzw44w4m34ar443ve4kyvwytr88uz6t4fdxcwvqwkmpxx5kc9ew8cn5jwn4rfy6t4lgwupzjck0pxa9kqdhmsunzc7p", - }, -}; - -export const adaHolderWallets: AdaHolderWallets = { - adaHolder1: { - type: "adaHolder", - payment: { - private: - "e21d70800240b9bb1b70c96ef909e96ecb46b83686b9c207e8e45f390daca28a", - public: - "ebddceb301df8a494855cb7e803e6ed95e078d815f4857c8b6d1a15efbd7386d", - pkh: "693e466f25213254e061fdc95f8a5f07bf6ef0de0478adbf89a3308f", - }, - stake: { - private: - "a7bdc3b90734a857bae808a479f88fdf93042ae11eec40e34d672b992ec08bbe", - public: - "d1a955aed30de26f800653beb3bc83a7de578d9c69edde45a35b15a5629e65f2", - pkh: "7c4641296645e557c0a6426e140a09d4ba423d158aba1eae06aba797", - }, - dRepId: "drep103ryz2txghj40s9xgfhpgzsf6jayy0g432apatsx4wnewwgg3qs", - address: - "addr_test1qp5nu3n0y5sny48qv87ujhu2turm7mhsmcz83tdl3x3nprmugeqjjej9u4tupfjzdc2q5zw5hfpr69v2hg02up4t57tstdrzh5", - }, - - adaHolder2: { - type: "adaHolder", - payment: { - private: - "e64d0e806cadd56771d0ec08c8c693212e27d890331462a5520ccb3a0d6b82ee", - public: - "728ce39e7e13d64d84c513d83a280ea03cad27e7fbc30fad4cd9c06ec9725460", - pkh: "d93170064d82eab9dea2b3141bc88503ec80e93c8691fb6b223fe310", - }, - stake: { - private: - "3eb78339bb813aa01ff7b0aaff39a273c5e684ff1fa9def96914d5342b25be76", - public: - "18d08f3178c0b467bd64c4be0509d97e640ac9035ad506e2cadf91b4170527d1", - pkh: "877c17de5bd978526e288334114fada629f699c4e799394aa45c2aad", - }, - dRepId: "drep1gxrgc26w22ysy236rah507rgyw7xqhrqn5ky0gkmtrsy5mn7tul", - address: - "addr_test1qrvnzuqxfkpw4ww752e3gx7gs5p7eq8f8jrfr7mtygl7xyy80stauk7e0pfxu2yrxsg5ltdx98mfn388nyu54fzu92ksmdwpzc", - }, -}; - -// Reference data DRep wallets -export const referenceWallets: ReferenceWallets = { - dRep1: { - type: "dRep", - payment: { - private: - "2aa400c17606fa58df1307e265a070ede1c15df9d8e59683bcd256aefbe689a9", - public: - "de337d365e7cec4f01ec7a9af4c37dd65afca0aaf0fa5c828da6898ca68f1968", - pkh: "93ab1cf6cececd048265573176355a322b7732299bbd624f655af2f6", - }, - stake: { - private: - "7a5eb1dfc051822039b54a782674c527dff8e72f18b44741daa34c13c0440fd0", - public: - "902f3e7c43a26dfcb743d9947fcef3a2c8eb355e6d4a3ca40f299821909644ae", - pkh: "74984fae4ca1715fa1f8759f9d871015ac87f449a85dea6cf9956da1", - }, - dRepId: "drep1wjvyltjv59c4lg0cwk0empcszkkg0azf4pw75m8ej4k6zuqfvt5", - address: - "addr_test1qzf6k88kem8v6pyzv4tnza34tgezkaej9xdm6cj0v4d09an5np86un9pw906r7r4n7wcwyq44jrlgjdgth4xe7v4dkssf9rvq7", - }, - dRep2: { - type: "dRep", - payment: { - private: - "36d51e55069121db833aea2c4564a39a8ef95a5d351b4534bc166eb9789f58ee", - public: - "20b2147d6e596e8d60bbee91c63854afda49b172c0a210181aa7caeb27663fa9", - pkh: "bc032a8614a84f5d9ee772f2788954e9d664b4264226cd36d0c4ddae", - }, - stake: { - private: - "b522fc1a4ca31d1ab3a42f3334fd7eef8faf1e67658da7e45e550a1ff73dfb57", - public: - "1e1f37ff6091ce4cb87905c05e813ca106dd5a6a34b985ff6bc1fedc60a736b1", - pkh: "aa22f3a63400c1d96ad118b5cdd300cd039e83ae1957a35b76488194", - }, - dRepId: "drep14g308f35qrqaj6k3rz6um5cqe5peaqawr9t6xkmkfzqegq53t5z", - address: - "addr_test1qz7qx25xzj5y7hv7uae0y7yf2n5ave95yepzdnfk6rzdmt42yte6vdqqc8vk45gckhxaxqxdqw0g8tse2734kajgsx2qmrj65n", - }, -}; diff --git a/tests/govtool-frontend/cypress/e2e/0_bootstrap.cy.ts b/tests/govtool-frontend/cypress/e2e/0_bootstrap.cy.ts deleted file mode 100644 index 14a6b5796..000000000 --- a/tests/govtool-frontend/cypress/e2e/0_bootstrap.cy.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { - adaHolderWallets, - bootstrapWallet, - dRepWallets, - referenceWallets, -} from "../constants/wallet"; -import { ShelleyWallet } from "../lib/wallet/crypto"; -import { - generateWallets, - registerStake, - setupWallets, -} from "../lib/wallet/setupWallet"; -import { StaticWallet } from "../lib/wallet/types"; -import { pollTx, pollTxWithKuber } from "../services/apiService"; -import kuberService from "../services/kuberService"; -import { loadAmountFromFaucet } from "../services/faucetService"; -import { IFaucetResponse } from "../services/types"; -import { IProposal, IVotedProposal } from "../state/type"; -import { getDRepIDHash, getTxHash, saveWallets } from "../support/utils"; -import { loadAmountFromBootStrapWallet } from "./actions/commonActions"; - -const staticWallets = [ - ...Object.values(dRepWallets), - ...Object.values(adaHolderWallets), - ...Object.values(referenceWallets), -]; - -const bootstrapConfig = { - onTimeWalletSetup: Cypress.env("runOneTimeWalletSetup") || false, - enableStakeRegistrationForStaticWallets: - Cypress.env("enableStakeRegistrationForStaticWallets") || true, -}; -// NOTE This is not for tests. -describe("Bootstrap", () => { - it("Setup mock wallets", () => { - if (!bootstrapConfig.onTimeWalletSetup) return; - - const generateAndRegisterWallets = async () => { - const wallets = await generateWallets(50); - await setupWallets(wallets); - saveWallets(wallets); - }; - cy.wrap(0).then({ timeout: 2 * 60 * 10000 }, async () => - generateAndRegisterWallets() - ); - }); - - it("Load faucet into bootstrap wallet", () => { - cy.wrap(loadAmountFromFaucet(bootstrapWallet.address)).then( - { timeout: 2 * 60 * 1000 }, - async (res: IFaucetResponse) => { - await pollTxWithKuber(res.txid); - } - ); - }); - - it("Load amounts into static wallets", () => { - const staticWalletAddressList = Object.values(staticWallets).map( - (wallet) => wallet.address - ); - cy.wrap(loadAmountFromBootStrapWallet(staticWalletAddressList)).then( - { timeout: 2 * 60 * 1000 }, - async (tx: any) => { - await pollTxWithKuber(tx.txId); - } - ); - }); - - Object.values(staticWallets).forEach((walletJson) => { - it(`Register stake of the static wallet: ${walletJson.type}`, () => { - cy.on("fail", (err) => { - console.log(err); - if (err.message === "Stake already registered") { - return false; - } - }); - cy.wrap(registerStake(ShelleyWallet.fromJson(walletJson)), { - timeout: 2 * 60 * 1000, - }); - }); - }); - - Object.values(referenceWallets).forEach((walletJson: StaticWallet) => { - it(`Clean up reference wallet: ${walletJson.type}`, () => { - cy.on("fail", (err) => { - return false; - }); - cy.wrap( - kuberService.dRepRegistration( - walletJson.address, - walletJson.payment.private, - walletJson.stake.pkh - ) - ).then({ timeout: 2 * 60 * 1000 }, async (tx: any) => { - await pollTxWithKuber(tx.txId); - }); - }); - }); - - it("Setup proposals for voting ", () => { - let notVotedProposals: IProposal[] = []; - let votedProposals: IVotedProposal[] = []; - - const today = new Date(); - const tomorrow = new Date(today); - today.setDate(today.getDate() + 1); - // Creating proposals - cy.log("Creating not voted proposal"); - cy.wrap(0).then({ timeout: 2 * 60 * 1000 }, async () => { - const res = await kuberService.createGovAction(1); - const txHash = getTxHash(res.cborHex); - await pollTxWithKuber(txHash); - notVotedProposals.push({ - id: "1", - txHash: txHash, - index: 0, - type: "Info", - details: "Info", - createdDate: today.toISOString(), - expiryDate: tomorrow.toISOString(), - abstainVotes: 0, - noVote: 0, - metadataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - url: "https://bit.ly/3zCH2HL", - yesVotes: 0, - }); - }); - - cy.log("Creating voted proposal"); - cy.wrap(0).then({ timeout: 2 * 60 * 1000 }, async () => { - const res = await kuberService.createGovAction(1); - const txHash = getTxHash(res.cborHex); - await pollTxWithKuber(txHash); - votedProposals.push({ - proposal: { - id: "1", - txHash: txHash, - index: 0, - type: "Info", - details: "Info", - createdDate: today.toISOString(), - expiryDate: tomorrow.toISOString(), - abstainVotes: 0, - noVote: 0, - metadataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - url: "https://bit.ly/3zCH2HL", - yesVotes: 1, - }, - vote: { - drepId: getDRepIDHash(dRepWallets.votedDRep.dRepId), - metadataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - url: "https://bit.ly/3zCH2HL", - proposalId: "1", - vote: "Yes", - }, - }); - }); - // vote - cy.log("Voting proposal"); - cy.wrap(0).then({ timeout: 2 * 60 * 1000 }, async () => { - const votedDRepWallet = dRepWallets.votedDRep; - const votedProposal = votedProposals[0]; - const res = await kuberService.voteOnProposal( - votedDRepWallet.address, - votedDRepWallet.payment.private, - getDRepIDHash(votedDRepWallet.dRepId), - votedDRepWallet.stake.private, - `${votedProposal.proposal.txHash}#${votedProposal.proposal.index}` - ); - await pollTxWithKuber(res.txId); - }); - cy.writeFile("cypress/fixtures/notVotedProposals.json", notVotedProposals, { - flag: "w", - }); - cy.writeFile("cypress/fixtures/votedProposals.json", votedProposals, { - flag: "w", - }); - }); -}); diff --git a/tests/govtool-frontend/cypress/e2e/1_user_story_wallet_connect.cy.ts b/tests/govtool-frontend/cypress/e2e/1_user_story_wallet_connect.cy.ts deleted file mode 100644 index d0c7d96dd..000000000 --- a/tests/govtool-frontend/cypress/e2e/1_user_story_wallet_connect.cy.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Logger } from "../lib/logger/logger"; -import { ShelleyWallet } from "../lib/wallet/crypto"; -import { - convertUint8ArrayToHex, - getWebAppNetworkId, - isMobile, -} from "../support/utils"; -import { connectWallet, openMobileDrawer } from "./actions/commonActions"; - -describe("Wallet Connection", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - it("1A. Should connect wallet and choose stake-key to use", () => { - cy.wrap(0).then(async () => { - const shellyWallet1 = await ShelleyWallet.generate(); - const shellyWallet2 = await ShelleyWallet.generate(); - connectWallet({ - getRegisteredPubStakeKeys: [ - convertUint8ArrayToHex(shellyWallet1.stakeKey.public), - convertUint8ArrayToHex(shellyWallet2.stakeKey.public), - ], - getRewardAddresses: [ - convertUint8ArrayToHex(shellyWallet1.rewardAddressRawBytes(0)), - convertUint8ArrayToHex(shellyWallet2.rewardAddressRawBytes(0)), - ], - }); - }); - }); - - it("1B. Should connect wallet with single stake key", () => { - connectWallet({}); - }); - - it("1C. Should disconnect Wallet When connected ", () => { - connectWallet({}); - - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("disconnect-button").click(); - cy.getBySel("disconnect-button").should("not.exist"); - }); - - it("1D. Should check correct network (Testnet/Mainnet) on connection", () => { - const networkId = getWebAppNetworkId(); - const wrongNetwork = networkId == 0 ? 1 : 0; - cy.on("uncaught:exception", (err, runnable) => { - Logger.success("Network mismatch error caught"); - return false; - }); - cy.on("fail", (err, runnable) => { - Logger.success("Assertion error caught"); - return false; - }); - connectWallet({ getNetworkId: wrongNetwork }); - }); -}); diff --git a/tests/govtool-frontend/cypress/e2e/2_user_story_delegate_to_drep.cy.ts b/tests/govtool-frontend/cypress/e2e/2_user_story_delegate_to_drep.cy.ts deleted file mode 100644 index 7cc3c5795..000000000 --- a/tests/govtool-frontend/cypress/e2e/2_user_story_delegate_to_drep.cy.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { generateDRep, getDRepIDHash, isMobile } from "../support/utils"; -import { - connectWallet, - disconnectAndReconnectWallet, - loadWallet, - openMobileDrawer, - viewProposalDetails, -} from "./actions/commonActions"; -import { - checkForDelegationConfirmation, - clickDelegateButton, - delegateToDRepId, - delegateToMyself, -} from "./actions/delegateActions"; -import { - adaHolderWallets, - dRepWallets, - referenceWallets, -} from "../constants/wallet"; -import { retireDRep } from "./actions/dRepActions"; - -describe("Delegation to DRep", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - it("2A. Should show delegated DRepId on dashboard after delegating", () => { - loadWallet(adaHolderWallets.adaHolder1, { withStakeSigning: true }); - clickDelegateButton(); - delegateToDRepId(referenceWallets.dRep1.dRepId); - checkForDelegationConfirmation(referenceWallets.dRep1.dRepId); - }); - - // Given that I'm an Ada-Holder - it("2B. Should access delegation to dRep page", () => { - connectWallet(); - cy.getBySel("delegate-button").click(); - cy.contains("Delegate to dRep", { matchCase: false }); - }); - - // Given that I'm not connected to the wallet - // User visits the DRep delegation page - it("2C. Verify DRep Behavior in Disconnected State", () => { - cy.getBySel("delegate-connect-wallet-button").click(); - cy.getBySel("connect-your-wallet-modal").should("be.visible"); - }); - - // Given that I'm connected to the wallet as ADA-Holder - // User visits the DRep delegation page - // All delegation actions should be accessible - it("2D. Verify DRep Behavior in Connected State", () => { - loadWallet(referenceWallets.dRep1); - clickDelegateButton(); - - // Verifying Delegation options card - cy.getBySel("delegate-to-drep-card").should("be.visible"); - cy.getBySel("delegate-to-myself-card").should("be.visible"); - cy.contains("Other options").click(); - cy.getBySel("signal-no-confidence-card").should("be.visible"); - cy.getBySel("vote-abstain-card").should("be.visible"); - - // Verifying dRepId delegation - cy.getBySel("delegate-to-drep-card").click(); - cy.getBySel("next-step-button").click(); - cy.getBySel("dRep-id-input").should("be.visible"); - cy.getBySel("delegate-button").should("be.visible"); - }); - - it("2E. Should delegate to myself", () => { - loadWallet(dRepWallets.dRep1, { withStakeSigning: true }); - clickDelegateButton(); - delegateToMyself(); - checkForDelegationConfirmation(dRepWallets.dRep1.dRepId); - }); - - // Given that ADA-Holder has already delegated to a DRep - it("2F. Should change delegated DRep", () => { - loadWallet(adaHolderWallets.adaHolder2, { withStakeSigning: true }); - // delegate - clickDelegateButton(); - delegateToDRepId(referenceWallets.dRep1.dRepId); - checkForDelegationConfirmation(referenceWallets.dRep1.dRepId); - // change delegation - clickDelegateButton(); - delegateToDRepId(referenceWallets.dRep2.dRepId); - checkForDelegationConfirmation(referenceWallets.dRep2.dRepId); - }); - - // Given I'm already registered as DRep - // When pressing retire as dRep button, wallet asks to sign the tx - it("2G. Should verify retire as a DRep", () => { - loadWallet(dRepWallets.dRep1, { withStakeSigning: true }); - cy.getBySel("retire-button").should("be.enabled"); - cy.getBySel("retire-button").click(); - cy.intercept("**/tx/submit").as("submitTx"); - cy.wait("@submitTx").then((res) => { - expect( - res.response.statusCode, - `[Submit Tx error]: ${res.response.body.message}` - ).eq(200); - }); - }); - - // Given that the I'm connected to the wallet with the registered dRep account - it("2H. Verify DRep behavior in Retired State", () => { - loadWallet(dRepWallets.dRep2, { withStakeSigning: true }); - retireDRep(); - disconnectAndReconnectWallet(null, null, { withStakeSigning: true }); - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("governance-actions-link").click(); - viewProposalDetails(); - cy.getBySel("vote-button").should("not.exist"); - }); - - // Given that I'm an Ada-Holder - it("2I. Should check validity of DRep Id", () => { - connectWallet(); - const dRep = generateDRep(); - - cy.getBySel("delegate-button").click(); - // not registered dRep id - cy.getBySel("delegate-to-drep-card").click(); - cy.getBySel("next-step-button").click(); - cy.getBySel("dRep-id-input").type(getDRepIDHash(dRep.id)); - cy.getBySel("delegate-button").click(); - cy.contains("DrepId not found", { matchCase: false }).should("exist"); - cy.getBySel("confirm-modal-button").first().click({ force: true }); - cy.getBySel("dRep-id-input").clear(); - // registered dRep id - cy.getBySel("dRep-id-input").type( - getDRepIDHash(referenceWallets.dRep1.dRepId) - ); - cy.getBySel("delegate-button").click(); - cy.contains("DrepId not found", { matchCase: false }).should("not.exist"); - }); -}); diff --git a/tests/govtool-frontend/cypress/e2e/3_user_story_drep_registration.cy.ts b/tests/govtool-frontend/cypress/e2e/3_user_story_drep_registration.cy.ts deleted file mode 100644 index 9730e1af8..000000000 --- a/tests/govtool-frontend/cypress/e2e/3_user_story_drep_registration.cy.ts +++ /dev/null @@ -1,123 +0,0 @@ -import * as crypto from "crypto"; -import { random32BytesHex } from "../support/utils"; -import { - connectWallet, - loadWallet, - waitForTxToComplete, -} from "./actions/commonActions"; -import { - checkForDRepRegistrationConfirmation, - registerAsDRep, -} from "./actions/dRepActions"; -import { - validateDRepMetaHashInput, - validateDRepURLInput, -} from "../support/validations"; -import { - adaHolderWallets, - dRepWallets, - referenceWallets, -} from "../constants/wallet"; - -describe("DRep registration", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - it("3A. Should show dRepId on dashboard after connecting registered dRep Wallet", () => { - loadWallet(referenceWallets.dRep1); - checkForDRepRegistrationConfirmation(referenceWallets.dRep1.dRepId); - }); - - it("3B. Should access dRep registration page", () => { - connectWallet(); - cy.getBySel("register-button").click(); - cy.contains("Add information", { matchCase: false }); - }); - - it("3C. Should open wallet connection popup, when Register as DRep from wallet unconnected state", () => { - cy.getBySel("register-connect-wallet-button").click(); - cy.getBySel("connect-your-wallet-modal").should("be.visible"); - }); - - // Given that I'm connected to the wallet - // User visits the DRep Registration page - // DRep registration actions should be accessible - it("3D.Should access DRep registration page in Wallet Connected State", () => { - connectWallet(); - cy.getBySel("register-button").click(); - cy.getBySel("url-input").should("be.visible"); - cy.getBySel("hash-input").should("be.visible"); - cy.getBySel("skip-button").should("be.visible"); - }); - - it("3E. Should reject invalid data and accept valid data", () => { - connectWallet(); - cy.getBySel("register-button").click(); - // invalid datas - const longUrl = - "https://ipfs.io/ipfs/" + crypto.randomBytes(32).toString("hex"); - validateDRepURLInput(longUrl); - - const invalidUrl = "abcd"; - validateDRepURLInput(invalidUrl); - - const emptyUrl = " "; - validateDRepURLInput(emptyUrl); - - const invalidHash = "ipfs://" + crypto.randomBytes(32).toString("hex"); - validateDRepMetaHashInput(invalidHash); - - // too short text should be invalid - const tooShortHash = "abcd"; - validateDRepMetaHashInput(tooShortHash); - // empty should be valid - validateDRepMetaHashInput(" "); - - // valid datas - const validUrl = "ipfs://" + crypto.randomBytes(28).toString("hex"); - const validHash = crypto.randomBytes(32).toString("hex"); - cy.getBySel("url-input").type(validUrl); - cy.getBySel("hash-input").type(validHash); - cy.getBySel("confirm-button").should("be.enabled"); - }); - - // Given that I'm an ADA-Holder - // When registering for DRep, wallet asks to sign the tx - it("3F. Should create proper DRep registration request, when registered with data", () => { - cy.intercept("**/utxo?**").as("getUtxos"); - connectWallet(); - cy.getBySel("register-button").click(); - cy.getBySel("url-input").type("https://google.com"); - cy.getBySel("hash-input").type(random32BytesHex()); - cy.getBySel("confirm-button").click(); - cy.getBySel("register-button").click(); - cy.wait("@getUtxos").then((interception) => { - expect(interception.response.body.length).to.equal(0); - }); - }); - - it("3G: Should show confirmation message with link to view transaction, when DRep registration txn is submitted", () => { - loadWallet(adaHolderWallets.adaHolder2); - cy.getBySel("register-button").click(); - cy.getBySel("url-input").type( - "ipfs://" + crypto.randomBytes(28).toString("hex") - ); - cy.getBySel("hash-input").type(random32BytesHex()); - cy.getBySel("confirm-button").click(); - cy.getBySel("register-button").click(); - cy.getBySel("registration-transaction-submitted-modal").should( - "be.visible" - ); - waitForTxToComplete(); - cy.contains("this link"); - }); - - it("3H. Should be able to update metadata.", () => { - loadWallet(dRepWallets.dRep1); - cy.getBySel("change-metadata-button").click(); - cy.getBySel("url-input").type("https://google.com"); - cy.getBySel("hash-input").should("be.visible").type(random32BytesHex()); - cy.getBySel("confirm-button").should("be.enabled"); - }); -}); diff --git a/tests/govtool-frontend/cypress/e2e/4_user_story_governance_action_visibility.cy.ts b/tests/govtool-frontend/cypress/e2e/4_user_story_governance_action_visibility.cy.ts deleted file mode 100644 index b0fbfa29f..000000000 --- a/tests/govtool-frontend/cypress/e2e/4_user_story_governance_action_visibility.cy.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { groupElements } from "../support/utils"; -import { - checkGovernanceActionsVisibility, - visitGovernanceActionsPage, -} from "./actions/governanceActions"; -import { - governanceActions, - governanceSorts, -} from "../constants/governanceActions"; -import { - connectWallet, - filterGovActions, - sortElementByText, - viewProposalDetails, -} from "./actions/commonActions"; -import { validateSort } from "../support/validations"; -import { dRepWallets } from "../constants/wallet"; - -describe("Governance Actions visibility", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - cy.intercept("**/proposal/list").as("getAllProposal"); - }); - - it("4A: Should access Governance Actions page with/without connecting wallet", () => { - // without wallet connection - cy.getBySel("move-to-governance-actions-button").click(); - cy.wait("@getAllProposal", { timeout: 50000 }); - checkGovernanceActionsVisibility(); - - // with wallet connection - cy.visit(Cypress.env("baseUrl")); - connectWallet(); - visitGovernanceActionsPage(); - checkGovernanceActionsVisibility(); - }); - - it("4B: Should restrict voting for users who are not registered as DReps", () => { - cy.getBySel("move-to-governance-actions-button").click(); - viewProposalDetails(); - cy.getBySel("vote-button").should("not.exist"); - }); - - it("4C.1: Should filter Governance Action Type on governance actions page", () => { - cy.intercept(`**/proposal/list?type=*`).as("getFilteredProposals"); - connectWallet(); - visitGovernanceActionsPage(); - cy.getBySel("filters-button").click(); - // single filter - governanceActions.forEach((govAction) => { - filterGovActions([govAction], () => { - cy.wait("@getFilteredProposals"); - }); - }); - - // multiple filters - for (let i = 2; i <= governanceActions.length; i++) { - filterGovActions(governanceActions.slice(0, i), () => { - cy.wait("@getFilteredProposals"); - }); - } - }); - - it("4C.2: Should sort Governance Action Type on governance actions page", () => { - cy.intercept({ method: "GET", url: "**/proposal/list?sort=*" }).as( - "getSortedProposals" - ); - connectWallet(); - visitGovernanceActionsPage(); - cy.getBySel("sort-button").click(); - governanceSorts.forEach((sort) => { - sortElementByText(sort); - cy.wait("@getSortedProposals").then((responseData: any) => { - if (responseData) { - const sortedData = groupElements(responseData.response.body); - validateSort(sortedData); - } - }); - }); - }); - - it("4C.3: Should filter and sort Governance Action Type on governance actions page", () => { - cy.intercept(`**/proposal/list?type=*`).as("getFilteredProposals"); - cy.intercept({ method: "GET", url: "**/proposal/list?type=*sort=*" }).as( - "getFilteredAndSortedProposals" - ); - connectWallet(); - visitGovernanceActionsPage(); - cy.getBySel("filters-button").click(); - // single filter - governanceActions.forEach((govAction) => { - filterGovActions([govAction], () => { - cy.wait("@getFilteredProposals"); - cy.getBySel("sort-button").click(); - governanceSorts.forEach((sort) => { - sortElementByText(sort); - cy.wait("@getFilteredAndSortedProposals").then( - (responseData: any) => { - if (responseData) { - const sortedData = groupElements(responseData.response.body); - validateSort(sortedData); - } - } - ); - }); - cy.getBySel("filters-button").click(); - }); - }); - }); - // Not implemented in FE yet. - it.skip( - "4.D Should only view the proposals that are accepted by the Constitutional Committee." - ); -}); diff --git a/tests/govtool-frontend/cypress/e2e/5_user_story_governance_action_functionality.cy.ts b/tests/govtool-frontend/cypress/e2e/5_user_story_governance_action_functionality.cy.ts deleted file mode 100644 index 2100fbdf4..000000000 --- a/tests/govtool-frontend/cypress/e2e/5_user_story_governance_action_functionality.cy.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { getDRepIDHash, injectOpen } from "../support/utils"; -import { randomBytes } from "crypto"; -import { - castVote, - visitGovernanceActionsPage, -} from "./actions/governanceActions"; -import { - validateDRepMetaHashInput, - validateDRepURLInput, -} from "../support/validations"; -import { - connectWallet, - loadWallet, - viewProposalDetails, -} from "./actions/commonActions"; -import { IProposal } from "../state/type"; -import { dRepWallets } from "../constants/wallet"; - -describe("Governance Action Functionality", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - // stubbing responses - cy.intercept("**/proposal/list", { fixture: "notVotedProposals.json" }); - cy.intercept( - `**/drep/getVotes/${getDRepIDHash(dRepWallets.votedDRep.dRepId)}`, - { fixture: "votedProposals.json" } - ).as("getVotes"); - }); - - it("5A: Should show relevant details about governance action as dRep.", () => { - loadWallet(dRepWallets.dRep1); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.contains("Expiry").should("exist"); - cy.contains("Governance Action Type").should("exist"); - cy.get("p:contains(View other details)").should("exist"); - cy.getBySel("vote-button").should("exist"); - cy.getBySel("yes-radio").should("exist"); - cy.getBySel("no-radio").should("exist"); - cy.getBySel("abstain-radio").should("exist"); - }); - - it('5B: Should view "Vote" button on governance action item on registered as DRep', () => { - loadWallet(dRepWallets.dRep1); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.getBySel("vote-button").should("exist"); - }); - - it("5C: Should show required field in proposal voting on registered as DRep", () => { - loadWallet(dRepWallets.dRep1); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.getBySel("yes-radio").should("exist"); - cy.getBySel("no-radio").should("exist"); - cy.getBySel("abstain-radio").should("exist"); - cy.getBySel("context-button").click(); - cy.getBySel("url-input").should("be.visible"); - cy.getBySel("hash-input").should("be.visible"); - cy.getBySel("yes-radio").click(); - cy.getBySel("vote-button").should("be.enabled"); - }); - - it("5D: Should validate proposal voting", () => { - const invalidURLs = ["testdotcom", "https://testdotcom", "https://test.c"]; - const validURLs = ["https://test.com"]; - loadWallet(dRepWallets.dRep1); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.getBySel("context-button").click(); - invalidURLs.forEach((url) => { - validateDRepURLInput(url); - }); - - validURLs.forEach((url) => { - validateDRepURLInput(url, false); - }); - - // invalid hash - const hash20Bytes = randomBytes(20).toString("hex"); - validateDRepMetaHashInput(hash20Bytes); - - const hash32BytesString = randomBytes(32).toString(); - validateDRepMetaHashInput(hash32BytesString); - - // valid hash - const hash32Bytes = randomBytes(32).toString("hex"); - validateDRepMetaHashInput(hash32Bytes, false); - }); - - // The proposals should include following criteria - // The proposals must be already voted by (VotedDRep) - // As a dRep which has already voted - it("5E: Should re-vote with new data on a already voted governance action.", () => { - cy.fixture("votedProposals.json").then((proposals) => { - cy.intercept("**/proposal/list").as("getAllProposal"); - console.log({ proposals }); - const votedProposal: IProposal = proposals[0].proposal; - const proposalID = `${votedProposal.txHash}#${votedProposal.index}`; - loadWallet(dRepWallets.votedDRep, { withStakeSigning: true }); - visitGovernanceActionsPage(); - cy.getBySel("voted-tab").click(); - cy.wait("@getVotes"); - cy.contains("Yes", { matchCase: false }); - cy.getBySel(`govaction-${proposalID}-change-your-vote`).click(); - cy.getBySel("no-radio").click(); - cy.getBySel("context-button").click(); - cy.getBySel("url-input").clear().type("https://test.com"); - cy.getBySel("hash-input").clear().type(randomBytes(32).toString("hex")); - castVote("changeVote"); - cy.getBySel("voted-tab").click(); - cy.wait("@getAllProposal"); - cy.contains("No", { matchCase: false }); - }); - }); - - it("5F: Should show notification of casted vote after vote", () => { - cy.fixture("notVotedProposals.json").then((proposals) => { - const proposalToVote: IProposal = proposals[0]; - const proposalID = `${proposalToVote.txHash}#${proposalToVote.index}`; - loadWallet(dRepWallets.dRep1, { withStakeSigning: true }); - visitGovernanceActionsPage(); - cy.getBySel(`govaction-${proposalID}-view-detail`).click(); - cy.getBySel("context-button").click(); - cy.getBySel("yes-radio").click(); - cy.getBySel("url-input").clear().type("https://test.com"); - cy.getBySel("hash-input").clear().type(randomBytes(32).toString("hex")); - castVote(); - }); - }); - - it.skip( - "5G: Given governance action headline is clicked, JSON metadata url is opened in new tab" - ); - - it.skip( - "5H: Given governance action headline is clicked, warn user to validate the metadata hash themselves" - ); - - it("5I: Should show warning to the users to visit the site at their own risk, when external url is opened", () => { - connectWallet(); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.getBySel("view-other-details-button").click(); - cy.getBySel("external-link-modal").should("be.visible"); - }); - - it("5J: Should open a new tab, when external URL is opened", () => { - connectWallet(); - visitGovernanceActionsPage(); - - viewProposalDetails(); - cy.getBySel("view-other-details-button").click(); - cy.getBySel("external-link-modal").should("be.visible"); - let res = injectOpen(); - cy.getBySel("continue-modal-button").click(); - cy.wait(100).then(() => { - expect(res.args[0]).to.exist; - expect(res.args[1]).to.equal("_blank"); - }); - }); - - // Given that I am logged into the app as a dRep - // When I view governance actions I can see which ones I have personally voted on and how I voted - it("5K: Should view the vote details,when viewing governance action already voted by the DRep", () => { - loadWallet(dRepWallets.votedDRep); - visitGovernanceActionsPage(); - - cy.getBySel("voted-tab").click(); - cy.contains("Yes", { matchCase: false }); - }); -}); diff --git a/tests/govtool-frontend/cypress/e2e/6_user_story_miscellaneous.cy.ts b/tests/govtool-frontend/cypress/e2e/6_user_story_miscellaneous.cy.ts deleted file mode 100644 index a74614cf7..000000000 --- a/tests/govtool-frontend/cypress/e2e/6_user_story_miscellaneous.cy.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { injectOpen, isMobile, random32BytesHex } from "../support/utils"; -import * as mockWallet from "../lib/wallet/mockWallet"; -import { - checkInvalidityOfDRepId, - connectWallet, - openMobileDrawer, -} from "./actions/commonActions"; - -describe("Miscellaneous", () => { - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - // All testes can be tested for mobile - it.skip("6A: Should be accessible from mobile", () => {}); - - it("6B. Provides error for invalid format", () => { - connectWallet(); - - // invalid dRep id - checkInvalidityOfDRepId("Random values"); - cy.getBySel("confirm-modal-button").first().click({ force: true }); - cy.go(-2); - // invalid dRep registration - cy.getBySel("register-button").click(); - cy.getBySel("url-input").type("abc"); - cy.getBySel("invalid-url-format-error").should("be.visible"); - - cy.getBySel("hash-input").type("abc"); - cy.getBySel("hash-must-be-exactly-64-characters-long-error").should( - "be.visible" - ); - }); - - it("6C. Navigation within the dApp ", () => { - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("governance-actions-link").click(); - cy.url().should("include", "/governance_actions"); - if (isMobile()) { - openMobileDrawer(); - } - const res = injectOpen(); - cy.getBySel("guides-link").click(); - cy.wait(100).then(() => { - expect(res.args[1]).to.equal("_blank"); - }); - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("faqs-link").click(); - cy.wait(100).then(() => { - expect(res.args[1]).to.equal("_blank"); - }); - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("home-link").click(); - cy.url().should("include", "/"); - }); - - it("6D. Proper label and recognition of the testnet network", () => { - connectWallet(); - cy.contains("testnet"); - }); - - //Skipped: Mainnet cannot be connected from testnet - it.skip("6E. Proper label and recognition of the mainnet network"); -}); diff --git a/tests/govtool-frontend/cypress/e2e/actions/cleanUpActions.ts b/tests/govtool-frontend/cypress/e2e/actions/cleanUpActions.ts deleted file mode 100644 index bc0db74d8..000000000 --- a/tests/govtool-frontend/cypress/e2e/actions/cleanUpActions.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ShelleyWallet } from "../../lib/wallet/crypto"; -import { - CipMethodOverride, - StaticWallet, - WalletParams, -} from "../../lib/wallet/types"; -import { convertUint8ArrayToHex } from "../../support/utils"; -import { disconnectAndReconnectWallet } from "./commonActions"; -import kuberService from "../../services/kuberService"; -import { pollTxWithKuber } from "../../services/apiService"; - -export function cleanUpStaticWallet( - walletJson: StaticWallet, - overrides?: CipMethodOverride, - walletParams?: WalletParams -) { - cy.log(`Check for ${walletJson.type} cleanup.....`); - if (walletJson.type == "dRep") { - cy.get("body").then((bodyElement) => { - const generatedWallet = ShelleyWallet.fromJson(walletJson); - if (bodyElement.find('[data-testid="dRep-id-display"]').length == 0) { - cy.log("DRep clean up process (DRep registration)....."); - registerDRepAndReconnect(generatedWallet, overrides, walletParams); - } - if (bodyElement.find('[data-testid="delegated-to-drep-id"]').length > 0) { - cy.log("AdaHolder clean up process (Abstain delegation)....."); - abstainDelegationAndReconnect(generatedWallet, overrides, walletParams); - } else if ( - bodyElement.find(":contains('ABSTAIN')").length === 0 && - bodyElement.find('[data-testid="change-dRep-button"]').length > 0 - ) { - cy.log("AdaHolder clean up process (Abstain delegation)....."); - abstainDelegationAndReconnect(generatedWallet, overrides, walletParams); - } - }); - } else if (walletJson.type == "adaHolder") { - cy.get("body").then({ timeout: 2 * 60 * 1000 }, (bodyElement) => { - const generatedWallet = ShelleyWallet.fromJson(walletJson); - if (bodyElement.find('[data-testid="dRep-id-display"]').length > 0) { - cy.log("AdaHolder clean up process (DRep de-registration)....."); - deRegisterDRepAndReconnect(generatedWallet, overrides, walletParams); - } - if (bodyElement.find('[data-testid="delegated-to-drep-id"]').length > 0) { - cy.log("AdaHolder clean up process (Abstain delegation)....."); - abstainDelegationAndReconnect(generatedWallet, overrides, walletParams); - } - }); - } -} - -function deRegisterDRepAndReconnect(wallet, overrides, walletParams) { - cy.wrap( - kuberService.dRepDeRegistration( - wallet.addressBech32(0), - convertUint8ArrayToHex(wallet.paymentKey.private), - convertUint8ArrayToHex(wallet.stakeKey.private), - convertUint8ArrayToHex(wallet.stakeKey.pkh) - ) - ).then({ timeout: 5 * 60 * 1000 }, async (tx: any) => { - await pollTxWithKuber(tx.txId); - cy.wait(5000); // Wait for db sync - disconnectAndReconnectWallet(null, overrides, walletParams); - }); -} - -function registerDRepAndReconnect(wallet, overrides, walletParams) { - cy.wrap( - kuberService.dRepRegistration( - wallet.addressBech32(0), - convertUint8ArrayToHex(wallet.paymentKey.private), - convertUint8ArrayToHex(wallet.stakeKey.pkh) - ) - ).then({ timeout: 5 * 60 * 1000 }, async (tx: any) => { - await pollTxWithKuber(tx.txId); - cy.wait(5000); // Wait for db sync - disconnectAndReconnectWallet(null, overrides, walletParams); - }); -} - -function abstainDelegationAndReconnect(wallet, overrides, walletParams) { - cy.wrap( - kuberService.stakeDelegation( - wallet.addressBech32(0), - convertUint8ArrayToHex(wallet.paymentKey.private), - convertUint8ArrayToHex(wallet.stakeKey.private), - convertUint8ArrayToHex(wallet.stakeKey.pkh), - "abstain" - ) - ).then({ timeout: 5 * 60 * 1000 }, async (tx: any) => { - await pollTxWithKuber(tx.txId); - cy.wait(5000); // Wait for db sync - disconnectAndReconnectWallet(null, overrides, walletParams); - }); -} diff --git a/tests/govtool-frontend/cypress/e2e/actions/commonActions.ts b/tests/govtool-frontend/cypress/e2e/actions/commonActions.ts deleted file mode 100644 index bb47fff32..000000000 --- a/tests/govtool-frontend/cypress/e2e/actions/commonActions.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { mkWallet } from "../../lib/wallet/mockWallet"; -import { - CIP30Provider, - CipMethodOverride, - StaticWallet, - WalletParams, -} from "../../lib/wallet/types"; -import { validateFilter } from "../../support/validations"; -import { ShelleyWallet, ShelleyWalletAddress } from "../../lib/wallet/crypto"; -import { mkCardanoWalletExtension } from "../../lib/wallet/cardanoWallet"; -import walletState from "../../state/walletState"; -import { destructWalletArgs, isMobile } from "../../support/utils"; - -import { cleanUpStaticWallet } from "./cleanUpActions"; -import { pollTxWithKuber } from "../../services/apiService"; -import kuberService from "../../services/kuberService"; -import { bootstrapWallet } from "../../constants/wallet"; - -export function injectWallet(wallet: CIP30Provider) { - cy.window().then((w: any) => { - w.cardano = { - demos: wallet || mkWallet(), - }; - }); -} - -export function injectCardanoWallet(wallet: Promise) { - cy.window().then(async (w: any) => { - w.cardano = { - demos: await wallet, - }; - }); -} - -export async function initiateWalletConnection( - overrides?: CipMethodOverride, - walletParams?: WalletParams -): Promise { - const walletToInjected = mkCardanoWalletExtension(overrides, walletParams); - injectCardanoWallet(walletToInjected); - return await walletToInjected; -} - -export async function initializeWallet( - wallet: ShelleyWallet, - overrides?: CipMethodOverride, - walletParams?: WalletParams -): Promise { - return await mkCardanoWalletExtension(overrides, walletParams, wallet); -} - -export function loadAndInjectWallet( - wallet: ShelleyWallet, - overrides?: CipMethodOverride, - walletParams?: WalletParams -) { - injectCardanoWallet(initializeWallet(wallet, overrides, walletParams)); -} - -export function filterGovActions( - govActions: string[], - onFilterCallback?: () => void, - element = "div" -) { - for (const govAction of govActions) { - cy.get(element) - .contains(govAction, { matchCase: false }) - .parent() - .within(() => { - cy.get("input").click(); - // cy.getBySel(`${govAction.replace(/ /g, "")}-checkbox`).click(); - }); - } - onFilterCallback(); - for (const govAction of govActions) { - validateFilter(govAction); - } - // Uncheck the filter after it's completed - for (const govAction of govActions) { - cy.get(element) - .contains(govAction, { matchCase: false }) - .parent() - .within(() => { - cy.getBySel(`${govAction.replace(/ /g, "")}-checkbox`).uncheck(); - }); - } -} - -export function sortElementByText(text: string, element = "span") { - cy.get(element) - .contains(text, { matchCase: false }) - .parent() - .within(() => { - cy.get("input").check(); - }); -} - -export function openMobileDrawer() { - cy.getBySel("open-drawer-button").click({ force: true }); -} - -export function checkInvalidityOfDRepId(invalidDRepId: string) { - cy.getBySel("delegate-button").click(); - cy.getBySel("delegate-to-drep-card").click(); - cy.getBySel("next-step-button").click(); - cy.get("input").type(invalidDRepId); - cy.getBySel("delegate-button").click(); - cy.getBySel("delegation-transaction-error-modal").should("exist"); -} - -export function viewProposalDetails() { - cy.get('[data-testid^="govaction-"][data-testid$="-view-detail"]') - .first() - .click(); -} - -export function disconnectAndReconnectWallet( - walletToInject?: ShelleyWallet, - overrides?: CipMethodOverride, - walletParams?: WalletParams -) { - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("disconnect-button").click(); - cy.wrap( - loadAndInjectWallet( - walletToInject || walletState.getWallet(), - overrides, - walletParams - ) - ); - cy.clearCookie(Cypress.env("baseUrl")); - cy.clearLocalStorage(); - cy.getBySel("connect-wallet-button").wait(100).first().click(); - cy.getBySel("demos-wallet-button").eq(1).click({ force: true }); - cy.getBySel("confirm-modal-button").first().click({ force: true }); // accept the info about sancho net}; - cy.wait(6000); // Waiting for wallet initialization -} -export function waitForTxToComplete() { - cy.wrap(0).then({ timeout: 5 * 60 * 1000 }, async () => { - console.log("Waiting for Tx to complete"); - const txHash = walletState.getTxHash(); - if (txHash === undefined) return; - - console.debug("Waiting for tx: " + txHash); - await pollTxWithKuber(txHash); - }); -} - -export function connectWallet(args?: CipMethodOverride & WalletParams) { - const { overrides, walletParams } = destructWalletArgs(args); - cy.wrap(initiateWalletConnection(overrides, walletParams)).then( - { timeout: 5 * 60 * 1000 }, - async (injectedWallet: CIP30Provider) => { - cy.getBySel("connect-wallet-button").wait(100).first().click(); - cy.getBySel("demos-wallet-button").eq(1).click({ force: true }); - // cy.getBySel("demos-wallet-button").click(); - cy.getBySel("confirm-modal-button").first().click({ force: true }); // accept the info about sancho net - const walletInstance = await injectedWallet.enable(); - - // load amount from faucet - if (args && walletParams.loadFundsAndRegister) { - console.debug("Loading faucet..."); - const shellyWalletAddress = ShelleyWalletAddress.fromRawBytes( - await walletInstance.getChangeAddress() - ); - const { txId } = await loadAmountFromBootStrapWallet([ - shellyWalletAddress.toBech32(), - ]); - await pollTxWithKuber(txId); - // await pollTx(txId); - } - // Handle multiple stake keys - if ("cip95" in walletInstance) { - const stakeKeys = - await walletInstance.cip95.getRegisteredPubStakeKeys(); - const rewardAddress = await walletInstance.getRewardAddresses(); - if (stakeKeys.length > 1) { - console.log("Stake Keys:", stakeKeys); - console.log("Reward address:", rewardAddress); - cy.getBySel(`${rewardAddress[0]}-radio`); - cy.contains("Voting power").click(); - cy.getBySel("select-button").click(); - } - } - cy.getBySel("alert-success", { timeout: 6000 }).should("be.visible"); - cy.wait(6000); // Waiting for wallet initialization - } - ); -} - -export const loadWallet = ( - walletJson: StaticWallet, - args?: CipMethodOverride & WalletParams -) => { - cy.log(`Loading ${walletJson.type} wallet`); - const { overrides, walletParams } = destructWalletArgs(args); - const wallet = ShelleyWallet.fromJson(walletJson); - cy.wrap(loadAndInjectWallet(wallet, overrides, walletParams)); - cy.log("Wallet injected"); - cy.getBySel("connect-wallet-button").wait(100).first().click(); - cy.getBySel("demos-wallet-button").eq(1).click({ force: true }); - cy.getBySel("confirm-modal-button").first().click({ force: true }); // accept the info about sancho net}; - cy.getBySel("alert-success", { timeout: 6000 }).should("be.visible"); - cy.wait(6000); // Waiting for wallet initialization - cleanUpStaticWallet(walletJson, overrides, walletParams); -}; - -export async function loadAmountFromBootStrapWallet(addressList: string[]) { - return await kuberService.transferADA( - bootstrapWallet.address, - addressList, - bootstrapWallet.payment.private - ); -} diff --git a/tests/govtool-frontend/cypress/e2e/actions/dRepActions.ts b/tests/govtool-frontend/cypress/e2e/actions/dRepActions.ts deleted file mode 100644 index 5c0e5f0a8..000000000 --- a/tests/govtool-frontend/cypress/e2e/actions/dRepActions.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { waitForTxToComplete } from "./commonActions"; - -export function registerAsDRep() { - cy.getBySel("register-button").click(); - cy.getBySel("skip-button").click(); - cy.getBySel("register-button").click(); - cy.getBySel("registration-transaction-submitted-modal").should("be.visible"); - cy.getBySel("confirm-modal-button").first().click({ force: true }); - waitForTxToComplete(); -} - -export function retireDRep() { - cy.getBySel("retire-button").click(); - cy.intercept("**/tx/submit").as("submitTx"); - cy.wait("@submitTx").then((res) => { - expect( - res.response.statusCode, - `[Submit Tx error]: ${res.response.body.message}` - ).eq(200); - }); - cy.getBySel("retirement-transaction-submitted-modal").should("be.visible"); - cy.getBySel("confirm-modal-button").first().click({ force: true }); - waitForTxToComplete(); - cy.contains("in progress", { timeout: 30 * 1000, matchCase: false }).should( - "not.exist" - ); -} - -export function checkForDRepRegistrationConfirmation(expectedDRepId: string) { - cy.getBySel("dRep-id-display", { timeout: 30 * 1000 }).then(($dRepIdEl) => { - cy.wrap($dRepIdEl).should("contain", expectedDRepId); - }); -} - -export function verifyVoteOnProposal() { - cy.contains("button", "View proposal details", { matchCase: false }).click(); - cy.getBySel("abstain-radio").click(); - cy.getBySel("yes-radio").click(); - cy.getBySel("no-radio").click(); - cy.getBySel("vote-button").should("be.visible"); -} diff --git a/tests/govtool-frontend/cypress/e2e/actions/delegateActions.ts b/tests/govtool-frontend/cypress/e2e/actions/delegateActions.ts deleted file mode 100644 index 6ce50f596..000000000 --- a/tests/govtool-frontend/cypress/e2e/actions/delegateActions.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { waitForTxToComplete } from "./commonActions"; -import { getDRepIDHash } from "../../support/utils"; - -const enum DelegationOptions { - delegateTodRep = "delegate-to-drep-card", - delegateToMyself = "delegate-to-myself", -} - -export function changeDRepDelegation( - dRepId: string, - option: DelegationOptions = DelegationOptions.delegateTodRep -) { - cy.getBySel("change-dRep-button").click(); - delegate(dRepId, option); - waitForTxToComplete(); -} - -export function delegateToDRepId(dRepId: string, convertToHash = true) { - delegate(dRepId, DelegationOptions.delegateTodRep, convertToHash); -} - -export function delegateToMyself() { - delegate("", DelegationOptions.delegateToMyself); -} -function delegate( - dRepId: string, - option: DelegationOptions = DelegationOptions.delegateTodRep, - convertToHash = true -) { - const hashedDRepId = - convertToHash && dRepId !== "" ? getDRepIDHash(dRepId) : dRepId; - - if (option === DelegationOptions.delegateTodRep) { - cy.getBySel("delegate-to-drep-card").click(); - cy.getBySel("next-step-button").click(); - cy.getBySel("dRep-id-input").type(hashedDRepId); - } else if (option === DelegationOptions.delegateToMyself) { - cy.getBySel("delegate-to-myself-card").click(); - } - cy.getBySel("delegate-button").click(); - cy.getBySel("delegation-transaction-submitted-modal").should("be.visible"); - cy.getBySel("confirm-modal-button").first().click({ force: true }); - waitForTxToComplete(); -} - -export function checkForDelegationConfirmation(dRepId: string) { - cy.getBySel("change-dRep-button", { timeout: 30 * 1000 }).should("exist"); - cy.contains(dRepId).should("exist"); -} - -export function clickDelegateButton() { - cy.get("body").then((bodyElement) => { - if (bodyElement.find('[data-testid="delegate-button"]').length > 0) { - cy.getBySel("delegate-button").click(); - } else { - cy.getBySel("change-dRep-button").click(); - } - }); -} diff --git a/tests/govtool-frontend/cypress/e2e/actions/governanceActions.ts b/tests/govtool-frontend/cypress/e2e/actions/governanceActions.ts deleted file mode 100644 index 5ab3810ea..000000000 --- a/tests/govtool-frontend/cypress/e2e/actions/governanceActions.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { governanceActions } from "../../constants/governanceActions"; -import { isMobile } from "../../support/utils"; -import { openMobileDrawer, waitForTxToComplete } from "./commonActions"; - -export function visitGovernanceActionsPage() { - cy.intercept("**/proposal/list").as("getAllProposal"); - if (isMobile()) { - openMobileDrawer(); - } - cy.getBySel("governance-actions-link").click(); - cy.url().should("include", "/governance_actions"); - // Waits for proposals to be loaded for further governance actions functionality - cy.wait("@getAllProposal", { timeout: 5000 }); -} - -function isViewProposalDetailsButtonMissing($slider: any) { - return !( - $slider.find('[data-testid^="govaction-"][data-testid$="-view-detail"]') - .length > 0 - ); -} - -function isExpectedProposalTypeMissing($slide: any) { - for (const type of governanceActions) { - if ($slide.find(`p:contains(${type})`).length > 0) { - return false; - } - } - - return true; -} - -export const checkGovernanceActionsVisibility = () => { - cy.get(".keen-slider") - .find(".keen-slider__slide") - .each(($slide) => { - if ($slide.find("p:contains(Governance Action Type)").length > 0) { - if (isExpectedProposalTypeMissing($slide)) { - throw new Error("Expected proposals are missing"); - } - if (isViewProposalDetailsButtonMissing($slide)) { - throw new Error("View proposal button missing"); - } - } - }); -}; - -export const castVote = (castOption: "newVote" | "changeVote" = "newVote") => { - if (castOption === "changeVote") { - cy.getBySel("change-vote").click(); - } else { - cy.getBySel("vote-button").click(); - } - cy.intercept("**/tx/submit").as("submitTx"); - cy.wait("@submitTx"); - cy.getBySel("alert-success").should("be.visible"); - waitForTxToComplete(); -}; diff --git a/tests/govtool-frontend/cypress/e2e/security/7.1_security_overflow_data_headers.cy.ts b/tests/govtool-frontend/cypress/e2e/security/7.1_security_overflow_data_headers.cy.ts deleted file mode 100644 index 5c8ccb723..000000000 --- a/tests/govtool-frontend/cypress/e2e/security/7.1_security_overflow_data_headers.cy.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { governanceActions } from "../../constants/governanceActions"; -import { - validateDRepMetaHashInput, - validateDRepURLInput, -} from "../../support/validations"; -import { - connectWallet, - disconnectAndReconnectWallet, - viewProposalDetails, -} from "../actions/commonActions"; -import * as crypto from "crypto"; -import { visitGovernanceActionsPage } from "../actions/governanceActions"; -import { ShelleyWallet } from "../../lib/wallet/crypto"; -import { referenceWallets } from "../../constants/wallet"; - -describe("Test for Overflows, Valid/Invalid data and Headers", () => { - if (Cypress.env("disableSecurityTest")) return; - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - // Input Size Testing - it("7.1.1: Should reject excessively long inputs", () => { - // DRep registration - connectWallet(); - cy.getBySel("register-button").click(); - const longInput = "a".repeat(1500); - cy.getBySel("url-input").type(longInput).blur(); - cy.getBySel("hash-input").type(longInput).blur(); - cy.go("back"); - // Search input (Governance actions) - visitGovernanceActionsPage(); - cy.getBySel("search-input").type(longInput).clear().blur(); - - // Vote on Proposal form - disconnectAndReconnectWallet( - ShelleyWallet.fromJson(referenceWallets.dRep1) - ); - visitGovernanceActionsPage(); - viewProposalDetails(); - cy.getBySel("context-button").click(); - cy.getBySel("url-input").type(longInput).blur(); - cy.getBySel("hash-input").type(longInput).blur(); - }); - - // Valid/Invalid Data Testing - it("7.1.2: Should accept valid data and reject the invalid data", () => { - // DRep registration - connectWallet(); - cy.getBySel("register-button").click(); - dRepFormValidation(); - - // Search input (Governance actions) - cy.go("back"); - // Positive data - visitGovernanceActionsPage(); - governanceActions.forEach((action) => { - cy.getBySel("search-input").type(action).blur(); - cy.contains(action); - cy.getBySel("search-input").clear(); - }); - - // Negative data - cy.getBySel("search-input").type("nono").blur(); - cy.contains("There're any Governance Actions yet.").should("be.visible"); - cy.getBySel("search-input").clear(); - - // Vote on Proposal form - viewProposalDetails(); - dRepFormValidation(); - }); - - it("7.1.3.a: Should contain CSP header", () => { - const urlsToTest = ["", "governance_actions"]; - urlsToTest.map((url) => { - cy.request({ - method: "GET", - url: Cypress.env("baseUrl") + url, - }).then((response) => { - expect(response.headers).to.have.property("content-security-policy"); - }); - }); - }); - - it("7.1.3.b: Should handle CORS request properly", () => { - cy.request({ - method: "GET", - url: Cypress.env("apiUrl") + "/proposal/list", - headers: { - Origin: "https://another-origin.com", - }, - }).then((response) => { - expect(response.headers).to.have.property("access-control-allow-origin"); - expect(response.headers).to.not.have.property( - "access-control-allow-origin", - "*" - ); - }); - }); - - it("7.1.3.c: Should match the actual content", () => { - cy.visit(Cypress.env("baseUrl")); - const endPointsContentTypes = [ - { endpoint: "/proposal/list", contentType: "application/json" }, - { endpoint: "/drep/list", contentType: "application/json" }, - ]; - endPointsContentTypes.forEach((endpoint) => { - cy.request(Cypress.env("apiUrl") + endpoint.endpoint).then((response) => { - expect(response.headers).to.have.property("content-type"); - - const contentTypeHeader = response.headers["content-type"]; - expect(contentTypeHeader).to.include(endpoint.contentType); - }); - }); - }); -}); - -const dRepFormValidation = () => { - const invalidUrls = [ - "https://ipfs.io/ipfs/" + crypto.randomBytes(32).toString("hex"), - "abcd", - " ", - ]; - const invalidHashs = [ - "ipfs://" + crypto.randomBytes(32).toString("hex"), - "abcd", - " ", - ]; - const validHash = crypto.randomBytes(32).toString("hex"); - const validUrl = "ipfs://QmXqBdW3t6jFwz3L4pRy7zmZGKEzj7qHpA7ZyG6Zr45nsw"; - - // Negative Tests - invalidUrls.forEach((url) => { - validateDRepURLInput(url); - }); - invalidHashs.forEach((url) => { - validateDRepMetaHashInput(url); - }); - - // Positive Tests - validateDRepURLInput(validUrl, false); - validateDRepMetaHashInput(validHash, false); -}; diff --git a/tests/govtool-frontend/cypress/e2e/security/7.3_security_xss.cy.ts b/tests/govtool-frontend/cypress/e2e/security/7.3_security_xss.cy.ts deleted file mode 100644 index 62798db6b..000000000 --- a/tests/govtool-frontend/cypress/e2e/security/7.3_security_xss.cy.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { referenceWallets } from "../../constants/wallet"; -import { ShelleyWallet } from "../../lib/wallet/crypto"; -import { - connectWallet, - disconnectAndReconnectWallet, - viewProposalDetails, -} from "../actions/commonActions"; -import { visitGovernanceActionsPage } from "../actions/governanceActions"; - -describe("Cross Site Scripting", () => { - if (Cypress.env("disableSecurityTest")) return; - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - // Input Fields Testing - it("7.3.1: Should prevent script from injection in input fields", () => { - connectWallet(); - const script = ""; - // DRep Registration page - cy.getBySel("register-button").click(); - dRepFormXSS(script); - - cy.go("back"); - disconnectAndReconnectWallet( - ShelleyWallet.fromJson(referenceWallets.dRep1) - ); - // Positive data - visitGovernanceActionsPage(); - cy.getBySel("search-input").type(script).blur(); - listenXSSAlert(); - - cy.getBySel("search-input").clear(); - - // Vote on Proposal form - viewProposalDetails(); - cy.getBySel("context-button").click(); - dRepFormXSS(script); - }); - - // Output Rendering Testing - it("7.3.2: Should properly encode or escape user generated content", () => { - const maliciousContent = - "
User-generated content with a
"; - cy.intercept("**/proposal/list", (req) => { - req.continue((res) => { - res.body = [...res.body, { ...res.body[0], type: maliciousContent }]; - }); - }); - - cy.intercept("**/drep/get-voting-power/*", (req) => { - req.continue((res) => { - res.body = maliciousContent; - }); - }); - connectWallet(); - visitGovernanceActionsPage(); - listenXSSAlert(); - }); -}); - -const dRepFormXSS = (script: string) => { - cy.getBySel("url-input").type(script).blur(); - cy.getBySel("hash-input").type("").blur(); - listenXSSAlert(); -}; - -const listenXSSAlert = () => { - cy.on("window:alert", (alertText) => { - throw new Error(`Unexpected alert: ${alertText}`); - }); -}; diff --git a/tests/govtool-frontend/cypress/e2e/security/7.4_sql_injection.cy.ts b/tests/govtool-frontend/cypress/e2e/security/7.4_sql_injection.cy.ts deleted file mode 100644 index 812117913..000000000 --- a/tests/govtool-frontend/cypress/e2e/security/7.4_sql_injection.cy.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { referenceWallets } from "../../constants/wallet"; -import { ShelleyWallet } from "../../lib/wallet/crypto"; -import { - validateDRepMetaHashInput, - validateDRepURLInput, -} from "../../support/validations"; -import { - connectWallet, - disconnectAndReconnectWallet, - viewProposalDetails, -} from "../actions/commonActions"; -import { visitGovernanceActionsPage } from "../actions/governanceActions"; - -const sqlVulnerable = "' OR '1'='1"; -const hexEncodedSqlVulnerable = Buffer.from(sqlVulnerable, "utf-8").toString( - "hex" -); - -describe("SQL Injection", () => { - if (Cypress.env("disableSecurityTest")) return; - beforeEach(() => { - cy.visit(Cypress.env("baseUrl")); - }); - - it("7.4.1: Should prevent SQL Injection in input fields", () => { - connectWallet(); - // DRep registration - cy.getBySel("register-button").click(); - validateDRepURLInput(sqlVulnerable); - validateDRepMetaHashInput(sqlVulnerable); - - cy.go("back"); - - disconnectAndReconnectWallet( - ShelleyWallet.fromJson(referenceWallets.dRep1) - ); - - // Proposal form - visitGovernanceActionsPage(); - viewProposalDetails(); - cy.getBySel("context-button").click(); - cy.getBySel("url-input").type(sqlVulnerable).blur(); - cy.getBySel("hash-input").type(sqlVulnerable).blur(); - }); - - it("7.4.2: Should prevent SQL Injection in query and path parameters", () => { - // Sql injection in proposals query (Governance actions) - checkForSqlVulnerable(`/proposal/list?type=${sqlVulnerable}`); - // Sql injection in sort query (Governance actions) - checkForSqlVulnerable(`/proposal/list?sort=${sqlVulnerable}`); - // Sql injection in get-current-delegation path - checkForSqlVulnerable( - `/ada-holder/get-current-delegation/${hexEncodedSqlVulnerable}` - ); - // Sql injection in adaHolder get-voting-power path - checkForSqlVulnerable( - `/ada-holder/get-voting-delegation/${hexEncodedSqlVulnerable}` - ); - // Sql injection in dRep get-voting-power path - checkForSqlVulnerable( - `/dRep/get-voting-delegation/${hexEncodedSqlVulnerable}` - ); - // Sql injection in dRep get-votes path - checkForSqlVulnerable(`/dRep/getVotes/${hexEncodedSqlVulnerable}`); - }); - - it("7.4.3: Should prevent error based injection", () => { - const sqlInjectionTests = [ - "'", - "' '", - '"', - "“ ”", - "\\", - "\\\\", - "' OR '1", - "' OR 1 -- -", - '" OR "" = "', - '" OR 1 = 1 -- -', - "'='", - "'LIKE'", - "'=0 -- +", - ]; - sqlInjectionTests.forEach((test) => { - // Sql injection in proposals query (Governance actions) - checkForSqlVulnerable(`/proposal/list?type=${test}`); - // Sql injection in sort query (Governance actions) - checkForSqlVulnerable(`/proposal/list?sort=${test}`); - // Sql injection in get-current-delegation path - checkForSqlVulnerable(`/ada-holder/get-current-delegation/${test}`); - // Sql injection injection in adaHolder get-voting-power path - checkForSqlVulnerable(`/ada-holder/get-voting-delegation/${test}`); - // Sql injection injection in dRep get-voting-power path - checkForSqlVulnerable(`/dRep/get-voting-delegation/${test}`); - // Sql injection injection in dRep get-votes path - checkForSqlVulnerable(`/dRep/getVotes/${test}`); - }); - }); -}); - -function checkForSqlVulnerable(path: string) { - cy.request({ - url: Cypress.env("apiUrl") + path, - failOnStatusCode: false, - }).then((resp) => { - console.log(resp); - expect(resp.status).to.eq( - 400, - `[SQL injection] URL:${Cypress.env("apiUrl")}${path}` - ); - }); -} diff --git a/tests/govtool-frontend/cypress/lib/logger/logger.ts b/tests/govtool-frontend/cypress/lib/logger/logger.ts deleted file mode 100644 index 282544bb5..000000000 --- a/tests/govtool-frontend/cypress/lib/logger/logger.ts +++ /dev/null @@ -1,13 +0,0 @@ -export class Logger { - static success(msg: string) { - console.debug(`\x1b[32m✔ ${msg}\x1b[0m`); // Green color - } - - static fail(msg) { - console.debug(`\x1b[33m✖ ${msg}\x1b[0m`); // Orange color - } - - static info(msg: string) { - console.debug(`\x1b[36mℹ ${msg}\x1b[0m`); // Cyan color - } -} diff --git a/tests/govtool-frontend/cypress/lib/wallet/blockfrost.ts b/tests/govtool-frontend/cypress/lib/wallet/blockfrost.ts deleted file mode 100644 index e3ae38d0e..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/blockfrost.ts +++ /dev/null @@ -1,104 +0,0 @@ -const config = { - apiUrl: "https://cardano-sanchonet.blockfrost.io/api/v0", - apiKey: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", -}; -export const blockfrost = { - async addresses(addr: string) { - return await getBlockfrost("/addresses/" + addr).catch((e) => { - if (e.status == 404) { - return "00"; - } else { - throw e; - } - }); - }, - async addressesUtxos(addr: string) { - return await getBlockfrost("/addresses/" + addr + "/utxos?order=desc").catch((e) => { - if (e.status == 404) { - return []; - } else { - throw e; - } - }); - }, - async submitTransaction(tx:string){ - return await submitTransaction(Buffer.from(tx,'hex')) - } -}; - -function getAssetDetail(asset: string) { - return getBlockfrost("/assets/" + asset); -} - -function getDatum(hash: string) { - return getBlockfrost("/scripts/datum/" + hash); -} -function getTransactionDetails(txHash: any) { - return getBlockfrost("/txs/" + txHash); -} -function getTransactionUtxos(txHash: any) { - return getBlockfrost("/txs/" + txHash + "/utxos"); -} - -function getTransactions(addr: any) { - return getBlockfrost("/addresses/" + addr + "/utxos"); -} - - -function submitTransaction(txData: any) { - const path = '/tx/submit'; - const method = 'POST'; - const contentType = 'application/cbor'; - - return getBlockfrost(path, method, txData, contentType); - -} - - -async function getBlockfrost(path: any, method: 'GET' | 'POST' = 'GET', body?: BodyInit,contentType?:string) { - const url = config.apiUrl + path; - - const headers: Record = { - project_id: config.apiKey, - }; - if(contentType){ - headers['content-type']=contentType - } - - const options: RequestInit = { - method, - headers, - }; - - if (method === 'POST' ) { - if(body) - options.body = body; - } - - return fetch(url, options).then(async (res) => { - if (res.status === 200) { - return res.json(); - } else { - return res.text().then((txt) => { - let err; - let json: any; - try { - json = JSON.parse(txt); - if (json) { - err = Error( - `BlockfrostApi [Status ${res.status}] : ${ - json.message ? json.message : txt - }` - ); - } else { - err = Error(`BlockfrostApi [Status ${res.status}] : ${txt}`); - } - } catch (e) { - err = Error(`BlockfrostApi [Status ${res.status}] : ${txt}`); - } - err.status = res.status; - throw err; - }); - } - }); -} diff --git a/tests/govtool-frontend/cypress/lib/wallet/cardanoWallet.ts b/tests/govtool-frontend/cypress/lib/wallet/cardanoWallet.ts deleted file mode 100644 index a763850ef..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/cardanoWallet.ts +++ /dev/null @@ -1,329 +0,0 @@ -import * as blake from "blakejs"; -import { - CIP30Provider, - Cip95Instance, - CipMethodOverride, - WalletParams, -} from "./types"; -import { encode, Decoder, Encoder, addExtension } from "cbor-x"; -import { ShelleyWallet } from "./crypto"; -import walletState from "../../state/walletState"; -import { - cborxDecoder, - cborxEncoder, - getPubDRepIds, - getTxHash, -} from "../../support/utils"; -import { Logger } from "../logger/logger"; -import kuberService, * as kuber from "../../services/kuberService"; -import { KuberValue } from "../../models/types"; -import blockfrostService from "../../services/blockfrostService"; - -class AuxData { - value: any; - constructor(value: any) { - this.value = value; - } -} -// this is required to override default beehaviour of AuxData -addExtension({ - Class: AuxData, - tag: 259, // register our own extension code for 259 tag - encode(instance, encode) { - return encode(instance.value); - }, - decode(data: any) { - return new AuxData(data); - }, -}); - -/** - * Creates a CIP-30 and CIP-95 compliant wallet instance. - * - * @param {ShelleyWallet=} wallet_ - The Shelley wallet to use. If not provided, a new wallet will be generated. - * @param {number=} networkId - The network ID for the wallet (0 for testnet, 1 for mainnet ). - * @param {boolean=} withStakeSigning When set to true, when signing transactions, signature of stakeKey will also be added - * @returns {Promise} A promise that resolves when the CIP-95 wallet is created. - */ - -export async function mkCip95Wallet( - wallet_?: ShelleyWallet, - networkId: number = 0, - withStakeSigning = false, - onSignTxCallback?: any, - onWalletInitialized?: any -) { - const wallet = wallet_ || (await ShelleyWallet.generate()); - const walletAddress = wallet.addressBech32(networkId); - // Setting wallet state for further use - onWalletInitialized && - onWalletInitialized({ - wallet, - stakePkh: Buffer.from(wallet.stakeKey.pkh).toString("hex"), - signingKey: Buffer.from(wallet.paymentKey.private).toString("hex"), - address: walletAddress, - }); - console.debug("Wallet address:" + walletAddress); - const walletAddressRaw = Buffer.from(wallet.addressRawBytes(networkId)); - const walletAddressHex = walletAddressRaw.toString("hex"); - - const rewardAddr = Buffer.from( - wallet.rewardAddressRawBytes(networkId) - ).toString("hex"); - const stakePublicKey = Buffer.from(wallet.stakeKey.public).toString("hex"); - const dRepDetails = getPubDRepIds(stakePublicKey); - console.debug("Injected Wallet DRepIds: " + JSON.stringify(dRepDetails)); - const walletInstance: Cip95Instance & { - experimental: Record; - } = { - getBalance: async () => { - const apiResponse = await blockfrostService.addresses(walletAddress); - return Buffer.from(encode(amountToObject(apiResponse.amount))).toString( - "hex" - ); - }, - - submitTx: async (tx) => { - console.debug("[CardanoWallet] SubmittingTx: ", tx); - return await kuberService.submitTransaction(tx).then(async (res) => { - expect(res.status).eq(200); - return getTxHash(tx); - // if (res.status <= 200 || res.status <= 299) { - // await blockfrost.submitTransaction(tx).catch(e=>{ - // console.log("Ignoring transaction submission error on blockfrost") - // }); - // } - }); - }, - getUtxos: (p1, p2) => - getUtxosKuber(walletAddress, walletAddressRaw, p1, p2), - getUsedAddresses: async () => [walletAddressHex], - getUnusedAddresses: async () => [walletAddressHex], - getChangeAddress: async () => walletAddressHex, - getRewardAddresses: async () => [rewardAddr], - getNetworkId: async () => networkId, - experimental: { - on: (eventName, callback) => { - return; - }, - off: (eventName, callback) => { - return; - }, - getCollateral: () => { - return ""; - }, - }, - cip95: { - getPubDRepKey: async () => stakePublicKey, - getUnregisteredPubStakeKeys: async () => [stakePublicKey], - getRegisteredPubStakeKeys: async () => [stakePublicKey], - }, - // CIP-95 ----------------------------- - getActivePubStakeKeys: async () => [rewardAddr], - - signTx: async (tx, partialSign) => { - // decode transaction body and calculate hash - let decodedTx = cborxDecoder.decode(Buffer.from(tx, "hex")); - const reEncodedTx = Buffer.from(cborxEncoder.encode(decodedTx)).toString( - "hex" - ); - - if (tx != reEncodedTx) { - console.warn("[CardanoWallet] Re-encoded tx is not same"); - console.warn("[CardanoWallet] Starting Tx", tx); - console.warn("[CardanoWallet] Re-Encoded Tx", reEncodedTx); - } - - const txbody = Uint8Array.from(cborxEncoder.encode(decodedTx[0])); - const txHash = blake.blake2b(txbody, undefined, 32); - Logger.success( - "[CardanoWallet] Signing Tx hash=" + Buffer.from(txHash).toString("hex") - ); - - // sign the transaction hash with payment key - const paymentKeySig = await wallet.paymentKey.signRaw(txHash); - - // create witness set object - const witness = new Map(); - const vkeyWitnesses = [[wallet.paymentKey.public, paymentKeySig]]; - - // encode witness set to cbor hex and return - if (withStakeSigning) { - Logger.success("Signing stake key..."); - const stakeKeySig = await wallet.stakeKey.signRaw(txHash); - vkeyWitnesses.push([wallet.stakeKey.public, stakeKeySig]); - } - - witness.set(0, vkeyWitnesses); - - if (onSignTxCallback) { - onSignTxCallback(Buffer.from(txHash).toString("hex")); - } - return Buffer.from(cborxEncoder.encode(witness)).toString("hex"); - }, - - signData: async (address, payload) => { - return ""; - }, - getExtensions: () => [{ cip: 95 }], - }; - return walletInstance; -} - -/** - * Creates a Cardano Wallet Extension with CIP-95 compliance and optional overrides. - * the returned object can be injected to `window.cardano.demos` for testing wallet extension feature. - * - * @param {CipMethodOverride=} overrides - Optional overrides for CIP-20 and cip95 overrides. - * @param {ShelleyWallet=} shellyWallet - Optional Shelley wallet to use in the extension. - * @param {boolean=} withStakeSigning When set to true, when signing transactions, signature of stakeKey will also be added - * @returns {Promise} A promise that resolves with the created CIP-30 provider. - */ - -export async function mkCardanoWalletExtension( - overrides?: CipMethodOverride, - walletParams?: WalletParams, - shellyWallet?: ShelleyWallet -): Promise { - let extension = await mkCip95Wallet( - shellyWallet, - 0, - walletParams?.withStakeSigning, - walletParams?.onTxSign, - walletParams?.onWalletInitialized - ); - - let result = { ...extension }; - - if (overrides) { - Object.keys(overrides).forEach((k) => { - if (result[k]) { - console.debug( - "[CardanoWallet] Overriding", - k, - "to", - typeof overrides[k], - overrides[k] - ); - result[k] = async () => overrides[k]; - } - if (result.cip95 && result.cip95[k]) { - result.cip95[k] = async () => overrides[k]; - } - }); - } - let enabled = false; - - return { - apiVersion: "1.3.1", - icon: "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='309.36' y='12.441' width='121.115' height='472.347' style='fill: rgb(128 177 211)%3B'/%3E%3Cellipse style='fill: rgb(128 177 211)%3B' cx='231.272' cy='320.966' rx='171.791' ry='137.051'/%3E%3C/svg%3E", - - enable: async function () { - console.debug("[Cardano Wallet] Enable called"); - enabled = true; - return result; - }, - - isEnabled: async function () { - return enabled; - }, - - name: "Demos", - - supportedExtensions: [ - { - cip: 95, - }, - ], - }; -} - -// convert MultiAsset Value from blockfrost for cbor encoding as per the ledger cddl -function amountToObject( - amount -): [BigInt, Map>] | BigInt { - let lovelace: BigInt; - let assets: Map> = new Map(); - amount.forEach((a) => { - if (a.unit == "lovelace") { - lovelace = BigInt(a.quantity); - } else { - let policy = a.unit.substring(0, 56); - let tokenName = a.unit.substring(56, a.unit.length); - if (assets.has(policy)) { - assets.get(policy).set(tokenName, BigInt(a.quantity)); - } else { - let quantityMap = new Map(); - quantityMap.set(tokenName, BigInt(a.quantity)); - assets.set(policy, quantityMap); - } - } - }); - if (assets.size > 0) { - return [lovelace, assets]; - } else { - return lovelace; - } -} - -const getUtxosBlockfrost = async ( - walletAddress, - walletAddressRaw, - amount, - paginate -) => { - const apiResponse = await blockfrostService.addressesUtxos(walletAddress); - - return apiResponse.map((utxo, idx) => { - return Buffer.from( - cborxEncoder.encode([ - [Buffer.from(utxo.tx_hash, "hex"), utxo.output_index], - [walletAddressRaw, amountToObject(utxo.amount)], - ]) - ).toString("hex"); - }); -}; - -const getUtxosKuber = async ( - walletAddress, - walletAddressRaw, - amount, - paginate -) => { - function kuberValuetoObject( - value: KuberValue - ): [bigint, Map>] | bigint { - const lovelace = BigInt(value.lovelace as bigint | number | string); - let assets: Map> = new Map(); - for (let policy in value) { - const assetMap = value[policy] as Record; - for (let tokenName in assetMap) { - if (assets.has(policy)) { - assets.get(policy).set(tokenName, BigInt(assetMap[tokenName])); - } else { - let quantityMap = new Map(); - quantityMap.set(tokenName, BigInt(assetMap[tokenName])); - assets.set(policy, quantityMap); - } - } - } - - if (assets.size > 0) { - return [lovelace, assets]; - } else { - return lovelace; - } - } - - const apiResponse = await kuberService.queryUtxos(walletAddress); - let result = []; - return apiResponse.map((utxo) => { - const txin = utxo.txin.split("#"); - return Buffer.from( - cborxEncoder.encode([ - [Buffer.from(txin[0], "hex"), BigInt(txin[1])], - [walletAddressRaw, kuberValuetoObject(utxo.value)], - ]) - ).toString("hex"); - }); -}; diff --git a/tests/govtool-frontend/cypress/lib/wallet/crypto.ts b/tests/govtool-frontend/cypress/lib/wallet/crypto.ts deleted file mode 100644 index 08db7de1e..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/crypto.ts +++ /dev/null @@ -1,253 +0,0 @@ -import * as ed from "@noble/ed25519"; -import { bech32 } from "bech32"; -import * as blake from "blakejs"; - -const KEYHASH_LENGTH = 28; -const ADDR_LENGTH = KEYHASH_LENGTH * 2 + 1; - -// Stores ed25519 KeyPair and hash of publicKey -export class Ed25519Key { - private: Uint8Array; - public: Uint8Array; - pkh: Uint8Array; - - private constructor(priv: Uint8Array, pub: Uint8Array, pkh: Uint8Array) { - this.private = priv; - this.public = pub; - this.pkh = pkh; - } - public static async generate() { - const privKey = ed.utils.randomPrivateKey(); // Secure random private key - return await Ed25519Key.fromPrivateKey(privKey); - } - - public static async fromPrivateKey(privKey: Uint8Array) { - const pubKey = await ed.getPublicKeyAsync(privKey); - const pkh = blake.blake2b(pubKey, undefined, KEYHASH_LENGTH); - const key = new Ed25519Key(privKey, pubKey, pkh); - console.log("loaded", "Ed25519Key", key.json()); - return key; - } - public static async fromPrivateKeyHex(privKey) { - return await Ed25519Key.fromPrivateKey( - Uint8Array.from(Buffer.from(privKey, "hex")) - ); - } - - public bech32Pkh(prefix: string = "stake"): string { - return bech32.encode(prefix, bech32.toWords(this.pkh)); - } - public bech32PublicKey(prefix: string = "vk_"): string { - return bech32.encode(prefix, bech32.toWords(this.public)); - } - public bech32PrivateKey(prefix: string = "sk_"): string { - return bech32.encode(prefix, bech32.toWords(this.private)); - } - public async signRaw(message: Uint8Array) { - return await ed.signAsync(message, this.private); - } - public async verify(message, signature) { - return await ed.verifyAsync(signature, message, this.public); - } - - public json() { - return { - private: Buffer.from(this.private).toString("hex"), - public: Buffer.from(this.public).toString("hex"), - pkh: Buffer.from(this.pkh).toString("hex"), - }; - } - public static fromJson(json: any): Ed25519Key { - if (!json || typeof json !== "object") { - throw new Error( - "Invalid JSON format for Ed25519Key: Input must be a non-null object." - ); - } - - if (!json.private || !json.public || !json.pkh) { - throw new Error( - "Invalid JSON format for Ed25519Key: Missing required fields (private, public, or pkh)." - ); - } - - return new Ed25519Key( - Uint8Array.from(Buffer.from(json.private, "hex")), - Uint8Array.from(Buffer.from(json.public, "hex")), - Uint8Array.from(Buffer.from(json.pkh, "hex")) - ); - } -} - -// Shelley Wallet has 2 ed25519 key pair -// - one for payment purpose -// - one for staking/governance purpose -export class ShelleyWallet { - paymentKey: Ed25519Key; - stakeKey: Ed25519Key; - - public constructor(payment, stake) { - this.paymentKey = payment; - this.stakeKey = stake; - } - - public static async generate() { - const wallet = new ShelleyWallet( - await Ed25519Key.generate(), - await Ed25519Key.generate() - ); - console.log("generated", "Ed25519Key", wallet); - return wallet; - } - - addressBech32(networkId: number): string { - const prefix = networkId == 0 ? "addr_test" : "addr"; - return bech32.encode( - prefix, - bech32.toWords(Buffer.from(this.addressRawBytes(networkId))), - 200 - ); - } - - addressRawBytes(networkId) { - const concatenatedArray1 = new Uint8Array(ADDR_LENGTH); - concatenatedArray1[0] = networkId; - concatenatedArray1.set(this.paymentKey.pkh, 1); - concatenatedArray1.set(this.stakeKey.pkh, KEYHASH_LENGTH + 1); - return concatenatedArray1; - } - rewardAddressRawBytes(network: number) { - const rewardAccountPrefix = 0xe0; - const header = network | rewardAccountPrefix; - const result = new Uint8Array(KEYHASH_LENGTH + 1); - result[0] = header; - result.set(this.stakeKey.pkh, 1); - return result; - } - - rewardAddressBech32(networkId: number): string { - const prefix = networkId == 0 ? "stake_test" : "stake"; - return bech32.encode( - prefix, - bech32.toWords(Buffer.from(this.rewardAddressRawBytes(networkId))), - 200 - ); - } - public json() { - return { - payment: this.paymentKey.json(), - stake: this.stakeKey.json(), - }; - } - - public static fromJson(obj: { - payment: object; - stake: object; - }): ShelleyWallet { - if (!obj || typeof obj !== "object") { - throw new Error("ShelleyWallet.fromJson: The input must be an object."); - } - - const paymentKey = obj.payment; - const stakeKey = obj.stake; - - if (!paymentKey || typeof paymentKey !== "object") { - throw new Error( - "ShelleyWallet.fromJson : Invalid payment key: It must be an object." - ); - } - - if (!stakeKey || typeof stakeKey !== "object") { - throw new Error( - "ShelleyWallet.fromJson : Invalid stake key: It must be an object." - ); - } - return new ShelleyWallet( - Ed25519Key.fromJson(paymentKey), - Ed25519Key.fromJson(stakeKey) - ); - } - - public static dummy(): ShelleyWallet { - return ShelleyWallet.fromJson({ - payment: { - pkh: "595ac9bbf256bae584f56a4b671baa4b14a18c8098b8e571834bc12c", - private: - "5a1380cd79ecaee48d66c14f7d92ddfc866490a3b59d44520e60f16309c8a17d", - public: - "8d2f4d49118eb1156048b66dd6372cdb1f82da0f8e208d9f8ea4b388c79c09ad", - }, - stake: { - pkh: "6706efab75778c2f08b9a5321ead8bfc982a5c08b51a0b2a713cac52", - private: - "24e8c012c7bef2f5823baef1c06dac253da860a43f0d1f43fc3c8349a4f719a1", - public: - "f7a1eaea2691ee80b6c0d6f27482145d7037055829b1b26224a5d8f0c2243f16", - }, - }); - } -} - -export interface Address { - toBech32(): string; - toRawBytes(): Uint8Array; - toRawBytesHex(): string; -} -export class ShelleyWalletAddress implements Address { - paymentKeyHash: Uint8Array; - stakeKeyHash: Uint8Array; - network: number; - - private constructor( - network: number | "mainnet" | "testnet", - pkh: Uint8Array, - skh: Uint8Array - ) { - this.network = - network == "mainnet" ? 1 : network == "testnet" ? 0 : network; - this.paymentKeyHash = pkh; - this.stakeKeyHash = skh; - } - public static fromRawBytes(bytea: Uint8Array | string | Buffer) { - let bytebuffer: Buffer; - if (bytea.length == ADDR_LENGTH * 2 && typeof bytea == "string") { - bytebuffer = Buffer.from(bytea, "hex"); - } else { - if (bytea.length !== ADDR_LENGTH) { - throw Error( - "ShelleyAddress.fromRawBytes: Invalid byte array length. expected: " + - ADDR_LENGTH + - " got: " + - bytea.length - ); - } - bytebuffer = Buffer.from(bytea); - } - - let paymentKeyHash = bytebuffer.subarray(1, 29); - let stakeKeyHash = bytebuffer.subarray(29, ADDR_LENGTH); - - return new ShelleyWalletAddress( - bytebuffer.at(0), - paymentKeyHash, - stakeKeyHash - ); - } - toBech32(): string { - const prefix = this.network == 0 ? "addr_test" : "addr"; - return bech32.encode( - prefix, - bech32.toWords(Buffer.from(this.toRawBytes())), - 200 - ); - } - toRawBytes(): Uint8Array { - const rawBytes = new Uint8Array(ADDR_LENGTH); - rawBytes[0] = this.network; - rawBytes.set(this.paymentKeyHash, 1); - rawBytes.set(this.stakeKeyHash, KEYHASH_LENGTH + 1); - return rawBytes; - } - toRawBytesHex(): string { - return Buffer.from(this.toRawBytes()).toString("hex"); - } -} diff --git a/tests/govtool-frontend/cypress/lib/wallet/mockWallet.ts b/tests/govtool-frontend/cypress/lib/wallet/mockWallet.ts deleted file mode 100644 index 7398399ac..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/mockWallet.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { randomBytes } from "crypto"; -import { CIP30Provider, Cip95Instance, CipMethodOverride } from "./types"; - -export const mockUserStakeKeys = [ - "012f5dc3125b8a07981e6e50f5a671e2c6fbb26c3ffde1cd1dcaf40a7fe8f160", - "012f5dc3115b8a07981e6e50f5a671e2c6fbb26c3ffde1cd1dcaf40a7fe8f160", -]; -export const mockUserDrepKey = randomBytes(32).toString("hex"); -export const mockUserAddress = - "000fdc780023d8be7c9ff3a6bdc0d8d3b263bd0cc12448c40948efbf42e557890352095f1cf6fd2b7d1a28e3c3cb029f48cf34ff890a28d176"; -export let networkId: number = Cypress.env("networkId"); -networkId = - (networkId as unknown as string).toLowerCase() == "testnet" || networkId == 0 - ? 0 - : 1; - -const walletInstance: Cip95Instance & { - experimental: Record; -} = { - getBalance: async () => { - return "10000000"; - }, - submitTx: async (tx) => { - return; - }, - getUtxos: async (amount, paginate) => { - return [ - "8282582018BC892DF1A4CF0D1B388A684D287304A500D7EEDB4D35D5CAB7C8922503A6E0008258390036E0CF1E52E05EF92E52C7BC2A04493D6BAE481B8ACBAB12EC4300D7F9C9E87246D2F0373885896AD2804B7229673204CAC9208345C1EA5B1B00000002540BE400", - ]; - }, - getUsedAddresses: async () => [mockUserAddress], - getUnusedAddresses: async () => [], - getChangeAddress: async () => - "000fdc780023d8be7c9ff3a6bdc0d8d3b263bd0cc12448c40948efbf42e557890352095f1cf6fd2b7d1a28e3c3cb029f48cf34ff890a28d176", - getRewardAddresses: async () => [ - "e0e557890352095f1cf6fd2b7d1a28e3c3cb029f48cf34ff890a28d176", - ], - getNetworkId: async () => networkId, - experimental: { - on: (eventName, callback) => { - return; - }, - off: (eventName, callback) => { - return; - }, - getCollateral: () => { - return ""; - }, - }, - // CIP-95 ----------------------------- - cip95: { - getPubDRepKey: async () => mockUserDrepKey, - getRegisteredPubStakeKeys: async () => mockUserStakeKeys, - getUnregisteredPubStakeKeys: async () => mockUserStakeKeys, - }, - getActivePubStakeKeys: async () => mockUserStakeKeys, - // getUnregisteredPubStakeKeys: async () => mockUserStakeKeys, - signTx: async (tx, partialSign) => { - return "a10081825820b004cba76275ee90b44de0bee3edf2f69b77a3936c59879536bd0d3fcbc25e635840ae41c154e42fe3ad56ecc040f51e7488c5851b129194362a7d35c08f8c4ca86f7b8e1a4ba53ee59d6d4ee0a0b90816702f7af3877235e281fee122c4d21c7e04"; - }, - signData: async (address, payload) => { - return ""; - }, - getExtensions: () => [{ cip: 95 }], -}; -export function mkSingleStakeKeyWallet() { - return mkWallet({ getUnregisteredPubStakeKeys: [mockUserStakeKeys[0]] }); -} - -export function mkWallet(overrides?: CipMethodOverride): CIP30Provider { - let result = { ...walletInstance }; - if (overrides) { - Object.keys(overrides).forEach((k) => { - if (result[k]) { - // console.log("Overriding", k, "to", typeof overrides[k], overrides[k]); - result[k] = async () => overrides[k]; - } - if (result.cip95 && result.cip95[k]) { - result.cip95[k] = async () => overrides[k]; - } - }); - } - let enabled = false; - return { - apiVersion: "1.3.1", - icon: "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3Csvg viewBox='0 0 500 500' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='309.36' y='12.441' width='121.115' height='472.347' style='fill: rgb(128 177 211)%3B'/%3E%3Cellipse style='fill: rgb(128 177 211)%3B' cx='231.272' cy='320.966' rx='171.791' ry='137.051'/%3E%3C/svg%3E", - - enable: async function () { - enabled = true; - return result; - }, - isEnabled: async function () { - return enabled; - }, - name: "Demos", - supportedExtensions: [ - { - cip: 95, - }, - ], - }; -} diff --git a/tests/govtool-frontend/cypress/lib/wallet/setupWallet.ts b/tests/govtool-frontend/cypress/lib/wallet/setupWallet.ts deleted file mode 100644 index cc731e466..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/setupWallet.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { bootstrapWallet } from "../../constants/wallet"; -import { pollTxWithKuber } from "../../services/apiService"; -import kuberService from "../../services/kuberService"; -import { Logger } from "../logger/logger"; -import { ShelleyWallet } from "./crypto"; - -export async function generateWallets( - numWallets: number = 100 -): Promise { - const wallets: ShelleyWallet[] = []; - - for (let i = 0; i < numWallets; i++) { - const wallet = await ShelleyWallet.generate(); - wallets.push(wallet); - } - - return wallets; -} -// check if the stake is registered - -export async function setupWallets(wallets: ShelleyWallet[]) { - if (wallets.length === 0) { - throw new Error("No wallets to load balance"); - } - - const signingKey = bootstrapWallet.payment.private; - await kuberService.initializeMultipleWallets( - bootstrapWallet.address, - signingKey, - wallets - ); - Logger.success(`[Setup Wallet] Successfully setup ${wallets.length} wallets`); -} - -export async function registerStake(wallet: ShelleyWallet) { - const { stakeKey, paymentKey } = wallet; - const hexPaymentObj = { - pkh: Buffer.from(paymentKey.pkh).toString("hex"), - private: Buffer.from(paymentKey.private).toString("hex"), - public: Buffer.from(paymentKey.public).toString("hex"), - }; - const hexStakeObj = { - pkh: Buffer.from(stakeKey.pkh).toString("hex"), - private: Buffer.from(stakeKey.private).toString("hex"), - public: Buffer.from(stakeKey.public).toString("hex"), - }; - const address = wallet.addressBech32(0); - - try { - const { cbor, txId } = await kuberService - .registerStake( - hexStakeObj.private, - hexStakeObj.pkh, - hexPaymentObj.private, - address - ) - .catch((err) => { - if (err.status === 400) { - throw new Error("Stake already registered"); - } - throw new Error(err); - }); - await pollTxWithKuber(txId); - } catch (err) { - throw new Error(err); - } -} diff --git a/tests/govtool-frontend/cypress/lib/wallet/types.ts b/tests/govtool-frontend/cypress/lib/wallet/types.ts deleted file mode 100644 index 283141529..000000000 --- a/tests/govtool-frontend/cypress/lib/wallet/types.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { ShelleyWallet } from "./crypto"; - -export type HexString = string; -export type StaticWallet = { - type: string; - payment: { - private: string; - public: string; - pkh: string; - }; - stake: { - private: string; - public: string; - pkh: string; - }; - dRepId: string; - address: string; -}; - -export interface CIP30Provider { - apiVersion: string; - enable: () => Promise; - icon: string; - isEnabled: () => Promise; - name: string; - supportedExtensions: Record[]; -} - -export enum Network { - Mainnet = 0, - Testnet = 1, -} - -export interface CIP30Instance { - submitTx: (tx: string) => Promise; - signTx: (tx: string, partial?: Boolean) => Promise; - getChangeAddress: () => Promise; - getNetworkId: () => Promise; - getRewardAddresses: () => Promise; - getUnusedAddresses: () => Promise; - getUsedAddresses: () => Promise>; - getUtxos: (amount?: object, paginate?: any) => Promise>; - getCollateral?: () => Promise>; - signData: (address: string, payload: HexString) => Promise; - getBalance: () => Promise; -} -export interface Cip95Instance extends CIP30Instance { - cip95: { - getPubDRepKey: () => Promise; - getUnregisteredPubStakeKeys: () => Promise; - getRegisteredPubStakeKeys: () => Promise; - }; - getActivePubStakeKeys: () => Promise; - getExtensions: () => Record[]; -} - -export interface CipMethodOverride { - submitTx?: HexString; - signTx?: HexString; - getChangeAddress?: HexString; - getNetworkId?: number; - getRewardAddresses?: HexString[]; - getUnusedAddresses?: HexString[]; - getUsedAddresses?: HexString[]; - getUtxos?: HexString[]; - getCollateral?: HexString[]; - signData?: HexString; - getBalance?: string; - getPubDRepKey?: HexString; - // getUnregisteredPubStakeKeys?: HexString[]; - getExtensions?: Record[]; - getRegisteredPubStakeKeys?: HexString[]; - getUnregisteredPubStakeKeys?: HexString[]; -} - -export interface WalletParams { - loadFundsAndRegister?: boolean; - onTxSign?: (txId: string) => void; - testTx?: any; - withStakeSigning?: boolean; - onWalletInitialized?: ({ - wallet, - stakePkh, - signingKey, - address, - }: { - wallet?: ShelleyWallet; - stakePkh: string; - signingKey: string; - address: string; - }) => void; -} diff --git a/tests/govtool-frontend/cypress/models/types.ts b/tests/govtool-frontend/cypress/models/types.ts deleted file mode 100644 index cf641989f..000000000 --- a/tests/govtool-frontend/cypress/models/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface IDRepIdentity { - id: string; - key: string; -} - -export interface KuberValue { - [policyId: string]: Record | BigInt | number; -} - -export interface KuberBalanceResponse { - address: string; - txin: string; - value: KuberValue; -} diff --git a/tests/govtool-frontend/cypress/services/apiService.ts b/tests/govtool-frontend/cypress/services/apiService.ts deleted file mode 100644 index 2d63eda6b..000000000 --- a/tests/govtool-frontend/cypress/services/apiService.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { randomBytes } from "crypto"; -import { Logger } from "../lib/logger/logger"; -import blockfrostService from "./blockfrostService"; -import kuberService from "./kuberService"; - -const apiUrl = (function () { - let url: string = Cypress.env("apiUrl"); - return url.endsWith("/") ? url.substring(0, url.length - 1) : url; -})(); - -function getApi(url: string): Cypress.Chainable> { - const normalizedUrl = url.startsWith("/") ? url : "/" + url; - return cy.request(apiUrl + normalizedUrl); -} -function postApi( - url: string, - body?: Cypress.RequestBody -): Cypress.Chainable> { - const normalizedUrl = url.startsWith("/") ? url : "/" + url; - return cy.request("POST", apiUrl + normalizedUrl, body); -} - -export const pollTxWithKuber = async ( - txHash: string, - maxRetries = 32 -): Promise => { - const MAX_RETRIES = maxRetries; - const RETRY_INTERVAL = 5000; - - if (txHash === undefined) return; - - function retry(tries, cb) { - if (tries) { - setTimeout(() => checkTransaction(tries - 1, cb), RETRY_INTERVAL); - } else { - cb( - new Error( - "[Kuber Tx] Wait timeout for tx:" + - txHash + - ", waited for " + - (MAX_RETRIES * RETRY_INTERVAL) / 1000 + - "secs" - ) - ); - } - } - - function checkTransaction(tries, cb) { - return kuberService - .getTransactionDetails(txHash) - .then(async (res) => { - if ((await res.json()).length > 0) { - console.debug("[Kuber Poll Tx] Successful", res); - cb(); - } else if (res.status === 500) { - throw cb(new Error("Internal Server Error")); - } else { - Logger.fail( - "[Kuber Poll Tx] Tx unsuccessful waiting for another " + - RETRY_INTERVAL / 1000 + - "secs..." - ); - - retry(tries, cb); - } - }) - .catch((e) => { - if (e.status == 404) { - retry(tries, cb); - } else { - throw cb( - new Error( - "[Kuber Poll Tx] Timeout for tx:" + - txHash + - ", waited for " + - (MAX_RETRIES * RETRY_INTERVAL) / 1000 + - "secs" - ) - ); - } - }); - } - - return new Promise((resolve, reject) => { - setTimeout(() => { - checkTransaction(MAX_RETRIES, (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }); - RETRY_INTERVAL; - }); -}; - -export const pollTx = async (txHash: string): Promise => { - const MAX_RETRIES = 20; - const RETRY_INTERVAL = 5000; - - function checkTransaction(tries, cb) { - return blockfrostService - .getTransactionDetails(txHash) - .then((res) => { - console.debug("[Blockfrost Poll Tx] successful", res); - cb(); - }) - .catch((e) => { - Logger.fail( - "[Blockfrost Poll Tx] Unsuccessful waiting for another " + - RETRY_INTERVAL / 1000 + - "secs..." - ); - - if (e.status == 404) { - if (tries) { - setTimeout(() => checkTransaction(tries - 1, cb), RETRY_INTERVAL); - } else { - cb( - new Error( - "[Blockfrost Poll Tx] Timeout for tx:" + - txHash + - ", waited for " + - (MAX_RETRIES * RETRY_INTERVAL) / 1000 + - "secs" - ) - ); - } - } else { - cy.then(async () => { - expect(e.status).to.closeTo(200, 299); - }); - throw cb(e); - } - }); - } - - return new Promise((resolve, reject) => { - setTimeout(() => { - checkTransaction(MAX_RETRIES, (err) => { - if (err) { - reject(err); - } else { - resolve(); - } - }); - }), - RETRY_INTERVAL; - }); -}; diff --git a/tests/govtool-frontend/cypress/services/blockfrostService.ts b/tests/govtool-frontend/cypress/services/blockfrostService.ts deleted file mode 100644 index bc9148d9c..000000000 --- a/tests/govtool-frontend/cypress/services/blockfrostService.ts +++ /dev/null @@ -1,106 +0,0 @@ -const config = { - apiUrl: Cypress.env("blockfrostUrl"), - apiKey: Cypress.env("blockfrostApiKey"), -}; - -const blockfrostService = { - async addresses(addr: string) { - return await callBlockfrost("/addresses/" + addr).catch((e) => { - if (e.status == 404) { - return "00"; - } else { - throw e; - } - }); - }, - async addressesUtxos(addr: string) { - return await callBlockfrost( - "/addresses/" + addr + "/utxos?order=desc" - ).catch((e) => { - if (e.status == 404) { - return []; - } else { - throw e; - } - }); - }, - async submitTransaction(tx: string) { - return await callBlockfrost( - "/tx/submit", - "POST", - Buffer.from(tx, "hex"), - "application/cbor" - ); - }, - async getAssetDetail(asset: string) { - return await callBlockfrost("/assets/" + asset); - }, - - async getDatum(hash: string) { - return await callBlockfrost("/scripts/datum/" + hash); - }, - async getTransactionDetails(txHash: any) { - return await callBlockfrost("/txs/" + txHash); - }, - async getTransactionUtxos(txHash: any) { - return await callBlockfrost("/txs/" + txHash + "/utxos"); - }, - - async getTransactions(addr: any) { - return await callBlockfrost("/addresses/" + addr + "/utxos"); - }, -}; - -async function callBlockfrost( - path: any, - method: "GET" | "POST" = "GET", - body?: BodyInit, - contentType?: string -) { - const url = config.apiUrl + path; - - const headers: Record = { - project_id: config.apiKey, - }; - if (contentType) { - headers["content-type"] = contentType; - } - - const options: RequestInit = { - method, - headers, - }; - - if (method === "POST") { - if (body) options.body = body; - } - - return fetch(url, options).then(async (res) => { - if (res.status === 200) { - return res.json(); - } else { - return res.text().then((txt) => { - let err; - let json: any; - try { - json = JSON.parse(txt); - if (json) { - err = Error( - `BlockfrostApi [Status ${res.status}] : ${ - json.message ? json.message : txt - }` - ); - } else { - err = Error(`BlockfrostApi [Status ${res.status}] : ${txt}`); - } - } catch (e) { - err = Error(`BlockfrostApi [Status ${res.status}] : ${txt}`); - } - err.status = res.status; - throw err; - }); - } - }); -} - -export default blockfrostService; diff --git a/tests/govtool-frontend/cypress/services/faucetService.ts b/tests/govtool-frontend/cypress/services/faucetService.ts deleted file mode 100644 index 2a09c9fd6..000000000 --- a/tests/govtool-frontend/cypress/services/faucetService.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { IFaucetResponse } from "./types"; - -const faucetApiKey = Cypress.env("faucetApiKey"); -const faucetApiUrl = Cypress.env("faucetApiUrl"); - -const fetchClient = (url: string) => { - return fetch(faucetApiUrl + url); -}; - -export const loadAmountFromFaucet = async ( - walletAddress: string -): Promise => { - try { - const res = await fetchClient( - `/send-money?type=default&action=funds&address=${walletAddress}&poolid=undefined&api_key=${faucetApiKey}` - ); - const responseBody = await res.json(); - console.debug(`faucet response: ${JSON.stringify(responseBody)}`); - - if (responseBody.error) { - throw new Error("Error in loadAmountFaucet:" + responseBody.error.tag); - } - return responseBody; - } catch (error) { - console.error("Error in loadAmountFromFaucet:", error); - throw error; - } -}; diff --git a/tests/govtool-frontend/cypress/services/kuberService.ts b/tests/govtool-frontend/cypress/services/kuberService.ts deleted file mode 100644 index b6073b88a..000000000 --- a/tests/govtool-frontend/cypress/services/kuberService.ts +++ /dev/null @@ -1,347 +0,0 @@ -import { Logger } from "../lib/logger/logger"; -import { ShelleyWallet } from "../lib/wallet/crypto"; -import { - cborxDecoder, - cborxEncoder, - convertUint8ArrayToHex, -} from "../support/utils"; -import * as blake from "blakejs"; -import { KuberBalanceResponse } from "../models/types"; -import { bootstrapWallet } from "../constants/wallet"; - -type CertificateType = "registerstake" | "registerdrep" | "deregisterdrep"; -const config = { - apiUrl: Cypress.env("kuberApiUrl"), - apiKey: Cypress.env("kuberApiKey"), -}; -class Kuber { - walletAddr: string; - signingKey: string; - version: string; - - constructor(walletAddr: string, signingKey: string, version = "v1") { - this.walletAddr = walletAddr; - this.signingKey = signingKey; - this.version = version; - } - static generateCert(type: CertificateType, key: string) { - if (type === "registerstake" || type === "deregisterdrep") { - return { - type: type, - key: key, - }; - } else if (type === "registerdrep") { - return { - type: "registerdrep", - key: key, - anchor: { - url: "https://bit.ly/3zCH2HL", - dataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - }, - }; - } - } - signTx(tx: any) { - return { - ...tx, - selections: [ - ...(tx.selections || []), - { - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + this.signingKey, - }, - this.walletAddr, - ], - changeAddress: this.walletAddr, - }; - } - - async signAndSubmitTx(tx: any) { - const signedTx = this.signTx(tx); - const res = await callKuber( - `/api/${this.version}/tx?submit=true`, - "POST", - JSON.stringify(signedTx) - ); - Logger.success("[Kuber] Tx: " + JSON.stringify(res)); - let decodedTx = cborxDecoder.decode(Buffer.from(res.cborHex, "hex")); - const submittedTxBody = Uint8Array.from(cborxEncoder.encode(decodedTx[0])); - const submittedTxHash = Buffer.from( - blake.blake2b(submittedTxBody, undefined, 32) - ).toString("hex"); - return { cbor: res.cborHex, txId: submittedTxHash }; - } -} - -const kuberService = { - initializeMultipleWallets: ( - senderAddress: string, - signingKey: string, - wallets: ShelleyWallet[] - ) => { - const kuber = new Kuber(senderAddress, signingKey); - const outputs = []; - const stakes = []; - const certificates = []; - for (let i = 0; i < wallets.length; i++) { - const wallet = wallets[i]; - const address = wallet.addressBech32(0); - outputs.push({ - address: address, - value: 0, - }); - stakes.push({ - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + convertUint8ArrayToHex(wallet.stakeKey.private), - }); - certificates.push( - Kuber.generateCert( - "registerstake", - convertUint8ArrayToHex(wallet.stakeKey.pkh) - ) - ); - } - return kuber.signAndSubmitTx({ - selections: [...stakes], - outputs, - certificates, - }); - }, - - submitTransaction(tx: any) { - return fetch(config.apiUrl + "/api/v1/tx/submit", { - method: "POST", - headers: { - "Content-Type": "application/json", - "api-key": config.apiKey, - }, - - body: JSON.stringify({ - tx: { - description: "", - type: "Tx ConwayEra", - cborHex: tx, - }, - }), - redirect: "follow", - }); - }, - transferADA: ( - senderAddress: string, - receiverAddressList: string[], - signingKey?: string, // private payment key - ADA = 100 - ) => { - const kuber = new Kuber(senderAddress, signingKey); - const req = { - outputs: receiverAddressList.map((addr) => { - return { - address: addr, - value: `${ADA}A`, - }; - }), - }; - return kuber.signAndSubmitTx(req); - }, - dRepRegistration: (addr: string, signingKey: string, pkh: string) => { - const kuber = new Kuber(addr, signingKey); - const req = { - certificates: [Kuber.generateCert("registerdrep", pkh)], - }; - return kuber.signAndSubmitTx(req); - }, - - // NOTE This is not supported yet - dRepDeRegistration: ( - addr: string, - signingKey: string, - stakePrivateKey: string, - pkh: string - ) => { - const kuber = new Kuber(addr, signingKey); - const selections = [ - { - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + stakePrivateKey, - }, - ]; - const req = { - selections, - inputs: addr, - certificates: [Kuber.generateCert("deregisterdrep", pkh)], - }; - return kuber.signAndSubmitTx(req); - }, - stakeDelegation: ( - addr: string, - signingKey: string, - stakePrivateKey: string, - pkh: string, - dRep: string | "abstain" | "noconfidence" - ) => { - const kuber = new Kuber(addr, signingKey); - const selections = [ - { - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + stakePrivateKey, - }, - ]; - const req = { - selections, - certificates: [ - { - type: "delegate", - key: pkh, - drep: dRep, - }, - ], - }; - return kuber.signAndSubmitTx(req); - }, - registerStake: ( - stakePrivateKey: string, - pkh: string, - signingKey: string, - addr: string - ) => { - const kuber = new Kuber(addr, signingKey); - const selections = [ - { - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + stakePrivateKey, - }, - ]; - const req = { - selections, - certificates: [Kuber.generateCert("registerstake", pkh)], - }; - return kuber.signAndSubmitTx(req); - }, - createGovAction(proposalsCount = 2) { - const kuber = new Kuber( - bootstrapWallet.address, - bootstrapWallet.payment.private - ); - const infoProposal = { - deposit: 1000000000, - refundAccount: { - network: "Testnet", - credential: { - "key hash": - "db1bc3c3f99ce68977ceaf27ab4dd917123ef9e73f85c304236eab23", - }, - }, - anchor: { - url: "https://bit.ly/3zCH2HL", - dataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - }, - }; - const req = kuber.signTx({ - proposals: Array.from({ length: proposalsCount }, (_, i) => infoProposal), - }); - return callKuber("/api/v1/tx?submit=true", "POST", JSON.stringify(req)); - }, - - getTransactionDetails(txHash: string) { - return fetch(config.apiUrl + "/api/v3/utxo?txin=" + txHash + "%230", { - method: "GET", - headers: { - "Content-Type": "application/json", - "api-key": config.apiKey, - }, - }); - }, - queryUtxos(address: string): Promise<[KuberBalanceResponse]> { - return callKuber("/api/v3/utxo?address=" + address); - }, - voteOnProposal( - addr: string, - signingKey: string, - voter: string, // dRepHash - dRepStakePrivKey: string, - proposal: string - ) { - const kuber = new Kuber(addr, signingKey); - const req = { - selections: [ - { - type: "PaymentSigningKeyShelley_ed25519", - description: "Payment Signing Key", - cborHex: "5820" + dRepStakePrivKey, - }, - ], - vote: { - voter, - role: "drep", - proposal, - vote: true, - anchor: { - url: "https://bit.ly/3zCH2HL", - dataHash: - "1111111111111111111111111111111111111111111111111111111111111111", - }, - }, - }; - return kuber.signAndSubmitTx(req); - }, -}; -async function callKuber( - path: any, - method: "GET" | "POST" = "GET", - body?: BodyInit, - contentType = "application/json" -) { - const url = config.apiUrl + path; - - const headers: Record = { - "api-key": config.apiKey, - }; - if (contentType) { - headers["content-type"] = contentType; - } - - const options: RequestInit = { - method, - headers, - }; - - if (method === "POST") { - if (body) options.body = body; - } - - return fetch(url, options).then(async (res) => { - if (res.status === 200) { - return res.json(); - } else { - return res.text().then((txt) => { - let err; - let json: any; - try { - json = JSON.parse(txt); - if (json) { - err = Error( - `KuberApi [Status ${res.status}] : ${ - json.message ? json.message : txt - }` - ); - } else { - err = Error(`KuberApi [Status ${res.status}] : ${txt}`); - } - } catch (e) { - err = Error(`KuberApi [Status ${res.status}] : ${txt}`); - } - err.status = res.status; - throw err; - }); - } - }); -} - -export default kuberService; diff --git a/tests/govtool-frontend/cypress/services/types.ts b/tests/govtool-frontend/cypress/services/types.ts deleted file mode 100644 index e7ff594e6..000000000 --- a/tests/govtool-frontend/cypress/services/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface IFaucetResponse { - amount: { - lovelace: number; - }; - txid: string; - txin: string; -} diff --git a/tests/govtool-frontend/cypress/state/store.ts b/tests/govtool-frontend/cypress/state/store.ts deleted file mode 100644 index 091d73772..000000000 --- a/tests/govtool-frontend/cypress/state/store.ts +++ /dev/null @@ -1 +0,0 @@ -export const store = new Map(); diff --git a/tests/govtool-frontend/cypress/state/type.ts b/tests/govtool-frontend/cypress/state/type.ts deleted file mode 100644 index 69f4805f1..000000000 --- a/tests/govtool-frontend/cypress/state/type.ts +++ /dev/null @@ -1,25 +0,0 @@ -export interface IProposal { - id: string; - txHash: string; - index: number; - type: string; - details: string; - expiryDate: string; - createdDate: string; - url: string; - metadataHash: string; - yesVotes: number; - noVote: number; - abstainVotes: number; -} - -export interface IVotedProposal { - proposal: IProposal; - vote: { - proposalId: string; - drepId: string; - vote: string; - url: string | null; - metadataHash: string | null; - }; -} diff --git a/tests/govtool-frontend/cypress/state/walletState.ts b/tests/govtool-frontend/cypress/state/walletState.ts deleted file mode 100644 index 12d418601..000000000 --- a/tests/govtool-frontend/cypress/state/walletState.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Logger } from "../lib/logger/logger"; -import { ShelleyWallet } from "../lib/wallet/crypto"; -import { store } from "./store"; - -const walletState = { - setTxHash: (txHash: string) => { - store.set("txHash", txHash); - Logger.info(`[Wallet State] Tx Hash Saved: ${txHash}.`); - }, - setWallet: (wallet?: ShelleyWallet) => { - store.set("wallet", wallet); - }, - setStakePkh: (pkh: string) => { - store.set("stakePkh", pkh); - }, - setSigningKey: (key: string) => { - store.set("signingKey", key); - }, - setAddress: (addr: string) => { - store.set("address", addr); - }, - getWallet: (): ShelleyWallet => store.get("wallet"), - getAddress: () => store.get("address"), - getSigningKey: () => store.get("signingKey"), - getStakePkh: () => store.get("stakePkh"), - getTxHash: () => { - const txHash = store.get("txHash"); - Logger.info(`[Wallet State] Getting txHash: ${txHash}.`); - return txHash; - }, -}; - -export default walletState; diff --git a/tests/govtool-frontend/cypress/support/command.d.ts b/tests/govtool-frontend/cypress/support/command.d.ts deleted file mode 100644 index 45c4e2b78..000000000 --- a/tests/govtool-frontend/cypress/support/command.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -declare namespace Cypress { - interface Chainable { - getBySel( - selector: string, - options?: Partial< - Cypress.Loggable & - Cypress.Timeoutable & - Cypress.Withinable & - Cypress.Shadow - > - ): Chainable; - runOneTimeWalletSetup(): any; - getInputByPlaceholder(placeholder: string): Chainable; - getButtonByText(text: string): Chainable; - setGlobalState(key: string, value: any); - getGlobalState(key: string): any; - } -} diff --git a/tests/govtool-frontend/cypress/support/commands.ts b/tests/govtool-frontend/cypress/support/commands.ts deleted file mode 100644 index 67d02f140..000000000 --- a/tests/govtool-frontend/cypress/support/commands.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as addCommands from "cypress-browser-extension-plugin/commands"; - -Cypress.Commands.add("getBySel", (selector, ...args): void | any => { - return cy.get(`[data-testid="${selector}"]`, ...args); -}); - -Cypress.Commands.add("getInputByPlaceholder", (placeholder): void | any => { - return cy.get(`input[placeholder*="${placeholder}"]`); -}); - -Cypress.Commands.add("getButtonByText", (text): void | any => { - return cy.get("button").filter(`:contains("${text}")`); -}); - -Cypress.Commands.add("setGlobalState", (key, value) => { - cy.window().then((w: any) => { - w.myGlobalState = w.myGlobalState || {}; - w.myGlobalState[key] = value; - }); -}); - -Cypress.Commands.add("getGlobalState", (key) => { - return cy.window().then((w: any) => { - return w.myGlobalState && w.myGlobalState[key]; - }); -}); - -addCommands(Cypress); diff --git a/tests/govtool-frontend/cypress/support/e2e.ts b/tests/govtool-frontend/cypress/support/e2e.ts deleted file mode 100644 index 2078b3716..000000000 --- a/tests/govtool-frontend/cypress/support/e2e.ts +++ /dev/null @@ -1,21 +0,0 @@ -// *********************************************************** -// This example support/e2e.js is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import "cypress-cloud/support"; -import "./commands"; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/tests/govtool-frontend/cypress/support/utils.ts b/tests/govtool-frontend/cypress/support/utils.ts deleted file mode 100644 index 277b893f8..000000000 --- a/tests/govtool-frontend/cypress/support/utils.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { blake2b, blake2bHex } from "blakejs"; -import { randomBytes } from "crypto"; -import { bech32 } from "bech32"; -import { Ed25519Key, ShelleyWallet } from "../lib/wallet/crypto"; -import { Logger } from "../lib/logger/logger"; -import { CipMethodOverride, WalletParams } from "../lib/wallet/types"; -import { Decoder, Encoder } from "cbor-x"; -import walletState from "../state/walletState"; - -export const cborxEncoder = new Encoder({ - mapsAsObjects: false, - useRecords: false, -}); -export const cborxDecoder = new Decoder({ mapsAsObjects: false }); - -export function injectOpen() { - let a = { args: [] }; - cy.window().then((w: any) => { - w.open = (...args) => { - a.args = args; - }; - }); - return a; -} - -export function convertUint8ArrayToHex(buffer: Uint8Array) { - return Buffer.from(buffer).toString("hex"); -} -export function random32BytesHex() { - return randomBytes(32).toString("hex"); -} - -export function generateDRep() { - const dRepKey = randomBytes(32); - return loadDRepFromKey(dRepKey); -} - -export function loadDRepFromKey(dRepKey?: any) { - const dRepKeyHash = blake2b(dRepKey, undefined, 28); - return { - id: bech32.encode("drep", bech32.toWords(dRepKeyHash)), - key: dRepKey.toString("hex"), - }; -} - -export function getWebAppNetworkId(): number { - const networkId: string = Cypress.env("networkId"); - //@ts-ignore - return networkId.toLowerCase() == "testnet" || networkId == 0 ? 0 : 1; -} - -export const isMobile = () => { - return ( - Cypress.config("viewportWidth") < - Cypress.env("mobileViewportWidthBreakpoint") - ); -}; - -export const removeWhiteSpaces = (str: string) => str.replace(/\s+/g, ""); - -export const groupElements = (elements: any[], key?: string) => { - const groupedElements = {}; - - elements.forEach((element) => { - const elementType = key ? element[`${key}`] : element.type; - - if (!groupedElements[elementType]) { - groupedElements[elementType] = []; - } - groupedElements[elementType].push({ - ...element, - txHash: element.txHash, - }); - }); - - return groupedElements; -}; - -// export const loadDRep = async (type: "dRep" | "adaHolder") => { -// const stakePrivKeyHex = -// type === "dRep" -// ? dRepWalletDetails.stake.private -// : adaHolderWalletDetails.stake.private; -// const stakeKey = await Ed25519Key.fromPrivateKeyHex(stakePrivKeyHex); -// const dRepKey = Buffer.from(stakeKey.pkh).toString("hex"); -// return loadDRepFromKey(dRepKey); -// }; - -export const getDRepIDHash = (dRepIdBech32: string) => { - const decodedDRepId = bech32.decode(dRepIdBech32); - const dRepIDHex = Buffer.from(bech32.fromWords(decodedDRepId.words)).toString( - "hex" - ); - Logger.success("Decoded DRepId Hex: " + dRepIDHex); - return dRepIDHex; -}; - -export const getPubDRepIds = (dRepKey: string) => { - const dRepKeyBytes = Buffer.from(dRepKey, "hex"); - const dRepID = blake2bHex(dRepKeyBytes, undefined, 28); - const words = bech32.toWords(Buffer.from(dRepID, "hex")); - const dRepIdBech32 = bech32.encode("drep", words); - return { dRepID, dRepIdBech32 }; -}; - -export function destructWalletArgs(args: CipMethodOverride & WalletParams) { - args = { - ...args, - onTxSign: (txId) => { - walletState.setTxHash(txId); - }, - onWalletInitialized: ({ wallet, stakePkh, signingKey, address }) => { - walletState.setWallet(wallet); - walletState.setStakePkh(stakePkh); - walletState.setSigningKey(signingKey); - walletState.setAddress(address); - - Logger.success("[Wallet State] Wallet state saved."); - }, - }; - const overrides: CipMethodOverride = {}; - const walletParams: WalletParams = { - loadFundsAndRegister: null, - onTxSign: null, - withStakeSigning: false, - onWalletInitialized: null, - }; - - args && - Object.keys(args).forEach((key) => { - if (key in walletParams) { - walletParams[key] = args[key]; - } else { - overrides[key] = args[key]; - } - }); - console.log("overrides: " + JSON.stringify(overrides)); - console.log("walletParams: " + JSON.stringify(walletParams)); - return { overrides, walletParams }; -} - -export function saveWallets(wallets: ShelleyWallet[]) { - const jsonWallets = []; - for (let i = 0; i < wallets.length; i++) { - jsonWallets.push({ - ...wallets[i].json(), - address: wallets[i].addressBech32(0), - }); - } - cy.writeFile("cypress/fixtures/wallets.json", jsonWallets, { flag: "a" }); -} - -export function getTxHash(tx: string) { - let decodedTx = cborxDecoder.decode(Buffer.from(tx, "hex")); - const txbody = Uint8Array.from(cborxEncoder.encode(decodedTx[0])); - return blake2bHex(txbody, undefined, 32); -} - -export const getShortenedGovActionId = (txHash: string, index: number) => { - const firstPart = txHash.slice(0, 4); - const lastPart = txHash.slice(-4); - - return `${firstPart}...${lastPart}#${index}`; -}; diff --git a/tests/govtool-frontend/cypress/support/validations.ts b/tests/govtool-frontend/cypress/support/validations.ts deleted file mode 100644 index 2dd36f9ec..000000000 --- a/tests/govtool-frontend/cypress/support/validations.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { govActionEnums } from "../constants/governanceActions"; -import { getShortenedGovActionId } from "./utils"; - -// Validates that the rendered data on the frontend matches the expected filtered data. -export const validateFilter = (filterText: string) => { - cy.getBySel(`govaction-${filterText.replace(/ /g, "")}-card`).each( - ($slide) => { - cy.wrap($slide).should("contain", filterText); - } - ); -}; - -// Validates that the rendered data on the frontend matches the expected sorted order. -export const validateSort = (sortedData: any) => { - Object.keys(sortedData).forEach((type: string, type_index: number) => { - cy.wrap(type_index).then(() => { - cy.getBySel( - `govaction-${govActionEnums[type].replace(/ /g, "")}-card` - ).each(($slide, idx) => { - if (idx > 5) return; - - cy.wrap({ idx, type }).then((context) => { - cy.wrap($slide) - .find( - `[data-testid="${sortedData[context.type][context.idx].txHash}#${ - sortedData[context.type][context.idx].index - }-id"]` - ) - .should("have.length.greaterThan", 0); - }); - }); - }); - }); - cy.contains("Clear", { matchCase: false }).click(); -}; - -export const validateDRepURLInput = (value: string, invalid = true) => { - cy.getBySel("url-input").type(value).blur(); - if (invalid) { - cy.getBySel("invalid-url-format-error").should("be.visible"); - } else { - cy.getBySel("invalid-url-format-error").should("not.exist"); - } - - cy.getBySel("url-input").clear(); -}; - -export const validateDRepMetaHashInput = (value: string, invalid = true) => { - cy.getBySel("hash-input").type(value).blur(); - if (invalid) { - cy.getBySel("hash-must-be-exactly-64-characters-long-error").should( - "be.visible" - ); - } else { - cy.getBySel("hash-must-be-exactly-64-characters-long-error").should( - "not.exist" - ); - } - - cy.getBySel("hash-input").clear(); -}; diff --git a/tests/govtool-frontend/package.json b/tests/govtool-frontend/package.json deleted file mode 100644 index c1e720a49..000000000 --- a/tests/govtool-frontend/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "govtool-frontend-test", - "version": "1.0.0", - "main": "index.js", - "license": "MIT", - "scripts": { - "cypress": "cypress", - "cypress-cloud": "cypress-cloud", - "cypress:run:mobile": "cypress run --config viewportWidth=375,viewportHeight=667", - "cypress:open:mobile": "cypress open --config viewportWidth=375,viewportHeight=667", - "cypress-cloud:run:mobile": "cypress run --config viewportWidth=375,viewportHeight=667", - "test": "ts-node test.ts" - }, - "dependencies": { - "@noble/ed25519": "^2.0.0", - "@types/node": "^22.7.9", - "add": "^2.0.6", - "axios": "^1.4.0", - "bech32": "^2.0.0", - "blakejs": "^1.2.1", - "cbor-x": "^1.5.4", - "cypress": "^13.6.0", - "cypress-browser-extension-plugin": "^0.1.0", - "cypress-cloud": "^1.9.3", - "typescript": "^5.1.6" - } -} diff --git a/tests/govtool-frontend/tsconfig.json b/tests/govtool-frontend/tsconfig.json deleted file mode 100644 index d9bd1f9bf..000000000 --- a/tests/govtool-frontend/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "lib": ["es5", "dom"], - "types": ["cypress", "node"] - }, - "include": ["**/*.ts", "**/*.d.ts"] -} diff --git a/tests/govtool-frontend/yarn.lock b/tests/govtool-frontend/yarn.lock deleted file mode 100644 index c8b81cb33..000000000 --- a/tests/govtool-frontend/yarn.lock +++ /dev/null @@ -1,3695 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.15.4": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" - integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== - dependencies: - regenerator-runtime "^0.14.0" - -"@cbor-extract/cbor-extract-darwin-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338" - integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w== - -"@cbor-extract/cbor-extract-darwin-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a" - integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w== - -"@cbor-extract/cbor-extract-linux-arm64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae" - integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ== - -"@cbor-extract/cbor-extract-linux-arm@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709" - integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q== - -"@cbor-extract/cbor-extract-linux-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97" - integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw== - -"@cbor-extract/cbor-extract-win32-x64@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f" - integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w== - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@currents/commit-info@1.0.1-beta.0": - version "1.0.1-beta.0" - resolved "https://registry.yarnpkg.com/@currents/commit-info/-/commit-info-1.0.1-beta.0.tgz#c33112685c27896bba29064234fd2341ec9134e6" - integrity sha512-gkn8E3UC+F4/fCla7QAGMGgGPzxZUL9bU9+4I+KZf9PtCU3DdQCdy7a+er2eg4ewfUzZ2Ic1HcfnHuPkuLPKIw== - dependencies: - bluebird "3.5.5" - check-more-types "2.24.0" - debug "4.3.4" - execa "1.0.0" - lazy-ass "1.6.0" - ramda "0.26.1" - -"@cypress/request@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.5.tgz#d893a6e68ce2636c085fcd8d7283c3186499ba63" - integrity sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~4.0.0" - http-signature "~1.4.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - performance-now "^2.1.0" - qs "6.13.0" - safe-buffer "^5.1.2" - tough-cookie "^4.1.3" - tunnel-agent "^0.6.0" - uuid "^8.3.2" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - -"@noble/ed25519@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-2.1.0.tgz#4bf661de9ee0ad775d41fcacbfc9aeec491f459c" - integrity sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@types/node@*", "@types/node@^22.7.9": - version "22.7.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" - integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== - dependencies: - undici-types "~6.19.2" - -"@types/sinonjs__fake-timers@8.1.1": - version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" - integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== - -"@types/sizzle@^2.3.2": - version "2.3.9" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.9.tgz#d4597dbd4618264c414d7429363e3f50acb66ea2" - integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== - -"@types/yauzl@^2.9.1": - version "2.10.3" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" - integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== - dependencies: - "@types/node" "*" - -JSONStream@^1.0.3: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -acorn-node@^1.2.0, acorn-node@^1.3.0, acorn-node@^1.5.2, acorn-node@^1.8.2: - version "1.8.2" - resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn@^7.0.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.8.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" - integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== - -add@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/add/-/add-2.0.6.tgz#248f0a9f6e5a528ef2295dbeec30532130ae2235" - integrity sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -asn1.js@^4.10.1: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assert@^1.4.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76" - integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A== - dependencies: - object.assign "^4.1.4" - util "^0.10.4" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77" - integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg== - -async@^3.2.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.13.2" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" - integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== - -axios-retry@^3.4.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/axios-retry/-/axios-retry-3.9.1.tgz#c8924a8781c8e0a2c5244abf773deb7566b3830d" - integrity sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w== - dependencies: - "@babel/runtime" "^7.15.4" - is-retry-allowed "^2.2.0" - -axios@^1.2.0, axios@^1.4.0: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355" - integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -blakejs@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -bluebird@3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-pack@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.1.0.tgz#c34ba10d0b9ce162b5af227c7131c92c2ecd5774" - integrity sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA== - dependencies: - JSONStream "^1.0.3" - combine-source-map "~0.8.0" - defined "^1.0.0" - safe-buffer "^5.1.1" - through2 "^2.0.0" - umd "^3.0.0" - -browser-resolve@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-2.0.0.tgz#99b7304cb392f8d73dba741bb2d7da28c6d7842b" - integrity sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ== - dependencies: - resolve "^1.17.0" - -browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238" - integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ== - dependencies: - bn.js "^5.2.1" - randombytes "^2.1.0" - safe-buffer "^5.2.1" - -browserify-sign@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208" - integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw== - dependencies: - bn.js "^5.2.1" - browserify-rsa "^4.1.0" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.5" - hash-base "~3.0" - inherits "^2.0.4" - parse-asn1 "^5.1.7" - readable-stream "^2.3.8" - safe-buffer "^5.2.1" - -browserify-versionify@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-versionify/-/browserify-versionify-1.0.6.tgz#ab2dc61d6a119e627bec487598d1983b7fdb275e" - integrity sha512-DhYuu4atLBdEZcJdEcoMTo0iKvW8B8nOlATEZMZhk/m4GJ67lHtwbjXuEsdz4cdBjngjLA+ftVY0VTGiZM1Fhw== - dependencies: - find-root "^0.1.1" - through2 "0.6.3" - -browserify-zlib@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserify@^16.2.0: - version "16.5.2" - resolved "https://registry.yarnpkg.com/browserify/-/browserify-16.5.2.tgz#d926835e9280fa5fd57f5bc301f2ef24a972ddfe" - integrity sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g== - dependencies: - JSONStream "^1.0.3" - assert "^1.4.0" - browser-pack "^6.0.1" - browser-resolve "^2.0.0" - browserify-zlib "~0.2.0" - buffer "~5.2.1" - cached-path-relative "^1.0.0" - concat-stream "^1.6.0" - console-browserify "^1.1.0" - constants-browserify "~1.0.0" - crypto-browserify "^3.0.0" - defined "^1.0.0" - deps-sort "^2.0.0" - domain-browser "^1.2.0" - duplexer2 "~0.1.2" - events "^2.0.0" - glob "^7.1.0" - has "^1.0.0" - htmlescape "^1.1.0" - https-browserify "^1.0.0" - inherits "~2.0.1" - insert-module-globals "^7.0.0" - labeled-stream-splicer "^2.0.0" - mkdirp-classic "^0.5.2" - module-deps "^6.2.3" - os-browserify "~0.3.0" - parents "^1.0.1" - path-browserify "~0.0.0" - process "~0.11.0" - punycode "^1.3.2" - querystring-es3 "~0.2.0" - read-only-stream "^2.0.0" - readable-stream "^2.0.2" - resolve "^1.1.4" - shasum "^1.0.0" - shell-quote "^1.6.1" - stream-browserify "^2.0.0" - stream-http "^3.0.0" - string_decoder "^1.1.1" - subarg "^1.0.0" - syntax-error "^1.1.1" - through2 "^2.0.0" - timers-browserify "^1.0.1" - tty-browserify "0.0.1" - url "~0.11.0" - util "~0.10.1" - vm-browserify "^1.0.0" - xtend "^4.0.0" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@~5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" - integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cached-path-relative@^1.0.0, cached-path-relative@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.1.0.tgz#865576dfef39c0d6a7defde794d078f5308e3ef3" - integrity sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA== - -cachedir@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" - integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== - -call-bind@^1.0.5, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -cbor-extract@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840" - integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA== - dependencies: - node-gyp-build-optional-packages "5.1.1" - optionalDependencies: - "@cbor-extract/cbor-extract-darwin-arm64" "2.2.0" - "@cbor-extract/cbor-extract-darwin-x64" "2.2.0" - "@cbor-extract/cbor-extract-linux-arm" "2.2.0" - "@cbor-extract/cbor-extract-linux-arm64" "2.2.0" - "@cbor-extract/cbor-extract-linux-x64" "2.2.0" - "@cbor-extract/cbor-extract-win32-x64" "2.2.0" - -cbor-x@^1.5.4: - version "1.6.0" - resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.6.0.tgz#89c35d2d805efc30e09a28349425cc05d57aacd7" - integrity sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg== - optionalDependencies: - cbor-extract "^2.2.0" - -chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-more-types@2.24.0, check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== - -chokidar@^2.0.3: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-table3@~0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colorette@^2.0.16: - version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combine-source-map@^0.8.0, combine-source-map@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" - integrity sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg== - dependencies: - convert-source-map "~1.1.0" - inline-source-map "~0.6.0" - lodash.memoize "~3.0.3" - source-map "~0.5.3" - -combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.9.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -common-path-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" - integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -component-emitter@^1.2.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" - integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ== - -convert-source-map@~1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" - integrity sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg== - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -create-ecdh@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-browserify@^3.0.0: - version "3.12.1" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac" - integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ== - dependencies: - browserify-cipher "^1.0.1" - browserify-sign "^4.2.3" - create-ecdh "^4.0.4" - create-hash "^1.2.0" - create-hmac "^1.1.7" - diffie-hellman "^5.0.3" - hash-base "~3.0.4" - inherits "^2.0.4" - pbkdf2 "^3.1.2" - public-encrypt "^4.0.3" - randombytes "^2.1.0" - randomfill "^1.0.4" - -cy2@^3.4.2: - version "3.4.3" - resolved "https://registry.yarnpkg.com/cy2/-/cy2-3.4.3.tgz#c61665a953256e22399804f69067bb407ca922da" - integrity sha512-I1yfJWJTRy2ROti1TlLM5Qk86WSeKMrtZbY/G6VD2tjm3VKTu6pDkpcV56C2HhN+txK5p6MMsmzKXJM2W9JlxA== - dependencies: - acorn "^8.8.0" - debug "^4.3.2" - escodegen "^2.0.0" - estraverse "^5.3.0" - js-yaml "^4.1.0" - npm-which "^3.0.1" - slash "3.0.0" - -cypress-browser-extension-plugin@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cypress-browser-extension-plugin/-/cypress-browser-extension-plugin-0.1.0.tgz#c7cfddfac62cf563be55f0db98199902e7b22870" - integrity sha512-YbF5SneqoMrAN9XEz2I+okmCzK2RJPnl9+yBV5d2r/ayEia+bRTI0X+H+cOwlIgZ3XVQTOHeRX5s2sg1XPdTUw== - dependencies: - browserify "^16.2.0" - browserify-versionify "^1.0.6" - chokidar "^2.0.3" - fs-extra "^5.0.0" - nanoid "^1.0.2" - unzip-crx "^0.2.0" - -cypress-cloud@^1.9.3: - version "1.11.0" - resolved "https://registry.yarnpkg.com/cypress-cloud/-/cypress-cloud-1.11.0.tgz#7776f7e4f718dbc14a2e69391272403cfe73e263" - integrity sha512-dWRsHe78Uhru7nVpQ1Kt9P5qSPFTjCxorgNAxau02y3oLCeKmrBu3AVTBtiBJqalYvg67po2HffzG3cj+izTOg== - dependencies: - "@currents/commit-info" "1.0.1-beta.0" - axios "^1.2.0" - axios-retry "^3.4.0" - bluebird "^3.7.2" - chalk "^4.1.2" - commander "^10.0.0" - common-path-prefix "^3.0.0" - cy2 "^3.4.2" - debug "^4.3.4" - execa "^5.1.1" - getos "^3.2.1" - globby "^11.1.0" - is-absolute "^1.0.0" - lil-http-terminator "^1.2.3" - lodash "^4.17.21" - nanoid "^3.3.4" - plur "^4.0.0" - pretty-ms "^7.0.1" - source-map-support "^0.5.21" - table "^6.8.1" - tmp-promise "^3.0.3" - ts-pattern "^4.3.0" - ws "^8.13.0" - -cypress@^13.6.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.15.0.tgz#5eca5387ef34b2e611cfa291967c69c2cd39381d" - integrity sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw== - dependencies: - "@cypress/request" "^3.0.4" - "@cypress/xvfb" "^1.2.4" - "@types/sinonjs__fake-timers" "8.1.1" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - buffer "^5.7.1" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.1" - commander "^6.2.1" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.4" - enquirer "^2.3.6" - eventemitter2 "6.4.7" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.1" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.8" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - process "^0.11.10" - proxy-from-env "1.0.0" - request-progress "^3.0.0" - semver "^7.5.3" - supports-color "^8.1.1" - tmp "~0.2.3" - untildify "^4.0.0" - yauzl "^2.10.0" - -dash-ast@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37" - integrity sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -dayjs@^1.10.4: - version "1.11.13" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" - integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== - -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -deps-sort@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.1.tgz#9dfdc876d2bcec3386b6829ac52162cda9fa208d" - integrity sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw== - dependencies: - JSONStream "^1.0.3" - shasum-object "^1.0.0" - subarg "^1.0.0" - through2 "^2.0.0" - -des.js@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" - integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-libc@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detective@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034" - integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw== - dependencies: - acorn-node "^1.8.2" - defined "^1.0.0" - minimist "^1.2.6" - -diffie-hellman@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -domain-browser@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA== - dependencies: - readable-stream "^2.0.2" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -elliptic@^6.5.3, elliptic@^6.5.5: - version "6.5.7" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b" - integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enquirer@^2.3.6: - version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eventemitter2@6.4.7: - version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" - integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== - -events@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/events/-/events-2.1.0.tgz#2a9a1e18e6106e0e812aa9ebd4a819b3c29c0ba5" - integrity sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz#c406a83b6e70d9e35ce3b30a81141df30aeba884" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-uri@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241" - integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-root@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" - integrity sha512-GyDxVgA61TZcrgDJPqOqGBpi80Uf2yIstubgizi7AjC9yPdRrqBR+Y0MvK4kXnYlaoz3d+SGxDHMYVkwI/yd2w== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data@^4.0.0, form-data@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48" - integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-assigned-identifiers@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz#6dbf411de648cbaf8d9169ebb0d2d576191e2ff1" - integrity sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA== - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.0: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-base@~3.0, hash-base@~3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -htmlescape@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" - integrity sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg== - -http-signature@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f" - integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.18.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg== - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -inline-source-map@~0.6.0: - version "0.6.3" - resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.3.tgz#db9d553037fa74bf95dfbff186375fcf5c563cdd" - integrity sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w== - dependencies: - source-map "~0.5.3" - -insert-module-globals@^7.0.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.2.1.tgz#d5e33185181a4e1f33b15f7bf100ee91890d5cb3" - integrity sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg== - dependencies: - JSONStream "^1.0.3" - acorn-node "^1.5.2" - combine-source-map "^0.8.0" - concat-stream "^1.6.1" - is-buffer "^1.1.0" - path-is-absolute "^1.0.1" - process "~0.11.0" - through2 "^2.0.0" - undeclared-identifiers "^1.1.2" - xtend "^4.0.0" - -irregular-plurals@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.5.0.tgz#0835e6639aa8425bdc8b0d33d0dc4e89d9c01d2b" - integrity sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ== - -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" - integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== - dependencies: - hasown "^2.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q== - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.0, is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-ci@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-core-module@^2.13.0: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== - dependencies: - hasown "^2.0.2" - -is-data-descriptor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" - integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== - dependencies: - hasown "^2.0.0" - -is-descriptor@^0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" - integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" - integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== - dependencies: - is-accessor-descriptor "^1.0.1" - is-data-descriptor "^1.0.1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw== - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - -is-retry-allowed@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d" - integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" - integrity sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw== - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jszip@^3.1.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - setimmediate "^1.0.5" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -labeled-stream-splicer@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz#42a41a16abcd46fd046306cf4f2c3576fffb1c21" - integrity sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw== - dependencies: - inherits "^2.0.1" - stream-splicer "^2.0.0" - -lazy-ass@1.6.0, lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - -lil-http-terminator@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/lil-http-terminator/-/lil-http-terminator-1.2.3.tgz#594ef0f3c2b2f7d43a8f2989b2b3de611bf507eb" - integrity sha512-vQcHSwAFq/kTR2cG6peOVS7SjgksGgSPeH0G2lkw+buue33thE/FCHdn10wJXXshc5RswFy0Iaz48qA2Busw5Q== - -listr2@^3.8.3: - version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" - integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.1" - through "^2.3.8" - wrap-ansi "^7.0.0" - -lodash.memoize@~3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" - integrity sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A== - -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.0, minimist@^1.2.6, minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-classic@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -module-deps@^6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-6.2.3.tgz#15490bc02af4b56cf62299c7c17cba32d71a96ee" - integrity sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA== - dependencies: - JSONStream "^1.0.3" - browser-resolve "^2.0.0" - cached-path-relative "^1.0.2" - concat-stream "~1.6.0" - defined "^1.0.0" - detective "^5.2.0" - duplexer2 "^0.1.2" - inherits "^2.0.1" - parents "^1.0.0" - readable-stream "^2.0.2" - resolve "^1.4.0" - stream-combiner2 "^1.1.1" - subarg "^1.0.0" - through2 "^2.0.0" - xtend "^4.0.0" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nan@^2.12.1: - version "2.22.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" - integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== - -nanoid@^1.0.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.3.4.tgz#ad89f62c9d1f4fd69710d4a90953d2893d2d31f4" - integrity sha512-4ug4BsuHxiVHoRUe1ud6rUFT3WUMmjXt1W0quL0CviZQANdan7D8kqN5/maw53hmAApY/jfzMRkC57BNNs60ZQ== - -nanoid@^3.3.4: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-gyp-build-optional-packages@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c" - integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw== - dependencies: - detect-libc "^2.0.1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-path@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" - integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== - dependencies: - which "^1.2.10" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-which@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" - integrity sha512-CM8vMpeFQ7MAPin0U3wzDhSGV0hMHNwHU0wjo402IVizPDrs45jSfSuoC+wThevY88LQti8VvaAnqYAeVy3I1A== - dependencies: - commander "^2.9.0" - npm-path "^2.0.2" - which "^1.2.10" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -os-browserify@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A== - -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -pako@~1.0.2, pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parents@^1.0.0, parents@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" - integrity sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg== - dependencies: - path-platform "~0.11.15" - -parse-asn1@^5.0.0, parse-asn1@^5.1.7: - version "5.1.7" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06" - integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg== - dependencies: - asn1.js "^4.10.1" - browserify-aes "^1.2.0" - evp_bytestokey "^1.0.3" - hash-base "~3.0" - pbkdf2 "^3.1.2" - safe-buffer "^5.2.1" - -parse-ms@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-2.1.0.tgz#348565a753d4391fa524029956b172cb7753097d" - integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-browserify@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q== - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-platform@~0.11.15: - version "0.11.15" - resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" - integrity sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -plur@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/plur/-/plur-4.0.0.tgz#729aedb08f452645fe8c58ef115bf16b0a73ef84" - integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== - dependencies: - irregular-plurals "^3.2.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-ms@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" - integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== - dependencies: - parse-ms "^2.1.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10, process@~0.11.0: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -public-encrypt@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -qs@6.13.0, qs@^6.12.3: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -querystring-es3@~0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -ramda@0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" - integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -read-only-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0" - integrity sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w== - dependencies: - readable-stream "^2.0.2" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@^2.3.8, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== - dependencies: - throttleit "^1.0.0" - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.1.4, resolve@^1.17.0, resolve@^1.4.0: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^7.5.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shasum-object@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shasum-object/-/shasum-object-1.0.0.tgz#0b7b74ff5b66ecf9035475522fa05090ac47e29e" - integrity sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg== - dependencies: - fast-safe-stringify "^2.0.7" - -shasum@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" - integrity sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw== - dependencies: - json-stable-stringify "~0.0.0" - sha.js "~2.4.4" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -slash@3.0.0, slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6, source-map@~0.5.3: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sshpk@^1.18.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" - integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-combiner2@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" - integrity sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw== - dependencies: - duplexer2 "~0.1.0" - readable-stream "^2.0.2" - -stream-http@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.2.0.tgz#1872dfcf24cb15752677e40e5c3f9cc1926028b5" - integrity sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.4" - readable-stream "^3.6.0" - xtend "^4.0.2" - -stream-splicer@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd" - integrity sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.2" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -subarg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - integrity sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg== - dependencies: - minimist "^1.1.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -syntax-error@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" - integrity sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w== - dependencies: - acorn-node "^1.2.0" - -table@^6.8.1: - version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -throttleit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" - integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== - -through2@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.3.tgz#795292fde9f254c2a368b38f9cc5d1bd4663afb6" - integrity sha512-6UXIsO0fTTYMgxeQ9pisMOIqF/uL6Ebva+4HxihtLLR2gscWEu+OTMwar/0TYZaeDSNS1msIJAXJRis+GojL8g== - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -"through@>=2.2.7 <3", through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timers-browserify@^1.0.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" - integrity sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q== - dependencies: - process "~0.11.0" - -tmp-promise@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" - integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== - dependencies: - tmp "^0.2.0" - -tmp@^0.2.0, tmp@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -ts-pattern@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-4.3.0.tgz#7a995b39342f1b00d1507c2d2f3b90ea16e178a6" - integrity sha512-pefrkcd4lmIVR0LA49Imjf9DYLK8vtWhqBPA3Ya1ir8xCW0O2yjL9dsCVvI7pCodLC5q7smNpEtDR2yVulQxOg== - -tslib@^2.1.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" - integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== - -tty-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" - integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^5.1.6: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== - -umd@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.3.tgz#aa9fe653c42b9097678489c01000acb69f0b26cf" - integrity sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow== - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== - -undeclared-identifiers@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f" - integrity sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw== - dependencies: - acorn-node "^1.3.0" - dash-ast "^1.0.0" - get-assigned-identifiers "^1.2.0" - simple-concat "^1.0.0" - xtend "^4.0.1" - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -unzip-crx@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/unzip-crx/-/unzip-crx-0.2.0.tgz#4c0baa8bdac756256754beca7843c13d7b858c18" - integrity sha512-6LGdnpdnX5mkTdjdsZVuKRC63ht8pgOUGYYYK/wsDtgw81+W7WUBXLHzhhAcc/lxUvK7ByqZAzlwaa9U6CMSCQ== - dependencies: - jszip "^3.1.0" - mkdirp "^0.5.1" - yaku "^0.16.6" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@~0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" - integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== - dependencies: - punycode "^1.4.1" - qs "^6.12.3" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.10.4, util@~0.10.1: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -which@^1.2.10, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^8.13.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yaku@^0.16.6: - version "0.16.7" - resolved "https://registry.yarnpkg.com/yaku/-/yaku-0.16.7.tgz#1d195c78aa9b5bf8479c895b9504fd4f0847984e" - integrity sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw== - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" diff --git a/tests/test-metrics-api/.env.example b/tests/test-metrics-api/.env.example deleted file mode 100644 index ab6a5e93d..000000000 --- a/tests/test-metrics-api/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -PGHOST='office.sireto.dev' -PGPORT=8080 -PGDATABASE='govtool' -PGUSER='postgres' -PGPASSWORD='your password' -API_SECRET_TOKEN='some-token' diff --git a/tests/test-metrics-api/.gitignore b/tests/test-metrics-api/.gitignore deleted file mode 100644 index e75fc9993..000000000 --- a/tests/test-metrics-api/.gitignore +++ /dev/null @@ -1,159 +0,0 @@ -run/ -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional stylelint cache -.stylelintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variable files -.env -.env.development.local -.env.test.local -.env.production.local -.env.local - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -### Node Patch ### -# Serverless Webpack directories -.webpack/ - -# Optional stylelint cache - -# SvelteKit build / generate output -.svelte-kit - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -!.vscode/*.code-snippets - -# Local History for Visual Studio Code -.history/ - -# Built Visual Studio Code Extensions -*.vsix - -### VisualStudioCode Patch ### -# Ignore all local history of files -.history -.ionide diff --git a/tests/test-metrics-api/.prettierrc.yaml b/tests/test-metrics-api/.prettierrc.yaml deleted file mode 100644 index a3f5bb1c7..000000000 --- a/tests/test-metrics-api/.prettierrc.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# .prettierrc or .prettierrc.yaml -trailingComma: 'es5' -tabWidth: 2 -printWidth: 130 -semi: false -singleQuote: true diff --git a/tests/test-metrics-api/Dockerfile b/tests/test-metrics-api/Dockerfile deleted file mode 100644 index fd39b64e9..000000000 --- a/tests/test-metrics-api/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -FROM node:19 as prod -USER node -WORKDIR /home/node -COPY --chown=node:node package.json yarn.lock ./ -RUN yarn install --prod --frozen-lockfile - -FROM prod as builder -RUN yarn install --frozen-lockfile -COPY ./src ./src -COPY ./tsconfig.json . -RUN yarn build - -FROM prod -COPY --from=builder /home/node/dist/ ./ -ENV PGHOST=postgres \ - PGPORT=5432 \ - PGUSER=postgres \ - NODE_OPTIONS="--max-old-space-size=2048" \ - PORT=8080 \ - NODE_ENV=production -EXPOSE 8080 -CMD node index.js diff --git a/tests/test-metrics-api/README.md b/tests/test-metrics-api/README.md deleted file mode 100644 index 5526d0adb..000000000 --- a/tests/test-metrics-api/README.md +++ /dev/null @@ -1,161 +0,0 @@ -# Test Metrics API - -This api is intended to be called by Github Action whenever a new commit to GovTool app has been made and new metrics are obtained. The api expects a POST request with a JSON file of the metrics which will then update the database with the new metrics. - -## Prerequisite - -- **PostgresSql** Database - -### Table Structure - -Database tables are automatically created upon startup - -#### `test_metrics` Table - -| Column Name | Data Type | Constraints | -| ----------- | --------- | ----------- | -| id | SERIAL | PRIMARY KEY | -| outcome | TEXT | NOT NULL | -| start_date | BIGINT | NOT NULL | -| end_date | BIGINT | NOT NULL | -| build_id | TEXT | NOT NULL | -| test_name | TEXT | NOT NULL | -| commit_hash | TEXT | NOT NULL | - -#### `endpoint_metrics` Table - -| Column Name | Data Type | Constraints | -| ------------- | --------- | ----------- | -| id | SERIAL | PRIMARY KEY | -| build_id | TEXT | NOT NULL | -| method | TEXT | NOT NULL | -| endpoint | TEXT | NOT NULL | -| path_param | TEXT | | -| json | text | | -| status_code | INTEGER | NOT NULL | -| response_json | text | | -| response_time | BIGINT | NOT NULL | -| start_date | BIGINT | NOT NULL | - -### How to run - -To run it in develop mode, you can use `npm run make` command in the terminal -To compile it, you can use `npm run build` command in the terminal -To run the compiled version, you can use `npm run start` command in the terminal - -| Environment Variable | Description | -| -------------------- | ---------------------------------------------------------------------------------- | -| API_SECRET_TOKEN | A secret token that must be provided in each API call in the header `secret-token` | -| PGHOST | Hostname for the database server | -| PGPORT | Port number for the database server | -| PGDATABASE | Database name | -| PGUSER | Database username | -| PGPASSWORD | Database password | -| PORT | Port number for the API | - -### Posting metrics to the server - -``` -curl -X POST http://localhost:8080 \ - -d "@metrics.json" \ - -H "commitHash: abc" \ - -H "secret-token: token" - -H 'Content-Type: application/json' -``` - -# Metrics API Reference - -## Authentication - -Each API request must include a secret token in the request headers for authentication. - -- Headers: - - `secret-token`: The secret token used to authenticate requests. - -If the provided `secret-token` is missing or invalid, the server will return a `403 Forbidden` status code, and the request will not be processed further. - ---- - -# Metrics API Reference - -## Test Result Metrics - -### **POST** `/metrics/test-results` - -Stores test execution results into the database. - -#### Request - -- Headers: - - - `secret-token`: The secret token used to authenticate requests. - -- Body (application/json): - - ```json - { - "outcome": "passed", - "start_date": 1625072400000, - "end_date": 1625076000000, - "build_id": "build-12345", - "test_name": "Unit Tests", - "commit_hash": "abc123def456" - } - ``` - - - `TestMetricsJson` object structure. - -#### Response - -- **200 OK**: Metrics have been successfully uploaded. -- **400 Bad Request**: Metrics upload not successful. -- **403 Forbidden**: Secret Token missing or invalid. - ---- - -## API Endpoint Metrics - -### **POST** `/metrics/api-endpoints` - -Stores metrics related to API endpoint performance into the database. - -#### Request - -- Headers: - - - `secret-token`: The secret token used to authenticate requests. - -- Body (application/json): - - ```json - { - "build_id": "build-67890", - "method": "GET", - "endpoint": "/users/{userId}", - "path_param": "userId", - "json": {}, - "status_code": 200, - "response_json": { "name": "John Doe" }, - "response_time": 120, - "start_date": 1625079600000 - } - ``` - - - Replace any placeholder `{userId}` in the endpoint with actual path parameters. - - The `json` key should contain the JSON payload sent to the server or empty object if none. - - `EndpointMetricsJson` object structure. - -#### Response - -- **200 OK**: Metrics have been successfully uploaded. -- **400 Bad Request**: Metrics upload not successful. -- **403 Forbidden**: Secret Token missing or invalid. - ---- - - -## Packaging -Project used Docker for packaging. Build docker image with -``` -docker build -t voltaire-era/test-metrics-api . -``` diff --git a/tests/test-metrics-api/package.json b/tests/test-metrics-api/package.json deleted file mode 100644 index eea1827d7..000000000 --- a/tests/test-metrics-api/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "metrics-api", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "build": "npx tsc", - "start": "node dist/index.js", - "dev": "concurrently \"npx tsc --watch\" \"nodemon -q dist/index.js\"", - "make": "ts-node ./src/index.ts", - "format": "prettier . --write" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "dotenv": "^16.3.1", - "express": "^4.18.2", - "pg": "^8.11.1", - "typescript": "^5.1.6" - }, - "devDependencies": { - "prettier": "^3.1.0", - "@types/express": "^4.17.17", - "@types/multer": "^1.4.7", - "@types/node": "^20.4.5", - "@types/pg": "^8.10.2", - "concurrently": "^8.2.0", - "nodemon": "^3.0.1", - "ts-node": "^10.9.1" - } -} diff --git a/tests/test-metrics-api/src/config.ts b/tests/test-metrics-api/src/config.ts deleted file mode 100644 index 3d4f8d520..000000000 --- a/tests/test-metrics-api/src/config.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as dotenv from 'dotenv' -import * as fs from 'fs' -import * as path from 'path' - -dotenv.config() - -interface Config { - PGPASSWORD: string | undefined - PGUSER: string | undefined - API_SECRET_TOKEN: string | undefined - PGPORT: string | undefined - PGDATABASE: string | undefined - PGHOST: string | undefined -} - -const readSecretFromFile = (envVar: string): string | undefined => { - if (process.env[envVar]) { - return process.env[envVar] - } - const filePath = process.env[envVar + '_FILE'] || '/run/secrets/' + envVar.toLowerCase() - - try { - return fs.readFileSync(filePath, 'utf8').trim() - } catch (error) { - console.error(`Error reading secret from file ${filePath}:`, error) - process.exit(1) - } -} -const readFromEnv = (envVar: string, defaultVal: string): string => { - return process.env[envVar] || defaultVal -} - -const config: Config = { - PGPASSWORD: readSecretFromFile('PGPASSWORD'), - PGUSER: readSecretFromFile('PGUSER'), - API_SECRET_TOKEN: readSecretFromFile('API_SECRET_TOKEN'), - PGPORT: readFromEnv('PGPORT', '5432'), - PGDATABASE: readSecretFromFile('PGDATABASE'), - PGHOST: readFromEnv('PGHOST', '/run/secrets/host'), -} - -export default config diff --git a/tests/test-metrics-api/src/db.ts b/tests/test-metrics-api/src/db.ts deleted file mode 100644 index 2ab7ff6fe..000000000 --- a/tests/test-metrics-api/src/db.ts +++ /dev/null @@ -1,64 +0,0 @@ -import pg from 'pg' -import config from './config' -import { EndpointMetricsJson, LighthouseMetricsJson, TestMetricsJson } from './types' - -export const pool = new pg.Pool({ - host: config.PGHOST, - port: parseInt(config.PGPORT as string), - database: config.PGDATABASE, - user: config.PGUSER, - password: config.PGPASSWORD, -}) - -export async function migrate() { - let createTableQuery = ` - CREATE TABLE IF NOT EXISTS test_metrics ( - id SERIAL PRIMARY KEY, - outcome TEXT NOT NULL, - start_date BIGINT NOT NULL, - end_date BIGINT NOT NULL, - build_id TEXT NOT NULL, - test_name TEXT NOT NULL, - commit_hash TEXT NOT NULL - - )` - await pool.query(createTableQuery) - createTableQuery = ` - CREATE TABLE IF NOT EXISTS endpoint_metrics ( - id SERIAL PRIMARY KEY, - build_id TEXT NOT NULL, - method TEXT NOT NULL, - endpoint TEXT NOT NULL, - path_param TEXT, - json TEXT, - status_code INTEGER NOT NULL, - response_json TEXT , - response_time BIGINT NOT NULL, - start_date BIGINT NOT NULL - )` - await pool.query(createTableQuery) -} - -export async function testMetricsToDb(json: TestMetricsJson) { - const insertQuery = ` - INSERT INTO test_metrics (outcome, start_date, end_date, build_id, test_name, commit_hash) - VALUES ($1, $2, $3, $4, $5, $6)` - await pool.query(insertQuery, [json.outcome, json.start_date, json.end_date, json.build_id, json.test_name, json.commit_hash]) -} - -export async function endpointMetricsToDb(json: EndpointMetricsJson) { - const insertQuery = ` - INSERT INTO endpoint_metrics (build_id, method, endpoint, path_param, json, status_code, response_json, response_time, start_date) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)` - await pool.query(insertQuery, [ - json.build_id, - json.method, - json.endpoint, - json.path_param, - json.json, - json.status_code, - json.response_json, - json.response_time, - json.start_date, - ]) -} diff --git a/tests/test-metrics-api/src/index.ts b/tests/test-metrics-api/src/index.ts deleted file mode 100644 index f7ed04fce..000000000 --- a/tests/test-metrics-api/src/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import express, { Express, NextFunction, Request, Response } from 'express' -import config from './config' -import { endpointMetricsToDb, migrate, pool, testMetricsToDb } from './db' - -const app: Express = express() -const port = process.env.server_PORT || 8080 -app.use(express.json({ limit: '200mb' })) -app.use(express.urlencoded({ extended: true })) -migrate() - -const checkSecretToken = (req: Request, res: Response, next: NextFunction) => { - const key = req.get('secret-token') - - if (key !== config.API_SECRET_TOKEN) { - res.status(403).json({ message: 'Secret Token missing or invalid' }) - return - } - next() // Call next to proceed to the next middleware or route handler -} - -app.use(checkSecretToken) - - -async function uploadMetrics(req: Request, res: Response, uploadFunction: (file: any) => Promise) { - try { - const file = req.body - if (!file) { - throw 'File not uploaded' - } - await uploadFunction(file) - res.send('Metrics have been successfully uploaded to database') - } catch (e) { - console.log('Error: ', e) - res.status(400).send('Metrics upload not successful') - } -} - -app.post('/metrics/test-results', async (req: Request, res: Response) => { - uploadMetrics(req, res, testMetricsToDb) -}) - -app.post('/metrics/api-endpoints', async (req: Request, res: Response) => { - uploadMetrics(req, res, endpointMetricsToDb) -}) -pool.connect().then(() => - app.listen(port, () => { - console.log(`⚡️[server]: Server is running at http://localhost:${port}`) - }) -) diff --git a/tests/test-metrics-api/src/types.ts b/tests/test-metrics-api/src/types.ts deleted file mode 100644 index 8eab9e6e8..000000000 --- a/tests/test-metrics-api/src/types.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Define TypeScript types for the various JSON structures -export interface TestMetricsJson { - outcome: string - start_date: number - end_date: number - build_id: string - test_name: string - commit_hash: string -} - -export interface EndpointMetricsJson { - build_id: string - method: string - endpoint: string - path_param?: string - json?: any // Replace 'any' with a more specific type if possible - status_code: number - response_json?: any // Replace 'any' with a more specific type if possible - response_time: number - start_date: number -} - -export interface LighthouseAuditMetric { - numericValue: number - numericUnit: 'ms' | 's' -} - -// Complete Lighthouse Metrics JSON Type -export interface LighthouseMetricsJson { - audits: { - interactive: LighthouseAuditMetric - 'first-contentful-paint': LighthouseAuditMetric - 'speed-index': LighthouseAuditMetric - 'total-blocking-time': LighthouseAuditMetric - 'largest-contentful-paint': LighthouseAuditMetric - 'cumulative-layout-shift': LighthouseAuditMetric - [auditName: string]: LighthouseAuditMetric // In case there are more metrics that follow the same pattern - } - fetchTime: string -} diff --git a/tests/test-metrics-api/tsconfig.json b/tests/test-metrics-api/tsconfig.json deleted file mode 100644 index c4dab6be2..000000000 --- a/tests/test-metrics-api/tsconfig.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - "outDir": "./dist", - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -} diff --git a/tests/test-metrics-api/yarn.lock b/tests/test-metrics-api/yarn.lock deleted file mode 100644 index 723440550..000000000 --- a/tests/test-metrics-api/yarn.lock +++ /dev/null @@ -1,1247 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.21.0": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.9.tgz#65884fd6dc255a775402cc1d9811082918f4bf00" - integrity sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg== - dependencies: - regenerator-runtime "^0.14.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.0.tgz#91f06cda1049e8f17eeab364798ed79c97488a1c" - integrity sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/express@^4.17.17": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/multer@^1.4.7": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" - integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== - dependencies: - "@types/express" "*" - -"@types/node@*": - version "22.7.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9" - integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg== - dependencies: - undici-types "~6.19.2" - -"@types/node@^20.4.5": - version "20.16.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.15.tgz#826f97ca53a213d190124ca6a972206f06a88b69" - integrity sha512-DV58qQz9dBMqVVn+qnKwGa51QzCD4YM/tQM16qLKxdf5tqz5W4QwtrMzjSTbabN1cFTSuyxVYBy+QWHjWW8X/g== - dependencies: - undici-types "~6.19.2" - -"@types/pg@^8.10.2": - version "8.11.10" - resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.11.10.tgz#b8fb2b2b759d452fe3ec182beadd382563b63291" - integrity sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg== - dependencies: - "@types/node" "*" - pg-protocol "*" - pg-types "^4.0.1" - -"@types/qs@*": - version "6.9.16" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.16.tgz#52bba125a07c0482d26747d5d4947a64daf8f794" - integrity sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-walk@^8.1.1: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^8.11.0, acorn@^8.4.1: - version "8.13.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" - integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^8.2.0: - version "8.2.2" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-8.2.2.tgz#353141985c198cfa5e4a3ef90082c336b5851784" - integrity sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg== - dependencies: - chalk "^4.1.2" - date-fns "^2.30.0" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - spawn-command "0.0.2" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -date-fns@^2.30.0: - version "2.30.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" - integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== - dependencies: - "@babel/runtime" "^7.21.0" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dotenv@^16.3.1: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -escalade@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -express@^4.18.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.10" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -hasown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -nodemon@^3.0.1: - version "3.1.7" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.7.tgz#07cb1f455f8bece6a499e0d72b5e029485521a54" - integrity sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -obuf@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== - -pg-cloudflare@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" - integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== - -pg-connection-string@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.7.0.tgz#f1d3489e427c62ece022dba98d5262efcb168b37" - integrity sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA== - -pg-int8@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" - integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== - -pg-numeric@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a" - integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== - -pg-pool@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.7.0.tgz#d4d3c7ad640f8c6a2245adc369bafde4ebb8cbec" - integrity sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g== - -pg-protocol@*, pg-protocol@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" - integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== - -pg-types@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" - integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== - dependencies: - pg-int8 "1.0.1" - postgres-array "~2.0.0" - postgres-bytea "~1.0.0" - postgres-date "~1.0.4" - postgres-interval "^1.1.0" - -pg-types@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-4.0.2.tgz#399209a57c326f162461faa870145bb0f918b76d" - integrity sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng== - dependencies: - pg-int8 "1.0.1" - pg-numeric "1.0.2" - postgres-array "~3.0.1" - postgres-bytea "~3.0.0" - postgres-date "~2.1.0" - postgres-interval "^3.0.0" - postgres-range "^1.1.1" - -pg@^8.11.1: - version "8.13.0" - resolved "https://registry.yarnpkg.com/pg/-/pg-8.13.0.tgz#e3d245342eb0158112553fcc1890a60720ae2a3d" - integrity sha512-34wkUTh3SxTClfoHB3pQ7bIMvw9dpFU1audQQeZG837fmHfHpr14n/AELVDoOYVDW2h5RDWU78tFjkD+erSBsw== - dependencies: - pg-connection-string "^2.7.0" - pg-pool "^3.7.0" - pg-protocol "^1.7.0" - pg-types "^2.1.0" - pgpass "1.x" - optionalDependencies: - pg-cloudflare "^1.1.1" - -pgpass@1.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" - integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== - dependencies: - split2 "^4.1.0" - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -postgres-array@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" - integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== - -postgres-array@~3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-3.0.2.tgz#68d6182cb0f7f152a7e60dc6a6889ed74b0a5f98" - integrity sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog== - -postgres-bytea@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" - integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== - -postgres-bytea@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-3.0.0.tgz#9048dc461ac7ba70a6a42d109221619ecd1cb089" - integrity sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw== - dependencies: - obuf "~1.1.2" - -postgres-date@~1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" - integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== - -postgres-date@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0" - integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA== - -postgres-interval@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" - integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== - dependencies: - xtend "^4.0.0" - -postgres-interval@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-3.0.0.tgz#baf7a8b3ebab19b7f38f07566c7aab0962f0c86a" - integrity sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw== - -postgres-range@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/postgres-range/-/postgres-range-1.1.4.tgz#a59c5f9520909bcec5e63e8cf913a92e4c952863" - integrity sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w== - -prettier@^3.1.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.5.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shell-quote@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -spawn-command@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" - integrity sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ== - -split2@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" - integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" - integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-node@^10.9.1: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tslib@^2.1.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" - integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typescript@^5.1.6: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~6.19.2: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From 139244de85adc7da8b6f8738589c59491348d12c Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Wed, 23 Oct 2024 11:56:55 +0100 Subject: [PATCH 02/21] change: no DRep found copy text --- CHANGELOG.md | 1 + govtool/frontend/src/i18n/locales/en.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe765d4cd..da2f0ed82 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ changes. ### Changed - Bump to use Cardano Node `10.0.0-pre` +- Changed copy for no DRep found via search ### Removed diff --git a/govtool/frontend/src/i18n/locales/en.ts b/govtool/frontend/src/i18n/locales/en.ts index ad5aa48a5..50b0ed165 100644 --- a/govtool/frontend/src/i18n/locales/en.ts +++ b/govtool/frontend/src/i18n/locales/en.ts @@ -275,7 +275,7 @@ export const en = { "Select this to signal no confidence in the current constitutional committee by voting NO on every proposal and voting YES to no confidence proposals", noConfidenceDefaultTitle: "Signal No Confidence on Every Vote", noResultsForTheSearchTitle: "No DReps found", - noResultsForTheSearchDescription: "Please try a different search", + noResultsForTheSearchDescription: "If you can't find the DRep you were looking for either they are not registered or they didn't submit metadata in their registration", title: "DRep Directory", votingPower: "Voting Power", }, From 01653ed751a629df105ac661ecc1a868ace8cd30 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 23 Oct 2024 11:58:52 +0100 Subject: [PATCH 03/21] Update govtool/frontend/src/i18n/locales/en.ts Signed-off-by: Ryan --- govtool/frontend/src/i18n/locales/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/govtool/frontend/src/i18n/locales/en.ts b/govtool/frontend/src/i18n/locales/en.ts index 50b0ed165..5f51dae41 100644 --- a/govtool/frontend/src/i18n/locales/en.ts +++ b/govtool/frontend/src/i18n/locales/en.ts @@ -275,7 +275,7 @@ export const en = { "Select this to signal no confidence in the current constitutional committee by voting NO on every proposal and voting YES to no confidence proposals", noConfidenceDefaultTitle: "Signal No Confidence on Every Vote", noResultsForTheSearchTitle: "No DReps found", - noResultsForTheSearchDescription: "If you can't find the DRep you were looking for either they are not registered or they didn't submit metadata in their registration", + noResultsForTheSearchDescription: "If you can't find the DRep you were looking for either they are not registered or they didn't submit metadata in their registration.", title: "DRep Directory", votingPower: "Voting Power", }, From a0f2b791a718f1796944b2051211efb308c0f110 Mon Sep 17 00:00:00 2001 From: Ryan Date: Wed, 23 Oct 2024 12:02:25 +0100 Subject: [PATCH 04/21] Update govtool/frontend/src/i18n/locales/en.ts Signed-off-by: Ryan --- govtool/frontend/src/i18n/locales/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/govtool/frontend/src/i18n/locales/en.ts b/govtool/frontend/src/i18n/locales/en.ts index 5f51dae41..36c654025 100644 --- a/govtool/frontend/src/i18n/locales/en.ts +++ b/govtool/frontend/src/i18n/locales/en.ts @@ -275,7 +275,7 @@ export const en = { "Select this to signal no confidence in the current constitutional committee by voting NO on every proposal and voting YES to no confidence proposals", noConfidenceDefaultTitle: "Signal No Confidence on Every Vote", noResultsForTheSearchTitle: "No DReps found", - noResultsForTheSearchDescription: "If you can't find the DRep you were looking for either they are not registered or they didn't submit metadata in their registration.", + noResultsForTheSearchDescription: "If you can't find the DRep you're looking for, either they are not registered, requested not to be listed in the DRep Directory, or did not submit metadata during registration.", title: "DRep Directory", votingPower: "Voting Power", }, From 06e716be6027bb83f0bdb4098f43232bf93a5650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Fri, 25 Oct 2024 11:07:51 +0200 Subject: [PATCH 05/21] fix(#2233): enforce validating metadata against the specified standard --- CHANGELOG.md | 2 +- .../molecules/GovernanceActionCard.tsx | 18 +++++++++-------- .../frontend/src/models/metadataValidation.ts | 6 ++++++ govtool/frontend/src/utils/mapDtoToDrep.ts | 8 +++++++- .../frontend/src/utils/mapDtoToProposal.ts | 20 +++++++++++++------ .../metadata-validation/src/app.service.ts | 6 +++++- .../src/dto/validateMetadata.dto.ts | 4 ++++ 7 files changed, 47 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58efefbbc..bec2beb03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ changes. ### Fixed -- +- Fix validating metadata against the CIP standard [Issue 2233](https://github.com/IntersectMBO/govtool/issues/2233) ### Changed diff --git a/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx b/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx index 89b802254..c70ede09a 100644 --- a/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx +++ b/govtool/frontend/src/components/molecules/GovernanceActionCard.tsx @@ -87,14 +87,16 @@ export const GovernanceActionCard: FC = ({ ...props }) => { title={title} isDataMissing={metadataStatus} /> - + {!metadataStatus && ( + + )} = { status?: MetadataValidationStatus; valid: boolean; @@ -15,6 +20,7 @@ export type ValidateMetadataResult = { export type MetadataValidationDTO = { url: string; hash: string; + standard?: MetadataStandard; }; export type DRepMetadata = { diff --git a/govtool/frontend/src/utils/mapDtoToDrep.ts b/govtool/frontend/src/utils/mapDtoToDrep.ts index 923acf546..419973c14 100644 --- a/govtool/frontend/src/utils/mapDtoToDrep.ts +++ b/govtool/frontend/src/utils/mapDtoToDrep.ts @@ -1,4 +1,9 @@ -import { DRepData, DRepMetadata, DrepDataDTO } from "@/models"; +import { + DRepData, + DRepMetadata, + DrepDataDTO, + MetadataStandard, +} from "@/models"; import { postValidate } from "@/services"; import { fixViewForScriptBasedDRep } from "./dRep"; @@ -23,6 +28,7 @@ export const mapDtoToDrep = async (dto: DrepDataDTO): Promise => { const validationResponse = await postValidate({ url: dto.url, hash: dto.metadataHash, + standard: MetadataStandard.CIP119, }); return { ...dto, diff --git a/govtool/frontend/src/utils/mapDtoToProposal.ts b/govtool/frontend/src/utils/mapDtoToProposal.ts index 4c118c294..5324eb342 100644 --- a/govtool/frontend/src/utils/mapDtoToProposal.ts +++ b/govtool/frontend/src/utils/mapDtoToProposal.ts @@ -1,4 +1,9 @@ -import { ProposalData, ProposalDataDTO, ProposalMetadata } from "@/models"; +import { + MetadataStandard, + ProposalData, + ProposalDataDTO, + ProposalMetadata, +} from "@/models"; import { postValidate } from "@/services"; export const mapDtoToProposal = async ( @@ -8,15 +13,18 @@ export const mapDtoToProposal = async ( const validationResponse = await postValidate({ url: dto.url, hash: dto.metadataHash, + standard: MetadataStandard.CIP108, }); return { ...dto, - title: validationResponse.metadata?.title, - abstract: validationResponse.metadata?.abstract, - motivation: validationResponse.metadata?.motivation, - rationale: validationResponse.metadata?.rationale, - references: validationResponse.metadata?.references?.map(({ uri }) => uri), + title: dto.title || validationResponse.metadata?.title, + abstract: dto.abstract || validationResponse.metadata?.abstract, + motivation: dto.motivation || validationResponse.metadata?.motivation, + rationale: dto.rationale || validationResponse.metadata?.rationale, + references: validationResponse.metadata?.references?.map( + ({ uri }) => uri, + ), metadataStatus: validationResponse.status || null, metadataValid: validationResponse.valid, }; diff --git a/govtool/metadata-validation/src/app.service.ts b/govtool/metadata-validation/src/app.service.ts index 1ce809d1b..a948ef173 100644 --- a/govtool/metadata-validation/src/app.service.ts +++ b/govtool/metadata-validation/src/app.service.ts @@ -16,9 +16,11 @@ export class AppService { async validateMetadata({ hash, url, + standard: paramStandard, }: ValidateMetadataDTO): Promise { let status: MetadataValidationStatus; let metadata: Record; + let standard = paramStandard; try { const { data: rawData } = await firstValueFrom( @@ -42,7 +44,9 @@ export class AppService { throw MetadataValidationStatus.INCORRECT_FORMAT; } - const standard = getStandard(parsedData); + if (!standard) { + standard = getStandard(parsedData); + } if (standard) { await validateMetadataStandard(parsedData.body, standard); diff --git a/govtool/metadata-validation/src/dto/validateMetadata.dto.ts b/govtool/metadata-validation/src/dto/validateMetadata.dto.ts index c962d5679..edf5bf55a 100644 --- a/govtool/metadata-validation/src/dto/validateMetadata.dto.ts +++ b/govtool/metadata-validation/src/dto/validateMetadata.dto.ts @@ -1,5 +1,9 @@ +import { MetadataStandard } from '@/types'; + export class ValidateMetadataDTO { hash: string; url: string; + + standard?: MetadataStandard; } From 68320f93aa1dc0978082a867aee0f1a43e4dce41 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 14:30:56 +0545 Subject: [PATCH 06/21] chore: add 128 words validation on invalid url --- .../playwright/lib/_mock/index.ts | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/_mock/index.ts b/tests/govtool-frontend/playwright/lib/_mock/index.ts index cbd20a9c8..0ce7b3d83 100644 --- a/tests/govtool-frontend/playwright/lib/_mock/index.ts +++ b/tests/govtool-frontend/playwright/lib/_mock/index.ts @@ -3,19 +3,24 @@ import { generateExactLengthText } from "@helpers/string"; export const invalid = { url: () => { - const invalidSchemes = ["ftp", "unsupported", "unknown-scheme"]; - const invalidCharacters = "<>@!#$%^&*()"; - const invalidTlds = [".invalid", ".example", ".test"]; - - const scheme = - invalidSchemes[Math.floor(Math.random() * invalidSchemes.length)]; - const invalidChar = - invalidCharacters[Math.floor(Math.random() * invalidCharacters.length)]; - const invalidTld = - invalidTlds[Math.floor(Math.random() * invalidTlds.length)]; - - const randomDomain = `example${invalidChar}domain${invalidTld}`; - return `${scheme}://${randomDomain}`; + const choice = faker.number.int({ min: 1, max: 2 }); + if (choice === 1) { + const invalidSchemes = ["ftp", "unsupported", "unknown-scheme"]; + const invalidCharacters = "<>@!#$%^&*()"; + const invalidTlds = [".invalid", ".example", ".test"]; + + const scheme = + invalidSchemes[Math.floor(Math.random() * invalidSchemes.length)]; + const invalidChar = + invalidCharacters[Math.floor(Math.random() * invalidCharacters.length)]; + const invalidTld = + invalidTlds[Math.floor(Math.random() * invalidTlds.length)]; + + const randomDomain = `example${invalidChar}domain${invalidTld}`; + return `${scheme}://${randomDomain}`; + } + // max 128 words invalid + return faker.internet.url() + faker.lorem.paragraphs(2).replace(/\s+/g, ""); }, name: () => { From d83227fc3cbd2346a01e64681a42ad5ed7779cde Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 14:48:44 +0545 Subject: [PATCH 07/21] chore: update the assertion of metadata anchor error --- .../dRepRegistration.loggedin.spec.ts | 12 ++++++++++-- .../tests/3-drep-registration/editDRep.dRep.spec.ts | 11 +++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts index a3da2b512..509e38d87 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts @@ -156,8 +156,16 @@ test.describe("Validation of dRep Registration Form", () => { await dRepRegistrationPage.registerBtn.click(); for (let i = 0; i < 100; i++) { - await dRepRegistrationPage.metadataUrlInput.fill(mockInvalid.url()); - await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + const invalidUrl = mockInvalid.url(); + + await dRepRegistrationPage.metadataUrlInput.fill(invalidUrl); + if (invalidUrl.length <= 128) { + await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + } else { + await expect( + page.getByTestId("url-must-be-less-than-128-bytes-error") + ).toBeVisible(); + } } const sentenceWithoutSpace = faker.lorem diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index a2500d29b..1454a005c 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -127,8 +127,15 @@ test.describe("Validation of edit dRep Form", () => { await editDRepPage.registerBtn.click(); for (let i = 0; i < 100; i++) { - await editDRepPage.metadataUrlInput.fill(mockInvalid.url()); - await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + const invalidUrl = mockInvalid.url(); + await editDRepPage.metadataUrlInput.fill(invalidUrl); + if (invalidUrl.length <= 128) { + await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + } else { + await expect( + page.getByTestId("url-must-be-less-than-128-bytes-error") + ).toBeVisible(); + } } const sentenceWithoutSpace = faker.lorem From 0d497da3980b1ce8188e967c80d54f1df0da5be1 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 15:30:31 +0545 Subject: [PATCH 08/21] chore: add validation for 128-word limit on metadata anchor field only --- tests/govtool-frontend/playwright/lib/_mock/index.ts | 6 ++++-- .../3-drep-registration/dRepRegistration.loggedin.spec.ts | 2 +- .../tests/3-drep-registration/editDRep.dRep.spec.ts | 2 +- .../proposalSubmission.loggedin.spec.ts | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/_mock/index.ts b/tests/govtool-frontend/playwright/lib/_mock/index.ts index 0ce7b3d83..234f772d1 100644 --- a/tests/govtool-frontend/playwright/lib/_mock/index.ts +++ b/tests/govtool-frontend/playwright/lib/_mock/index.ts @@ -2,8 +2,10 @@ import { faker } from "@faker-js/faker"; import { generateExactLengthText } from "@helpers/string"; export const invalid = { - url: () => { - const choice = faker.number.int({ min: 1, max: 2 }); + url: (isSupportedGreaterThan128Words = true) => { + const choice = isSupportedGreaterThan128Words + ? 1 + : faker.number.int({ min: 1, max: 2 }); if (choice === 1) { const invalidSchemes = ["ftp", "unsupported", "unknown-scheme"]; const invalidCharacters = "<>@!#$%^&*()"; diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts index 509e38d87..21afc8703 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.loggedin.spec.ts @@ -156,7 +156,7 @@ test.describe("Validation of dRep Registration Form", () => { await dRepRegistrationPage.registerBtn.click(); for (let i = 0; i < 100; i++) { - const invalidUrl = mockInvalid.url(); + const invalidUrl = mockInvalid.url(false); await dRepRegistrationPage.metadataUrlInput.fill(invalidUrl); if (invalidUrl.length <= 128) { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts index 1454a005c..95a90f0e9 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/editDRep.dRep.spec.ts @@ -127,7 +127,7 @@ test.describe("Validation of edit dRep Form", () => { await editDRepPage.registerBtn.click(); for (let i = 0; i < 100; i++) { - const invalidUrl = mockInvalid.url(); + const invalidUrl = mockInvalid.url(false); await editDRepPage.metadataUrlInput.fill(invalidUrl); if (invalidUrl.length <= 128) { await expect(page.getByTestId("invalid-url-error")).toBeVisible(); diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.spec.ts index 1c4999a26..b96e5e2dc 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.spec.ts @@ -261,7 +261,7 @@ test.describe("Proposal created logged state", () => { }) => { test.slow(); // Brute-force testing with 100 random data for (let i = 0; i < 50; i++) { - await proposalSubmissionPage.metadataUrlInput.fill(invalid.url()); + await proposalSubmissionPage.metadataUrlInput.fill(invalid.url(false)); await expect(page.getByTestId("url-input-error-text")).toBeVisible(); } From b40ab3febb6aaf6ab06d02deff6dfb28fd8286cd Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 15:38:29 +0545 Subject: [PATCH 09/21] chore: update test ids of metadata download and url of govAction details page --- .../lib/pages/governanceActionDetailsPage.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts index 3508c39e9..600d8818f 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts @@ -21,6 +21,9 @@ export default class GovernanceActionDetailsPage { readonly governanceActionId = this.page.getByText("Governance Action ID:"); readonly contextBtn = this.page.getByTestId("provide-context-button"); + readonly metadataDownloadBtn = this.page.getByTestId( + "metadata-download-button" + ); readonly viewOtherDetailsLink = this.page.getByTestId( "view-other-details-button" ); @@ -31,6 +34,7 @@ export default class GovernanceActionDetailsPage { readonly externalLinkModal = this.page.getByTestId("external-link-modal"); readonly contextInput = this.page.getByTestId("provide-context-input"); + readonly metadataUrlInput = this.page.getByTestId("metadata-url-input"); readonly cancelModalBtn = this.page.getByTestId("cancel-modal-button"); readonly dRepYesVotes = this.page.getByTestId("submitted-votes-dReps-yes"); @@ -78,16 +82,14 @@ export default class GovernanceActionDetailsPage { await this.page.getByRole("checkbox").click(); await this.confirmModalBtn.click(); - this.page - .getByRole("button", { name: "download Vote_Context.jsonld" }) - .click(); // BUG missing test id + this.metadataDownloadBtn.click(); const voteMetadata = await this.downloadVoteMetadata(); const url = await metadataBucketService.uploadMetadata( voteMetadata.name, voteMetadata.data ); - await this.page.getByPlaceholder("URL").fill(url); // Bug showing data-testid="undefinedinput" on url + await this.metadataUrlInput.fill(url); await this.confirmModalBtn.click(); await this.page.getByTestId("go-to-vote-modal-button").click(); } From e9455c3611db283b16fc08112970a266f34432e7 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 15:43:17 +0545 Subject: [PATCH 10/21] test: vote context metadata anchor validation --- .../proposalVisibility.dRep.spec.ts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index 210e5de18..c3523de46 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -12,6 +12,7 @@ import { import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; +import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; import { BootstrapGovernanceActionType, GrovernanceActionType, @@ -41,6 +42,50 @@ test.describe("Logged in DRep", () => { `₳ ${lovelaceToAda(votingPower)}` ); }); + + test.describe("vote context metadata anchor validation", () => { + test.beforeEach(async ({ page }) => { + const govActionsPage = new GovernanceActionsPage(page); + await govActionsPage.goto(); + + const govActionDetailsPage = (await isBootStrapingPhase()) + ? await govActionsPage.viewFirstProposalByGovernanceAction( + GrovernanceActionType.InfoAction + ) + : await govActionsPage.viewFirstProposal(); + + await govActionDetailsPage.contextBtn.click(); + await govActionDetailsPage.contextInput.fill(faker.lorem.sentence(200)); + await govActionDetailsPage.confirmModalBtn.click(); + await page.getByRole("checkbox").click(); + await govActionDetailsPage.confirmModalBtn.click(); + }); + + test("4N. Should accept valid metadata anchor on vote context", async ({ + page, + }) => { + for (let i = 0; i < 100; i++) { + await page.getByPlaceholder("URL").fill(mockValid.url()); + await expect(page.getByTestId("invalid-url-error")).toBeHidden(); + } + }); + + test("4O. Should reject invalid metadata anchor on vote context", async ({ + page, + }) => { + for (let i = 0; i < 100; i++) { + const invalidUrl = mockInvalid.url(false); + await page.getByPlaceholder("URL").fill(invalidUrl); + if (invalidUrl.length <= 128) { + await expect(page.getByTestId("invalid-url-error")).toBeVisible(); + } else { + await expect( + page.getByTestId("url-must-be-less-than-128-bytes-error") + ).toBeVisible(); + } + } + }); + }); }); test.describe("Temporary DReps", async () => { From 71595c169b3571400c1430a87d01e49e06cc633d Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 15:49:09 +0545 Subject: [PATCH 11/21] chore: use metadata url input testId instead of getByPlaceholder --- .../4-proposal-visibility/proposalVisibility.dRep.spec.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts index c3523de46..6ac7a810b 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.dRep.spec.ts @@ -19,6 +19,7 @@ import { IProposal, } from "@types"; import walletManager from "lib/walletManager"; +import GovernanceActionDetailsPage from "@pages/governanceActionDetailsPage"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); @@ -44,11 +45,12 @@ test.describe("Logged in DRep", () => { }); test.describe("vote context metadata anchor validation", () => { + let govActionDetailsPage: GovernanceActionDetailsPage; test.beforeEach(async ({ page }) => { const govActionsPage = new GovernanceActionsPage(page); await govActionsPage.goto(); - const govActionDetailsPage = (await isBootStrapingPhase()) + govActionDetailsPage = (await isBootStrapingPhase()) ? await govActionsPage.viewFirstProposalByGovernanceAction( GrovernanceActionType.InfoAction ) @@ -65,7 +67,7 @@ test.describe("Logged in DRep", () => { page, }) => { for (let i = 0; i < 100; i++) { - await page.getByPlaceholder("URL").fill(mockValid.url()); + await govActionDetailsPage.metadataUrlInput.fill(mockValid.url()); await expect(page.getByTestId("invalid-url-error")).toBeHidden(); } }); @@ -75,7 +77,7 @@ test.describe("Logged in DRep", () => { }) => { for (let i = 0; i < 100; i++) { const invalidUrl = mockInvalid.url(false); - await page.getByPlaceholder("URL").fill(invalidUrl); + await govActionDetailsPage.metadataUrlInput.fill(invalidUrl); if (invalidUrl.length <= 128) { await expect(page.getByTestId("invalid-url-error")).toBeVisible(); } else { From 0582ee469bdb97fff88c68ca2cb3dcde0112c7f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Thu, 24 Oct 2024 08:52:21 +0200 Subject: [PATCH 12/21] fix: searching for metadatas in proposal list --- govtool/backend/sql/list-proposals.sql | 9 ++++-- govtool/backend/src/VVA/API.hs | 26 ++++++++--------- govtool/backend/src/VVA/Proposal.hs | 40 ++++++++++++++++---------- 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/govtool/backend/sql/list-proposals.sql b/govtool/backend/sql/list-proposals.sql index bbe19be2c..5fa0c3058 100644 --- a/govtool/backend/sql/list-proposals.sql +++ b/govtool/backend/sql/list-proposals.sql @@ -141,8 +141,13 @@ FROM AND ldd_cc.rn = 1 LEFT JOIN gov_action_proposal AS prev_gov_action ON gov_action_proposal.prev_gov_action_proposal = prev_gov_action.id LEFT JOIN tx AS prev_gov_action_tx ON prev_gov_action.tx_id = prev_gov_action_tx.id -WHERE (NOT ? - OR (concat(encode(creator_tx.hash, 'hex'), '#', gov_action_proposal.index) IN ?)) +WHERE + (COALESCE(?, '') = '' OR + off_chain_vote_gov_action_data.title ILIKE ? OR + off_chain_vote_gov_action_data.abstract ILIKE ? OR + off_chain_vote_gov_action_data.motivation ILIKE ? OR + off_chain_vote_gov_action_data.rationale ILIKE ? OR + concat(encode(creator_tx.hash, 'hex'), '#', gov_action_proposal.index) ILIKE ?) AND gov_action_proposal.expiration >( SELECT Max(NO) diff --git a/govtool/backend/src/VVA/API.hs b/govtool/backend/src/VVA/API.hs index c975b5183..bb1b700d3 100644 --- a/govtool/backend/src/VVA/API.hs +++ b/govtool/backend/src/VVA/API.hs @@ -357,20 +357,20 @@ listProposals selectedTypes sortMode mPage mPageSize mDrepRaw mSearchQuery = do map (voteParamsProposalId . voteResponseVote) <$> getVotes drepId [] Nothing Nothing - CacheEnv {proposalListCache} <- asks vvaCache - mappedAndSortedProposals <- do - proposals <- cacheRequest proposalListCache () Proposal.listProposals - mappedSortedAndFilteredProposals <- mapSortAndFilterProposals selectedTypes sortMode proposals - return $ filter - ( \p@ProposalResponse {proposalResponseId} -> - proposalResponseId `notElem` proposalsToRemove - && isProposalSearchedFor mSearchQuery p - ) mappedSortedAndFilteredProposals - - let total = length mappedAndSortedProposals :: Int - - let elements = take pageSize $ drop (page * pageSize) mappedAndSortedProposals + + proposals <- cacheRequest proposalListCache () (Proposal.listProposals mSearchQuery) + + mappedSortedAndFilteredProposals <- mapSortAndFilterProposals selectedTypes sortMode proposals + let filteredProposals = filter + ( \p@ProposalResponse {proposalResponseId} -> + proposalResponseId `notElem` proposalsToRemove + && isProposalSearchedFor mSearchQuery p + ) mappedSortedAndFilteredProposals + + let total = length filteredProposals :: Int + + let elements = take pageSize $ drop (page * pageSize) filteredProposals return $ ListProposalsResponse { listProposalsResponsePage = fromIntegral page diff --git a/govtool/backend/src/VVA/Proposal.hs b/govtool/backend/src/VVA/Proposal.hs index bc9fb6a2d..e2256f987 100644 --- a/govtool/backend/src/VVA/Proposal.hs +++ b/govtool/backend/src/VVA/Proposal.hs @@ -28,10 +28,9 @@ import qualified Data.Text.IO as Text import Data.Time import qualified Database.PostgreSQL.Simple as SQL - -import qualified GHC.Generics as SQL - -import Text.Read (readMaybe) +import qualified Database.PostgreSQL.Simple.Types as PG +import Database.PostgreSQL.Simple.ToField (ToField(..)) +import Database.PostgreSQL.Simple.ToRow (ToRow(..)) import VVA.Config import VVA.Pool (ConnectionPool, withPool) @@ -43,10 +42,15 @@ sqlFrom bs = fromString $ unpack $ Text.decodeUtf8 bs listProposalsSql :: SQL.Query listProposalsSql = sqlFrom $(embedFile "sql/list-proposals.sql") +newtype TextArray = TextArray [Text] + +instance ToRow TextArray where + toRow (TextArray texts) = map toField texts + listProposals :: (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m, MonadError AppError m) => - m [Proposal] -listProposals = getProposals Nothing + Maybe Text -> m [Proposal] +listProposals mSearch = getProposals (fmap (:[]) mSearch) getProposal :: (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m, MonadError AppError m) => @@ -54,17 +58,23 @@ getProposal :: Integer -> m Proposal getProposal txHash index = do - result <- getProposals (Just [txHash <> "#" <> pack (show index)]) + let proposalId = txHash <> "#" <> pack (show index) + result <- getProposals (Just [proposalId]) case result of - [] -> throwError $ NotFoundError ("Proposal with id: " <> txHash <> "#" <> pack (show index) <> " not found") + [] -> throwError $ NotFoundError ("Proposal with id: " <> proposalId <> " not found") [a] -> return a - _ -> throwError $ CriticalError ("Multiple proposal found for id: " <> txHash <> "#" <> pack (show index) <> ". This should never happen") + _ -> throwError $ CriticalError ("Multiple proposals found for id: " <> proposalId <> ". This should never happen") getProposals :: (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m, MonadError AppError m) => - Maybe [Text] -> - m [Proposal] -getProposals mProposalIds = withPool $ \conn -> - liftIO $ case mProposalIds of - Nothing -> SQL.query @(Bool, SQL.In [Text]) conn listProposalsSql (False, SQL.In []) - Just proposalIds -> SQL.query conn listProposalsSql (True, SQL.In proposalIds) + Maybe [Text] -> m [Proposal] +getProposals mSearchTerms = withPool $ \conn -> do + let searchParam = fromMaybe "" (fmap head mSearchTerms) + liftIO $ SQL.query conn listProposalsSql + ( searchParam + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + ) From 9e9e9a718f3b12024ffcd5ba67bc076b8dc8ca9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Thu, 24 Oct 2024 09:49:27 +0200 Subject: [PATCH 13/21] fix: searching for metadatas in drep list --- govtool/backend/sql/list-dreps.sql | 10 +++++++ govtool/backend/src/VVA/API.hs | 2 +- govtool/backend/src/VVA/DRep.hs | 44 +++++++++++++++++------------- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/govtool/backend/sql/list-dreps.sql b/govtool/backend/sql/list-dreps.sql index 000a0c440..0c71e69a8 100644 --- a/govtool/backend/sql/list-dreps.sql +++ b/govtool/backend/sql/list-dreps.sql @@ -134,6 +134,16 @@ FROM AND dr_first_register.rn = 1 LEFT JOIN tx AS tx_first_register ON tx_first_register.id = dr_first_register.tx_id LEFT JOIN block AS block_first_register ON block_first_register.id = tx_first_register.block_id +WHERE + ( + COALESCE(?, '') = '' OR + dh.view ILIKE ? OR + off_chain_vote_drep_data.payment_address ILIKE ? OR + off_chain_vote_drep_data.given_name ILIKE ? OR + off_chain_vote_drep_data.objectives ILIKE ? OR + off_chain_vote_drep_data.motivations ILIKE ? OR + off_chain_vote_drep_data.qualifications ILIKE ? + ) GROUP BY dh.raw, second_to_newest_drep_registration.voting_anchor_id, diff --git a/govtool/backend/src/VVA/API.hs b/govtool/backend/src/VVA/API.hs index bb1b700d3..104b903b8 100644 --- a/govtool/backend/src/VVA/API.hs +++ b/govtool/backend/src/VVA/API.hs @@ -140,7 +140,7 @@ delegationToResponse Types.Delegation {..} = drepList :: App m => Maybe Text -> [DRepStatus] -> Maybe DRepSortMode -> Maybe Natural -> Maybe Natural -> m ListDRepsResponse drepList mSearchQuery statuses mSortMode mPage mPageSize = do CacheEnv {dRepListCache} <- asks vvaCache - dreps <- cacheRequest dRepListCache () DRep.listDReps + dreps <- cacheRequest dRepListCache () (DRep.listDReps mSearchQuery) let filterDRepsByQuery = case mSearchQuery of Nothing -> filter $ \Types.DRepRegistration {..} -> dRepRegistrationType == Types.DRep diff --git a/govtool/backend/src/VVA/DRep.hs b/govtool/backend/src/VVA/DRep.hs index 1cb35ffbe..a8a95fb42 100644 --- a/govtool/backend/src/VVA/DRep.hs +++ b/govtool/backend/src/VVA/DRep.hs @@ -26,7 +26,6 @@ import qualified Data.Text.Encoding as Text import Data.Time import qualified Database.PostgreSQL.Simple as SQL - import VVA.Config import VVA.Pool (ConnectionPool, withPool) import qualified VVA.Proposal as Proposal @@ -36,29 +35,23 @@ import VVA.Types (AppError, DRepInfo (..), DRepRegist sqlFrom :: ByteString -> SQL.Query sqlFrom bs = fromString $ unpack $ Text.decodeUtf8 bs -getVotingPowerSql :: SQL.Query -getVotingPowerSql = sqlFrom $(embedFile "sql/get-voting-power.sql") - -getVotingPower :: - (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m) => - Text -> - m Integer -getVotingPower drepId = withPool $ \conn -> do - result <- - liftIO - (SQL.query @_ @(SQL.Only Scientific) conn getVotingPowerSql $ SQL.Only drepId) - case result of - [SQL.Only votingPower] -> return $ floor votingPower - [] -> return 0 - listDRepsSql :: SQL.Query listDRepsSql = sqlFrom $(embedFile "sql/list-dreps.sql") listDReps :: (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m) => - m [DRepRegistration] -listDReps = withPool $ \conn -> do - results <- liftIO $ SQL.query_ conn listDRepsSql + Maybe Text -> m [DRepRegistration] +listDReps mSearchQuery = withPool $ \conn -> do + let searchParam = fromMaybe "" mSearchQuery + results <- liftIO $ SQL.query conn listDRepsSql + ( searchParam + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + , "%" <> searchParam <> "%" + ) timeZone <- liftIO getCurrentTimeZone return [ DRepRegistration drepHash drepView isScriptBased url dataHash (floor @Scientific deposit) votingPower status drepType txHash (localTimeToUTC timeZone date) metadataError paymentAddress givenName objectives motivations qualifications imageUrl imageHash @@ -95,6 +88,19 @@ listDReps = withPool $ \conn -> do | Data.Maybe.isJust url = DRep ] +getVotingPowerSql :: SQL.Query +getVotingPowerSql = sqlFrom $(embedFile "sql/get-voting-power.sql") + +getVotingPower :: + (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m) => + Text -> + m Integer +getVotingPower drepId = withPool $ \conn -> do + result <- liftIO (SQL.query @_ @(SQL.Only Scientific) conn getVotingPowerSql $ SQL.Only drepId) + case result of + [SQL.Only votingPower] -> return $ floor votingPower + [] -> return 0 + getVotesSql :: SQL.Query getVotesSql = sqlFrom $(embedFile "sql/get-votes.sql") From 69267e79563b4f29981a9ad789ef5c1369e46c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Thu, 24 Oct 2024 10:18:12 +0200 Subject: [PATCH 14/21] fix: hlint warning on using maybe --- govtool/backend/sql/list-dreps.sql | 4 ---- govtool/backend/src/VVA/Proposal.hs | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/govtool/backend/sql/list-dreps.sql b/govtool/backend/sql/list-dreps.sql index 0c71e69a8..123a3ce1d 100644 --- a/govtool/backend/sql/list-dreps.sql +++ b/govtool/backend/sql/list-dreps.sql @@ -138,11 +138,7 @@ WHERE ( COALESCE(?, '') = '' OR dh.view ILIKE ? OR - off_chain_vote_drep_data.payment_address ILIKE ? OR off_chain_vote_drep_data.given_name ILIKE ? OR - off_chain_vote_drep_data.objectives ILIKE ? OR - off_chain_vote_drep_data.motivations ILIKE ? OR - off_chain_vote_drep_data.qualifications ILIKE ? ) GROUP BY dh.raw, diff --git a/govtool/backend/src/VVA/Proposal.hs b/govtool/backend/src/VVA/Proposal.hs index e2256f987..328b091eb 100644 --- a/govtool/backend/src/VVA/Proposal.hs +++ b/govtool/backend/src/VVA/Proposal.hs @@ -69,7 +69,7 @@ getProposals :: (Has ConnectionPool r, Has VVAConfig r, MonadReader r m, MonadIO m, MonadFail m, MonadError AppError m) => Maybe [Text] -> m [Proposal] getProposals mSearchTerms = withPool $ \conn -> do - let searchParam = fromMaybe "" (fmap head mSearchTerms) + let searchParam = maybe "" head mSearchTerms liftIO $ SQL.query conn listProposalsSql ( searchParam , "%" <> searchParam <> "%" From 2eeac4a72c1cd8f0f3fe04984fc7b4c7a55915db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Mon, 28 Oct 2024 11:48:21 +0100 Subject: [PATCH 15/21] Update govtool/frontend/src/i18n/locales/en.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michał Szałowski --- govtool/frontend/src/i18n/locales/en.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/govtool/frontend/src/i18n/locales/en.ts b/govtool/frontend/src/i18n/locales/en.ts index 36c654025..6ae79ef28 100644 --- a/govtool/frontend/src/i18n/locales/en.ts +++ b/govtool/frontend/src/i18n/locales/en.ts @@ -275,7 +275,7 @@ export const en = { "Select this to signal no confidence in the current constitutional committee by voting NO on every proposal and voting YES to no confidence proposals", noConfidenceDefaultTitle: "Signal No Confidence on Every Vote", noResultsForTheSearchTitle: "No DReps found", - noResultsForTheSearchDescription: "If you can't find the DRep you're looking for, either they are not registered, requested not to be listed in the DRep Directory, or did not submit metadata during registration.", + noResultsForTheSearchDescription: "If you can't find the DRep you're looking for, either they are not registered, requested not to be listed in the DRep Directory, or did not submit correct metadata during registration.", title: "DRep Directory", votingPower: "Voting Power", }, From f0e58a841c763f25b5924c8d0afd44d3a98fcf97 Mon Sep 17 00:00:00 2001 From: Niraj Date: Mon, 28 Oct 2024 16:47:06 +0545 Subject: [PATCH 16/21] chore: update dRep form references url and link error testId --- .../playwright/lib/forms/dRepForm.ts | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts index cc578b217..3985e96d3 100644 --- a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts +++ b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts @@ -12,7 +12,14 @@ const formErrors = { ], linkDescription: "max-80-characters-error", email: "invalid-email-address-error", - link: "invalid-url-error", + links: { + url:"link-reference-description-1-error", + description: "link-reference-description-1-error", + }, + identity: { + url: "identity-reference-url-1-error", + description: "identity-reference-description-1-error", + }, paymentAddress: "invalid-payment-address-error", }; @@ -165,7 +172,8 @@ export default class DRepForm { dRepInfo.qualifications ); - await expect(this.form.getByTestId(formErrors.link)).toBeHidden(); + await expect(this.form.getByTestId(formErrors.links.url)).toBeHidden(); + await expect(this.form.getByTestId(formErrors.identity.url)).toBeHidden(); await expect(this.form.getByTestId(formErrors.paymentAddress)).toBeHidden(); await expect(this.continueBtn).toBeEnabled(); } @@ -190,7 +198,7 @@ export default class DRepForm { }) .all(); - expect(nameErrors.length).toBeGreaterThanOrEqual(1); // BUG duplicate test ids + expect(nameErrors.length).toBeGreaterThanOrEqual(1); await expect( this.form.getByTestId(formErrors.paymentAddress) @@ -206,14 +214,14 @@ export default class DRepForm { dRepInfo.qualifications ); - await expect(this.form.getByTestId(formErrors.link).first()).toBeVisible(); // BUG duplicate test ids + await expect(this.form.getByTestId(formErrors.links.url)).toBeVisible(); await expect( - this.form.getByTestId(formErrors.linkDescription).first() - ).toBeVisible(); // BUG duplicate test ids - await expect(this.form.getByTestId(formErrors.link).last()).toBeVisible(); // BUG duplicate test ids + this.form.getByTestId(formErrors.links.description) + ).toBeVisible(); + await expect(this.form.getByTestId(formErrors.identity.url)).toBeVisible(); await expect( - this.form.getByTestId(formErrors.linkDescription).last() - ).toBeVisible(); // BUG duplicate test ids + this.form.getByTestId(formErrors.identity.description) + ).toBeVisible(); await expect(this.continueBtn).toBeDisabled(); } From 9867c304220a2fd0c21653317d89b55f7bf775bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Mon, 28 Oct 2024 12:08:59 +0100 Subject: [PATCH 17/21] fix: drep list sql --- govtool/backend/sql/list-dreps.sql | 2 +- govtool/backend/src/VVA/AdaHolder.hs | 3 --- govtool/backend/src/VVA/DRep.hs | 4 ---- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/govtool/backend/sql/list-dreps.sql b/govtool/backend/sql/list-dreps.sql index 123a3ce1d..ea6414145 100644 --- a/govtool/backend/sql/list-dreps.sql +++ b/govtool/backend/sql/list-dreps.sql @@ -138,7 +138,7 @@ WHERE ( COALESCE(?, '') = '' OR dh.view ILIKE ? OR - off_chain_vote_drep_data.given_name ILIKE ? OR + off_chain_vote_drep_data.given_name ILIKE ? ) GROUP BY dh.raw, diff --git a/govtool/backend/src/VVA/AdaHolder.hs b/govtool/backend/src/VVA/AdaHolder.hs index 2678717ac..6a2ac3c33 100644 --- a/govtool/backend/src/VVA/AdaHolder.hs +++ b/govtool/backend/src/VVA/AdaHolder.hs @@ -29,9 +29,6 @@ import VVA.Types sqlFrom :: ByteString -> SQL.Query sqlFrom bs = fromString $ unpack $ Text.decodeUtf8 bs -listDRepsSql :: SQL.Query -listDRepsSql = sqlFrom $(embedFile "sql/list-dreps.sql") - getCurrentDelegationSql :: SQL.Query getCurrentDelegationSql = sqlFrom $(embedFile "sql/get-current-delegation.sql") diff --git a/govtool/backend/src/VVA/DRep.hs b/govtool/backend/src/VVA/DRep.hs index a8a95fb42..98c05ae5a 100644 --- a/govtool/backend/src/VVA/DRep.hs +++ b/govtool/backend/src/VVA/DRep.hs @@ -47,10 +47,6 @@ listDReps mSearchQuery = withPool $ \conn -> do ( searchParam , "%" <> searchParam <> "%" , "%" <> searchParam <> "%" - , "%" <> searchParam <> "%" - , "%" <> searchParam <> "%" - , "%" <> searchParam <> "%" - , "%" <> searchParam <> "%" ) timeZone <- liftIO getCurrentTimeZone return From 391ae0cd24baaa384e30c35fea69f4b68f1bf3b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Mon, 28 Oct 2024 14:15:00 +0100 Subject: [PATCH 18/21] fix(#2247): fix counting the CC votes on governance actions --- CHANGELOG.md | 1 + govtool/backend/sql/list-proposals.sql | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1838d9c7..9e1219bf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ changes. ### Fixed - Fix validating metadata against the CIP standard [Issue 2233](https://github.com/IntersectMBO/govtool/issues/2233) +- Fix counting the CC votes [Issue 2247](https://github.com/IntersectMBO/govtool/issues/2247) ### Changed diff --git a/govtool/backend/sql/list-proposals.sql b/govtool/backend/sql/list-proposals.sql index 5fa0c3058..4f717872c 100644 --- a/govtool/backend/sql/list-proposals.sql +++ b/govtool/backend/sql/list-proposals.sql @@ -129,14 +129,19 @@ FROM SUM(CASE WHEN vote = 'No' THEN 1 ELSE 0 END) AS ccNoVotes, SUM(CASE WHEN vote = 'Abstain' THEN 1 ELSE 0 END) AS ccAbstainVotes FROM - voting_procedure + voting_procedure AS vp WHERE - committee_voter IS NOT NULL + vp.committee_voter IS NOT NULL + AND (vp.tx_id, vp.committee_voter, vp.gov_action_proposal_id) IN ( + SELECT MAX(tx_id), committee_voter, gov_action_proposal_id + FROM voting_procedure + WHERE committee_voter IS NOT NULL + GROUP BY committee_voter, gov_action_proposal_id + ) GROUP BY gov_action_proposal_id ) vp_by_cc ON gov_action_proposal.id = vp_by_cc.gov_action_proposal_id - LEFT JOIN LatestDrepDistr ldd_cc ON ldd_cc.hash_id = voting_procedure.committee_voter AND ldd_cc.rn = 1 LEFT JOIN gov_action_proposal AS prev_gov_action ON gov_action_proposal.prev_gov_action_proposal = prev_gov_action.id From 4a414c7d2d61a2787d5040a20f5038932f4b357e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Mon, 28 Oct 2024 15:36:17 +0100 Subject: [PATCH 19/21] chore: bump GovTool to v1.0.23 --- CHANGELOG.md | 18 ++++++++++++++++++ govtool/backend/Dockerfile | 2 +- govtool/backend/Dockerfile.qovery | 2 +- govtool/backend/vva-be.cabal | 2 +- govtool/frontend/package-lock.json | 4 ++-- govtool/frontend/package.json | 4 ++-- govtool/metadata-validation/package-lock.json | 4 ++-- govtool/metadata-validation/package.json | 2 +- govtool/metadata-validation/src/main.ts | 2 +- 9 files changed, 29 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e1219bf4..0ea3e9be5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,24 @@ changes. ### Fixed +- + +### Changed + +- + +### Removed + +- + +## [v1.0.23](https://github.com/IntersectMBO/govtool/releases/tag/v1.0.23) 2024-10-28 + +### Added + +- Add searching for DRep and Proposal metadatas [Issue 1893](https://github.com/IntersectMBO/govtool/issues/1783) + +### Fixed + - Fix validating metadata against the CIP standard [Issue 2233](https://github.com/IntersectMBO/govtool/issues/2233) - Fix counting the CC votes [Issue 2247](https://github.com/IntersectMBO/govtool/issues/2247) diff --git a/govtool/backend/Dockerfile b/govtool/backend/Dockerfile index 3958d667c..8ea278247 100644 --- a/govtool/backend/Dockerfile +++ b/govtool/backend/Dockerfile @@ -4,4 +4,4 @@ FROM $BASE_IMAGE_REPO:$BASE_IMAGE_TAG WORKDIR /src COPY . . RUN cabal build -RUN cp dist-newstyle/build/x86_64-linux/ghc-9.2.7/vva-be-1.0.22/x/vva-be/build/vva-be/vva-be /usr/local/bin +RUN cp dist-newstyle/build/x86_64-linux/ghc-9.2.7/vva-be-1.0.23/x/vva-be/build/vva-be/vva-be /usr/local/bin diff --git a/govtool/backend/Dockerfile.qovery b/govtool/backend/Dockerfile.qovery index f569e7320..5d4b35a4d 100644 --- a/govtool/backend/Dockerfile.qovery +++ b/govtool/backend/Dockerfile.qovery @@ -4,7 +4,7 @@ FROM $BASE_IMAGE_REPO:$BASE_IMAGE_TAG WORKDIR /src COPY . . RUN cabal build -RUN cp dist-newstyle/build/x86_64-linux/ghc-9.2.7/vva-be-1.0.22/x/vva-be/build/vva-be/vva-be /usr/local/bin +RUN cp dist-newstyle/build/x86_64-linux/ghc-9.2.7/vva-be-1.0.23/x/vva-be/build/vva-be/vva-be /usr/local/bin # Expose the necessary port EXPOSE 9876 diff --git a/govtool/backend/vva-be.cabal b/govtool/backend/vva-be.cabal index 29cd2f744..8b750a2b3 100644 --- a/govtool/backend/vva-be.cabal +++ b/govtool/backend/vva-be.cabal @@ -1,6 +1,6 @@ cabal-version: 3.6 name: vva-be -version: 1.0.22 +version: 1.0.23 -- A short (one-line) description of the package. -- synopsis: diff --git a/govtool/frontend/package-lock.json b/govtool/frontend/package-lock.json index 819751b51..bdd0af72b 100644 --- a/govtool/frontend/package-lock.json +++ b/govtool/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "@govtool/frontend", - "version": "1.0.22", + "version": "1.0.23", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@govtool/frontend", - "version": "1.0.22", + "version": "1.0.23", "hasInstallScript": true, "dependencies": { "@emotion/react": "^11.11.1", diff --git a/govtool/frontend/package.json b/govtool/frontend/package.json index f5042b79f..d1892bfe9 100644 --- a/govtool/frontend/package.json +++ b/govtool/frontend/package.json @@ -1,7 +1,7 @@ { "name": "@govtool/frontend", "private": true, - "version": "1.0.22", + "version": "1.0.23", "type": "module", "scripts": { "build": "vite build", @@ -109,5 +109,5 @@ "typescript": "^5.0.2" }, "readme": "ERROR: No README data found!", - "_id": "govtool@1.0.22" + "_id": "govtool@1.0.23" } diff --git a/govtool/metadata-validation/package-lock.json b/govtool/metadata-validation/package-lock.json index 56f1d2455..a1dbcdbf8 100644 --- a/govtool/metadata-validation/package-lock.json +++ b/govtool/metadata-validation/package-lock.json @@ -1,12 +1,12 @@ { "name": "@govtool/metadata-validation", - "version": "1.0.22", + "version": "1.0.23", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@govtool/metadata-validation", - "version": "1.0.22", + "version": "1.0.23", "license": "UNLICENSED", "dependencies": { "@nestjs/axios": "^3.0.2", diff --git a/govtool/metadata-validation/package.json b/govtool/metadata-validation/package.json index 0a29cf148..4b2624b55 100644 --- a/govtool/metadata-validation/package.json +++ b/govtool/metadata-validation/package.json @@ -1,6 +1,6 @@ { "name": "@govtool/metadata-validation", - "version": "1.0.22", + "version": "1.0.23", "description": "", "author": "", "private": true, diff --git a/govtool/metadata-validation/src/main.ts b/govtool/metadata-validation/src/main.ts index 8183e2676..52cc325b0 100644 --- a/govtool/metadata-validation/src/main.ts +++ b/govtool/metadata-validation/src/main.ts @@ -13,7 +13,7 @@ async function bootstrap() { const config = new DocumentBuilder() .setTitle('Metadata Validation Tool') .setDescription('The Metadata Validation Tool API description') - .setVersion('1.0.22') + .setVersion('1.0.23') .build(); const document = SwaggerModule.createDocument(app, config); From 69ebd77085194bf8bfffc0f9e68375ce98b01b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Tue, 29 Oct 2024 10:48:29 +0100 Subject: [PATCH 20/21] chore: update GovTool-v1.0.23 release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea3e9be5..4181941a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ changes. - -## [v1.0.23](https://github.com/IntersectMBO/govtool/releases/tag/v1.0.23) 2024-10-28 +## [v1.0.23](https://github.com/IntersectMBO/govtool/releases/tag/v1.0.23) 2024-10-29 ### Added From a0fadf931003f91dc0cb3531408c6df2037d1f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Sza=C5=82owski?= Date: Tue, 29 Oct 2024 14:58:27 +0100 Subject: [PATCH 21/21] fix: handle no results on get votes query --- govtool/backend/src/VVA/DRep.hs | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/govtool/backend/src/VVA/DRep.hs b/govtool/backend/src/VVA/DRep.hs index 98c05ae5a..730814e4f 100644 --- a/govtool/backend/src/VVA/DRep.hs +++ b/govtool/backend/src/VVA/DRep.hs @@ -107,17 +107,23 @@ getVotes :: m ([Vote], [Proposal]) getVotes drepId selectedProposals = withPool $ \conn -> do results <- liftIO $ SQL.query conn getVotesSql (SQL.Only drepId) - let proposalsToSelect = if null selectedProposals - then [ govActionId | (_, govActionId, _, _, _, _, _, _, _) <- results] - else selectedProposals - proposals <- Proposal.getProposals (Just proposalsToSelect) - let proposalMap = M.fromList $ map (\x -> (proposalId x, x)) proposals - timeZone <- liftIO getCurrentTimeZone - return - ([ Vote proposalId' drepId' vote' url' docHash' epochNo' (localTimeToUTC timeZone date') voteTxHash' - | (proposalId', govActionId', drepId', vote', url', docHash', epochNo', date', voteTxHash') <- results - , govActionId' `elem` proposalsToSelect - ], proposals) + + if null results + then return ([], []) + else do + let proposalsToSelect = if null selectedProposals + then [ govActionId | (_, govActionId, _, _, _, _, _, _, _) <- results] + else selectedProposals + proposals <- if null proposalsToSelect + then return [] + else Proposal.getProposals (Just proposalsToSelect) + let proposalMap = M.fromList $ map (\x -> (proposalId x, x)) proposals + timeZone <- liftIO getCurrentTimeZone + let votes = [ Vote proposalId' drepId' vote' url' docHash' epochNo' (localTimeToUTC timeZone date') voteTxHash' + | (proposalId', govActionId', drepId', vote', url', docHash', epochNo', date', voteTxHash') <- results + , govActionId' `elem` proposalsToSelect + ] + return (votes, proposals) getDRepInfoSql :: SQL.Query getDRepInfoSql = sqlFrom $(embedFile "sql/get-drep-info.sql")