From a101555f77ecf9ffcf044b6901621046998c94f6 Mon Sep 17 00:00:00 2001 From: nabinpkl Date: Fri, 23 Aug 2024 01:04:00 -0400 Subject: [PATCH 01/47] Add governance script support for gov action loader --- .../backend/app/data/gov-script.plutus | 5 ++ gov-action-loader/backend/app/main.py | 26 +++------- gov-action-loader/backend/app/transaction.py | 52 ++++++++++++++++--- .../frontend/src/views/SpecificLoad.vue | 2 +- 4 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 gov-action-loader/backend/app/data/gov-script.plutus diff --git a/gov-action-loader/backend/app/data/gov-script.plutus b/gov-action-loader/backend/app/data/gov-script.plutus new file mode 100644 index 000000000..06da9f61f --- /dev/null +++ b/gov-action-loader/backend/app/data/gov-script.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "", + "cborHex": "59082f59082c0101003232323232323232323232323232323232323232323232323232323232323232323232323232323232323225932325333573466e1d2000001180098121bab357426ae88d55cf001054ccd5cd19b874801000460042c6aae74004dd51aba1357446ae88d55cf1baa325333573466e1d200a35573a00226ae84d5d11aab9e0011637546ae84d5d11aba235573c6ea800642b26006003149a2c8a4c3021801c0052000c00e0070018016006901e40608058c00e00290016007003800c00b0034830268320306007001800600690406d6204e00060001801c0052004c00e007001801600690404001e0006007001800600690404007e00060001801c0052006c00e006023801c006001801a4101000980018000600700148023003801808e0070018006006904827600060001801c005200ac00e0070018016006904044bd4060c00e003000c00d2080ade204c000c0003003800a4019801c00e003002c00d2080cab5ee0180c100d1801c005200ec00e0060238000c00e00290086007003800c00b003483d00e0306007001800600690500fe00040243003800a4025803c00c01a0103003800a4029803c00e003002c00cc07520d00f8079801c006001801980ea4120078001800060070014805b00780180360070018006006603e900a4038c0003003800a4041801c00c04601a3003800a4045801c00e003002c00d20f02e80c1801c006001801a4190cb80010090c00e00290126000c00e0029013600b003803c00e003002c00cc0752032c000c00e003000c00cc075200ac000c0006007007801c006005801980ea418170058001801c006001801980ea41209d80018000c0003003800a4051802c00e007003011c00e003000c00d2080e89226c000c0006007003801808e007001800600690406c4770b7e000600030000c00e0029015600b003801c00c047003800c00300348202e2e1cb00030001801c00e006023801c006001801a410181f905540580018000c0003003800a4059801c00c047003800c00300348203000700030000c00e00290176007003800c00b003483200603060070018006006904801e00040243003800a4061801c00c0430001801c0052032c016006003801801e00600780180140100c00e002901a600b003001c00c00f003003c00c00f003002c00c007003001c00c007003803c00e003002c00c0560184014802000c00e002901b6007003800c00b003480030034801b0001801c006001801a4029800180006007001480e3003801c006005801a4001801a40498000c00e003000c00d20ca04c00080486007001480eb00380180860070018006006900f600060001801c005203cc00e006015801c006001801a4101012bcf138c09800180006007001480fb003801805600700180060069040505bc3f482e00060001801c0052040c00e0070018016006900d4060c00e003000c00d204ac000c0003003800a4085801c00c04601630000000000200f003006c00e003000c00c05a0166000200f003005c00e003000c00c057003010c0006000200f003800c00b003012c00cc05d2028c0004008801c01e007001801600602380010043000400e003000c00c04b003011c0006000800c00b00300d8049001801600601d801980924190038000801c0060010066000801c00600900f6000800c00b003480030034820225eb0001003800c003003483403f0003000400c023000400e003000c00d208094ebdc03c000c001003009c001003300f4800b0004006005801a40058001001801401c6014900518052402860169004180424008600a900a180324005003480030001806240cc6016900d18052402460129004180424004600e900018032400c6014446666aae7c004a0005003328009aab9d0019aab9e0011aba100298019aba200224c6012444a6520071300149a4432005225900689802a4d2219002912c998099bad0020068ac99807002800c4cc03001c00e300244cc03001c02a3002012c801460012218010c00888004c004880094cc8c0040048848c8cc0088c00888c00800c8c00888c00400c8d4cc01001000cd400c0044888cc00c896400a300090999804c00488ccd5cd19b87002001800400a01522333573466e2000800600100291199ab9a33712004003000801488ccd5cd19b89002001801400244666ae68cdc4001000c00a001225333573466e240080044004400a44a666ae68cdc4801000880108008004dd6801484cc010004dd6001484c8ccc02a002452005229003912999ab9a3370e0080042666ae68cdc3801800c00200430022452005229003911980899b820040013370400400648a400a45200722333573466e20cdc100200099b82002003800400880648a400a45200722333573466e24cdc100200099b82002003801400091480148a400e44666ae68cdc419b8200400133704004007002800122593300e0020018800c400922593300e00200188014400400233323357346ae8cd5d10009198051bad357420066eb4d5d08011aba2001268001bac00214800c8ccd5cd1aba3001800400a444b26600c0066ae8400626600a0046ae8800630020c0148894ccd5cd19b87480000045854ccd5cd19b88001480004cc00ccdc0a400000466e05200000113280099b8400300199b840020011980200100098021112999ab9a3370e9000000880109980180099b860020012223300622590018c002443200522323300d225900189804803488564cc0140080322600800318010004b20051900991111111001a3201322222222005448964ce402e444444440100020018c00a30000002225333573466e1c00800460002a666ae68cdc48010008c010600445200522900391199ab9a3371266e08010004cdc1001001c0020041191800800918011198010010009" +} \ No newline at end of file diff --git a/gov-action-loader/backend/app/main.py b/gov-action-loader/backend/app/main.py index 268ee1b3d..88e2d4d3c 100644 --- a/gov-action-loader/backend/app/main.py +++ b/gov-action-loader/backend/app/main.py @@ -15,7 +15,9 @@ from app.transaction import (get_base_proposal_for_multiple, get_default_transaction, get_proposal_data_from_type, - main_wallet, submit_proposal_tx) + main_wallet, submit_proposal_tx, + get_gov_script + ) app = FastAPI() add_cors(app) @@ -125,6 +127,9 @@ async def submit_single_proposal( combined_proposal = default_proposal_data | proposal default_transaction["proposals"][0] = combined_proposal + if "withdraw" in combined_proposal or "parameterupdate" in combined_proposal: + combined_proposal["script"] = get_gov_script() + tx_url = settings.kuber_api_url + "/api/v1/tx?submit=true" kuber_response = await client.post( tx_url, @@ -141,22 +146,3 @@ async def submit_single_proposal( raise HTTPException( status_code=kuber_response.status_code, detail=kuber_response.text ) - - -@app.get("/api/blockfrost/transaction/{tx_hash}") -async def get_transaction_from_blockfrost( - tx_hash: str, - client: httpx.AsyncClient = Depends(get_client), -): - tx_url = settings.blockfrost_api_url + "/txs/" + tx_hash - tx_response = await client.get( - tx_url, - headers={"project_id": settings.blockfrost_project_id}, - ) - if tx_response.status_code == 200: - return tx_response.json() - else: - print(tx_response.text) - raise HTTPException( - status_code=tx_response.status_code, detail=tx_response.json() - ) diff --git a/gov-action-loader/backend/app/transaction.py b/gov-action-loader/backend/app/transaction.py index 8b980f5aa..8310ea927 100644 --- a/gov-action-loader/backend/app/transaction.py +++ b/gov-action-loader/backend/app/transaction.py @@ -115,6 +115,13 @@ def change_pp_value(random_parameter): return random_parameter +def get_gov_script(): + with open("app/data/gov-script.plutus", "r") as script_file: + script_str = script_file.read() + script_json = json.loads(script_str) + return script_json + + def get_proposal_data_from_type(proposal_type, current_pParams): match proposal_type: case "constitution": @@ -126,7 +133,10 @@ def get_proposal_data_from_type(proposal_type, current_pParams): } case "withdrawal": number_of_addresses = random.randint(1, 5) - return {"withdraw": generate_withdraw(number_of_addresses)} + return { + "script": get_gov_script(), + "withdraw": generate_withdraw(number_of_addresses), + } case "no-confidence": return {"noconfidence": True} case "update-committee": @@ -146,7 +156,10 @@ def get_proposal_data_from_type(proposal_type, current_pParams): keys = pParams.keys() rand_key = random.choice(filter_updatable_paramKeys(list(keys))) # recurse into the innermost element of that key and change it by +-1, all protocol parameter value is either float or int - return {"parameterupdate": {rand_key: change_pp_value(pParams[rand_key])}} + return { + "script": get_gov_script(), + "parameterupdate": {rand_key: change_pp_value(pParams[rand_key])}, + } # added_proposal = case "info": return {} @@ -160,11 +173,36 @@ def get_proposal_data_from_type(proposal_type, current_pParams): def filter_updatable_paramKeys(keys): - updatable_keys = {"maxBlockSize", "maxBBSize", "maxTxSize", "maxBHSize", "keyDeposit", "poolDeposit", "eMax", - "nOpt", "a0", "rho", "tau", "minPoolCost", "coinsPerUTxOByte", "costModels", "prices", - "maxTxExUnits", "maxBlockExUnits", "maxValSize", "collateralPercentage", "maxCollateralInputs", - "poolVotingThresholds", "dRepVotingThresholds", "committeeMinSize", "committeeMaxTermLength", - "govActionLifetime", "govActionDeposit", "dRepDeposit", "dRepActivity"} + updatable_keys = { + "maxBlockSize", + "maxBBSize", + "maxTxSize", + "maxBHSize", + "keyDeposit", + "poolDeposit", + "eMax", + "nOpt", + "a0", + "rho", + "tau", + "minPoolCost", + "coinsPerUTxOByte", + "costModels", + "prices", + "maxTxExUnits", + "maxBlockExUnits", + "maxValSize", + "collateralPercentage", + "maxCollateralInputs", + "poolVotingThresholds", + "dRepVotingThresholds", + "committeeMinSize", + "committeeMaxTermLength", + "govActionLifetime", + "govActionDeposit", + "dRepDeposit", + "dRepActivity", + } return [x for x in keys if x in updatable_keys] diff --git a/gov-action-loader/frontend/src/views/SpecificLoad.vue b/gov-action-loader/frontend/src/views/SpecificLoad.vue index 9d1181bf4..4ddcfa3e7 100644 --- a/gov-action-loader/frontend/src/views/SpecificLoad.vue +++ b/gov-action-loader/frontend/src/views/SpecificLoad.vue @@ -956,7 +956,7 @@ export default { break case 'Info': break - case 'Withdrawl': + case 'Withdrawal': proposal_data['withdraw'] = this.treasuryWithdrawalAddresses.reduce((obj, key, index) => { obj[key] = parseInt(this.treasuryAmounts[index]) return obj From 4166cbc13172dfc7628e1557fde19e133fc5f83f Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 10:50:11 +0545 Subject: [PATCH 02/47] Add multiple testnet feature --- .gitignore | 2 +- gov-action-loader/backend/.env.example | 4 +++- gov-action-loader/backend/app/funds.py | 14 +++++++------ .../guardrails/guardrails-sanchonet.plutus | 5 +++++ gov-action-loader/backend/app/main.py | 20 ++++++++++++------- gov-action-loader/backend/app/models.py | 1 + gov-action-loader/backend/app/network.py | 15 ++++++++++++++ gov-action-loader/backend/app/settings.py | 4 +++- gov-action-loader/backend/app/transaction.py | 9 +++++---- 9 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus create mode 100644 gov-action-loader/backend/app/network.py diff --git a/.gitignore b/.gitignore index 05f1097fb..ccd0c617b 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,7 @@ node_storage/ # MSVC Windows builds of rustc generate these, which store debugging information *.pdb - +.venv ### Windows ### # Windows thumbnail cache files Thumbs.db diff --git a/gov-action-loader/backend/.env.example b/gov-action-loader/backend/.env.example index 8997b5adf..d0868c32f 100644 --- a/gov-action-loader/backend/.env.example +++ b/gov-action-loader/backend/.env.example @@ -1,2 +1,4 @@ -KUBER_API_URL=https://sanchonet.kuber.cardanoapi.io +KUBER_API_URL_SANCHO=https://sanchonet.kuber.cardanoapi.io +KUBER_API_URL_PREVIEW=https://preview.kuber.cardanoapi.io +KUBER_API_URL_PREPROD=https://preprod.kuber.cardanoapi.io KUBER_API_KEY=xxxxxxxxxxxxx diff --git a/gov-action-loader/backend/app/funds.py b/gov-action-loader/backend/app/funds.py index 6899ddc3c..015f0c511 100644 --- a/gov-action-loader/backend/app/funds.py +++ b/gov-action-loader/backend/app/funds.py @@ -2,13 +2,15 @@ from fastapi import HTTPException +from app.network import get_api_url from app.settings import settings from app.transaction import (default_proposal_deposit_ada, main_wallet, submit_tx) -async def get_ada_balance(address, client): - utxo_url = settings.kuber_api_url + "/api/v3/utxo" +async def get_ada_balance(address, client, network): + + utxo_url = get_api_url(network) + "/api/v3/utxo" kuber_response = await client.get( utxo_url, params={"address": address}, @@ -25,8 +27,8 @@ async def get_ada_balance(address, client): ) -async def get_protocol_params(client): - pParamsQuery = settings.kuber_api_url + "/api/v3/protocol-params" +async def get_protocol_params(client, network): + pParamsQuery = get_api_url(network) + "/api/v3/protocol-params" kuber_response = await client.get( pParamsQuery, headers={"api-key": settings.kuber_api_key}, @@ -41,7 +43,7 @@ async def get_protocol_params(client): async def check_balance_and_fund_wallets( - wallets, supported_proposals_in_single_tx, per_proposal_deposit, client + wallets, supported_proposals_in_single_tx, per_proposal_deposit, client, network ): wallets_with_balance = await asyncio.gather( *[get_ada_balance(wallet["address"], client) for wallet in wallets] @@ -82,7 +84,7 @@ async def check_balance_and_fund_wallets( for wallet in low_balance_wallets ], } - tx = await submit_tx(fund_from_main_tx, client) + tx = await submit_tx(fund_from_main_tx, client, network) raise HTTPException( status_code=412, detail="This action required multiple transaction and wallet setup TX:" diff --git a/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus b/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus new file mode 100644 index 000000000..06da9f61f --- /dev/null +++ b/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "", + "cborHex": "59082f59082c0101003232323232323232323232323232323232323232323232323232323232323232323232323232323232323225932325333573466e1d2000001180098121bab357426ae88d55cf001054ccd5cd19b874801000460042c6aae74004dd51aba1357446ae88d55cf1baa325333573466e1d200a35573a00226ae84d5d11aab9e0011637546ae84d5d11aba235573c6ea800642b26006003149a2c8a4c3021801c0052000c00e0070018016006901e40608058c00e00290016007003800c00b0034830268320306007001800600690406d6204e00060001801c0052004c00e007001801600690404001e0006007001800600690404007e00060001801c0052006c00e006023801c006001801a4101000980018000600700148023003801808e0070018006006904827600060001801c005200ac00e0070018016006904044bd4060c00e003000c00d2080ade204c000c0003003800a4019801c00e003002c00d2080cab5ee0180c100d1801c005200ec00e0060238000c00e00290086007003800c00b003483d00e0306007001800600690500fe00040243003800a4025803c00c01a0103003800a4029803c00e003002c00cc07520d00f8079801c006001801980ea4120078001800060070014805b00780180360070018006006603e900a4038c0003003800a4041801c00c04601a3003800a4045801c00e003002c00d20f02e80c1801c006001801a4190cb80010090c00e00290126000c00e0029013600b003803c00e003002c00cc0752032c000c00e003000c00cc075200ac000c0006007007801c006005801980ea418170058001801c006001801980ea41209d80018000c0003003800a4051802c00e007003011c00e003000c00d2080e89226c000c0006007003801808e007001800600690406c4770b7e000600030000c00e0029015600b003801c00c047003800c00300348202e2e1cb00030001801c00e006023801c006001801a410181f905540580018000c0003003800a4059801c00c047003800c00300348203000700030000c00e00290176007003800c00b003483200603060070018006006904801e00040243003800a4061801c00c0430001801c0052032c016006003801801e00600780180140100c00e002901a600b003001c00c00f003003c00c00f003002c00c007003001c00c007003803c00e003002c00c0560184014802000c00e002901b6007003800c00b003480030034801b0001801c006001801a4029800180006007001480e3003801c006005801a4001801a40498000c00e003000c00d20ca04c00080486007001480eb00380180860070018006006900f600060001801c005203cc00e006015801c006001801a4101012bcf138c09800180006007001480fb003801805600700180060069040505bc3f482e00060001801c0052040c00e0070018016006900d4060c00e003000c00d204ac000c0003003800a4085801c00c04601630000000000200f003006c00e003000c00c05a0166000200f003005c00e003000c00c057003010c0006000200f003800c00b003012c00cc05d2028c0004008801c01e007001801600602380010043000400e003000c00c04b003011c0006000800c00b00300d8049001801600601d801980924190038000801c0060010066000801c00600900f6000800c00b003480030034820225eb0001003800c003003483403f0003000400c023000400e003000c00d208094ebdc03c000c001003009c001003300f4800b0004006005801a40058001001801401c6014900518052402860169004180424008600a900a180324005003480030001806240cc6016900d18052402460129004180424004600e900018032400c6014446666aae7c004a0005003328009aab9d0019aab9e0011aba100298019aba200224c6012444a6520071300149a4432005225900689802a4d2219002912c998099bad0020068ac99807002800c4cc03001c00e300244cc03001c02a3002012c801460012218010c00888004c004880094cc8c0040048848c8cc0088c00888c00800c8c00888c00400c8d4cc01001000cd400c0044888cc00c896400a300090999804c00488ccd5cd19b87002001800400a01522333573466e2000800600100291199ab9a33712004003000801488ccd5cd19b89002001801400244666ae68cdc4001000c00a001225333573466e240080044004400a44a666ae68cdc4801000880108008004dd6801484cc010004dd6001484c8ccc02a002452005229003912999ab9a3370e0080042666ae68cdc3801800c00200430022452005229003911980899b820040013370400400648a400a45200722333573466e20cdc100200099b82002003800400880648a400a45200722333573466e24cdc100200099b82002003801400091480148a400e44666ae68cdc419b8200400133704004007002800122593300e0020018800c400922593300e00200188014400400233323357346ae8cd5d10009198051bad357420066eb4d5d08011aba2001268001bac00214800c8ccd5cd1aba3001800400a444b26600c0066ae8400626600a0046ae8800630020c0148894ccd5cd19b87480000045854ccd5cd19b88001480004cc00ccdc0a400000466e05200000113280099b8400300199b840020011980200100098021112999ab9a3370e9000000880109980180099b860020012223300622590018c002443200522323300d225900189804803488564cc0140080322600800318010004b20051900991111111001a3201322222222005448964ce402e444444440100020018c00a30000002225333573466e1c00800460002a666ae68cdc48010008c010600445200522900391199ab9a3371266e08010004cdc1001001c0020041191800800918011198010010009" +} \ No newline at end of file diff --git a/gov-action-loader/backend/app/main.py b/gov-action-loader/backend/app/main.py index 88e2d4d3c..0948ade35 100644 --- a/gov-action-loader/backend/app/main.py +++ b/gov-action-loader/backend/app/main.py @@ -1,16 +1,17 @@ import asyncio import json import math -from typing import Any, Dict +from typing import Any, Dict, Literal import httpx -from fastapi import Depends, FastAPI, HTTPException +from fastapi import Depends, FastAPI, HTTPException, Header from app.cors import add_cors from app.funds import (check_balance_and_fund_wallets, get_ada_balance, get_protocol_params) from app.http_utils import get_client from app.models import MultipleProposal +from app.network import get_api_url from app.settings import settings from app.transaction import (get_base_proposal_for_multiple, get_default_transaction, @@ -27,13 +28,14 @@ async def submit_multiple_proposals( multi_proposal: MultipleProposal, client: httpx.AsyncClient = Depends(get_client), + network: str = Header(...) ): required_proposals = multi_proposal.no_of_proposals base_proposal = get_base_proposal_for_multiple() supported_proposals_in_single_tx = 50 maximum_supported_proposals = 10000 - pparams = await get_protocol_params(client) + pparams = await get_protocol_params(client, network) if required_proposals <= supported_proposals_in_single_tx: tx = await submit_proposal_tx( @@ -42,6 +44,7 @@ async def submit_multiple_proposals( | get_proposal_data_from_type(multi_proposal.proposal_type, pparams), required_proposals, client, + network ) return [{"proposal_count": required_proposals, "tx_hash": tx}] elif required_proposals <= maximum_supported_proposals: @@ -75,6 +78,7 @@ async def submit_multiple_proposals( supported_proposals_in_single_tx, per_proposal_deposit, client, + network ) proposals_numbers_in_last_tx = ( @@ -95,6 +99,7 @@ async def submit_multiple_proposals( if wallet != required_wallets[-1] else proposals_numbers_in_last_tx, client, + network ) for wallet in required_wallets ] @@ -113,14 +118,16 @@ async def submit_multiple_proposals( @app.get("/api/balance") -async def getWalletBalance(client: httpx.AsyncClient = Depends(get_client)): - return await get_ada_balance(main_wallet["address"], client) +async def getWalletBalance(client: httpx.AsyncClient = Depends(get_client), + network: str = Header(...)): + return await get_ada_balance(main_wallet["address"], client, network) @app.post("/api/load/single") async def submit_single_proposal( proposal: Dict[str, Any], client: httpx.AsyncClient = Depends(get_client), + network: str = Header(...) ): default_transaction = get_default_transaction() default_proposal_data = default_transaction["proposals"][0] @@ -129,8 +136,7 @@ async def submit_single_proposal( if "withdraw" in combined_proposal or "parameterupdate" in combined_proposal: combined_proposal["script"] = get_gov_script() - - tx_url = settings.kuber_api_url + "/api/v1/tx?submit=true" + tx_url = get_api_url(network) + "/api/v1/tx?submit=true" kuber_response = await client.post( tx_url, json=default_transaction, diff --git a/gov-action-loader/backend/app/models.py b/gov-action-loader/backend/app/models.py index 8a124a885..01bfa4c09 100644 --- a/gov-action-loader/backend/app/models.py +++ b/gov-action-loader/backend/app/models.py @@ -4,3 +4,4 @@ class MultipleProposal(BaseModel): proposal_type: str no_of_proposals: int + \ No newline at end of file diff --git a/gov-action-loader/backend/app/network.py b/gov-action-loader/backend/app/network.py new file mode 100644 index 000000000..c2ed2280a --- /dev/null +++ b/gov-action-loader/backend/app/network.py @@ -0,0 +1,15 @@ +from fastapi import HTTPException +from app.settings import settings + +NETWORKS = {"preview", "preprod", "sanchonet"} + +def get_api_url (network): + network_l_case = network.lower() + if network_l_case == "sancho" or "sanchonet": + return settings.kuber_api_url_sancho + elif network_l_case == "preview": + return settings.kuber_api_url_preview + elif network_l_case == "preprod": + return settings.kuber_api_url_preprod + else: + raise HTTPException(status_code=400, detail=f"Invalid network: {network}. Expected: {NETWORKS}") \ No newline at end of file diff --git a/gov-action-loader/backend/app/settings.py b/gov-action-loader/backend/app/settings.py index 02095e720..fa1eff63c 100644 --- a/gov-action-loader/backend/app/settings.py +++ b/gov-action-loader/backend/app/settings.py @@ -2,7 +2,9 @@ class Settings(BaseSettings): - kuber_api_url: str + kuber_api_url_sancho: str + kuber_api_url_preview: str + kuber_api_url_preprod: str kuber_api_key: str = '' settings = Settings() diff --git a/gov-action-loader/backend/app/transaction.py b/gov-action-loader/backend/app/transaction.py index 8310ea927..e0cb2736f 100644 --- a/gov-action-loader/backend/app/transaction.py +++ b/gov-action-loader/backend/app/transaction.py @@ -10,6 +10,7 @@ from fastapi import HTTPException +from app.network import get_api_url from app.settings import settings main_wallet = { @@ -206,9 +207,9 @@ def filter_updatable_paramKeys(keys): return [x for x in keys if x in updatable_keys] -async def submit_tx(tx, client, submit=True): +async def submit_tx(tx, client, network, submit=True): submit_query = "?submit=true" if submit else "" - tx_url = settings.kuber_api_url + "/api/v1/tx" + submit_query + tx_url = get_api_url(network) + "/api/v1/tx" + submit_query response = await client.post( tx_url, json=tx, @@ -225,7 +226,7 @@ async def submit_tx(tx, client, submit=True): raise HTTPException(status_code=response.status_code, detail=response.text) -async def submit_proposal_tx(wallet, proposal, proposal_numbers, client): +async def submit_proposal_tx(wallet, proposal, proposal_numbers, client, network): proposals = [ { **proposal, @@ -240,4 +241,4 @@ async def submit_proposal_tx(wallet, proposal, proposal_numbers, client): "selections": [wallet["address"], wallet["skey"]], "proposals": proposals, } - return await submit_tx(tx, client) + return await submit_tx(tx, client, network) From cea87fb198a41b60189d3f3dae649a2e8b93e80d Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 12:58:08 +0545 Subject: [PATCH 03/47] FIx api network selection --- gov-action-loader/backend/app/network.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gov-action-loader/backend/app/network.py b/gov-action-loader/backend/app/network.py index c2ed2280a..5c9fbaa84 100644 --- a/gov-action-loader/backend/app/network.py +++ b/gov-action-loader/backend/app/network.py @@ -5,7 +5,7 @@ def get_api_url (network): network_l_case = network.lower() - if network_l_case == "sancho" or "sanchonet": + if network_l_case == "sancho" or network_l_case == "sanchonet": return settings.kuber_api_url_sancho elif network_l_case == "preview": return settings.kuber_api_url_preview From 56dd69de58bb90c5d683ff544411511f3127131f Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 13:00:45 +0545 Subject: [PATCH 04/47] Add guardrail script input and remove mock database --- .../frontend/src/views/SpecificLoad.vue | 348 ++++++------------ 1 file changed, 115 insertions(+), 233 deletions(-) diff --git a/gov-action-loader/frontend/src/views/SpecificLoad.vue b/gov-action-loader/frontend/src/views/SpecificLoad.vue index 4ddcfa3e7..cef03c9d9 100644 --- a/gov-action-loader/frontend/src/views/SpecificLoad.vue +++ b/gov-action-loader/frontend/src/views/SpecificLoad.vue @@ -12,17 +12,13 @@ import config from '../config'
- +
-
-
Previous Gov Action ID (optional)
+
+
Previous Gov Action ID (optional) +
@@ -30,13 +26,8 @@ import config from '../config'
Proposal deposit (optional)
- +
@@ -61,10 +52,11 @@ import config from '../config' - +
- +
- - - - + + + -
+ + + +
+
@@ -101,38 +91,20 @@ import config from '../config' * - - + +
Add To Committee
- - - - + + + -
+ @@ -144,12 +116,10 @@ import config from '../config'
Remove From Committee
- - - + + -
+ @@ -164,20 +134,10 @@ import config from '../config' * - - + +
@@ -188,75 +148,35 @@ import config from '../config' * - - - - - - - - - + + + + + + + + + - - + + - + @@ -289,47 +209,31 @@ import config from '../config' - + - + Copy - - - + + + - + - + Copy @@ -337,66 +241,34 @@ import config from '../config' - + - + Copy - - - - - - + + + + + +
- + Submitting... Submit @@ -416,7 +288,8 @@ import config from '../config'
Transaction submitted successfully.
@@ -433,6 +306,11 @@ export default { props: { selectedNetwork: String, }, + // watch: { + // selectedNetwork(newValue) { + // setNetwork(newValue); + // } + // }, data() { return { // Data related to governance action form @@ -456,6 +334,8 @@ export default { majorProtocol: '', minorProtocol: '', + guardrailScript: '', + maxblocksize: null, minFeeA: null, MaxBBSize: null, @@ -961,6 +841,12 @@ export default { obj[key] = parseInt(this.treasuryAmounts[index]) return obj }, {}) + proposal_data['script'] = + { + type: "PlutusScriptV3", + description: "", + cborHex: this.guardrailScript + } break case 'No Confidence': proposal_data['noconfidence'] = true @@ -1015,8 +901,8 @@ export default { ...(this.CommitteeMinSize != null ? { CommitteeMinSize: parseInt(this.CommitteeMinSize) } : {}), ...(this.CommitteeMaxTermLength != null ? { - CommitteeMaxTermLength: parseInt(this.CommitteeMaxTermLength), - } + CommitteeMaxTermLength: parseInt(this.CommitteeMaxTermLength), + } : {}), ...(this.GovActionLifetime != null ? { GovActionLifetime: parseInt(this.GovActionLifetime) } : {}), ...(this.GovActionDeposit != null ? { GovActionDeposit: parseInt(this.GovActionDeposit) } : {}), @@ -1025,12 +911,8 @@ export default { } break } - if (this.selectedNetwork == 'Mock Database') { - console.log('Mock database') - this.submitProposalToMock(this.selectedAction, proposal_data) - } else { - this.submitProposalViaKuber(proposal_data) - } + + this.submitProposalViaKuber(proposal_data) }, submitProposalViaKuber(proposal_data) { this.loading = true From 97ef2abbddc5c57584bca1c68bc0492137511764 Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 13:01:07 +0545 Subject: [PATCH 05/47] Add network header on api calls --- gov-action-loader/frontend/src/App.vue | 59 +++++++++++++++++--------- gov-action-loader/frontend/src/api.ts | 18 +++++--- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/gov-action-loader/frontend/src/App.vue b/gov-action-loader/frontend/src/App.vue index 4a1d5a291..ff78cfd06 100644 --- a/gov-action-loader/frontend/src/App.vue +++ b/gov-action-loader/frontend/src/App.vue @@ -7,7 +7,8 @@ - + @@ -18,13 +19,19 @@ Bulk Load
-
+
-
+ +
+ Loading Balance ... +
+ + +
{{ walletInfo.balance }} Ada
@@ -53,21 +60,7 @@ export default { SpecificLoad, }, mounted() { - const fetchInterval = 7000 - const updateBalance = async () => { - getBalance() - .then((response) => { - if (response.data?.address) { - this.walletInfo.address = response.data.address - this.walletInfo.balance = response.data.totalValue - } - console.log('Wallet balance', response) - }) - .finally(() => { - this.timoutId = setTimeout(updateBalance, fetchInterval) - }) - } - Promise.resolve(updateBalance()) + this.updateBalance() }, unmounted() { if (this.timeoutId) { @@ -78,14 +71,42 @@ export default { return { tab: null, selectedNetwork: 'Sanchonet', // Default selection - networkOptions: ['Mock Database', 'Sanchonet'], + networkOptions: ['Sanchonet', 'Preview', 'Preprod'], walletInfo: { address: null, balance: null, }, timeoutId: null, + fetchInterval: 7000, + loading: false } }, + methods: { + async updateBalance() { + this.loading = true; + try { + const response = await getBalance(this.selectedNetwork) + if (response.data?.address) { + this.walletInfo.address = response.data.address + this.walletInfo.balance = response.data.totalValue + } + console.log('Wallet balance', response) + } catch (error) { + console.error('Error updating balance:', error) + } finally { + this.loading = false; + this.timeoutId = setTimeout(this.updateBalance, this.fetchInterval) + } + }, + }, + watch: { + selectedNetwork() { + if (this.timeoutId) { + clearTimeout(this.timeoutId) + } + this.updateBalance() + }, + }, } diff --git a/gov-action-loader/frontend/src/api.ts b/gov-action-loader/frontend/src/api.ts index 9d3584daa..5417b587c 100644 --- a/gov-action-loader/frontend/src/api.ts +++ b/gov-action-loader/frontend/src/api.ts @@ -1,24 +1,28 @@ import axios from 'axios' import config from './config' - axios.defaults.headers.common['Content-Type'] = 'application/json' +let NETWORK: string = '' + + export async function submitMultipleProposals(proposalType: string, noOfProposals: number) { const loadMultipleUrl = config.dataLoaderApi + '/api/load/multiple' const data = { proposal_type: proposalType, no_of_proposals: noOfProposals, } - return await axios.post(loadMultipleUrl, data) + return await axios.post(loadMultipleUrl, data, {headers:{network: NETWORK}}) } -export async function getBalance() { +export async function getBalance(selectedNetwork: string) { const loadSingleUrl = config.dataLoaderApi + '/api/balance' - return await axios.get(loadSingleUrl) + NETWORK = selectedNetwork + return await axios.get(loadSingleUrl, {headers:{network: selectedNetwork}}) } export async function submitSingleProposal(data?: any) { const loadSingleUrl = config.dataLoaderApi + '/api/load/single' - return await axios.post(loadSingleUrl, data) + console.log("data: ", data); + return await axios.post(loadSingleUrl, data, {headers:{network: NETWORK}}) } function generateRandomId(length: number) { @@ -61,7 +65,7 @@ export async function submitSingleProposalMock(action: String, data?: any) { url: data['anchor'].url, } break - case 'Withdrawl': + case 'Withdrawal': let withdrawAddress = Object.keys(data['withdraw'])[0] payload = { @@ -116,5 +120,5 @@ export async function submitSingleProposalMock(action: String, data?: any) { break } console.log(payload) - return await axios.post(singleProposalendpoint, payload) + return await axios.post(singleProposalendpoint, payload, {headers:{network: NETWORK}}) } From 060171bc2d61b9773c938efde98d7ede5da0e365 Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 16:17:21 +0545 Subject: [PATCH 06/47] Enable explicit guardrail script parsing --- gov-action-loader/backend/app/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/gov-action-loader/backend/app/main.py b/gov-action-loader/backend/app/main.py index 0948ade35..34bd1ffbc 100644 --- a/gov-action-loader/backend/app/main.py +++ b/gov-action-loader/backend/app/main.py @@ -135,6 +135,7 @@ async def submit_single_proposal( default_transaction["proposals"][0] = combined_proposal if "withdraw" in combined_proposal or "parameterupdate" in combined_proposal: + if combined_proposal["script"]["cborHex"] == "": combined_proposal["script"] = get_gov_script() tx_url = get_api_url(network) + "/api/v1/tx?submit=true" kuber_response = await client.post( From 38b95134493d57f535372f518f61c3c12a093052 Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 16:18:00 +0545 Subject: [PATCH 07/47] Add guardrail script field for parameter update --- gov-action-loader/frontend/src/views/SpecificLoad.vue | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gov-action-loader/frontend/src/views/SpecificLoad.vue b/gov-action-loader/frontend/src/views/SpecificLoad.vue index cef03c9d9..05fd0507f 100644 --- a/gov-action-loader/frontend/src/views/SpecificLoad.vue +++ b/gov-action-loader/frontend/src/views/SpecificLoad.vue @@ -264,6 +264,12 @@ import config from '../config' type="number"> + + + +
From 9c3845344a2ff732a3cc7ecb86979eec5dbd7615 Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Tue, 3 Sep 2024 16:18:31 +0545 Subject: [PATCH 08/47] Fix loading balance placeholer --- .../backend/app/guardrails/guardrails-sanchonet.plutus | 5 ----- gov-action-loader/frontend/src/App.vue | 7 ++++--- 2 files changed, 4 insertions(+), 8 deletions(-) delete mode 100644 gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus diff --git a/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus b/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus deleted file mode 100644 index 06da9f61f..000000000 --- a/gov-action-loader/backend/app/guardrails/guardrails-sanchonet.plutus +++ /dev/null @@ -1,5 +0,0 @@ -{ - "type": "PlutusScriptV3", - "description": "", - "cborHex": "59082f59082c0101003232323232323232323232323232323232323232323232323232323232323232323232323232323232323225932325333573466e1d2000001180098121bab357426ae88d55cf001054ccd5cd19b874801000460042c6aae74004dd51aba1357446ae88d55cf1baa325333573466e1d200a35573a00226ae84d5d11aab9e0011637546ae84d5d11aba235573c6ea800642b26006003149a2c8a4c3021801c0052000c00e0070018016006901e40608058c00e00290016007003800c00b0034830268320306007001800600690406d6204e00060001801c0052004c00e007001801600690404001e0006007001800600690404007e00060001801c0052006c00e006023801c006001801a4101000980018000600700148023003801808e0070018006006904827600060001801c005200ac00e0070018016006904044bd4060c00e003000c00d2080ade204c000c0003003800a4019801c00e003002c00d2080cab5ee0180c100d1801c005200ec00e0060238000c00e00290086007003800c00b003483d00e0306007001800600690500fe00040243003800a4025803c00c01a0103003800a4029803c00e003002c00cc07520d00f8079801c006001801980ea4120078001800060070014805b00780180360070018006006603e900a4038c0003003800a4041801c00c04601a3003800a4045801c00e003002c00d20f02e80c1801c006001801a4190cb80010090c00e00290126000c00e0029013600b003803c00e003002c00cc0752032c000c00e003000c00cc075200ac000c0006007007801c006005801980ea418170058001801c006001801980ea41209d80018000c0003003800a4051802c00e007003011c00e003000c00d2080e89226c000c0006007003801808e007001800600690406c4770b7e000600030000c00e0029015600b003801c00c047003800c00300348202e2e1cb00030001801c00e006023801c006001801a410181f905540580018000c0003003800a4059801c00c047003800c00300348203000700030000c00e00290176007003800c00b003483200603060070018006006904801e00040243003800a4061801c00c0430001801c0052032c016006003801801e00600780180140100c00e002901a600b003001c00c00f003003c00c00f003002c00c007003001c00c007003803c00e003002c00c0560184014802000c00e002901b6007003800c00b003480030034801b0001801c006001801a4029800180006007001480e3003801c006005801a4001801a40498000c00e003000c00d20ca04c00080486007001480eb00380180860070018006006900f600060001801c005203cc00e006015801c006001801a4101012bcf138c09800180006007001480fb003801805600700180060069040505bc3f482e00060001801c0052040c00e0070018016006900d4060c00e003000c00d204ac000c0003003800a4085801c00c04601630000000000200f003006c00e003000c00c05a0166000200f003005c00e003000c00c057003010c0006000200f003800c00b003012c00cc05d2028c0004008801c01e007001801600602380010043000400e003000c00c04b003011c0006000800c00b00300d8049001801600601d801980924190038000801c0060010066000801c00600900f6000800c00b003480030034820225eb0001003800c003003483403f0003000400c023000400e003000c00d208094ebdc03c000c001003009c001003300f4800b0004006005801a40058001001801401c6014900518052402860169004180424008600a900a180324005003480030001806240cc6016900d18052402460129004180424004600e900018032400c6014446666aae7c004a0005003328009aab9d0019aab9e0011aba100298019aba200224c6012444a6520071300149a4432005225900689802a4d2219002912c998099bad0020068ac99807002800c4cc03001c00e300244cc03001c02a3002012c801460012218010c00888004c004880094cc8c0040048848c8cc0088c00888c00800c8c00888c00400c8d4cc01001000cd400c0044888cc00c896400a300090999804c00488ccd5cd19b87002001800400a01522333573466e2000800600100291199ab9a33712004003000801488ccd5cd19b89002001801400244666ae68cdc4001000c00a001225333573466e240080044004400a44a666ae68cdc4801000880108008004dd6801484cc010004dd6001484c8ccc02a002452005229003912999ab9a3370e0080042666ae68cdc3801800c00200430022452005229003911980899b820040013370400400648a400a45200722333573466e20cdc100200099b82002003800400880648a400a45200722333573466e24cdc100200099b82002003801400091480148a400e44666ae68cdc419b8200400133704004007002800122593300e0020018800c400922593300e00200188014400400233323357346ae8cd5d10009198051bad357420066eb4d5d08011aba2001268001bac00214800c8ccd5cd1aba3001800400a444b26600c0066ae8400626600a0046ae8800630020c0148894ccd5cd19b87480000045854ccd5cd19b88001480004cc00ccdc0a400000466e05200000113280099b8400300199b840020011980200100098021112999ab9a3370e9000000880109980180099b860020012223300622590018c002443200522323300d225900189804803488564cc0140080322600800318010004b20051900991111111001a3201322222222005448964ce402e444444440100020018c00a30000002225333573466e1c00800460002a666ae68cdc48010008c010600445200522900391199ab9a3371266e08010004cdc1001001c0020041191800800918011198010010009" -} \ No newline at end of file diff --git a/gov-action-loader/frontend/src/App.vue b/gov-action-loader/frontend/src/App.vue index ff78cfd06..889b6c540 100644 --- a/gov-action-loader/frontend/src/App.vue +++ b/gov-action-loader/frontend/src/App.vue @@ -78,12 +78,11 @@ export default { }, timeoutId: null, fetchInterval: 7000, - loading: false + loading: true } }, methods: { async updateBalance() { - this.loading = true; try { const response = await getBalance(this.selectedNetwork) if (response.data?.address) { @@ -94,8 +93,8 @@ export default { } catch (error) { console.error('Error updating balance:', error) } finally { - this.loading = false; this.timeoutId = setTimeout(this.updateBalance, this.fetchInterval) + this.loading = false; } }, }, @@ -104,7 +103,9 @@ export default { if (this.timeoutId) { clearTimeout(this.timeoutId) } + this.loading = true; this.updateBalance() + }, }, } From 64da258345d14e9f1b5de5c488a59cd40a5f06df Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Wed, 4 Sep 2024 13:21:24 +0545 Subject: [PATCH 09/47] Generate valid hardfork action --- gov-action-loader/backend/app/transaction.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/gov-action-loader/backend/app/transaction.py b/gov-action-loader/backend/app/transaction.py index e0cb2736f..0d9027960 100644 --- a/gov-action-loader/backend/app/transaction.py +++ b/gov-action-loader/backend/app/transaction.py @@ -91,12 +91,16 @@ def generate_quorom(): return {"numerator": numerator, "denominator": denomintor} -def generate_hardfork(): - majorProtocolNum = random.randint(1, 9) - minorProtocolNum = random.randint(1, 9) +def generate_hardfork(current_pParams): + protocol_version = [current_pParams["protocolVersion"]["major"], + current_pParams["protocolVersion"]["minor"]] + + # Randomly select an index (0 for major, 1 for minor) and increment it + protocol_version[random.randint(0, 1)] += 1 + return { "hardfork": { - "protocolVersion": {"major": majorProtocolNum, "minor": minorProtocolNum} + "protocolVersion": {"major": protocol_version[0], "minor": protocol_version[1]} } } @@ -149,7 +153,7 @@ def get_proposal_data_from_type(proposal_type, current_pParams): } } case "hardfork": - return generate_hardfork() + return generate_hardfork(current_pParams) case "update-parameters": # read current protocol parameters from json # get one of the keys of the pp From 86a69a6b5219d07c8e48c82a490ae50505be61e7 Mon Sep 17 00:00:00 2001 From: niraj Date: Wed, 7 Aug 2024 14:18:50 +0545 Subject: [PATCH 10/47] chore: add function to skip tests if not hardfork --- .../playwright/lib/helpers/cardano.ts | 20 +++++++++++++++++++ .../govtool-frontend/playwright/lib/types.ts | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index 42eb3bd4e..d4ea91cb8 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -1,3 +1,7 @@ +import test, { expect } from "@playwright/test"; +import kuberService from "@services/kuberService"; +import { ProtocolParams } from "@types"; +import { allure } from "allure-playwright"; import { bech32 } from "bech32"; export function lovelaceToAda(lovelace: number) { @@ -10,3 +14,19 @@ export function generateWalletAddress() { const randomBytes = new Uint8Array(10); return bech32.encode("addr_test", randomBytes); } + +export async function getProtocolParamsMajorVersion() { + const protocolParameter: ProtocolParams = + await kuberService.queryProtocolParams(); + return protocolParameter.protocolVersion.major; +} + +export async function skipIfNotHardFork() { + const currentProtocolVersion = await getProtocolParamsMajorVersion(); + if (currentProtocolVersion < 9) { + await allure.description( + "Govtool Features will be available after hardfork." + ); + test.skip(); + } +} diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index 5d8b9b04a..30dd70320 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -94,6 +94,7 @@ export type IDRep = { export type ProtocolParams = { dRepDeposit: number; govActionDeposit: number; + protocolVersion: ProtocolVersionType; }; type Comment = { @@ -152,3 +153,8 @@ export type WalletAndAnchorType = { dataHash: string; wallet: StaticWallet; }; + +export type ProtocolVersionType = { + major: number; + minor: number; +}; From 61cff2d243f4f7d8dbfca116fe82af78f7e6dae1 Mon Sep 17 00:00:00 2001 From: niraj Date: Wed, 7 Aug 2024 14:19:56 +0545 Subject: [PATCH 11/47] chore: skip bootstrap and teardown test if not hardfork --- tests/govtool-frontend/playwright/tests/auth.setup.ts | 2 ++ tests/govtool-frontend/playwright/tests/dRep.setup.ts | 2 ++ tests/govtool-frontend/playwright/tests/delegation.teardown.ts | 2 ++ .../playwright/tests/governance-action.setup.ts | 2 ++ 4 files changed, 8 insertions(+) diff --git a/tests/govtool-frontend/playwright/tests/auth.setup.ts b/tests/govtool-frontend/playwright/tests/auth.setup.ts index 7160670af..2b2809e3c 100644 --- a/tests/govtool-frontend/playwright/tests/auth.setup.ts +++ b/tests/govtool-frontend/playwright/tests/auth.setup.ts @@ -21,6 +21,7 @@ import { import { test as setup } from "@fixtures/walletExtension"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; import { createAuth, createAuthWithUserName } from "@helpers/auth"; +import { skipIfNotHardFork } from "@helpers/cardano"; const dRep01AuthFile = ".auth/dRep01.json"; const dRep02AuthFile = ".auth/dRep02.json"; @@ -45,6 +46,7 @@ const proposal07AuthFile = ".auth/proposal07.json"; setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Authentication"); + await skipIfNotHardFork(); }); setup("Create DRep 01 auth", async ({ page, context }) => { diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index b872a7abe..a0a16e579 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -1,6 +1,7 @@ import environments from "@constants/environments"; import { dRepWallets } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { uploadMetadataAndGetJsonHash } from "@helpers/metadata"; import { pollTransaction } from "@helpers/transaction"; @@ -21,6 +22,7 @@ setup.beforeAll(async () => { setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Register DRep"); + await skipIfNotHardFork(); }); async function generateWallets(num: number) { diff --git a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts index 343dde873..5759f1741 100644 --- a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts @@ -1,6 +1,7 @@ import environments from "@constants/environments"; import { adaHolderWallets } from "@constants/staticWallets"; import { setAllureStory, setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { test as cleanup } from "@playwright/test"; import kuberService from "@services/kuberService"; @@ -9,6 +10,7 @@ cleanup.describe.configure({ timeout: environments.txTimeOut }); cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); + await skipIfNotHardFork(); }); cleanup(`Abstain delegation`, async () => { const stakePrivKeys = adaHolderWallets.map((wallet) => wallet.stake.private); diff --git a/tests/govtool-frontend/playwright/tests/governance-action.setup.ts b/tests/govtool-frontend/playwright/tests/governance-action.setup.ts index 9f7111499..3a8aed8f4 100644 --- a/tests/govtool-frontend/playwright/tests/governance-action.setup.ts +++ b/tests/govtool-frontend/playwright/tests/governance-action.setup.ts @@ -1,5 +1,6 @@ import environments from "@constants/environments"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { pollTransaction } from "@helpers/transaction"; import { test as setup } from "@playwright/test"; @@ -11,6 +12,7 @@ const PROPOSAL_SUBMISSIONS_WALLETS_COUNT = 1; setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("proposal"); + await skipIfNotHardFork(); }); async function generateWallets(num: number) { From c52a23f043b99061a3424ba7c86b1e0edd7f6558 Mon Sep 17 00:00:00 2001 From: niraj Date: Wed, 7 Aug 2024 14:21:47 +0545 Subject: [PATCH 12/47] chore: skip hardfork dependent test if not hardfork --- .../playwright/tests/2-delegation/delegation.drep.spec.ts | 2 ++ .../playwright/tests/2-delegation/delegation.loggedin.spec.ts | 2 ++ .../playwright/tests/2-delegation/delegation.spec.ts | 2 ++ .../2-delegation/delegationFunctionality.delegation.spec.ts | 2 ++ .../tests/3-drep-registration/dRepRegistration.dRep.spec.ts | 2 ++ .../3-drep-registration/dRepRegistration.loggedin.spec.ts | 2 ++ .../tests/3-drep-registration/dRepRegistration.spec.ts | 2 ++ .../playwright/tests/3-drep-registration/editDRep.dRep.spec.ts | 2 ++ .../4-proposal-visibility/proposalVisibility.dRep.spec.ts | 3 ++- .../4-proposal-visibility/proposalVisibility.loggedin.spec.ts | 2 ++ .../tests/4-proposal-visibility/proposalVisibility.spec.ts | 3 ++- .../proposalFunctionality.dRep.spec.ts | 2 ++ .../proposalFunctionality.loggedin.spec.ts | 2 ++ .../tests/6-miscellaneous/miscellaneous.dRep.spec.ts | 2 ++ .../tests/6-miscellaneous/miscellaneous.loggedin.spec.ts | 2 ++ .../tests/7-proposal-submission/proposalSubmission.ga.spec.ts | 2 ++ .../7-proposal-submission/proposalSubmission.loggedin.spec.ts | 2 ++ .../tests/7-proposal-submission/proposalSubmission.spec.ts | 2 ++ .../8-proposal-discussion/proposalDiscussion.loggedin.spec.ts | 2 ++ .../tests/8-proposal-discussion/proposalDiscussion.spec.ts | 2 ++ 20 files changed, 40 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts index 1c2d730c4..1dae8ec33 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts @@ -4,6 +4,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { isMobile, openDrawer } from "@helpers/mobile"; import { createNewPageWithWallet } from "@helpers/page"; @@ -16,6 +17,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); + await skipIfNotHardFork(); }); test("2C. Should open wallet connection popup on delegate in disconnected state", async ({ diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.loggedin.spec.ts index 41c83d599..4a9081968 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.loggedin.spec.ts @@ -1,6 +1,7 @@ import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { isMobile } from "@helpers/mobile"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; import { expect } from "@playwright/test"; @@ -9,6 +10,7 @@ test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); test.beforeEach(async () => { await setAllureEpic("2. Delegation"); + await skipIfNotHardFork(); }); test("2B. Should access DRep Directory page", async ({ page }) => { diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts index d11b21ec0..e69693882 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts @@ -1,10 +1,12 @@ import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; import { expect, test } from "@playwright/test"; import { DRepStatus } from "@types"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); + await skipIfNotHardFork(); }); test("2K_2. Should sort DReps", async ({ page }) => { diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index 2a0a93b0a..9eabe4cd1 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -12,6 +12,7 @@ import { import { createTempDRepAuth } from "@datafactory/createAuth"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; @@ -22,6 +23,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); + await skipIfNotHardFork(); }); test.describe("Delegate to others", () => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index 8c22e06dc..a5f8b6a4a 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -5,6 +5,7 @@ import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -14,6 +15,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); + await skipIfNotHardFork(); }); test.describe("Logged in DReps", () => { 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 ae9f46bb9..cf98b3c64 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 @@ -4,6 +4,7 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; +import { skipIfNotHardFork } from "@helpers/cardano"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; import { expect } from "@playwright/test"; @@ -14,6 +15,7 @@ test.use({ test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); + await skipIfNotHardFork(); }); test("3B. Should access DRep registration page", async ({ page }) => { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.spec.ts index d88415d53..c7aa58936 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.spec.ts @@ -1,8 +1,10 @@ import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { expect, test } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); + await skipIfNotHardFork(); }); test("3C. Should open wallet connection popup on DRep registration in disconnected state", async ({ 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 4b4c64f9c..a29ccecb3 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 @@ -4,11 +4,13 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; +import { skipIfNotHardFork } from "@helpers/cardano"; import EditDRepPage from "@pages/editDRepPage"; import { expect } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); + await skipIfNotHardFork(); }); test.use({ wallet: dRep02Wallet, storageState: ".auth/dRep02.json" }); 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 6e67b9fdd..73576c7ed 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 @@ -4,7 +4,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { lovelaceToAda } from "@helpers/cardano"; +import { lovelaceToAda, skipIfNotHardFork } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; @@ -13,6 +13,7 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); + await skipIfNotHardFork(); }); test.describe("Logged in DRep", () => { diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.loggedin.spec.ts index d74b966a1..1705c8ed6 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.loggedin.spec.ts @@ -1,6 +1,7 @@ import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import extractExpiryDateFromText from "@helpers/extractExpiryDateFromText"; import { isMobile, openDrawer } from "@helpers/mobile"; import removeAllSpaces from "@helpers/removeAllSpaces"; @@ -29,6 +30,7 @@ test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); + await skipIfNotHardFork(); }); test("4A_1. Should access Governance Actions page with connecting wallet", async ({ diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts index c4a9ba518..26d9c6009 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts @@ -1,11 +1,12 @@ import { setAllureEpic } from "@helpers/allure"; -import { lovelaceToAda } from "@helpers/cardano"; +import { lovelaceToAda, skipIfNotHardFork } from "@helpers/cardano"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect, test } from "@playwright/test"; import { FilterOption, IProposal } from "@types"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); + await skipIfNotHardFork(); }); test("4A_2. Should access Governance Actions page without connecting wallet", async ({ diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index 39704f353..1bdecae82 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -4,6 +4,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import GovernanceActionDetailsPage from "@pages/governanceActionDetailsPage"; @@ -16,6 +17,7 @@ const invalidInfinityProposals = require("../../lib/_mock/invalidInfinityProposa test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); + await skipIfNotHardFork(); }); test.describe("Proposal checks", () => { diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.loggedin.spec.ts index 5c5cae3b6..91c71b26c 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.loggedin.spec.ts @@ -1,12 +1,14 @@ import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { expect } from "@playwright/test"; test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); + await skipIfNotHardFork(); }); test("5J. Should hide retirement option for non-registered DRep", async ({ diff --git a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.dRep.spec.ts index d55f1ecde..c0f38d48f 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.dRep.spec.ts @@ -2,10 +2,12 @@ import environments from "@constants/environments"; import { dRep01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { expect } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("6. Miscellaneous"); + await skipIfNotHardFork(); }); test.use({ diff --git a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.loggedin.spec.ts index 53e370a77..fff528bad 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.loggedin.spec.ts @@ -11,6 +11,7 @@ import { user01Wallet } from "@constants/staticWallets"; import { createTempUserAuth } from "@datafactory/createAuth"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import { invalid as mockInvalid, valid as mockValid } from "@mock/index"; @@ -21,6 +22,7 @@ import { Page, expect } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("6. Miscellaneous"); + await skipIfNotHardFork(); }); test.describe("Logged in user", () => { diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts index 74b0f0b99..b87a67426 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.ga.spec.ts @@ -10,9 +10,11 @@ import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; import { expect } from "@playwright/test"; import walletManager from "lib/walletManager"; import { valid as mockValid } from "@mock/index"; +import { skipIfNotHardFork } from "@helpers/cardano"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); + await skipIfNotHardFork(); }); test("7H. Should submit a proposal as governance action", async ({ 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 d8e2e2ff0..1a1ffb4cc 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 @@ -9,6 +9,7 @@ import { import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import { invalid, valid as mockValid } from "@mock/index"; @@ -19,6 +20,7 @@ import { ProposalCreateRequest, ProposalType } from "@types"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); + await skipIfNotHardFork(); }); test.describe("Proposal created logged state", () => { diff --git a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.spec.ts b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.spec.ts index d5c74e90b..23c7b8d7e 100644 --- a/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.spec.ts +++ b/tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.spec.ts @@ -1,8 +1,10 @@ import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import { expect, test } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); + await skipIfNotHardFork(); }); test("7A. Should open wallet connection popup, when propose a governance action in disconnected state.", async ({ diff --git a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.spec.ts index badc38fad..a452b8101 100644 --- a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.spec.ts @@ -11,9 +11,11 @@ import { createNewPageWithWallet } from "@helpers/page"; import ProposalDiscussionDetailsPage from "@pages/proposalDiscussionDetailsPage"; import { Page, expect } from "@playwright/test"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; test.beforeEach(async () => { await setAllureEpic("8. Proposal Discussion Forum"); + await skipIfNotHardFork(); }); test.describe("Proposal created logged in state", () => { diff --git a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts index 6f656ca0c..80c8970f0 100644 --- a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts +++ b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts @@ -2,6 +2,7 @@ import environments from "@constants/environments"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; +import { skipIfNotHardFork } from "@helpers/cardano"; import ProposalDiscussionDetailsPage from "@pages/proposalDiscussionDetailsPage"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import { expect } from "@playwright/test"; @@ -17,6 +18,7 @@ const PROPOSAL_STATUS_FILTER = ["Submitted for vote", "Active proposal"]; test.beforeEach(async () => { await setAllureEpic("8. Proposal Discussion Forum"); + await skipIfNotHardFork(); }); test("8A. Should access proposed governance actions in disconnected state", async ({ From 8d0c407dff64932c18d732e9c2366ff6e57ebd5f Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 28 Aug 2024 09:30:31 +0545 Subject: [PATCH 13/47] test: add test 6s add test to warn user that they are in bootstrapping phase and some feature are disabled --- .../playwright/lib/constants/docsUrl.ts | 1 + .../6-miscellaneous/miscellaneous.spec.ts | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts b/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts index 242a18d7c..9a589861a 100644 --- a/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts +++ b/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts @@ -12,3 +12,4 @@ export const GUIDES_DOC_URL = `${environments.docsUrl}`; export const PRIVACY_POLICY = `${environments.docsUrl}/legal/privacy-policy`; export const TERMS_AND_CONDITIONS = `${environments.docsUrl}/legal/terms-and-conditions`; export const HELP_DOC_URL = `${environments.docsUrl}/support/get-help-in-discord`; +export const BOOTSTRAP_DOC_URL = `${environments.docsUrl}/about/bootstrapping-phase`; diff --git a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts index 3b079d09a..4d5c5666a 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts @@ -1,4 +1,5 @@ import { + BOOTSTRAP_DOC_URL, DELEGATION_DOC_URL, DIRECT_VOTER_DOC_URL, FAQS_DOC_URL, @@ -228,3 +229,35 @@ test.describe("User Snap", () => { }); }); }); + +test("6S. Should Warn users that they are in bootstrapping phase via banner", async ({ + page, + context, +}) => { + await page.route("**/api/epoch/params", async (route) => { + // Fetch the original response from the server + const response = await route.fetch(); + const json = await response.json(); + + // update protocol major version + json["protocol_major"] = 9; + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(json), + }); + }); + + const responsePromise = page.waitForResponse("**/api/epoch/params"); + await page.goto("/"); + + await responsePromise; + + await expect(page.getByText("Govtool is in the")).toBeVisible(); + + const [bootstrap] = await Promise.all([ + context.waitForEvent("page"), + page.getByRole("link", { name: "Learn more" }).click(), + ]); + await expect(bootstrap).toHaveURL(BOOTSTRAP_DOC_URL); +}); From 0b836a0e3f9d82b89fa97ebdb679b8f0af7f6519 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 28 Aug 2024 09:31:48 +0545 Subject: [PATCH 14/47] test: add test 6T to display proper network name --- .../6-miscellaneous/miscellaneous.spec.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts index 4d5c5666a..d2ea3ba60 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts @@ -261,3 +261,28 @@ test("6S. Should Warn users that they are in bootstrapping phase via banner", as ]); await expect(bootstrap).toHaveURL(BOOTSTRAP_DOC_URL); }); + +test("6T. Should display proper network name", async ({ page }) => { + await page.route("**/api/network/metrics", async (route) => { + // Fetch the original response from the server + const response = await route.fetch(); + const json = await response.json(); + + const networkNames = ["sanchonet", "preview"]; + // update network name + json["networkName"] = + networkNames[Math.floor(Math.random() * networkNames.length)]; + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(json), + }); + }); + const responsePromise = page.waitForResponse("**/api/network/metrics"); + await page.goto("/"); + + const response = await responsePromise; + const responseBody = await response.json(); + + await expect(page.getByText(responseBody["networkName"])).toBeVisible(); +}); From e0765fb5e17a2258fbd88dd86456fa85195b2394 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 4 Sep 2024 13:39:37 +0545 Subject: [PATCH 15/47] chore: add condition to create and view info proposal only on bootstrap --- .../playwright/lib/helpers/cardano.ts | 17 ++++++++++++++++- .../lib/pages/proposalSubmissionPage.ts | 5 ++++- tests/govtool-frontend/playwright/lib/types.ts | 4 ++++ .../proposalVisibility.dRep.spec.ts | 15 +++++++++++---- .../proposalFunctionality.dRep.spec.ts | 10 +++++++--- 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index d4ea91cb8..f2c3bf3ef 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -1,6 +1,6 @@ import test, { expect } from "@playwright/test"; import kuberService from "@services/kuberService"; -import { ProtocolParams } from "@types"; +import { ProposalType, ProtocolParams } from "@types"; import { allure } from "allure-playwright"; import { bech32 } from "bech32"; @@ -21,6 +21,21 @@ export async function getProtocolParamsMajorVersion() { return protocolParameter.protocolVersion.major; } +export async function isBootStrapingPhase() { + const protocolParameterMajorVersion = await getProtocolParamsMajorVersion(); + return protocolParameterMajorVersion === 9; +} + +export async function isTreasuryAndBootStraping(type: ProposalType) { + const isBootStraping = await isBootStrapingPhase(); + if (type === ProposalType.treasury && isBootStraping) { + await allure.description( + "This Features will be available only after hardfork." + ); + test.skip(); + } +} + export async function skipIfNotHardFork() { const currentProtocolVersion = await getProtocolParamsMajorVersion(); if (currentProtocolVersion < 9) { diff --git a/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts b/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts index 631723ede..66ffa3d32 100644 --- a/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/proposalSubmissionPage.ts @@ -1,6 +1,7 @@ import environments from "@constants/environments"; import { proposal04Wallet } from "@constants/staticWallets"; import { faker } from "@faker-js/faker"; +import { isBootStrapingPhase } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { expectWithInfo } from "@helpers/exceptionHandler"; import { downloadMetadata } from "@helpers/metadata"; @@ -325,7 +326,9 @@ export default class ProposalSubmissionPage { const proposalRequest: ProposalCreateRequest = this.generateValidProposalFormFields( - ProposalType.treasury, + (await isBootStrapingPhase()) + ? ProposalType.info + : ProposalType.treasury, false, receivingAddr ); diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index 30dd70320..ee57e0421 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -76,6 +76,10 @@ export enum FilterOption { UpdatetotheConstitution = "NewConstitution", } +export enum BootstrapFilterOption { + InfoAction = "InfoAction", +} + export type DRepStatus = "Active" | "Inactive" | "Retired"; export type IDRep = { 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 73576c7ed..97a7946d6 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 @@ -4,11 +4,15 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { lovelaceToAda, skipIfNotHardFork } from "@helpers/cardano"; +import { + isBootStrapingPhase, + lovelaceToAda, + skipIfNotHardFork, +} from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; -import { FilterOption, IProposal } from "@types"; +import { BootstrapFilterOption, FilterOption, IProposal } from "@types"; import walletManager from "lib/walletManager"; test.beforeEach(async () => { @@ -75,9 +79,12 @@ test.describe("Check vote count", () => { test("4G. Should display correct vote counts on governance details page for DRep", async ({ page, }) => { - const responsesPromise = Object.keys(FilterOption).map((filterKey) => + const voteWhiteListOption = (await isBootStrapingPhase()) + ? BootstrapFilterOption + : FilterOption; + const responsesPromise = Object.keys(voteWhiteListOption).map((filterKey) => page.waitForResponse((response) => - response.url().includes(`&type[]=${FilterOption[filterKey]}`) + response.url().includes(`&type[]=${voteWhiteListOption[filterKey]}`) ) ); diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index 1bdecae82..339c21b0e 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -4,7 +4,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; +import { isBootStrapingPhase, skipIfNotHardFork } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import GovernanceActionDetailsPage from "@pages/governanceActionDetailsPage"; @@ -29,7 +29,9 @@ test.describe("Proposal checks", () => { const govActionsPage = new GovernanceActionsPage(page); await govActionsPage.goto(); - govActionDetailsPage = await govActionsPage.viewFirstProposal(); + govActionDetailsPage = (await isBootStrapingPhase()) + ? await govActionsPage.viewFirstInfoProposal() + : await govActionsPage.viewFirstProposal(); }); test("5A. Should show relevant details about governance action as DRep", async () => { @@ -155,7 +157,9 @@ test.describe("Perform voting", () => { const govActionsPage = new GovernanceActionsPage(dRepPage); await govActionsPage.goto(); - govActionDetailsPage = await govActionsPage.viewFirstProposal(); + govActionDetailsPage = (await isBootStrapingPhase()) + ? await govActionsPage.viewFirstInfoProposal() + : await govActionsPage.viewFirstProposal(); }); test("5E. Should re-vote with new data on a already voted governance action", async ({}, testInfo) => { From a4ec43d8f8a878b469d129e191c91539111ef18a Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 4 Sep 2024 13:41:05 +0545 Subject: [PATCH 16/47] chore: skip treasury proposal for bootstrap phase --- .../proposalSubmission.loggedin.spec.ts | 15 +++++++++++++-- .../proposalDiscussion.spec.ts | 2 -- 2 files changed, 13 insertions(+), 4 deletions(-) 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 1a1ffb4cc..029876292 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 @@ -9,7 +9,7 @@ import { import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; +import { isTreasuryAndBootStraping, skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import { invalid, valid as mockValid } from "@mock/index"; @@ -37,6 +37,8 @@ test.describe("Proposal created logged state", () => { test(`7E_${index + 1}. Should accept valid data in ${type.toLowerCase()} proposal form`, async ({ page, }) => { + await isTreasuryAndBootStraping(type); + test.slow(); // Brute-force testing with 100 random data const proposalSubmissionPage = new ProposalSubmissionPage(page); @@ -75,6 +77,8 @@ test.describe("Proposal created logged state", () => { test(`7F_${index + 1}. Should reject invalid data in ${type.toLowerCase()} Proposal form`, async ({ page, }) => { + await isTreasuryAndBootStraping(type); + test.slow(); // Brute-force testing with 100 random data const proposalSubmissionPage = new ProposalSubmissionPage(page); @@ -99,6 +103,8 @@ test.describe("Proposal created logged state", () => { page, wallet, }) => { + await isTreasuryAndBootStraping(type); + const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -145,6 +151,8 @@ test.describe("Proposal created logged state", () => { test(`7I_${index + 1}. Should valid review submission in ${type.toLowerCase()} Proposal form`, async ({ page, }) => { + await isTreasuryAndBootStraping(type); + const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -197,6 +205,8 @@ test.describe("Proposal created logged state", () => { test(`7D_${index + 1}. Verify ${type.toLocaleLowerCase()} proposal form`, async ({ page, }) => { + await isTreasuryAndBootStraping(type); + const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -386,6 +396,8 @@ test.describe("Treasury Proposal Draft", () => { test.use({ storageState: ".auth/proposal07.json", wallet: proposal07Wallet }); test("7M_2. Should edit a treasury proposal draft", async ({ page }) => { + await isTreasuryAndBootStraping(ProposalType.treasury); + const proposalSubmissionPage = new ProposalSubmissionPage(page); const { proposalFormValue } = await proposalSubmissionPage.createDraft( ProposalType.treasury @@ -421,4 +433,3 @@ test.describe("Treasury Proposal Draft", () => { ); }); }); -// }); diff --git a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts index 80c8970f0..54f3da682 100644 --- a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts +++ b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts @@ -41,8 +41,6 @@ test.describe("Filter and sort proposals", () => { test("8B_1. Should filter the list of proposed governance actions.", async () => { test.slow(); - await proposalDiscussionPage.filterBtn.click(); - // unselect active proposal await proposalDiscussionPage.activeProposalWrapper.click(); From a9aadc54b032f77e4dfb27eef159a82364a802c6 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 4 Sep 2024 13:44:04 +0545 Subject: [PATCH 17/47] fix: change vote button and proposal sort --- .../playwright/lib/pages/governanceActionDetailsPage.ts | 2 +- .../playwright/lib/pages/governanceActionsPage.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts index 265b00d82..a0eec80a4 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts @@ -80,6 +80,6 @@ export default class GovernanceActionDetailsPage { @withTxConfirmation async reVote() { await this.noVoteRadio.click(); - await this.changeVoteBtn.click(); + await this.voteBtn.click(); } } diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts index b06f3898d..bdda8ea8a 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts @@ -142,7 +142,9 @@ export default class GovernanceActionsPage { } }); - await this.page.waitForTimeout(4_000); // wait for proposals to render + await expect( + this.page.getByRole("progressbar").getByRole("img") + ).toBeHidden({ timeout: 10_000 }); // Frontend validation for (let dIdx = 0; dIdx <= proposalsByType.length - 1; dIdx++) { From 757cd1147a5cfe1f9bd2200f312602a742030379 Mon Sep 17 00:00:00 2001 From: Niraj Date: Wed, 4 Sep 2024 13:54:26 +0545 Subject: [PATCH 18/47] chore: update network name and warn bootstrap test by testid and network intercept --- .../tests/6-miscellaneous/miscellaneous.spec.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts index d2ea3ba60..b0f5ae8a0 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts @@ -234,7 +234,7 @@ test("6S. Should Warn users that they are in bootstrapping phase via banner", as page, context, }) => { - await page.route("**/api/epoch/params", async (route) => { + await page.route("**/epoch/params", async (route) => { // Fetch the original response from the server const response = await route.fetch(); const json = await response.json(); @@ -248,22 +248,22 @@ test("6S. Should Warn users that they are in bootstrapping phase via banner", as }); }); - const responsePromise = page.waitForResponse("**/api/epoch/params"); + const responsePromise = page.waitForResponse("**/epoch/params"); await page.goto("/"); await responsePromise; - await expect(page.getByText("Govtool is in the")).toBeVisible(); + await expect(page.getByTestId("system-bootstrapping-warning")).toBeVisible(); const [bootstrap] = await Promise.all([ context.waitForEvent("page"), - page.getByRole("link", { name: "Learn more" }).click(), + page.getByTestId("system-bootstrapping-warning-link").click(), ]); await expect(bootstrap).toHaveURL(BOOTSTRAP_DOC_URL); }); test("6T. Should display proper network name", async ({ page }) => { - await page.route("**/api/network/metrics", async (route) => { + await page.route("**/network/metrics", async (route) => { // Fetch the original response from the server const response = await route.fetch(); const json = await response.json(); @@ -278,11 +278,11 @@ test("6T. Should display proper network name", async ({ page }) => { body: JSON.stringify(json), }); }); - const responsePromise = page.waitForResponse("**/api/network/metrics"); + const responsePromise = page.waitForResponse("**/network/metrics"); await page.goto("/"); const response = await responsePromise; const responseBody = await response.json(); - await expect(page.getByText(responseBody["networkName"])).toBeVisible(); + await expect((await page.getByTestId("system-network-name").innerText()).toLowerCase()).toBe(responseBody["networkName"].toLowerCase()) }); From 5b0c62aaaffaefc42b11ce37b8d6f76facf4eed0 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 13:11:45 +0545 Subject: [PATCH 19/47] enhance: JSON.stringify formatting with pretty-printing while upload to metadata --- .../playwright/lib/services/metadataBucketService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/lib/services/metadataBucketService.ts b/tests/govtool-frontend/playwright/lib/services/metadataBucketService.ts index 2765f09e6..d417cd65b 100644 --- a/tests/govtool-frontend/playwright/lib/services/metadataBucketService.ts +++ b/tests/govtool-frontend/playwright/lib/services/metadataBucketService.ts @@ -8,7 +8,7 @@ const metadataBucketService = { try { const res = await fetch(`${environments.metadataBucketUrl}/${name}`, { method: "PUT", - body: JSON.stringify(data), + body: JSON.stringify(data, null, 2), }); Logger.success(`Uploaded ${name} metadata to bucket`); return `${environments.metadataBucketUrl}/${name}`; From 2bd4445e9aabc276a75fe228f5fb3ff1f41b2ab9 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 13:30:11 +0545 Subject: [PATCH 20/47] test: add test 3Q to ensure dRep is excluded from dRep directory when 'doNotList' is checked --- .../playwright/lib/pages/dRepDirectoryPage.ts | 12 +++++++ .../govtool-frontend/playwright/lib/types.ts | 1 + .../dRepRegistration.dRep.spec.ts | 36 +++++++++++++++++++ .../playwright/tests/dRep.setup.ts | 2 +- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/dRepDirectoryPage.ts b/tests/govtool-frontend/playwright/lib/pages/dRepDirectoryPage.ts index b6736ad37..36e5cd9cd 100644 --- a/tests/govtool-frontend/playwright/lib/pages/dRepDirectoryPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/dRepDirectoryPage.ts @@ -150,4 +150,16 @@ export default class DRepDirectoryPage { .locator('[data-testid$="-drep-card"]') .all(); } + + async verifyDRepInList(dRepId: string) { + await this.goto(); + + await this.searchInput.fill(dRepId); + + await this.page.waitForTimeout(5_000); // wait until the dRep list render properly + + await expect( + this.page.getByTestId(`${dRepId}-drep-card`) + ).not.toBeVisible(); + } } diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index ee57e0421..2a4ca6fdd 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -59,6 +59,7 @@ export type IDRepInfo = { qualifications?: string; paymentAddress?: string; extraContentLinks?: string[]; + donNotList?:boolean; }; export enum ProposalType { diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index a5f8b6a4a..5ee8dfd6d 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -12,6 +12,7 @@ import DRepRegistrationPage from "@pages/dRepRegistrationPage"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect } from "@playwright/test"; import walletManager from "lib/walletManager"; +import DRepDirectoryPage from "@pages/dRepDirectoryPage"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); @@ -90,6 +91,41 @@ test.describe("Temporary DReps", () => { ).toBeVisible(); }); + test("3Q Should not list dRep in the dRep directory when 'doNotList' is checked during registration", async ({ + page, + browser, + }, testInfo) => { + test.setTimeout(testInfo.timeout + environments.txTimeOut); + + const wallet = await walletManager.popWallet("registerDRep"); + + const tempDRepAuth = await createTempDRepAuth(page, wallet); + const dRepPage = await createNewPageWithWallet(browser, { + storageState: tempDRepAuth, + wallet, + enableStakeSigning: true, + }); + + const dRepRegistrationPage = new DRepRegistrationPage(dRepPage); + await dRepRegistrationPage.goto(); + await dRepRegistrationPage.register({ + name: faker.person.firstName(), + donNotList: true, + }); + + await dRepRegistrationPage.confirmBtn.click(); + + await expect(dRepPage.getByTestId("d-rep-in-progress")).not.toBeVisible(); + + // connected state + const dRepDirectoryPage = new DRepDirectoryPage(page); + await dRepDirectoryPage.verifyDRepInList(wallet.dRepId); + + // disconnected state + await page.getByTestId("disconnect-button").click(); + await dRepDirectoryPage.verifyDRepInList(wallet.dRepId); + }); + test("3J. Should verify retire as DRep", async ({ page, browser }) => { test.slow(); // Due to queue in pop wallets diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index a0a16e579..bba1f7dcb 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -9,7 +9,7 @@ import { expect, test as setup } from "@playwright/test"; import kuberService from "@services/kuberService"; import walletManager from "lib/walletManager"; -const REGISTER_DREP_WALLETS_COUNT = 5; +const REGISTER_DREP_WALLETS_COUNT = 6; const DREP_WALLETS_COUNT = 9; let dRepDeposit: number; From fe83a8fe1518f05cd48b454347cceba0d6278870 Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 14:07:15 +0545 Subject: [PATCH 21/47] chore: update dRep info content testids --- .../tests/2-delegation/delegation.drep.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts index 1dae8ec33..7e04e60c6 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts @@ -84,20 +84,20 @@ test("2N. Should show DRep information on details page", async ({ await expect(dRepPage.getByTestId("Active-pill")).toHaveText("Active"); await expect(dRepPage.getByTestId("voting-power")).toHaveText("₳ 0"); - await expect(dRepPage.getByTestId("objectives-description")).toHaveText( + await expect(dRepPage.getByTestId("objectives-info-item-description")).toHaveText( objectives ); - await expect(dRepPage.getByTestId("motivations-description")).toHaveText( + await expect(dRepPage.getByTestId("motivations-info-item-description")).toHaveText( motivations ); - await expect(dRepPage.getByTestId("qualifications-description")).toHaveText( + await expect(dRepPage.getByTestId("qualifications-info-item-description")).toHaveText( qualifications ); for (const link of links) { await expect( - dRepPage.getByTestId(`${link.toLowerCase()}-link`) - ).toBeVisible(); + dRepPage.getByTestId(`label-link`) + ).toHaveText(link); } }); From 12c5266a585867f43fa92ef6beefc38ed8736f4d Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 14:11:17 +0545 Subject: [PATCH 22/47] chore: filter info type only on bootstraping phase --- .../tests/8-proposal-discussion/proposalDiscussion.spec.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts index 54f3da682..a07c4f18d 100644 --- a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts +++ b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts @@ -2,7 +2,7 @@ import environments from "@constants/environments"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; +import { isBootStrapingPhase, skipIfNotHardFork } from "@helpers/cardano"; import ProposalDiscussionDetailsPage from "@pages/proposalDiscussionDetailsPage"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import { expect } from "@playwright/test"; @@ -13,6 +13,7 @@ const mockComments = require("../../lib/_mock/proposalComments.json"); const mockInfoProposedGA = require("../../lib/_mock/infoProposedGAs.json"); const PROPOSAL_TYPE_FILTERS = ["Info", "Treasury"]; +const BOOTSTRAP_PROPOSAL_TYPE_FILTERS = ["Info"]; const PROPOSAL_STATUS_FILTER = ["Submitted for vote", "Active proposal"]; @@ -43,10 +44,11 @@ test.describe("Filter and sort proposals", () => { // unselect active proposal await proposalDiscussionPage.activeProposalWrapper.click(); + const isBootStraping = await isBootStrapingPhase(); // proposal type filter await proposalDiscussionPage.applyAndValidateFilters( - PROPOSAL_TYPE_FILTERS, + isBootStraping ? BOOTSTRAP_PROPOSAL_TYPE_FILTERS : PROPOSAL_TYPE_FILTERS, proposalDiscussionPage._validateTypeFiltersInProposalCard ); From d25a82488e9602735ca56feba22855020f77e3fb Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 14:18:49 +0545 Subject: [PATCH 23/47] chore: add wallet bootstrap dependencies on dRep project --- tests/govtool-frontend/playwright/playwright.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index 3d2f36ebd..de0939e99 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -90,7 +90,7 @@ export default defineConfig({ name: "dRep", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.dRep.spec.ts", - dependencies: environments.ci ? ["auth setup", "dRep setup"] : [], + dependencies: environments.ci ? ["auth setup", "dRep setup","wallet bootstrap"] : [], }, { name: "delegation", From 12854bc7e50987d528a20e0ca85a58c8d86bd3de Mon Sep 17 00:00:00 2001 From: Niraj Date: Thu, 5 Sep 2024 16:23:49 +0545 Subject: [PATCH 24/47] fix: test 8B with missing filter button and extra sort button --- .../tests/8-proposal-discussion/proposalDiscussion.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts index a07c4f18d..4ad591246 100644 --- a/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts +++ b/tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.spec.ts @@ -42,6 +42,8 @@ test.describe("Filter and sort proposals", () => { test("8B_1. Should filter the list of proposed governance actions.", async () => { test.slow(); + await proposalDiscussionPage.filterBtn.click(); + // unselect active proposal await proposalDiscussionPage.activeProposalWrapper.click(); const isBootStraping = await isBootStrapingPhase(); @@ -60,8 +62,6 @@ test.describe("Filter and sort proposals", () => { }); test("8B_2. Should sort the list of proposed governance actions.", async () => { - await proposalDiscussionPage.sortBtn.click(); - await proposalDiscussionPage.sortAndValidate( "asc", (p1, p2) => p1.attributes.createdAt <= p2.attributes.createdAt From 30975055def64e71de40858686030a7bc02b63d8 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 08:55:17 +0545 Subject: [PATCH 25/47] chore: update govAction type and generalize view proposal logic for all govactions --- .../lib/pages/governanceActionsPage.ts | 16 ++++++++-------- tests/govtool-frontend/playwright/lib/types.ts | 4 ++-- .../dRepRegistration.dRep.spec.ts | 3 ++- .../proposalVisibility.dRep.spec.ts | 6 +++--- .../proposalVisibility.spec.ts | 6 +++--- .../proposalFunctionality.dRep.spec.ts | 5 +++-- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts index bdda8ea8a..361b85cc1 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts @@ -1,6 +1,6 @@ import removeAllSpaces from "@helpers/removeAllSpaces"; import { Locator, Page, expect } from "@playwright/test"; -import { FilterOption, IProposal } from "@types"; +import { GrovernanceActionType, IProposal } from "@types"; import environments from "lib/constants/environments"; import GovernanceActionDetailsPage from "./governanceActionDetailsPage"; import { getEnumKeyByValue } from "@helpers/enum"; @@ -47,11 +47,11 @@ export default class GovernanceActionsPage { return new GovernanceActionDetailsPage(this.page); } - async viewFirstInfoProposal(): Promise { - const treasuryWithdrawFirstCard = this.page - .getByTestId("govaction-InfoAction-card") + async viewFirstProposalByGovernanceAction(governanceAction:GrovernanceActionType): Promise { + const proposalCard = this.page + .getByTestId(`govaction-${governanceAction}-card`) .first(); - await treasuryWithdrawFirstCard + await proposalCard .locator('[data-testid^="govaction-"][data-testid$="-view-detail"]') .first() .click(); @@ -108,14 +108,14 @@ export default class GovernanceActionsPage { async sortAndValidate( sortOption: string, validationFn: (p1: IProposal, p2: IProposal) => boolean, - filterKeys = Object.keys(FilterOption) + filterKeys = Object.keys(GrovernanceActionType) ) { const responsesPromise = Promise.all( filterKeys.map((filterKey) => this.page.waitForResponse((response) => response .url() - .includes(`&type[]=${FilterOption[filterKey]}&sort=${sortOption}`) + .includes(`&type[]=${GrovernanceActionType[filterKey]}&sort=${sortOption}`) ) ) ); @@ -150,7 +150,7 @@ export default class GovernanceActionsPage { for (let dIdx = 0; dIdx <= proposalsByType.length - 1; dIdx++) { const proposals = proposalsByType[0] as IProposal[]; const filterOptionKey = getEnumKeyByValue( - FilterOption, + GrovernanceActionType, proposals[0].type ); diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index 2a4ca6fdd..ebab64144 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -67,7 +67,7 @@ export enum ProposalType { treasury = "Treasury", } -export enum FilterOption { +export enum GrovernanceActionType { ProtocolParameterChange = "ParameterChange", InfoAction = "InfoAction", TreasuryWithdrawal = "TreasuryWithdrawals", @@ -77,7 +77,7 @@ export enum FilterOption { UpdatetotheConstitution = "NewConstitution", } -export enum BootstrapFilterOption { +export enum BootstrapGovernanceActionType { InfoAction = "InfoAction", } diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index 5ee8dfd6d..e6703aa63 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -13,6 +13,7 @@ import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect } from "@playwright/test"; import walletManager from "lib/walletManager"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; +import { GrovernanceActionType } from "@types"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); @@ -37,7 +38,7 @@ test.describe("Logged in DReps", () => { await governanceActionsPage.goto(); const governanceActionDetailsPage = - await governanceActionsPage.viewFirstInfoProposal(); + await governanceActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction); await expect(governanceActionDetailsPage.voteBtn).toBeVisible(); }); 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 97a7946d6..f897af4e7 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,7 +12,7 @@ import { import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; -import { BootstrapFilterOption, FilterOption, IProposal } from "@types"; +import { BootstrapGovernanceActionType, GrovernanceActionType, IProposal } from "@types"; import walletManager from "lib/walletManager"; test.beforeEach(async () => { @@ -80,8 +80,8 @@ test.describe("Check vote count", () => { page, }) => { const voteWhiteListOption = (await isBootStrapingPhase()) - ? BootstrapFilterOption - : FilterOption; + ? BootstrapGovernanceActionType + : GrovernanceActionType; const responsesPromise = Object.keys(voteWhiteListOption).map((filterKey) => page.waitForResponse((response) => response.url().includes(`&type[]=${voteWhiteListOption[filterKey]}`) diff --git a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts index 26d9c6009..bf8697df7 100644 --- a/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts +++ b/tests/govtool-frontend/playwright/tests/4-proposal-visibility/proposalVisibility.spec.ts @@ -2,7 +2,7 @@ import { setAllureEpic } from "@helpers/allure"; import { lovelaceToAda, skipIfNotHardFork } from "@helpers/cardano"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect, test } from "@playwright/test"; -import { FilterOption, IProposal } from "@types"; +import { GrovernanceActionType, IProposal } from "@types"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); @@ -31,9 +31,9 @@ test("4B_2. Should restrict voting for users who are not registered as DReps (wi test("4K. Should display correct vote counts on governance details page for disconnect state", async ({ page, }) => { - const responsesPromise = Object.keys(FilterOption).map((filterKey) => + const responsesPromise = Object.keys(GrovernanceActionType).map((filterKey) => page.waitForResponse((response) => - response.url().includes(`&type[]=${FilterOption[filterKey]}`) + response.url().includes(`&type[]=${GrovernanceActionType[filterKey]}`) ) ); diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index 339c21b0e..dc0fb4d98 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -11,6 +11,7 @@ import GovernanceActionDetailsPage from "@pages/governanceActionDetailsPage"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { Page, expect } from "@playwright/test"; import kuberService from "@services/kuberService"; +import { BootstrapGovernanceActionType, GrovernanceActionType } from "@types"; import walletManager from "lib/walletManager"; const invalidInfinityProposals = require("../../lib/_mock/invalidInfinityProposals.json"); @@ -30,7 +31,7 @@ test.describe("Proposal checks", () => { await govActionsPage.goto(); govActionDetailsPage = (await isBootStrapingPhase()) - ? await govActionsPage.viewFirstInfoProposal() + ? await govActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction) : await govActionsPage.viewFirstProposal(); }); @@ -158,7 +159,7 @@ test.describe("Perform voting", () => { await govActionsPage.goto(); govActionDetailsPage = (await isBootStrapingPhase()) - ? await govActionsPage.viewFirstInfoProposal() + ? await govActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction) : await govActionsPage.viewFirstProposal(); }); From 0398941c2429c0765099fd49bae4736b1cc4167f Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 11:09:19 +0545 Subject: [PATCH 26/47] test: add test 5L to restrict votes to info gov action during bootstrap --- .../lib/pages/governanceActionDetailsPage.ts | 1 + .../lib/pages/governanceActionsPage.ts | 29 ++++++--- .../proposalFunctionality.dRep.spec.ts | 59 ++++++++++++++++++- 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts index a0eec80a4..bce6ece44 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionDetailsPage.ts @@ -6,6 +6,7 @@ import { withTxConfirmation } from "lib/transaction.decorator"; export default class GovernanceActionDetailsPage { readonly voteBtn = this.page.getByTestId("vote-button"); + readonly backBtn = this.page.getByTestId("back-to-list-link"); readonly changeVoteBtn = this.page.getByTestId("change-vote"); readonly yesVoteRadio = this.page.getByTestId("yes-radio"); readonly noVoteRadio = this.page.getByTestId("no-radio"); diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts index 361b85cc1..e12e92e07 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts @@ -47,15 +47,28 @@ export default class GovernanceActionsPage { return new GovernanceActionDetailsPage(this.page); } - async viewFirstProposalByGovernanceAction(governanceAction:GrovernanceActionType): Promise { + async viewFirstProposalByGovernanceAction( + governanceAction: GrovernanceActionType + ): Promise { const proposalCard = this.page .getByTestId(`govaction-${governanceAction}-card`) .first(); - await proposalCard - .locator('[data-testid^="govaction-"][data-testid$="-view-detail"]') - .first() - .click(); - return new GovernanceActionDetailsPage(this.page); + + const isVisible = await proposalCard.isVisible(); + + if (isVisible) { + await proposalCard + .locator('[data-testid^="govaction-"][data-testid$="-view-detail"]') + .first() + .click(); + + return new GovernanceActionDetailsPage(this.page); + } else { + console.warn( + `Governance action details page for "${governanceAction}" was not found.` + ); + return null; + } } async viewVotedProposal( @@ -115,7 +128,9 @@ export default class GovernanceActionsPage { this.page.waitForResponse((response) => response .url() - .includes(`&type[]=${GrovernanceActionType[filterKey]}&sort=${sortOption}`) + .includes( + `&type[]=${GrovernanceActionType[filterKey]}&sort=${sortOption}` + ) ) ) ); diff --git a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts index dc0fb4d98..7c7282427 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.dRep.spec.ts @@ -31,7 +31,9 @@ test.describe("Proposal checks", () => { await govActionsPage.goto(); govActionDetailsPage = (await isBootStrapingPhase()) - ? await govActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction) + ? await govActionsPage.viewFirstProposalByGovernanceAction( + GrovernanceActionType.InfoAction + ) : await govActionsPage.viewFirstProposal(); }); @@ -159,7 +161,9 @@ test.describe("Perform voting", () => { await govActionsPage.goto(); govActionDetailsPage = (await isBootStrapingPhase()) - ? await govActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction) + ? await govActionsPage.viewFirstProposalByGovernanceAction( + GrovernanceActionType.InfoAction + ) : await govActionsPage.viewFirstProposal(); }); @@ -243,3 +247,54 @@ test.describe("Check voting power", () => { expect(balance, "Retirement deposit not returned").toBeGreaterThan(500); }); }); + +test.describe("Bootstrap phase", () => { + test.use({ storageState: ".auth/dRep01.json", wallet: dRep01Wallet }); + test("5L. Should restrict dRep votes to Info Governance actions During Bootstrapping Phase", async ({ + page, + context, + }) => { + const voteBlacklistOptions = Object.keys(GrovernanceActionType).filter( + (option) => option !== BootstrapGovernanceActionType.InfoAction + ); + + const govActionsPage = new GovernanceActionsPage(page); + await govActionsPage.goto(); + + const protocolParameter = await page.evaluate(() => { + return localStorage.getItem("protocol_params"); + }); + const parsedProtocolParameter = JSON.parse(protocolParameter); + // update protocol_major version + parsedProtocolParameter["protocol_major"] = 9; + + const updatedProtocolParameterString = JSON.stringify( + parsedProtocolParameter + ); + // add updated protocol parameter + await context.addInitScript(` + localStorage.setItem('protocol_params', '${updatedProtocolParameterString}'); + `); + + for (const voteBlacklistOption of voteBlacklistOptions) { + const governanceActionDetailsPage = + await govActionsPage.viewFirstProposalByGovernanceAction( + voteBlacklistOption as GrovernanceActionType + ); + + if (governanceActionDetailsPage !== null) { + await expect(page.getByText("yes₳").first()).toBeVisible(); + await expect(page.getByText("abstain₳").first()).toBeVisible(); + await expect(page.getByText("no₳").first()).toBeVisible(); + + await expect( + governanceActionDetailsPage.yesVoteRadio + ).not.toBeVisible(); + await expect(governanceActionDetailsPage.contextBtn).not.toBeVisible(); + await expect(governanceActionDetailsPage.voteBtn).not.toBeVisible(); + + await governanceActionDetailsPage.backBtn.click(); + } + } + }); +}); From d966f3be8455edf7d14148bea7265a8a21ad986d Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 11:56:58 +0545 Subject: [PATCH 27/47] chore: use multiple stake adaholder for delegated ada visibility test --- .../playwright/lib/fixtures/createWallet.ts | 8 +++++ .../playwright/lib/helpers/auth.ts | 33 +++++++++++++++++++ .../playwright/lib/pages/loginPage.ts | 3 +- ...delegationFunctionality.delegation.spec.ts | 2 +- .../playwright/tests/auth.setup.ts | 8 +++-- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/fixtures/createWallet.ts b/tests/govtool-frontend/playwright/lib/fixtures/createWallet.ts index c9d2dc6e7..381134fa5 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/createWallet.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/createWallet.ts @@ -5,13 +5,21 @@ import { } from "@cardanoapi/cardano-test-wallet/types"; import { ShelleyWallet } from "@helpers/crypto"; import { Page } from "@playwright/test"; +import { StaticWallet } from "@types"; export default async function createWallet( page: Page, config?: CardanoTestWalletConfig ) { const wallet = (await ShelleyWallet.generate()).json(); + await updateWalletConfig(page, config, wallet); +} +export async function updateWalletConfig( + page: Page, + config?: CardanoTestWalletConfig, + wallet?: StaticWallet +) { const initScriptArgs: { wallet: CardanoTestWalletJson; config: CardanoTestWalletConfig; diff --git a/tests/govtool-frontend/playwright/lib/helpers/auth.ts b/tests/govtool-frontend/playwright/lib/helpers/auth.ts index a6c03a612..ae839ebd4 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/auth.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/auth.ts @@ -4,6 +4,10 @@ import LoginPage from "@pages/loginPage"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import { BrowserContext, Page } from "@playwright/test"; import { StaticWallet } from "@types"; +import { ShelleyWallet } from "./crypto"; +import convertBufferToHex from "./convertBufferToHex"; +import { updateWalletConfig } from "@fixtures/createWallet"; +import { adaHolder05Wallet } from "@constants/staticWallets"; interface CreateUserProps { page: Page; @@ -47,3 +51,32 @@ export async function createAuthWithUserName({ await context.storageState({ path: auth }); } + +export async function createAuthWithMultipleStake({ + page, + context, + auth, + wallet, +}) { + const extraPubStakeKey = convertBufferToHex( + ShelleyWallet.fromJson(adaHolder05Wallet).stakeKey.public + ); + const extraRewardAddress = convertBufferToHex( + ShelleyWallet.fromJson(adaHolder05Wallet).rewardAddressRawBytes(0) + ); + + await updateWalletConfig( + page, + { + extraRegisteredPubStakeKeys: [extraPubStakeKey], + extraRewardAddresses: [extraRewardAddress], + }, + wallet + ); + + const loginPage = new LoginPage(page); + await loginPage.login(); + await loginPage.isLoggedIn(); + + await context.storageState({ path: auth }); +} diff --git a/tests/govtool-frontend/playwright/lib/pages/loginPage.ts b/tests/govtool-frontend/playwright/lib/pages/loginPage.ts index cd0c7b060..21dc76fe5 100644 --- a/tests/govtool-frontend/playwright/lib/pages/loginPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/loginPage.ts @@ -47,8 +47,7 @@ export default class LoginPage { // Handle multiple stake keys if (stakeKeys.length > 1) { await this.page - .getByTestId(`${rewardAddresses[0]}-radio`) - .getByText("Voting power:") + .getByTestId(`${rewardAddresses[0]}-radio`).locator('div').first() .click({ force: true }); await this.page.getByTestId("select-button").click(); } diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts index 9eabe4cd1..e9eddf2d0 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegationFunctionality.delegation.spec.ts @@ -309,7 +309,7 @@ test.describe("Delegated ADA visibility", () => { await dRepDirectoryPage.delegateToDRep(dRep01Wallet.dRepId); const adaHolderVotingPower = await kuberService.getBalance( - adaHolder05Wallet.address + adaHolder06Wallet.address ); await expect( page.getByText(`You have delegated ₳ ${adaHolderVotingPower}`) diff --git a/tests/govtool-frontend/playwright/tests/auth.setup.ts b/tests/govtool-frontend/playwright/tests/auth.setup.ts index 2b2809e3c..64135bb27 100644 --- a/tests/govtool-frontend/playwright/tests/auth.setup.ts +++ b/tests/govtool-frontend/playwright/tests/auth.setup.ts @@ -20,7 +20,11 @@ import { } from "@constants/staticWallets"; import { test as setup } from "@fixtures/walletExtension"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { createAuth, createAuthWithUserName } from "@helpers/auth"; +import { + createAuth, + createAuthWithMultipleStake, + createAuthWithUserName, +} from "@helpers/auth"; import { skipIfNotHardFork } from "@helpers/cardano"; const dRep01AuthFile = ".auth/dRep01.json"; @@ -122,7 +126,7 @@ setup("Create AdaHolder 05 auth", async ({ page, context }) => { }); setup("Create AdaHolder 06 auth", async ({ page, context }) => { - await createAuth({ + await createAuthWithMultipleStake({ page, context, wallet: adaHolder06Wallet, From 4ba2c5eb6475c4c3844b072d4bc4ad1aac07f0a4 Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 13:35:59 +0545 Subject: [PATCH 28/47] fix: dRep registration dependent test due to additional link and description field --- .../playwright/lib/forms/dRepForm.ts | 91 +++++++++++++++---- .../govtool-frontend/playwright/lib/types.ts | 10 +- .../2-delegation/delegation.drep.spec.ts | 48 +++++++--- .../dRepRegistration.dRep.spec.ts | 17 +++- .../dRepRegistration.loggedin.spec.ts | 53 +++++++++-- .../3-drep-registration/editDRep.dRep.spec.ts | 38 +++++++- 6 files changed, 211 insertions(+), 46 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts index 82f004552..cc578b217 100644 --- a/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts +++ b/tests/govtool-frontend/playwright/lib/forms/dRepForm.ts @@ -10,6 +10,7 @@ const formErrors = { "this-field-is-required-error", "no-spaces-allowed-error", ], + linkDescription: "max-80-characters-error", email: "invalid-email-address-error", link: "invalid-url-error", paymentAddress: "invalid-payment-address-error", @@ -17,7 +18,12 @@ const formErrors = { export default class DRepForm { readonly continueBtn = this.form.getByTestId("continue-button"); - readonly addLinkBtn = this.form.getByTestId("add-link-button"); + readonly addIdentityReferenceBtn = this.form.getByTestId( + "add-identity-reference-button" + ); + readonly addLinkReferenceBtn = this.form.getByTestId( + "add-link-reference-button" + ); readonly registerBtn = this.form.getByTestId("register-button"); readonly submitBtn = this.form.getByTestId("submit-button"); readonly metadataDownloadBtn = this.form.getByTestId( @@ -28,12 +34,24 @@ export default class DRepForm { readonly nameInput = this.form.getByTestId("name-input"); readonly emailInput = this.form.getByTestId("email-input"); readonly bioInput = this.form.getByTestId("bio-input"); - readonly linkInput = this.form.getByTestId("link-1-input"); + readonly linkRefrenceFirstUrlInput = this.form.getByTestId( + "link-reference-url-1-input" + ); + readonly linkRefrenceFirstDescriptionInput = this.form.getByTestId( + "link-reference-description-1-input" + ); + readonly identityReferenceFirstDescriptionInput = this.form.getByTestId( + "identity-reference-description-1-input" + ); + readonly identityReferenceFirstUrlInput = this.form.getByTestId( + "identity-reference-url-1-input" + ); readonly metadataUrlInput = this.form.getByTestId("metadata-url-input"); readonly objectivesInput = this.form.getByTestId("objectives-input"); readonly motivationsInput = this.form.getByTestId("motivations-input"); readonly qualificationsInput = this.form.getByTestId("qualifications-input"); readonly paymentAddressInput = this.form.getByTestId("payment-address-input"); + readonly doNotListCheckBox = this.form.getByRole("checkbox"); constructor(private readonly form: Page) {} @@ -58,14 +76,37 @@ export default class DRepForm { await this.paymentAddressInput.fill(dRepInfo.paymentAddress); } - if (dRepInfo.extraContentLinks != null) { - for (let i = 0; i < dRepInfo.extraContentLinks.length; i++) { + if (dRepInfo.linksReferenceLinks != null) { + for (let i = 0; i < dRepInfo.linksReferenceLinks.length; i++) { if (i > 0) { - await this.addLinkBtn.click(); + await this.addLinkReferenceBtn.click(); } - await this.linkInput.nth(i).fill(dRepInfo.extraContentLinks[i]); + await this.form + .getByTestId(`link-reference-url-${i + 1}-input`) + .fill(dRepInfo.linksReferenceLinks[i].url); + await this.form + .getByTestId(`link-reference-description-${i + 1}-input`) + .fill(dRepInfo.linksReferenceLinks[i].description); } } + + if (dRepInfo.identityReferenceLinks != null) { + for (let i = 0; i < dRepInfo.identityReferenceLinks.length; i++) { + if (i > 0) { + await this.addIdentityReferenceBtn.click(); + } + await this.form + .getByTestId(`identity-reference-url-${i + 1}-input`) + .fill(dRepInfo.identityReferenceLinks[i].url); + await this.form + .getByTestId(`identity-reference-description-${i + 1}-input`) + .fill(dRepInfo.identityReferenceLinks[i].description); + } + } + if (dRepInfo.donNotList) { + await this.doNotListCheckBox.click(); + } + await this.continueBtn.click(); await this.form.getByRole("checkbox").click(); await this.registerBtn.click(); @@ -86,13 +127,28 @@ export default class DRepForm { return downloadMetadata(download); } - async validateForm(dRepInfo: IDRepInfo) { + async fillupForm(dRepInfo: IDRepInfo) { await this.nameInput.fill(dRepInfo.name); await this.objectivesInput.fill(dRepInfo.objectives); await this.motivationsInput.fill(dRepInfo.motivations); await this.qualificationsInput.fill(dRepInfo.qualifications); await this.paymentAddressInput.fill(dRepInfo.paymentAddress); - await this.linkInput.fill(dRepInfo.extraContentLinks[0]); + await this.linkRefrenceFirstUrlInput.fill( + dRepInfo.linksReferenceLinks[0].url + ); + await this.linkRefrenceFirstDescriptionInput.fill( + dRepInfo.linksReferenceLinks[0].description + ); + await this.identityReferenceFirstUrlInput.fill( + dRepInfo.identityReferenceLinks[0].url + ); + await this.identityReferenceFirstDescriptionInput.fill( + dRepInfo.identityReferenceLinks[0].description + ); + } + + async validateForm(dRepInfo: IDRepInfo) { + await this.fillupForm(dRepInfo); for (const err of formErrors.dRepName) { await expect(this.form.getByTestId(err)).toBeHidden(); @@ -111,17 +167,11 @@ export default class DRepForm { await expect(this.form.getByTestId(formErrors.link)).toBeHidden(); await expect(this.form.getByTestId(formErrors.paymentAddress)).toBeHidden(); - await expect(this.continueBtn).toBeEnabled(); } async inValidateForm(dRepInfo: IDRepInfo) { - await this.nameInput.fill(dRepInfo.name); - await this.objectivesInput.fill(dRepInfo.objectives); - await this.motivationsInput.fill(dRepInfo.motivations); - await this.qualificationsInput.fill(dRepInfo.qualifications); - await this.paymentAddressInput.fill(dRepInfo.paymentAddress); - await this.linkInput.fill(dRepInfo.extraContentLinks[0]); + await this.fillupForm(dRepInfo); function convertTestIdToText(testId: string) { let text = testId.replace("-error", ""); @@ -140,7 +190,7 @@ export default class DRepForm { }) .all(); - expect(nameErrors.length).toEqual(1); + expect(nameErrors.length).toBeGreaterThanOrEqual(1); // BUG duplicate test ids await expect( this.form.getByTestId(formErrors.paymentAddress) @@ -156,7 +206,14 @@ export default class DRepForm { dRepInfo.qualifications ); - await expect(this.form.getByTestId(formErrors.link)).toBeVisible(); + await expect(this.form.getByTestId(formErrors.link).first()).toBeVisible(); // BUG duplicate test ids + 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 + await expect( + this.form.getByTestId(formErrors.linkDescription).last() + ).toBeVisible(); // BUG duplicate test ids await expect(this.continueBtn).toBeDisabled(); } diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index ebab64144..d1bc44c57 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -58,8 +58,14 @@ export type IDRepInfo = { motivations?: string; qualifications?: string; paymentAddress?: string; - extraContentLinks?: string[]; - donNotList?:boolean; + identityReferenceLinks?: LinkType[]; + linksReferenceLinks?: LinkType[]; + donNotList?: boolean; +}; + +export type LinkType = { + url: string; + description: string; }; export enum ProposalType { diff --git a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts index 7e04e60c6..8967a53fb 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.drep.spec.ts @@ -13,6 +13,7 @@ import DRepDetailsPage from "@pages/dRepDetailsPage"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; import { expect } from "@playwright/test"; +import { LinkType } from "@types"; import walletManager from "lib/walletManager"; test.beforeEach(async () => { @@ -59,7 +60,19 @@ test("2N. Should show DRep information on details page", async ({ const motivations = faker.lorem.paragraph(2); const qualifications = faker.lorem.paragraph(2); const paymentAddress = ShelleyWallet.fromJson(wallet).rewardAddressBech32(0); - const links = [faker.internet.url()]; + const linksReferenceLinks: LinkType[] = [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ]; + + const identityReferenceLinks: LinkType[] = [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ]; await dRepRegistrationPage.register({ name, @@ -67,7 +80,8 @@ test("2N. Should show DRep information on details page", async ({ motivations, qualifications, paymentAddress, - extraContentLinks: links, + linksReferenceLinks, + identityReferenceLinks, }); await dRepRegistrationPage.confirmBtn.click(); @@ -84,20 +98,26 @@ test("2N. Should show DRep information on details page", async ({ await expect(dRepPage.getByTestId("Active-pill")).toHaveText("Active"); await expect(dRepPage.getByTestId("voting-power")).toHaveText("₳ 0"); - await expect(dRepPage.getByTestId("objectives-info-item-description")).toHaveText( - objectives - ); - await expect(dRepPage.getByTestId("motivations-info-item-description")).toHaveText( - motivations - ); - await expect(dRepPage.getByTestId("qualifications-info-item-description")).toHaveText( - qualifications - ); + await expect( + dRepPage.getByTestId("objectives-info-item-description") + ).toHaveText(objectives); + await expect( + dRepPage.getByTestId("motivations-info-item-description") + ).toHaveText(motivations); + await expect( + dRepPage.getByTestId("qualifications-info-item-description") + ).toHaveText(qualifications); + + for (const link of linksReferenceLinks) { + await expect( + dRepPage.getByTestId(`${link.description.toLowerCase()}-link`) + ).toHaveText(link.url); + } - for (const link of links) { + for (const link of identityReferenceLinks) { await expect( - dRepPage.getByTestId(`label-link`) - ).toHaveText(link); + dRepPage.getByTestId(`${link.description.toLowerCase()}-link`) + ).toHaveText(link.url); } }); diff --git a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts index e6703aa63..619befc5d 100644 --- a/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/3-drep-registration/dRepRegistration.dRep.spec.ts @@ -38,7 +38,9 @@ test.describe("Logged in DReps", () => { await governanceActionsPage.goto(); const governanceActionDetailsPage = - await governanceActionsPage.viewFirstProposalByGovernanceAction(GrovernanceActionType.InfoAction); + await governanceActionsPage.viewFirstProposalByGovernanceAction( + GrovernanceActionType.InfoAction + ); await expect(governanceActionDetailsPage.voteBtn).toBeVisible(); }); @@ -60,7 +62,18 @@ test.describe("Logged in DReps", () => { motivations: faker.lorem.paragraph(2), qualifications: faker.lorem.paragraph(2), paymentAddress: (await ShelleyWallet.generate()).addressBech32(0), - extraContentLinks: [faker.internet.url()], + linksReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], + identityReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], }); await page.getByTestId("confirm-modal-button").click(); }); 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 cf98b3c64..a3da2b512 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 @@ -34,7 +34,20 @@ test("3D. Verify DRep registration form", async ({ page }) => { await expect(dRepRegistrationPage.motivationsInput).toBeVisible(); await expect(dRepRegistrationPage.qualificationsInput).toBeVisible(); await expect(dRepRegistrationPage.paymentAddressInput).toBeVisible(); - await expect(dRepRegistrationPage.addLinkBtn).toBeVisible(); + await expect(dRepRegistrationPage.addIdentityReferenceBtn).toBeVisible(); + await expect(dRepRegistrationPage.addLinkReferenceBtn).toBeVisible(); + await expect( + dRepRegistrationPage.linkRefrenceFirstDescriptionInput + ).toBeVisible(); + await expect(dRepRegistrationPage.linkRefrenceFirstUrlInput).toBeVisible(); + await expect( + dRepRegistrationPage.identityReferenceFirstDescriptionInput + ).toBeVisible(); + await expect( + dRepRegistrationPage.identityReferenceFirstUrlInput + ).toBeVisible(); + await expect(dRepRegistrationPage.doNotListCheckBox).toBeVisible(); + await expect(dRepRegistrationPage.continueBtn).toBeVisible(); }); @@ -52,16 +65,33 @@ test.describe("Validation of dRep Registration Form", () => { motivations: faker.lorem.paragraph(2), qualifications: faker.lorem.paragraph(2), paymentAddress: (await ShelleyWallet.generate()).addressBech32(0), - extraContentLinks: [faker.internet.url()], + linksReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], + identityReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], }); } for (let i = 0; i < 6; i++) { - await expect(dRepRegistrationPage.addLinkBtn).toBeVisible(); - await dRepRegistrationPage.addLinkBtn.click(); + await expect(dRepRegistrationPage.addLinkReferenceBtn).toBeVisible(); + await dRepRegistrationPage.addLinkReferenceBtn.click(); + } + + for (let i = 0; i < 6; i++) { + await expect(dRepRegistrationPage.addIdentityReferenceBtn).toBeVisible(); + await dRepRegistrationPage.addIdentityReferenceBtn.click(); } - await expect(dRepRegistrationPage.addLinkBtn).toBeHidden(); + await expect(dRepRegistrationPage.addLinkReferenceBtn).toBeHidden(); + await expect(dRepRegistrationPage.addIdentityReferenceBtn).toBeHidden(); }); test("3E_2. Should reject invalid data in DRep form", async ({ page }) => { @@ -77,7 +107,18 @@ test.describe("Validation of dRep Registration Form", () => { motivations: faker.lorem.paragraph(40), qualifications: faker.lorem.paragraph(40), paymentAddress: faker.string.alphanumeric(45), - extraContentLinks: [mockInvalid.url()], + linksReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(20), + }, + ], + identityReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(20), + }, + ], }); } }); 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 a29ccecb3..a2500d29b 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 @@ -32,16 +32,33 @@ test.describe("Validation of edit dRep Form", () => { motivations: faker.lorem.paragraph(2), qualifications: faker.lorem.paragraph(2), paymentAddress: (await ShelleyWallet.generate()).addressBech32(0), - extraContentLinks: [faker.internet.url()], + linksReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], + identityReferenceLinks: [ + { + url: faker.internet.url(), + description: faker.internet.displayName(), + }, + ], }); } for (let i = 0; i < 6; i++) { - await expect(editDRepPage.addLinkBtn).toBeVisible(); - await editDRepPage.addLinkBtn.click(); + await expect(editDRepPage.addLinkReferenceBtn).toBeVisible(); + await editDRepPage.addLinkReferenceBtn.click(); } - await expect(editDRepPage.addLinkBtn).toBeHidden(); + for (let i = 0; i < 6; i++) { + await expect(editDRepPage.addIdentityReferenceBtn).toBeVisible(); + await editDRepPage.addIdentityReferenceBtn.click(); + } + + await expect(editDRepPage.addLinkReferenceBtn).toBeHidden(); + await expect(editDRepPage.addIdentityReferenceBtn).toBeHidden(); }); test("3M_2. Should reject invalid data in edit dRep form", async ({ @@ -61,7 +78,18 @@ test.describe("Validation of edit dRep Form", () => { motivations: faker.lorem.paragraph(40), qualifications: faker.lorem.paragraph(40), paymentAddress: faker.string.alphanumeric(45), - extraContentLinks: [mockInvalid.url()], + linksReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(40), + }, + ], + identityReferenceLinks: [ + { + url: mockInvalid.url(), + description: faker.lorem.paragraph(40), + }, + ], }); } }); From 028ef7aeae6c320afb0df01ae7ab9e85811e851d Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 14:23:02 +0545 Subject: [PATCH 29/47] chore: update package-lock.json with latest package versions --- .../playwright/package-lock.json | 3596 +++++------------ 1 file changed, 1017 insertions(+), 2579 deletions(-) diff --git a/tests/govtool-frontend/playwright/package-lock.json b/tests/govtool-frontend/playwright/package-lock.json index f27d933af..51252ad2e 100644 --- a/tests/govtool-frontend/playwright/package-lock.json +++ b/tests/govtool-frontend/playwright/package-lock.json @@ -1,7 +1,7 @@ { "name": "intersect-govtool", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -42,58 +42,68 @@ "webpack-cli": "^5.1.4" } }, - "../../../../cardano-test-wallet": { - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "dependencies": { - "@noble/curves": "^1.3.0", - "@noble/ed25519": "^2.0.0", - "@types/seedrandom": "^3.0.8", - "bech32": "^2.0.0", - "blakejs": "^1.2.1", - "buffer": "^6.0.3", - "cbor-x": "^1.5.8", - "dotenv": "^16.4.4", - "node-fetch": "v2", - "path": "^0.12.7", - "seedrandom": "^3.0.5", - "typescript": "^5.4.2" - }, - "devDependencies": { - "@types/node": "^20.11.17", - "@types/node-fetch": "^2.6.11", - "copy-webpack-plugin": "^12.0.2", - "prettier": "3.2.5", - "ts-loader": "^9.5.1", - "tsconfig-paths-webpack-plugin": "^4.1.0", - "webpack": "^5.90.3", - "webpack-cli": "^5.1.4" - } - }, - "../../../../cardano-test-wallet/dist": { - "name": "@cardanoapi/cardano-test-wallet", - "version": "1.0.0", - "extraneous": true, - "license": "MIT" - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@cardanoapi/cardano-test-wallet": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@cardanoapi/cardano-test-wallet/-/cardano-test-wallet-2.1.1.tgz", "integrity": "sha512-K5HISR0GmWiJpZOaWT3PqfP7ez+Ht9+jrW8dSGwEXKfKPnj9g6uqUSnkUbuw3FmPeVRgNcB9EwkwmZzPcg7gZw==", "license": "MIT" }, + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@cbor-extract/cbor-extract-linux-x64": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", "cpu": [ "x64" ], @@ -103,11 +113,25 @@ "linux" ] }, + "node_modules/@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -115,18 +139,10 @@ "node": ">=12" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true, "license": "MIT", "engines": { @@ -138,6 +154,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -149,10 +166,11 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -162,6 +180,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -180,28 +199,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/@faker-js/faker": { "version": "8.4.1", "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", @@ -212,6 +219,7 @@ "url": "https://opencollective.com/fakerjs" } ], + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0", "npm": ">=6.14.13" @@ -221,7 +229,9 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -236,6 +246,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -248,23 +259,40 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.4", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -272,7 +300,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { @@ -280,53 +310,76 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.23", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@noble/curves": { - "version": "1.3.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.3" + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/ed25519": { - "version": "2.0.0", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-2.1.0.tgz", + "integrity": "sha512-KM4qTyXPinyCgMzeYJH/UudpdL+paJXtY3CHtHYZQtBkS8MZoPr4rOikZllIutJe0d06QDQKisyn02gxZ8TcQA==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, "node_modules/@noble/hashes": { - "version": "1.3.3", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -334,6 +387,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -346,6 +401,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -354,6 +411,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -365,21 +424,25 @@ } }, "node_modules/@playwright/test": { - "version": "1.41.2", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.47.0.tgz", + "integrity": "sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.41.2" + "playwright": "1.47.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, "license": "MIT", "engines": { @@ -393,64 +456,58 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "8.56.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } + "license": "MIT" }, "node_modules/@types/estree": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "20.11.17", + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@types/node-fetch": { "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dev": true, "license": "MIT", "dependencies": { @@ -458,26 +515,23 @@ "form-data": "^4.0.0" } }, - "node_modules/@types/node-fetch/node_modules/@types/node": { - "version": "20.11.19", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@types/seedrandom": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.8.tgz", + "integrity": "sha512-TY1eezMU2zH2ozQoAFAQFOPpvP15g+ZgSfTZt31AUUH/Rxtnz3H+A/Sv1Snw2/amp//omibc+AEkTaA8KUeOLQ==", "license": "MIT" }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "license": "MIT", "dependencies": { @@ -487,21 +541,29 @@ }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "license": "MIT", "dependencies": { @@ -512,22 +574,28 @@ }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "license": "MIT", "dependencies": { @@ -536,6 +604,8 @@ }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -544,30 +614,36 @@ }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -575,22 +651,26 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -599,16 +679,20 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, "node_modules/@webpack-cli/configtest": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "license": "MIT", "engines": { @@ -621,6 +705,8 @@ }, "node_modules/@webpack-cli/info": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, "license": "MIT", "engines": { @@ -633,6 +719,8 @@ }, "node_modules/@webpack-cli/serve": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "license": "MIT", "engines": { @@ -650,16 +738,22 @@ }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/acorn": { - "version": "8.11.3", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "license": "MIT", "bin": { @@ -669,8 +763,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -682,27 +778,34 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/ajv": { - "version": "8.12.0", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { @@ -712,6 +815,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -726,19 +831,44 @@ } } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", "peerDependencies": { - "ajv": "^8.8.2" + "ajv": "^6.9.1" } }, "node_modules/allure-commandline": { - "version": "2.27.0", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/allure-commandline/-/allure-commandline-2.30.0.tgz", + "integrity": "sha512-qSaGG/I8P38q8gufnxvEog+IrIeCick+PJxxoTp5Vh/L8kviymIfv3A7fvYWziOqZ/oDywyOuNFMEfPZiiKwAA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -746,7 +876,9 @@ } }, "node_modules/allure-js-commons": { - "version": "2.15.0", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-2.15.1.tgz", + "integrity": "sha512-5V/VINplbu0APnfSZOkYpKOzucO36Q2EtTD1kqjWjl7n6tj7Hh+IHCZsH3Vpk/LXRDfj9RuXugBBvwYKV5YMJw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -756,15 +888,19 @@ } }, "node_modules/allure-playwright": { - "version": "2.15.0", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/allure-playwright/-/allure-playwright-2.15.1.tgz", + "integrity": "sha512-P1Uu1j/ptDHdYp3V5ZAeBZyt33+L+OQu0otUIEl/zkOcv0KRycHqlHwC0GEJmpgnLKvVP7s+K37LcLoSUUj3Cg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "allure-js-commons": "2.15.0" + "allure-js-commons": "2.15.1" } }, "node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, "license": "MIT", "engines": { @@ -773,6 +909,8 @@ }, "node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -789,16 +927,20 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, @@ -806,10 +948,13 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -828,10 +973,14 @@ }, "node_modules/bech32": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", "license": "MIT" }, "node_modules/blakejs": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", "license": "MIT" }, "node_modules/brace-expansion": { @@ -839,24 +988,29 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.23.0", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -874,10 +1028,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -888,6 +1042,8 @@ }, "node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -910,6 +1066,8 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, @@ -918,12 +1076,15 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001591", + "version": "1.0.30001658", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001658.tgz", + "integrity": "sha512-N2YVqWbJELVdrnsW5p+apoQyYt51aBMSsBZki1XZEfeBCexcM/sf4xiAHcXQBkuOwJBXtWF7aW1sYX6tKebPHw==", "dev": true, "funding": [ { @@ -943,6 +1104,8 @@ }, "node_modules/cbor-extract": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", "hasInstallScript": true, "license": "MIT", "optional": true, @@ -962,7 +1125,9 @@ } }, "node_modules/cbor-x": { - "version": "1.5.8", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.6.0.tgz", + "integrity": "sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==", "license": "MIT", "optionalDependencies": { "cbor-extract": "^2.2.0" @@ -970,6 +1135,8 @@ }, "node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -985,6 +1152,8 @@ }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -992,7 +1161,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -1001,6 +1172,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1014,6 +1187,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1025,16 +1200,22 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -1045,21 +1226,23 @@ } }, "node_modules/commander": { - "version": "10.0.1", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/copy-webpack-plugin": { "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "license": "MIT", "dependencies": { @@ -1081,32 +1264,17 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", "dependencies": { @@ -1120,6 +1288,8 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1127,12 +1297,13 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1147,10 +1318,13 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { @@ -1158,7 +1332,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "license": "Apache-2.0", "optional": true, "engines": { @@ -1170,6 +1346,7 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -1179,6 +1356,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1187,7 +1365,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.4", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -1197,12 +1377,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.685", + "version": "1.5.16", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.16.tgz", + "integrity": "sha512-2gQpi2WYobXmz2q23FrOBYTLcI1O/P4heW3eqX+ldmPVDQELRqhiebV380EhlGG12NtnX1qbK/FHpN0ba+7bLA==", "dev": true, "license": "ISC" }, "node_modules/enhanced-resolve": { - "version": "5.15.1", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "license": "MIT", "dependencies": { @@ -1214,7 +1398,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.1", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, "license": "MIT", "bin": { @@ -1225,12 +1411,16 @@ } }, "node_modules/es-module-lexer": { - "version": "1.4.1", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true, "license": "MIT" }, "node_modules/escalade": { - "version": "3.1.2", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -1242,6 +1432,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1254,6 +1445,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -1305,15 +1497,20 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -1321,6 +1518,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1328,137 +1526,22 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/eslint/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -1471,6 +1554,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -1484,10 +1568,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -1495,17 +1580,10 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1515,16 +1593,10 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { - "version": "4.3.0", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -1536,12 +1608,15 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -1549,9 +1624,9 @@ } }, "node_modules/fast-check": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.17.2.tgz", - "integrity": "sha512-+3DPTxtxABLgmmVpYxrash3DHoq0cMa1jjLYNp3qqokKKhqVEaS4lbnaDKqWU5Dd6C2pEudPPBAEEQ9nUou9OQ==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.22.0.tgz", + "integrity": "sha512-8HKz3qXqnHYp/VCNn2qfjHdAdcI8zcSqOyX64GOMukp7SL2bfzfeDKjSd+UyECtejccaZv3LcvZTm9YDD22iCQ==", "funding": [ { "type": "individual", @@ -1562,6 +1637,7 @@ "url": "https://opencollective.com/fast-check" } ], + "license": "MIT", "dependencies": { "pure-rand": "^6.1.0" }, @@ -1571,11 +1647,15 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -1591,6 +1671,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -1602,6 +1684,8 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, @@ -1609,10 +1693,20 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true, + "license": "MIT" }, "node_modules/fastest-levenshtein": { - "version": "1.0.17", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", "engines": { @@ -1621,6 +1715,8 @@ }, "node_modules/fastq": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -1632,6 +1728,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -1640,7 +1737,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -1651,19 +1750,26 @@ } }, "node_modules/find-up": { - "version": "4.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, "license": "BSD-3-Clause", "bin": { @@ -1675,6 +1781,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -1688,10 +1795,13 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/form-data": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "license": "MIT", "dependencies": { @@ -1707,10 +1817,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", "funding": { @@ -1721,7 +1849,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1739,6 +1869,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -1750,6 +1882,8 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, @@ -1758,6 +1892,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1769,7 +1904,9 @@ } }, "node_modules/globby": { - "version": "14.0.1", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "license": "MIT", "dependencies": { @@ -1789,6 +1926,8 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, @@ -1796,10 +1935,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -1807,7 +1949,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1819,6 +1963,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -1836,7 +1982,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -1848,6 +1996,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -1859,17 +2008,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { - "version": "3.1.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { @@ -1891,6 +2033,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -1899,18 +2042,25 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { - "version": "2.0.3", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/interpret": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "license": "MIT", "engines": { @@ -1919,15 +2069,22 @@ }, "node_modules/is-buffer": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.13.1", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1935,6 +2092,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -1943,6 +2102,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1954,6 +2115,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -1965,12 +2128,15 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { @@ -1982,11 +2148,15 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", "engines": { @@ -1995,6 +2165,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -2006,16 +2178,10 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/@types/node": { - "version": "20.11.19", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2033,6 +2199,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2044,15 +2211,20 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "1.0.0", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, @@ -2060,10 +2232,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -2078,12 +2253,15 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { @@ -2095,6 +2273,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2105,6 +2284,8 @@ }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -2112,20 +2293,26 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lockfile": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "license": "ISC", "dependencies": { "signal-exit": "^3.0.2" } @@ -2134,27 +2321,20 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/md5": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2165,11 +2345,15 @@ }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -2177,11 +2361,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2190,6 +2376,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -2198,6 +2386,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -2212,6 +2402,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2221,6 +2412,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -2228,24 +2421,30 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/node-fetch": { "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -2264,6 +2463,8 @@ }, "node_modules/node-gyp-build-optional-packages": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", "license": "MIT", "optional": true, "dependencies": { @@ -2276,12 +2477,16 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -2293,54 +2498,65 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { - "version": "2.3.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { @@ -2352,6 +2568,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2361,6 +2578,8 @@ }, "node_modules/path": { "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", "license": "MIT", "dependencies": { "process": "^0.11.1", @@ -2369,6 +2588,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -2380,12 +2601,15 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -2394,11 +2618,15 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "license": "MIT", "engines": { @@ -2409,12 +2637,16 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -2426,6 +2658,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2435,32 +2669,92 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/playwright": { - "version": "1.41.2", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.0.tgz", + "integrity": "sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.41.2" + "playwright-core": "1.47.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.41.2", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.0.tgz", + "integrity": "sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/prelude-ls": { @@ -2468,6 +2762,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -2477,6 +2772,7 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -2489,6 +2785,8 @@ }, "node_modules/process": { "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "license": "MIT", "engines": { "node": ">= 0.6.0" @@ -2496,6 +2794,8 @@ }, "node_modules/properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/properties/-/properties-1.2.1.tgz", + "integrity": "sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==", "dev": true, "license": "MIT", "engines": { @@ -2504,6 +2804,8 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -2523,10 +2825,13 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -2546,6 +2851,8 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2554,6 +2861,8 @@ }, "node_modules/rechoir": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2565,6 +2874,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "license": "MIT", "engines": { @@ -2573,6 +2884,8 @@ }, "node_modules/resolve": { "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", "dependencies": { @@ -2589,6 +2902,8 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { @@ -2598,16 +2913,30 @@ "node": ">=8" } }, - "node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -2619,7 +2948,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2632,6 +2963,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -2654,6 +2987,8 @@ }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { @@ -2672,16 +3007,19 @@ "license": "MIT" }, "node_modules/schema-utils": { - "version": "3.3.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -2689,14 +3027,16 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -2704,29 +3044,37 @@ } }, "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, "node_modules/seedrandom": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", "license": "MIT" }, "node_modules/semver": { - "version": "7.6.0", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -2736,6 +3084,8 @@ }, "node_modules/serialize-javascript": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -2744,6 +3094,8 @@ }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "license": "MIT", "dependencies": { @@ -2755,6 +3107,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2766,6 +3120,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -2775,10 +3131,13 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" }, "node_modules/slash": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { @@ -2790,6 +3149,8 @@ }, "node_modules/source-map": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2798,6 +3159,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -2807,6 +3170,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -2815,6 +3180,8 @@ }, "node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "license": "MIT", "dependencies": { @@ -2826,6 +3193,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -2837,6 +3206,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -2846,6 +3216,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -2857,6 +3229,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -2868,6 +3242,8 @@ }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "license": "MIT", "engines": { @@ -2875,7 +3251,9 @@ } }, "node_modules/terser": { - "version": "5.28.1", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2893,6 +3271,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "license": "MIT", "dependencies": { @@ -2924,19 +3304,47 @@ } } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2948,10 +3356,14 @@ }, "node_modules/tr46": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, "node_modules/ts-loader": { "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "license": "MIT", "dependencies": { @@ -2969,23 +3381,12 @@ "webpack": "^5.0.0" } }, - "node_modules/ts-loader/node_modules/enhanced-resolve": { - "version": "5.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -3026,6 +3427,8 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -3039,6 +3442,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "license": "MIT", "dependencies": { @@ -3055,6 +3460,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3067,6 +3473,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3075,10 +3482,11 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3088,12 +3496,16 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", "dev": true, "license": "MIT", "engines": { @@ -3104,7 +3516,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -3122,8 +3536,8 @@ ], "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -3134,6 +3548,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3142,19 +3558,30 @@ }, "node_modules/util": { "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "license": "MIT", "dependencies": { "inherits": "2.0.3" } }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/watchpack": { - "version": "2.4.0", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "license": "MIT", "dependencies": { @@ -3167,28 +3594,31 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.90.3", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", + "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -3196,7 +3626,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -3217,6 +3647,8 @@ }, "node_modules/webpack-cli": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "license": "MIT", "dependencies": { @@ -3259,8 +3691,20 @@ } } }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/webpack-merge": { "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "license": "MIT", "dependencies": { @@ -3274,14 +3718,61 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -3290,6 +3781,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -3304,17 +3797,25 @@ }, "node_modules/wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true, "license": "MIT" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", "dev": true, "license": "ISC" }, @@ -3323,6 +3824,7 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -3332,6 +3834,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3339,2070 +3842,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@cardanoapi/cardano-test-wallet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cardanoapi/cardano-test-wallet/-/cardano-test-wallet-2.1.1.tgz", - "integrity": "sha512-K5HISR0GmWiJpZOaWT3PqfP7ez+Ht9+jrW8dSGwEXKfKPnj9g6uqUSnkUbuw3FmPeVRgNcB9EwkwmZzPcg7gZw==" - }, - "@cbor-extract/cbor-extract-linux-x64": { - "version": "2.2.0", - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } - } - }, - "@faker-js/faker": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.4.1.tgz", - "integrity": "sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==" - }, - "@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.4", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.23", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@noble/curves": { - "version": "1.3.0", - "requires": { - "@noble/hashes": "1.3.3" - } - }, - "@noble/ed25519": { - "version": "2.0.0" - }, - "@noble/hashes": { - "version": "1.3.3" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@playwright/test": { - "version": "1.41.2", - "dev": true, - "requires": { - "playwright": "1.41.2" - } - }, - "@sindresorhus/merge-streams": { - "version": "2.3.0", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/eslint": { - "version": "8.56.4", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.15", - "dev": true - }, - "@types/node": { - "version": "20.11.17", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "@types/node-fetch": { - "version": "2.6.11", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "20.11.19", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - } - } - }, - "@types/seedrandom": { - "version": "3.0.8" - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "requires": {} - }, - "@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "dev": true - }, - "acorn": { - "version": "8.11.3", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.9.0", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true - }, - "ajv": { - "version": "8.12.0", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "dev": true, - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "allure-commandline": { - "version": "2.27.0", - "dev": true - }, - "allure-js-commons": { - "version": "2.15.0", - "dev": true, - "requires": { - "md5": "^2.3.0", - "properties": "^1.2.1", - "strip-ansi": "^5.2.0" - } - }, - "allure-playwright": { - "version": "2.15.0", - "dev": true, - "requires": { - "allure-js-commons": "2.15.0" - } - }, - "ansi-regex": { - "version": "4.1.1", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1" - }, - "bech32": { - "version": "2.0.0" - }, - "blakejs": { - "version": "1.2.1" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browserslist": { - "version": "4.23.0", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "buffer": { - "version": "6.0.3", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-from": { - "version": "1.1.2", - "dev": true - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001591", - "dev": true - }, - "cbor-extract": { - "version": "2.2.0", - "optional": true, - "requires": { - "@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", - "node-gyp-build-optional-packages": "5.1.1" - } - }, - "cbor-x": { - "version": "1.5.8", - "requires": { - "cbor-extract": "^2.2.0" - } - }, - "chalk": { - "version": "4.1.2", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "charenc": { - "version": "0.0.2", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "dev": true - }, - "colorette": { - "version": "2.0.20", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "10.0.1", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "12.0.2", - "dev": true, - "requires": { - "fast-glob": "^3.3.2", - "glob-parent": "^6.0.1", - "globby": "^14.0.0", - "normalize-path": "^3.0.0", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, - "dependencies": { - "schema-utils": { - "version": "4.2.0", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - } - } - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "dev": true - }, - "detect-libc": { - "version": "2.0.2", - "optional": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "16.4.4" - }, - "electron-to-chromium": { - "version": "1.4.685", - "dev": true - }, - "enhanced-resolve": { - "version": "5.15.1", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.11.1", - "dev": true - }, - "es-module-lexer": { - "version": "1.4.1", - "dev": true - }, - "escalade": { - "version": "3.1.2", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "3.3.0", - "dev": true - }, - "fast-check": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.17.2.tgz", - "integrity": "sha512-+3DPTxtxABLgmmVpYxrash3DHoq0cMa1jjLYNp3qqokKKhqVEaS4lbnaDKqWU5Dd6C2pEudPPBAEEQ9nUou9OQ==", - "requires": { - "pure-rand": "^6.1.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "dev": true, - "requires": { - "@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" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.17", - "dev": true - }, - "fastq": { - "version": "1.17.1", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "dev": true - }, - "flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "form-data": { - "version": "4.0.0", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.2", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "glob-parent": { - "version": "6.0.2", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "dev": true - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "14.0.1", - "dev": true, - "requires": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "dev": true - }, - "hasown": { - "version": "2.0.1", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "ieee754": { - "version": "1.2.1" - }, - "ignore": { - "version": "5.3.1", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-local": { - "version": "3.1.0", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3" - }, - "interpret": { - "version": "3.1.1", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "dev": true - }, - "is-core-module": { - "version": "2.13.1", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isexe": { - "version": "2.0.0", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "@types/node": { - "version": "20.11.19", - "dev": true, - "requires": { - "undici-types": "~5.26.4" - } - }, - "supports-color": { - "version": "8.1.1", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true - }, - "json-schema-traverse": { - "version": "1.0.0", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "dev": true - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "loader-runner": { - "version": "4.3.0", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lockfile": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", - "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", - "requires": { - "signal-exit": "^3.0.2" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "md5": { - "version": "2.3.0", - "dev": true, - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "merge-stream": { - "version": "2.0.0", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "dev": true - }, - "node-fetch": { - "version": "2.7.0", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build-optional-packages": { - "version": "5.1.1", - "optional": true, - "requires": { - "detect-libc": "^2.0.1" - } - }, - "node-releases": { - "version": "2.0.14", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path": { - "version": "0.12.7", - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-exists": { - "version": "4.0.0", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "dev": true - }, - "path-type": { - "version": "5.0.0", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "playwright": { - "version": "1.41.2", - "dev": true, - "requires": { - "fsevents": "2.3.2", - "playwright-core": "1.41.2" - } - }, - "playwright-core": { - "version": "1.41.2", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true - }, - "process": { - "version": "0.11.10" - }, - "properties": { - "version": "1.2.1", - "dev": true - }, - "punycode": { - "version": "2.3.1", - "dev": true - }, - "pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==" - }, - "queue-microtask": { - "version": "1.2.3", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rechoir": { - "version": "0.8.0", - "dev": true, - "requires": { - "resolve": "^1.20.0" - } - }, - "require-from-string": { - "version": "2.0.2", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "dev": true - }, - "schema-utils": { - "version": "3.3.0", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "dev": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true - } - } - }, - "seedrandom": { - "version": "3.0.5" - }, - "semver": { - "version": "7.6.0", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "serialize-javascript": { - "version": "6.0.2", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shallow-clone": { - "version": "3.0.1", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "slash": { - "version": "5.1.0", - "dev": true - }, - "source-map": { - "version": "0.7.4", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "dev": true - }, - "terser": { - "version": "5.28.1", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3" - }, - "ts-loader": { - "version": "9.5.1", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.15.0", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - } - } - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "requires": { - "@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" - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tsconfig-paths-webpack-plugin": { - "version": "4.1.0", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.7.0", - "tsconfig-paths": "^4.1.2" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "dev": true - }, - "undici-types": { - "version": "5.26.5", - "dev": true - }, - "unicorn-magic": { - "version": "0.1.0", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util": { - "version": "0.10.4", - "requires": { - "inherits": "2.0.3" - } - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "watchpack": { - "version": "2.4.0", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webidl-conversions": { - "version": "3.0.1" - }, - "webpack": { - "version": "5.90.3", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "5.1.4", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - } - }, - "webpack-merge": { - "version": "5.10.0", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.1", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } } } From 2fc441bcbea6e2d52f690bfde0820000128f98ce Mon Sep 17 00:00:00 2001 From: Niraj Date: Fri, 6 Sep 2024 14:35:52 +0545 Subject: [PATCH 30/47] chore: rename isTreasuryAndBootStraping function to skipIfTreasuryAndBootstrapping --- .../playwright/lib/helpers/cardano.ts | 2 +- .../proposalSubmission.loggedin.spec.ts | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index f2c3bf3ef..c501a05c6 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -26,7 +26,7 @@ export async function isBootStrapingPhase() { return protocolParameterMajorVersion === 9; } -export async function isTreasuryAndBootStraping(type: ProposalType) { +export async function skipIfTreasuryAndBootstrapping(type: ProposalType) { const isBootStraping = await isBootStrapingPhase(); if (type === ProposalType.treasury && isBootStraping) { await allure.description( 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 029876292..f95e01586 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 @@ -9,7 +9,7 @@ import { import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; -import { isTreasuryAndBootStraping, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfTreasuryAndBootstrapping, skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import { invalid, valid as mockValid } from "@mock/index"; @@ -37,7 +37,7 @@ test.describe("Proposal created logged state", () => { test(`7E_${index + 1}. Should accept valid data in ${type.toLowerCase()} proposal form`, async ({ page, }) => { - await isTreasuryAndBootStraping(type); + await skipIfTreasuryAndBootstrapping(type); test.slow(); // Brute-force testing with 100 random data @@ -77,7 +77,7 @@ test.describe("Proposal created logged state", () => { test(`7F_${index + 1}. Should reject invalid data in ${type.toLowerCase()} Proposal form`, async ({ page, }) => { - await isTreasuryAndBootStraping(type); + await skipIfTreasuryAndBootstrapping(type); test.slow(); // Brute-force testing with 100 random data @@ -103,7 +103,7 @@ test.describe("Proposal created logged state", () => { page, wallet, }) => { - await isTreasuryAndBootStraping(type); + await skipIfTreasuryAndBootstrapping(type); const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -151,7 +151,7 @@ test.describe("Proposal created logged state", () => { test(`7I_${index + 1}. Should valid review submission in ${type.toLowerCase()} Proposal form`, async ({ page, }) => { - await isTreasuryAndBootStraping(type); + await skipIfTreasuryAndBootstrapping(type); const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -205,7 +205,7 @@ test.describe("Proposal created logged state", () => { test(`7D_${index + 1}. Verify ${type.toLocaleLowerCase()} proposal form`, async ({ page, }) => { - await isTreasuryAndBootStraping(type); + await skipIfTreasuryAndBootstrapping(type); const proposalSubmissionPage = new ProposalSubmissionPage(page); await proposalSubmissionPage.goto(); @@ -396,7 +396,7 @@ test.describe("Treasury Proposal Draft", () => { test.use({ storageState: ".auth/proposal07.json", wallet: proposal07Wallet }); test("7M_2. Should edit a treasury proposal draft", async ({ page }) => { - await isTreasuryAndBootStraping(ProposalType.treasury); + await skipIfTreasuryAndBootstrapping(ProposalType.treasury); const proposalSubmissionPage = new ProposalSubmissionPage(page); const { proposalFormValue } = await proposalSubmissionPage.createDraft( From 3534ebe9f849b8a1c84fb3c8163eb0a3aad9fff4 Mon Sep 17 00:00:00 2001 From: Reeshav Acharya Date: Mon, 9 Sep 2024 14:30:35 +0545 Subject: [PATCH 31/47] Update guardrail script --- gov-action-loader/backend/app/data/gov-script.plutus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gov-action-loader/backend/app/data/gov-script.plutus b/gov-action-loader/backend/app/data/gov-script.plutus index 06da9f61f..b6af50acb 100644 --- a/gov-action-loader/backend/app/data/gov-script.plutus +++ b/gov-action-loader/backend/app/data/gov-script.plutus @@ -1,5 +1,5 @@ { "type": "PlutusScriptV3", "description": "", - "cborHex": "59082f59082c0101003232323232323232323232323232323232323232323232323232323232323232323232323232323232323225932325333573466e1d2000001180098121bab357426ae88d55cf001054ccd5cd19b874801000460042c6aae74004dd51aba1357446ae88d55cf1baa325333573466e1d200a35573a00226ae84d5d11aab9e0011637546ae84d5d11aba235573c6ea800642b26006003149a2c8a4c3021801c0052000c00e0070018016006901e40608058c00e00290016007003800c00b0034830268320306007001800600690406d6204e00060001801c0052004c00e007001801600690404001e0006007001800600690404007e00060001801c0052006c00e006023801c006001801a4101000980018000600700148023003801808e0070018006006904827600060001801c005200ac00e0070018016006904044bd4060c00e003000c00d2080ade204c000c0003003800a4019801c00e003002c00d2080cab5ee0180c100d1801c005200ec00e0060238000c00e00290086007003800c00b003483d00e0306007001800600690500fe00040243003800a4025803c00c01a0103003800a4029803c00e003002c00cc07520d00f8079801c006001801980ea4120078001800060070014805b00780180360070018006006603e900a4038c0003003800a4041801c00c04601a3003800a4045801c00e003002c00d20f02e80c1801c006001801a4190cb80010090c00e00290126000c00e0029013600b003803c00e003002c00cc0752032c000c00e003000c00cc075200ac000c0006007007801c006005801980ea418170058001801c006001801980ea41209d80018000c0003003800a4051802c00e007003011c00e003000c00d2080e89226c000c0006007003801808e007001800600690406c4770b7e000600030000c00e0029015600b003801c00c047003800c00300348202e2e1cb00030001801c00e006023801c006001801a410181f905540580018000c0003003800a4059801c00c047003800c00300348203000700030000c00e00290176007003800c00b003483200603060070018006006904801e00040243003800a4061801c00c0430001801c0052032c016006003801801e00600780180140100c00e002901a600b003001c00c00f003003c00c00f003002c00c007003001c00c007003803c00e003002c00c0560184014802000c00e002901b6007003800c00b003480030034801b0001801c006001801a4029800180006007001480e3003801c006005801a4001801a40498000c00e003000c00d20ca04c00080486007001480eb00380180860070018006006900f600060001801c005203cc00e006015801c006001801a4101012bcf138c09800180006007001480fb003801805600700180060069040505bc3f482e00060001801c0052040c00e0070018016006900d4060c00e003000c00d204ac000c0003003800a4085801c00c04601630000000000200f003006c00e003000c00c05a0166000200f003005c00e003000c00c057003010c0006000200f003800c00b003012c00cc05d2028c0004008801c01e007001801600602380010043000400e003000c00c04b003011c0006000800c00b00300d8049001801600601d801980924190038000801c0060010066000801c00600900f6000800c00b003480030034820225eb0001003800c003003483403f0003000400c023000400e003000c00d208094ebdc03c000c001003009c001003300f4800b0004006005801a40058001001801401c6014900518052402860169004180424008600a900a180324005003480030001806240cc6016900d18052402460129004180424004600e900018032400c6014446666aae7c004a0005003328009aab9d0019aab9e0011aba100298019aba200224c6012444a6520071300149a4432005225900689802a4d2219002912c998099bad0020068ac99807002800c4cc03001c00e300244cc03001c02a3002012c801460012218010c00888004c004880094cc8c0040048848c8cc0088c00888c00800c8c00888c00400c8d4cc01001000cd400c0044888cc00c896400a300090999804c00488ccd5cd19b87002001800400a01522333573466e2000800600100291199ab9a33712004003000801488ccd5cd19b89002001801400244666ae68cdc4001000c00a001225333573466e240080044004400a44a666ae68cdc4801000880108008004dd6801484cc010004dd6001484c8ccc02a002452005229003912999ab9a3370e0080042666ae68cdc3801800c00200430022452005229003911980899b820040013370400400648a400a45200722333573466e20cdc100200099b82002003800400880648a400a45200722333573466e24cdc100200099b82002003801400091480148a400e44666ae68cdc419b8200400133704004007002800122593300e0020018800c400922593300e00200188014400400233323357346ae8cd5d10009198051bad357420066eb4d5d08011aba2001268001bac00214800c8ccd5cd1aba3001800400a444b26600c0066ae8400626600a0046ae8800630020c0148894ccd5cd19b87480000045854ccd5cd19b88001480004cc00ccdc0a400000466e05200000113280099b8400300199b840020011980200100098021112999ab9a3370e9000000880109980180099b860020012223300622590018c002443200522323300d225900189804803488564cc0140080322600800318010004b20051900991111111001a3201322222222005448964ce402e444444440100020018c00a30000002225333573466e1c00800460002a666ae68cdc48010008c010600445200522900391199ab9a3371266e08010004cdc1001001c0020041191800800918011198010010009" + "cborHex": "5908545908510101003232323232323232323232323232323232323232323232323232323232323232323232323232323232259323255333573466e1d20000011180098111bab357426ae88d55cf00104554ccd5cd19b87480100044600422c6aae74004dd51aba1357446ae88d55cf1baa3255333573466e1d200a35573a002226ae84d5d11aab9e00111637546ae84d5d11aba235573c6ea800642b26006003149a2c8a4c301f801c0052000c00e0070018016006901e4070c00e003000c00d20d00fc000c0003003800a4005801c00e003002c00d20c09a0c80e1801c006001801a4101b5881380018000600700148013003801c006005801a410100078001801c006001801a4101001f8001800060070014801b0038018096007001800600690404002600060001801c0052008c00e006025801c006001801a41209d8001800060070014802b003801c006005801a410112f501c3003800c00300348202b7881300030000c00e00290066007003800c00b003482032ad7b806038403060070014803b00380180960003003800a4021801c00e003002c00d20f40380e1801c006001801a41403f800100a0c00e0029009600f0030078040c00e002900a600f003800c00b003301a483403e01a600700180060066034904801e00060001801c0052016c01e00600f801c006001801980c2402900e30000c00e002901060070030128060c00e00290116007003800c00b003483c0ba03860070018006006906432e00040283003800a40498003003800a404d802c00e00f003800c00b003301a480cb0003003800c003003301a4802b00030001801c01e0070018016006603490605c0160006007001800600660349048276000600030000c00e0029014600b003801c00c04b003800c00300348203a2489b00030001801c00e006025801c006001801a4101b11dc2df80018000c0003003800a4055802c00e007003012c00e003000c00d2080b8b872c000c0006007003801809600700180060069040607e4155016000600030000c00e00290166007003012c00e003000c00d2080c001c000c0003003800a405d801c00e003002c00d20c80180e1801c006001801a412007800100a0c00e00290186007003013c0006007001480cb005801801e006003801800e00600500403003800a4069802c00c00f003001c00c007003803c00e003002c00c05300333023480692028c0004014c00c00b003003c00c00f003003c00e00f003800c00b00301480590052008003003800a406d801c00e003002c00d2000c00d2006c00060070018006006900a600060001801c0052038c00e007001801600690006006901260003003800c003003483281300020141801c005203ac00e006027801c006001801a403d800180006007001480f3003801804e00700180060069040404af3c4e302600060001801c005203ec00e006013801c006001801a4101416f0fd20b80018000600700148103003801c006005801a403501c3003800c0030034812b00030000c00e0029021600f003800c00a01ac00e003000c00ccc08d20d00f4800b00030000c0000000000803c00c016008401e006009801c006001801807e0060298000c000401e006007801c0060018018074020c000400e00f003800c00b003010c000802180020070018006006019801805e0003000400600580180760060138000800c00b00330134805200c400e00300080330004006005801a4001801a410112f58000801c00600901260008019806a40118002007001800600690404a75ee01e00060008018046000801801e000300c4832004c025201430094800a0030028052003002c00d2002c000300648010c0092002300748028c0312000300b48018c0292012300948008c0212066801a40018000c0192008300a2233335573e00250002801994004d55ce800cd55cf0008d5d08014c00cd5d10011263009222532900389800a4d2219002912c80344c01526910c80148964cc04cdd68010034564cc03801400626601800e0071801226601800e01518010096400a3000910c008600444002600244004a664600200244246466004460044460040064600444600200646a660080080066a00600224446600644b20051800484ccc02600244666ae68cdc3801000c00200500a91199ab9a33710004003000801488ccd5cd19b89002001800400a44666ae68cdc4801000c00a00122333573466e20008006005000912a999ab9a3371200400222002220052255333573466e2400800444008440040026eb400a42660080026eb000a4264666015001229002914801c8954ccd5cd19b8700400211333573466e1c00c006001002118011229002914801c88cc044cdc100200099b82002003245200522900391199ab9a3371066e08010004cdc1001001c002004403245200522900391199ab9a3371266e08010004cdc1001001c00a00048a400a45200722333573466e20cdc100200099b820020038014000912c99807001000c40062004912c99807001000c400a2002001199919ab9a357466ae880048cc028dd69aba1003375a6ae84008d5d1000934000dd60010a40064666ae68d5d1800c0020052225933006003357420031330050023574400318010600a444aa666ae68cdc3a400000222c22aa666ae68cdc4000a4000226600666e05200000233702900000088994004cdc2001800ccdc20010008cc010008004c01088954ccd5cd19b87480000044400844cc00c004cdc300100091119803112c800c60012219002911919806912c800c4c02401a442b26600a004019130040018c008002590028c804c8888888800d1900991111111002a244b267201722222222008001000c600518000001112a999ab9a3370e004002230001155333573466e240080044600823002229002914801c88ccd5cd19b893370400800266e0800800e00100208c8c0040048c0088cc008008005" } \ No newline at end of file From ead3e5aab0b10b726fef520dd8bb0d31e0b40e77 Mon Sep 17 00:00:00 2001 From: Sudip Bhattarai Date: Mon, 9 Sep 2024 14:49:11 +0545 Subject: [PATCH 32/47] Add preview/preprod config on gov-action-loader build --- tests/test-infrastructure/.env.example | 4 +++- .../test-infrastructure/docker-compose-govaction-loader.yml | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tests/test-infrastructure/.env.example b/tests/test-infrastructure/.env.example index 9d3654b2f..7e9b3932b 100644 --- a/tests/test-infrastructure/.env.example +++ b/tests/test-infrastructure/.env.example @@ -5,4 +5,6 @@ SENTRY_DSN_BACKEND= CARDANO_NETWORK=sanchonet BASE_DOMAIN=govtool.cardanoapi.io GOVTOOL_TAG=test -APP_ENV=test \ No newline at end of file +APP_ENV=test +PDF_API_URL= +KUBER_API_KEY= \ No newline at end of file diff --git a/tests/test-infrastructure/docker-compose-govaction-loader.yml b/tests/test-infrastructure/docker-compose-govaction-loader.yml index 269bc4202..5aafacc73 100644 --- a/tests/test-infrastructure/docker-compose-govaction-loader.yml +++ b/tests/test-infrastructure/docker-compose-govaction-loader.yml @@ -35,8 +35,10 @@ services: context: ../../gov-action-loader/backend dockerfile: Dockerfile environment: - KUBER_API_URL: "http://kuber:8081" - KUBER_API_KEY: "" + KUBER_API_URL_SANCHO: "http://kuber:8081" + KUBER_API_URL_PREPROD: "https://preprod.kuber.cardanoapi.io" + KUBER_API_URL_PREVIEW: "https://preview.kuber.cardanoapi.io" + KUBER_API_KEY: ${KUBER_API_KEY} VIRTUAL_HOST: https://governance-${BASE_DOMAIN}/api/ -> /api/ networks: - default From 4e76c9df4baa102d8f85ea5aa450ed2d4842195b Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Tue, 10 Sep 2024 11:13:38 +0200 Subject: [PATCH 33/47] [#1941] fix passing DRep votes to the modal --- CHANGELOG.md | 1 + .../src/components/molecules/VoteActionForm.tsx | 15 ++++++++------- .../organisms/VoteContext/VoteContextModal.tsx | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 030d5f3e3..778e14242 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ changes. - Make testIds for link and identity references in drep form unique [Issue 1928](https://github.com/IntersectMBO/govtool/issues/1928) - Fix saving the Do Not List checkbox value on DRep registration [Issue 1940](https://github.com/IntersectMBO/govtool/issues/1940) +- Fix passing DRep votes to the modal showing vote numbers [Issue 1941](https://github.com/IntersectMBO/govtool/issues/1941) ### Changed diff --git a/govtool/frontend/src/components/molecules/VoteActionForm.tsx b/govtool/frontend/src/components/molecules/VoteActionForm.tsx index 964edcf5c..d0f6fb4ed 100644 --- a/govtool/frontend/src/components/molecules/VoteActionForm.tsx +++ b/govtool/frontend/src/components/molecules/VoteActionForm.tsx @@ -14,6 +14,7 @@ import { } from "@hooks"; import { formatDisplayDate } from "@utils"; import { ProposalVote } from "@/models"; +import { VoteContextModalState, VotingPowerModalState } from "../organisms"; type VoteActionFormProps = { setIsVoteSubmitted: Dispatch>; @@ -59,9 +60,9 @@ export const VoteActionForm = ({ canVote, } = useVoteActionForm({ previousVote, voteContextHash, voteContextUrl }); - const setVoteContextData = (url: string, hash: string) => { + const setVoteContextData = (url: string, hash: string | null) => { setVoteContextUrl(url); - setVoteContextHash(hash); + setVoteContextHash(hash ?? undefined); }; useEffect(() => { @@ -217,11 +218,11 @@ export const VoteActionForm = ({ openModal({ type: "votingPower", state: { - dRepYesVotes, - dRepNoVotes, - dRepAbstainVotes, + yesVotes: dRepYesVotes, + noVotes: dRepNoVotes, + abstainVotes: dRepAbstainVotes, vote: previousVote?.vote, - }, + } satisfies VotingPowerModalState, }); }} > @@ -309,7 +310,7 @@ export const VoteActionForm = ({ type: "voteContext", state: { onSubmit: setVoteContextData, - }, + } satisfies VoteContextModalState, }); }} sx={{ diff --git a/govtool/frontend/src/components/organisms/VoteContext/VoteContextModal.tsx b/govtool/frontend/src/components/organisms/VoteContext/VoteContextModal.tsx index 9694d7d3d..4ceca049a 100644 --- a/govtool/frontend/src/components/organisms/VoteContext/VoteContextModal.tsx +++ b/govtool/frontend/src/components/organisms/VoteContext/VoteContextModal.tsx @@ -11,7 +11,7 @@ import { } from "@organisms"; import { VoteContextFormValues } from "@hooks"; -type VoteContextModalState = { +export type VoteContextModalState = { onSubmit: (url: string, hash: string | null, voteContextText: string) => void; }; From 0b1ac94422b10dc3f1649e7450fec525b99594ef Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Tue, 10 Sep 2024 15:43:34 +0100 Subject: [PATCH 34/47] change base readme for header image and mainnet launch --- .github/images/cardano-govtool-header.png | Bin 0 -> 102165 bytes CHANGELOG.md | 2 +- README.md | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 .github/images/cardano-govtool-header.png diff --git a/.github/images/cardano-govtool-header.png b/.github/images/cardano-govtool-header.png new file mode 100644 index 0000000000000000000000000000000000000000..f7a7ded9c46b521cd17db270f0733bf94553b719 GIT binary patch literal 102165 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 ^ge^|zt`aYufgY6EGm#5I64q`H4175DC> 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

%e`mG+;=_rpiG17?bbfGh2Yb9Vcyzx=DyU;O!> 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 - +

@@ -24,7 +24,7 @@ The Cardano GovTool enables ada holders to experience the governance features de #### Mainnet -- _Coming soon_ +- [gov.tools](https://gov.tools/) #### SanchoNet From 3f5b8d156ec5f54c749abdd4bd2a7da116a03457 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 6 Sep 2024 21:37:02 +0100 Subject: [PATCH 35/47] fix terms and conditions link --- govtool/frontend/src/components/organisms/Footer.tsx | 2 +- govtool/frontend/src/i18n/locales/en.ts | 2 +- tests/govtool-frontend/playwright/lib/constants/docsUrl.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/govtool/frontend/src/components/organisms/Footer.tsx b/govtool/frontend/src/components/organisms/Footer.tsx index d758cbd0f..c6a3bead3 100644 --- a/govtool/frontend/src/components/organisms/Footer.tsx +++ b/govtool/frontend/src/components/organisms/Footer.tsx @@ -41,7 +41,7 @@ export const Footer = () => { openInNewTab("https://docs.gov.tools/legal/privacy-policy"); const onClickTermOfService = () => - openInNewTab("https://docs.gov.tools/legal/terms-and-conditions"); + openInNewTab("https://docs.intersectmbo.org/legal/policies-and-conditions/terms-of-use"); const onClickFeedback = () => openFeedbackWindow(); diff --git a/govtool/frontend/src/i18n/locales/en.ts b/govtool/frontend/src/i18n/locales/en.ts index 1ec149052..033b583dc 100644 --- a/govtool/frontend/src/i18n/locales/en.ts +++ b/govtool/frontend/src/i18n/locales/en.ts @@ -350,7 +350,7 @@ export const en = { footer: { copyright: "© 2024 Intersect MBO", privacyPolicy: "Privacy policy", - termOfService: "Terms and Conditions", + termOfService: "Terms of Use", }, forms: { link: "Link", diff --git a/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts b/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts index 9a589861a..b76f8893f 100644 --- a/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts +++ b/tests/govtool-frontend/playwright/lib/constants/docsUrl.ts @@ -10,6 +10,6 @@ export const SIGNAL_NO_CONFIDENCE_VOTE_DOC_URL = `${environments.docsUrl}/using- export const FAQS_DOC_URL = `${environments.docsUrl}/faqs`; export const GUIDES_DOC_URL = `${environments.docsUrl}`; export const PRIVACY_POLICY = `${environments.docsUrl}/legal/privacy-policy`; -export const TERMS_AND_CONDITIONS = `${environments.docsUrl}/legal/terms-and-conditions`; +export const TERMS_AND_CONDITIONS = `https://docs.intersectmbo.org/legal/policies-and-conditions/terms-of-use`; export const HELP_DOC_URL = `${environments.docsUrl}/support/get-help-in-discord`; export const BOOTSTRAP_DOC_URL = `${environments.docsUrl}/about/bootstrapping-phase`; From 3856733f91744e16c1f4209b9fdd12c6ac908c34 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Fri, 6 Sep 2024 21:39:47 +0100 Subject: [PATCH 36/47] fix: broken terms and conditions link --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 382912734..e6bbce6f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ changes. ### Fixed -- +- Fixed terms and conditions link [Issue 1968](https://github.com/IntersectMBO/govtool/issues/1968) ### Changed From 5cb570e1b07ba1b55699ec5fc17317d0d68912f6 Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Wed, 11 Sep 2024 16:54:29 +0200 Subject: [PATCH 37/47] fix failing storybook test --- govtool/frontend/src/stories/Footer.stories.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/govtool/frontend/src/stories/Footer.stories.ts b/govtool/frontend/src/stories/Footer.stories.ts index 9d93a2489..5b2d604cf 100644 --- a/govtool/frontend/src/stories/Footer.stories.ts +++ b/govtool/frontend/src/stories/Footer.stories.ts @@ -27,7 +27,7 @@ export const FooterComponent: Story = { await expect(window.open).toHaveBeenCalledTimes(1); await userEvent.click( - canvas.getByTestId("terms-and-conditions-footer-link"), + canvas.getByTestId("terms-of-use-footer-link"), ); await expect(window.open).toHaveBeenCalledTimes(2); From 823ca6f2afccc8bec01fef8a606bf7a29df30e19 Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Wed, 11 Sep 2024 17:48:43 +0200 Subject: [PATCH 38/47] [#1817] add Matomo Analytics script --- CHANGELOG.md | 2 +- govtool/frontend/index.html | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bbce6f2..f5c64e0d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ changes. ### Added -- +- Add script for Matomo Analytics [Issue 1817](https://github.com/IntersectMBO/govtool/issues/1817) ### Fixed diff --git a/govtool/frontend/index.html b/govtool/frontend/index.html index 8032b4a36..cb8734a1b 100644 --- a/govtool/frontend/index.html +++ b/govtool/frontend/index.html @@ -24,6 +24,21 @@ +

From aead00dd79999df8ffab84dbfb57af7b187c271f Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Wed, 11 Sep 2024 16:39:13 +0200 Subject: [PATCH 39/47] chore / bump pdf-ui to v0.3.9 --- CHANGELOG.md | 2 +- govtool/frontend/package-lock.json | 8 ++++---- govtool/frontend/package.json | 2 +- govtool/frontend/yarn.lock | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bbce6f2..052bc0dd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ changes. ### Changed -- +- Bump @intersect.mbo/pdf-ui to v0.3.9 ### Removed diff --git a/govtool/frontend/package-lock.json b/govtool/frontend/package-lock.json index fdb9a75d1..9fd6038bc 100644 --- a/govtool/frontend/package-lock.json +++ b/govtool/frontend/package-lock.json @@ -14,7 +14,7 @@ "@emurgo/cardano-serialization-lib-asmjs": "12.0.0-beta.2", "@hookform/resolvers": "^3.3.1", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "^0.3.8", + "@intersect.mbo/pdf-ui": "^0.3.9", "@mui/icons-material": "^5.14.3", "@mui/material": "^5.14.4", "@rollup/plugin-babel": "^6.0.4", @@ -3551,9 +3551,9 @@ "license": "ISC" }, "node_modules/@intersect.mbo/pdf-ui": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.3.8.tgz", - "integrity": "sha512-eI8Uo2b6Byi7kQKOYA7TGCj3h96P4WP+kv0ZHKCPs/yVR6w1IGQHrXmBM9B0SlXh/gAQvW/kzTeZyL+nnL5ZOg==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.3.9.tgz", + "integrity": "sha512-KL2bd3Q7EuG0iYCdw19k8uABfr0NYmEaFkgwiXxNOAubGmUeZW/uognbfSl5hWdJIbJ3XZ68GCIW1JhrskgCHg==", "dependencies": { "@emurgo/cardano-serialization-lib-asmjs": "^12.0.0-beta.2", "@fontsource/poppins": "^5.0.14", diff --git a/govtool/frontend/package.json b/govtool/frontend/package.json index 541024da5..da61b73f8 100644 --- a/govtool/frontend/package.json +++ b/govtool/frontend/package.json @@ -28,7 +28,7 @@ "@emurgo/cardano-serialization-lib-asmjs": "12.0.0-beta.2", "@hookform/resolvers": "^3.3.1", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "^0.3.8", + "@intersect.mbo/pdf-ui": "^0.3.9", "@mui/icons-material": "^5.14.3", "@mui/material": "^5.14.4", "@rollup/plugin-babel": "^6.0.4", diff --git a/govtool/frontend/yarn.lock b/govtool/frontend/yarn.lock index 0b29b8e72..913850445 100644 --- a/govtool/frontend/yarn.lock +++ b/govtool/frontend/yarn.lock @@ -1693,10 +1693,10 @@ resolved "https://registry.npmjs.org/@intersect.mbo/intersectmbo.org-icons-set/-/intersectmbo.org-icons-set-1.1.0.tgz" integrity sha512-sjKEtnK9eLYH/8kCD0YRQCms3byFA/tnSsei9NHTZbBYX9sBpeX6ErfR0sKYjOSxQOxl4FumX9D0X+vHIqxo8g== -"@intersect.mbo/pdf-ui@^0.3.8": - version "0.3.8" - resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.3.8.tgz" - integrity sha512-eI8Uo2b6Byi7kQKOYA7TGCj3h96P4WP+kv0ZHKCPs/yVR6w1IGQHrXmBM9B0SlXh/gAQvW/kzTeZyL+nnL5ZOg== +"@intersect.mbo/pdf-ui@^0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.3.9.tgz" + integrity sha512-KL2bd3Q7EuG0iYCdw19k8uABfr0NYmEaFkgwiXxNOAubGmUeZW/uognbfSl5hWdJIbJ3XZ68GCIW1JhrskgCHg== dependencies: "@emurgo/cardano-serialization-lib-asmjs" "^12.0.0-beta.2" "@fontsource/poppins" "^5.0.14" From eaa03dfe5d0724ce6f997e13386c1cc3325cae6d Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Wed, 11 Sep 2024 19:01:35 +0200 Subject: [PATCH 40/47] [#1941] show all kinds of votes in the modal showing vote numbers --- CHANGELOG.md | 2 +- .../components/atoms/modal/ModalWrapper.tsx | 2 + .../GovernanceActionDetailsCardVotes.tsx | 35 +------ .../components/molecules/VoteActionForm.tsx | 25 ++--- .../components/molecules/VotesSubmitted.tsx | 31 +++--- .../organisms/Modal/SubmittedVotesModal.tsx | 31 ++++++ .../organisms/Modal/VotingPowerModal.tsx | 99 ------------------- .../src/components/organisms/Modal/index.ts | 2 +- govtool/frontend/src/context/modal.tsx | 8 +- govtool/frontend/src/models/api.ts | 23 +++-- ...es.tsx => SubmittedVotesModal.stories.tsx} | 44 ++++----- 11 files changed, 99 insertions(+), 203 deletions(-) create mode 100644 govtool/frontend/src/components/organisms/Modal/SubmittedVotesModal.tsx delete mode 100644 govtool/frontend/src/components/organisms/Modal/VotingPowerModal.tsx rename govtool/frontend/src/stories/modals/{VotingPowerModal.stories.tsx => SubmittedVotesModal.stories.tsx} (65%) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bbce6f2..3e6a5106b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ changes. ### Fixed +- Correctly show all kinds of votes in the modal showing vote numbers [Issue 1941](https://github.com/IntersectMBO/govtool/issues/1941) - Fixed terms and conditions link [Issue 1968](https://github.com/IntersectMBO/govtool/issues/1968) ### Changed @@ -36,7 +37,6 @@ changes. - Make testIds for link and identity references in drep form unique [Issue 1928](https://github.com/IntersectMBO/govtool/issues/1928) - Fix saving the Do Not List checkbox value on DRep registration [Issue 1940](https://github.com/IntersectMBO/govtool/issues/1940) -- Fix passing DRep votes to the modal showing vote numbers [Issue 1941](https://github.com/IntersectMBO/govtool/issues/1941) ### Changed diff --git a/govtool/frontend/src/components/atoms/modal/ModalWrapper.tsx b/govtool/frontend/src/components/atoms/modal/ModalWrapper.tsx index 807cded95..772063fc5 100644 --- a/govtool/frontend/src/components/atoms/modal/ModalWrapper.tsx +++ b/govtool/frontend/src/components/atoms/modal/ModalWrapper.tsx @@ -32,6 +32,8 @@ export const BaseWrapper = styled("div")>` width: 80vw; max-width: 510px; padding: 52px 24px 34px 24px; + max-height: 80vh; + overflow: auto; `; } if (variant === "popup") { diff --git a/govtool/frontend/src/components/molecules/GovernanceActionDetailsCardVotes.tsx b/govtool/frontend/src/components/molecules/GovernanceActionDetailsCardVotes.tsx index f56c6d8d9..985b0c3da 100644 --- a/govtool/frontend/src/components/molecules/GovernanceActionDetailsCardVotes.tsx +++ b/govtool/frontend/src/components/molecules/GovernanceActionDetailsCardVotes.tsx @@ -23,20 +23,7 @@ export const GovernanceActionDetailsCardVotes = ({ vote, isDashboard, isInProgress, - proposal: { - dRepAbstainVotes, - dRepNoVotes, - dRepYesVotes, - poolAbstainVotes, - poolNoVotes, - poolYesVotes, - ccAbstainVotes, - ccNoVotes, - ccYesVotes, - expiryDate, - expiryEpochNo, - type, - }, + proposal, }: GovernanceActionCardVotesProps) => { const { isVotingOnGovernanceActionEnabled } = useFeatureFlag(); const { screenWidth } = useScreenDimension(); @@ -52,29 +39,15 @@ export const GovernanceActionDetailsCardVotes = ({ p: `40px ${isModifiedPadding ? "24px" : "80px"}`, }} > - {isVoter && isVotingOnGovernanceActionEnabled(type) ? ( + {isVoter && isVotingOnGovernanceActionEnabled(proposal.type) ? ( ) : ( - + )} ); diff --git a/govtool/frontend/src/components/molecules/VoteActionForm.tsx b/govtool/frontend/src/components/molecules/VoteActionForm.tsx index d0f6fb4ed..79e13120b 100644 --- a/govtool/frontend/src/components/molecules/VoteActionForm.tsx +++ b/govtool/frontend/src/components/molecules/VoteActionForm.tsx @@ -13,29 +13,22 @@ import { useGetVoteContextTextFromFile, } from "@hooks"; import { formatDisplayDate } from "@utils"; -import { ProposalVote } from "@/models"; -import { VoteContextModalState, VotingPowerModalState } from "../organisms"; +import { ProposalData, ProposalVote } from "@/models"; +import { VoteContextModalState, SubmittedVotesModalState } from "../organisms"; type VoteActionFormProps = { setIsVoteSubmitted: Dispatch>; - expiryDate: string | undefined; - expiryEpochNo: number | undefined; isInProgress?: boolean; previousVote?: ProposalVote; - dRepYesVotes: number; - dRepNoVotes: number; - dRepAbstainVotes: number; + proposal: ProposalData; }; export const VoteActionForm = ({ setIsVoteSubmitted, - expiryDate, - expiryEpochNo, previousVote, - dRepAbstainVotes, - dRepNoVotes, - dRepYesVotes, isInProgress, + proposal, + proposal: { expiryDate, expiryEpochNo }, }: VoteActionFormProps) => { const [voteContextHash, setVoteContextHash] = useState(); const [voteContextUrl, setVoteContextUrl] = useState(); @@ -216,13 +209,11 @@ export const VoteActionForm = ({ }} onClick={() => { openModal({ - type: "votingPower", + type: "submittedVotes", state: { - yesVotes: dRepYesVotes, - noVotes: dRepNoVotes, - abstainVotes: dRepAbstainVotes, + ...proposal, vote: previousVote?.vote, - } satisfies VotingPowerModalState, + } satisfies SubmittedVotesModalState, }); }} > diff --git a/govtool/frontend/src/components/molecules/VotesSubmitted.tsx b/govtool/frontend/src/components/molecules/VotesSubmitted.tsx index d148a49a9..8edd31219 100644 --- a/govtool/frontend/src/components/molecules/VotesSubmitted.tsx +++ b/govtool/frontend/src/components/molecules/VotesSubmitted.tsx @@ -4,17 +4,10 @@ import { IMAGES } from "@consts"; import { VotePill } from "@atoms"; import { useTranslation } from "@hooks"; import { correctAdaFormat } from "@utils"; +import { SubmittedVotesData } from "@models"; type Props = { - dRepYesVotes: number; - dRepNoVotes: number; - dRepAbstainVotes: number; - poolYesVotes: number; - poolNoVotes: number; - poolAbstainVotes: number; - ccYesVotes: number; - ccNoVotes: number; - ccAbstainVotes: number; + votes: SubmittedVotesData; }; const Vote = ({ @@ -39,15 +32,17 @@ const Vote = ({ ); export const VotesSubmitted = ({ - dRepAbstainVotes, - dRepNoVotes, - dRepYesVotes, - poolAbstainVotes, - poolNoVotes, - poolYesVotes, - ccAbstainVotes, - ccNoVotes, - ccYesVotes, + votes: { + dRepYesVotes, + dRepAbstainVotes, + dRepNoVotes, + poolYesVotes, + poolAbstainVotes, + poolNoVotes, + ccYesVotes, + ccAbstainVotes, + ccNoVotes, + }, }: Props) => { const { t } = useTranslation(); diff --git a/govtool/frontend/src/components/organisms/Modal/SubmittedVotesModal.tsx b/govtool/frontend/src/components/organisms/Modal/SubmittedVotesModal.tsx new file mode 100644 index 000000000..1f3f7b6f5 --- /dev/null +++ b/govtool/frontend/src/components/organisms/Modal/SubmittedVotesModal.tsx @@ -0,0 +1,31 @@ +import { forwardRef } from "react"; +import { Box } from "@mui/material"; + +import { ModalContents, ModalWrapper } from "@atoms"; +import { useModal } from "@context"; +import { SubmittedVotesData } from "@/models"; +import { VotesSubmitted } from "@/components/molecules"; + +export interface SubmittedVotesModalState extends SubmittedVotesData { + vote?: string; +} + +export const SubmittedVotesModal = forwardRef((_, ref) => { + const { state } = useModal(); + + if (!state) return null; + + return ( + + + + + + + + ); +}); diff --git a/govtool/frontend/src/components/organisms/Modal/VotingPowerModal.tsx b/govtool/frontend/src/components/organisms/Modal/VotingPowerModal.tsx deleted file mode 100644 index 524f9bda4..000000000 --- a/govtool/frontend/src/components/organisms/Modal/VotingPowerModal.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { forwardRef } from "react"; -import { Box } from "@mui/material"; - -import { ModalContents, ModalWrapper, Typography, VotePill } from "@atoms"; -import { useModal } from "@context"; -import { correctAdaFormat } from "@utils"; -import { useScreenDimension, useTranslation } from "@hooks"; -import { Vote } from "@/models"; - -export interface VotingPowerModalState { - yesVotes: number; - noVotes: number; - abstainVotes: number; - vote?: string; -} - -export const VotingPowerModal = forwardRef((_, ref) => { - const { state } = useModal(); - const { isMobile } = useScreenDimension(); - const { t } = useTranslation(); - - const VOTES = [ - { title: "yes", vote: state?.yesVotes }, - { title: "abstain", vote: state?.abstainVotes }, - { title: "no", vote: state?.noVotes }, - ]; - - return ( - - - - - {t("modals.votingPower.govActionsVotes")} - - - {t("modals.votingPower.votesSubmittedByDReps")} - - {VOTES.map((vote, index) => ( - - {state?.vote?.toLocaleLowerCase() === vote.title ? ( - - {t("modals.votingPower.yourVote")} - - ) : null} - - - ₳ {correctAdaFormat(vote.vote)} - - - ))} - - - - ); -}); diff --git a/govtool/frontend/src/components/organisms/Modal/index.ts b/govtool/frontend/src/components/organisms/Modal/index.ts index 8f342f95d..4eb9eb8ce 100644 --- a/govtool/frontend/src/components/organisms/Modal/index.ts +++ b/govtool/frontend/src/components/organisms/Modal/index.ts @@ -2,4 +2,4 @@ export * from "./ChooseWalletModal"; export * from "./ExternalLinkModal"; export * from "./LoadingModal"; export * from "./StatusModal"; -export * from "./VotingPowerModal"; +export * from "./SubmittedVotesModal"; diff --git a/govtool/frontend/src/context/modal.tsx b/govtool/frontend/src/context/modal.tsx index bedfb2515..df08ea98d 100644 --- a/govtool/frontend/src/context/modal.tsx +++ b/govtool/frontend/src/context/modal.tsx @@ -6,7 +6,7 @@ import { ExternalLinkModal, StatusModal, VoteContextModal, - VotingPowerModal, + SubmittedVotesModal, LoadingModal, } from "@organisms"; import { basicReducer, callAll, BasicReducer } from "@utils"; @@ -28,7 +28,7 @@ export type ModalType = | "chooseWallet" | "statusModal" | "externalLink" - | "votingPower" + | "submittedVotes" | "voteContext"; const modals: Record = { @@ -47,8 +47,8 @@ const modals: Record = { externalLink: { component: , }, - votingPower: { - component: , + submittedVotes: { + component: , }, voteContext: { component: , diff --git a/govtool/frontend/src/models/api.ts b/govtool/frontend/src/models/api.ts index dd4e80073..4988fed43 100644 --- a/govtool/frontend/src/models/api.ts +++ b/govtool/frontend/src/models/api.ts @@ -145,6 +145,18 @@ export type ProposalVote = { vote: Vote; }; +export type SubmittedVotesData = { + dRepYesVotes: number; + dRepNoVotes: number; + dRepAbstainVotes: number; + ccYesVotes: number; + ccNoVotes: number; + ccAbstainVotes: number; + poolYesVotes: number; + poolNoVotes: number; + poolAbstainVotes: number; +}; + export type ProposalDataDTO = { createdDate: string; createdEpochNo: number; @@ -157,15 +169,6 @@ export type ProposalDataDTO = { txHash: string; type: GovernanceActionType; url: string; - dRepYesVotes: number; - dRepNoVotes: number; - dRepAbstainVotes: number; - ccYesVotes: number; - ccNoVotes: number; - ccAbstainVotes: number; - poolYesVotes: number; - poolNoVotes: number; - poolAbstainVotes: number; prevGovActionIndex: number | null; prevGovActionTxHash: string | null; abstract?: string; @@ -174,7 +177,7 @@ export type ProposalDataDTO = { references?: string[]; title?: string; protocolParams: EpochParams | null; -}; +} & SubmittedVotesData; export type ProposalData = ProposalDataDTO & { metadataStatus: MetadataValidationStatus | null; diff --git a/govtool/frontend/src/stories/modals/VotingPowerModal.stories.tsx b/govtool/frontend/src/stories/modals/SubmittedVotesModal.stories.tsx similarity index 65% rename from govtool/frontend/src/stories/modals/VotingPowerModal.stories.tsx rename to govtool/frontend/src/stories/modals/SubmittedVotesModal.stories.tsx index 4fdf4ae84..cd9af6c87 100644 --- a/govtool/frontend/src/stories/modals/VotingPowerModal.stories.tsx +++ b/govtool/frontend/src/stories/modals/SubmittedVotesModal.stories.tsx @@ -3,24 +3,24 @@ import { Meta, StoryFn } from "@storybook/react"; import { Modal } from "@atoms"; import { useModal } from "@context"; -import { StatusModal, VotingPowerModalState } from "@organisms"; +import { StatusModal, SubmittedVotesModalState } from "@organisms"; import { screen, waitFor, within } from "@storybook/testing-library"; import { callAll, correctAdaFormat } from "@utils"; import { useEffect } from "react"; const meta = { - title: "Example/Modals/VotingPowerModal", + title: "Example/Modals/SubmittedVotesModal", component: StatusModal, } satisfies Meta; export default meta; -const Template: StoryFn = (args) => { +const Template: StoryFn = (args) => { const { openModal, modal, modals } = useModal(); const open = () => { openModal({ - type: "votingPower", + type: "submittedVotes", state: { ...args, }, @@ -52,22 +52,22 @@ const Template: StoryFn = (args) => { async function assertVotes( canvas: ReturnType, - args: VotingPowerModalState, + args: SubmittedVotesModalState, ) { - const yesVotesText = `₳ ${correctAdaFormat(args.yesVotes)}`; - const noVotesText = `₳ ${correctAdaFormat(args.noVotes)}`; - const abstainVotesText = `₳ ${correctAdaFormat(args.abstainVotes)}`; + const dRepYesVotesText = `₳ ${correctAdaFormat(args.dRepYesVotes)}`; + const dRepNoVotesText = `₳ ${correctAdaFormat(args.dRepNoVotes)}`; + const dRepAbstainVotesText = `₳ ${correctAdaFormat(args.dRepAbstainVotes)}`; - await expect(canvas.getByText(yesVotesText)).toBeVisible(); - await expect(canvas.getByText(noVotesText)).toBeVisible(); - await expect(canvas.getByText(abstainVotesText)).toBeVisible(); + await expect(canvas.getByText(dRepYesVotesText)).toBeVisible(); + await expect(canvas.getByText(dRepNoVotesText)).toBeVisible(); + await expect(canvas.getByText(dRepAbstainVotesText)).toBeVisible(); } export const YesVoted = Template.bind({}); YesVoted.args = { - yesVotes: 1000000000000, - noVotes: 10000000000, - abstainVotes: 324000000, + dRepYesVotes: 1000000000000, + dRepNoVotes: 10000000000, + dRepAbstainVotes: 324000000, vote: "yes", }; YesVoted.play = async ({ args }) => { @@ -81,14 +81,14 @@ YesVoted.play = async ({ args }) => { export const AbstainVoted = Template.bind({}); AbstainVoted.args = { - yesVotes: 1000000000000, - noVotes: 10000000000, - abstainVotes: 324000000, + dRepYesVotes: 1000000000000, + dRepNoVotes: 10000000000, + dRepAbstainVotes: 324000000, vote: "abstain", }; AbstainVoted.play = async ({ args }) => { waitFor(async () => { - const modalScreen = screen.getAllByTestId("external-link-modal")[0]; + const modalScreen = screen.getAllByTestId("submitted-votes-modal")[0]; const loadingModalCanvas = within(modalScreen); await assertVotes(loadingModalCanvas, args); @@ -97,14 +97,14 @@ AbstainVoted.play = async ({ args }) => { export const NoVoted = Template.bind({}); NoVoted.args = { - yesVotes: 1000000000000, - noVotes: 10000000000, - abstainVotes: 324000000, + dRepYesVotes: 1000000000000, + dRepNoVotes: 10000000000, + dRepAbstainVotes: 324000000, vote: "no", }; NoVoted.play = async ({ args }) => { waitFor(async () => { - const modalScreen = screen.getAllByTestId("external-link-modal")[0]; + const modalScreen = screen.getAllByTestId("submitted-votes-modal")[0]; const loadingModalCanvas = within(modalScreen); await assertVotes(loadingModalCanvas, args); From a6991e89af4c6d20872f1b06258789fc18448b37 Mon Sep 17 00:00:00 2001 From: Joanna Dyczka Date: Wed, 11 Sep 2024 15:35:52 +0200 Subject: [PATCH 41/47] [#1982] hide Delegate button if already delegated to this DRep --- CHANGELOG.md | 1 + .../src/components/organisms/DRepCard.tsx | 3 +++ .../components/organisms/DRepDetailsCard.tsx | 18 +++++++++------ .../organisms/DRepDetailsCardHeader.tsx | 13 ++++++----- govtool/frontend/src/i18n/locales/en.ts | 2 ++ govtool/frontend/src/pages/DRepDetails.tsx | 22 +++++-------------- .../src/pages/DRepDirectoryContent.tsx | 1 + .../src/stories/DRepDetailsCard.stories.ts | 20 ++++++++++------- 8 files changed, 43 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6bbce6f2..e73182735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ changes. ### Fixed - Fixed terms and conditions link [Issue 1968](https://github.com/IntersectMBO/govtool/issues/1968) +- Hide Delegate button in DRep list and details if user has already delegated to this DRep [Issue 1982](https://github.com/IntersectMBO/govtool/issues/1982) ### Changed diff --git a/govtool/frontend/src/components/organisms/DRepCard.tsx b/govtool/frontend/src/components/organisms/DRepCard.tsx index 8391f3f1c..95e611c2e 100644 --- a/govtool/frontend/src/components/organisms/DRepCard.tsx +++ b/govtool/frontend/src/components/organisms/DRepCard.tsx @@ -19,6 +19,7 @@ type DRepCardProps = { isDelegationLoading?: boolean; isInProgress?: boolean; isMe?: boolean; + isMyDrep?: boolean; onDelegate?: () => void; }; @@ -28,6 +29,7 @@ export const DRepCard = ({ isDelegationLoading, isInProgress, isMe, + isMyDrep, onDelegate, }: DRepCardProps) => { const navigate = useNavigate(); @@ -209,6 +211,7 @@ export const DRepCard = ({ {status === "Active" && isConnected && onDelegate && + !isMyDrep && !isInProgress && (