diff --git a/.github/workflows/test_backend.yml b/.github/workflows/test_backend.yml index 2e01c721b..aa651f28c 100644 --- a/.github/workflows/test_backend.yml +++ b/.github/workflows/test_backend.yml @@ -17,7 +17,7 @@ on: - "staging.govtool.byron.network/api" - "govtool.cardanoapi.io/api" - "z6b8d2f7a-zca4a4c45-gtw.z937eb260.rustrocks.fr" - - "dev-sanchonet.govtool.byron.network/api" + - "z78acf3c2-z5575152b-gtw.z937eb260.rustrocks.fr" - "be.gov.tools" network: required: true @@ -39,7 +39,7 @@ concurrency: jobs: backend-tests: runs-on: ubuntu-latest - if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} outputs: start_time: ${{ steps.set-pending-status.outputs.timestamp }} status: ${{ steps.run-tests.outcome }} @@ -58,7 +58,6 @@ jobs: https://api.github.com/repos/${{ github.repository }}/statuses/${{ env.COMMIT_SHA }} \ -d "{\"state\": \"pending\", \"context\": \"Backend Tests : ${{env.BASE_URL}}\", \"target_url\": \"https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}\"}" - - name: Set up Python uses: actions/setup-python@v4 with: diff --git a/.github/workflows/test_integration_playwright.yml b/.github/workflows/test_integration_playwright.yml index f17e059e8..ea6406cfe 100644 --- a/.github/workflows/test_integration_playwright.yml +++ b/.github/workflows/test_integration_playwright.yml @@ -18,6 +18,7 @@ on: - "govtool.cardanoapi.io" - "preview.gov.tools" - "gov.tools" + - "p80-z78acf3c2-zded6a792-gtw.z937eb260.rustrocks.fr" network: required: true type: choice @@ -129,6 +130,7 @@ jobs: CARDANOAPI_METADATA_URL: ${{vars.CARDANOAPI_METADATA_URL}} PROPOSAL_FAUCET_PAYMENT_PRIVATE: ${{secrets.PROPOSAL_FAUCET_PAYMENT_PRIVATE}} PROPOSAL_FAUCET_STAKE_PRIVATE: ${{secrets.PROPOSAL_FAUCET_STAKE_PRIVATE}} + PROPOSAL_FAUCET_DREP_PRIVATE: ${{secrets.PROPOSAL_FAUCET_DREP_PRIVATE}} publish-report: runs-on: ubuntu-latest diff --git a/govtool/frontend/package-lock.json b/govtool/frontend/package-lock.json index 78093dc32..2f7e1e056 100644 --- a/govtool/frontend/package-lock.json +++ b/govtool/frontend/package-lock.json @@ -15,7 +15,7 @@ "@hookform/resolvers": "^3.3.1", "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "0.7.0-beta-19", + "@intersect.mbo/pdf-ui": "0.7.0-beta-24", "@mui/icons-material": "^5.14.3", "@mui/material": "^5.14.4", "@rollup/plugin-babel": "^6.0.4", @@ -3424,772 +3424,77 @@ "license": "ISC" }, "node_modules/@intersect.mbo/pdf-ui": { - "version": "0.7.0-beta-19", - "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-19.tgz", - "integrity": "sha512-7VxTZos1biINze2eijXX1qJ5zSlAEIbtbCbH12+9NPSfkRFHty4pZphgCka0/res/mI/wU6TNcweHnomjyJ2vQ==", + "version": "0.7.0-beta-24", + "resolved": "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-24.tgz", + "integrity": "sha512-o/3thkna2DQjvtiSqMf4KHN2XgDQN8qHVRklF3VRVhPue8y99IWtbji0nhlvhoYDqmdEVL/3Nmrt9Xom3QjHwg==", "dependencies": { "@emurgo/cardano-serialization-lib-asmjs": "^12.0.0-beta.2", "@fontsource/poppins": "^5.0.14", "@intersect.mbo/intersectmbo.org-icons-set": "^1.1.0", "axios": "^1.7.2", "date-fns": "^3.6.0", - "react-markdown": "^8.0.6", + "highlight.js": "^11.11.1", + "react-markdown": "^10.1.0", "react-slick": "^0.30.2", - "slick-carousel": "^1.8.1", - "web-vitals": "^2.1.4" - }, - "peerDependencies": { - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", - "@mui/material": "^5.15.18", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-router-dom": "^6.23.1", - "react-scripts": "5.0.1", - "sass": "^1.77.2" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/@emurgo/cardano-serialization-lib-asmjs": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-asmjs/-/cardano-serialization-lib-asmjs-12.1.1.tgz", - "integrity": "sha512-K3f28QUfLDJ7seO6MtKfMYtRm5ccf36TQ5yxyTmZqX1TA85MkriEdxqpgV9KLiLEA95emwnlvU2/WmlHMRPg1A==", - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/@types/hast": { - "version": "2.3.10", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", - "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/react-markdown": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz", - "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/prop-types": "^15.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "prop-types": "^15.0.0", - "property-information": "^6.0.0", - "react-is": "^18.0.0", - "remark-parse": "^10.0.0", - "remark-rehype": "^10.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=16", - "react": ">=16" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" + "rehype-katex": "^7.0.1", + "rehype-raw": "^7.0.0", + "remark-breaks": "^4.0.0", + "remark-math": "^6.0.0", + "slick-carousel": "^1.8.1", + "web-vitals": "^2.1.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/material": "^5.15.18", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.23.1", + "react-scripts": "5.0.1", + "sass": "^1.77.2" } }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "node_modules/@intersect.mbo/pdf-ui/node_modules/@emurgo/cardano-serialization-lib-asmjs": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-asmjs/-/cardano-serialization-lib-asmjs-12.1.1.tgz", + "integrity": "sha512-K3f28QUfLDJ7seO6MtKfMYtRm5ccf36TQ5yxyTmZqX1TA85MkriEdxqpgV9KLiLEA95emwnlvU2/WmlHMRPg1A==", + "license": "MIT" }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", + "node_modules/@intersect.mbo/pdf-ui/node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", + "node_modules/@intersect.mbo/pdf-ui/node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" - } - }, - "node_modules/@intersect.mbo/pdf-ui/node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" } }, "node_modules/@isaacs/cliui": { @@ -16305,6 +15610,31 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", @@ -16332,6 +15662,25 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-to-text": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", @@ -16395,6 +15744,15 @@ "dev": true, "license": "MIT" }, + "node_modules/highlight.js": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", + "integrity": "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -16573,6 +15931,16 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/html-webpack-plugin": { "version": "5.6.3", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", @@ -17096,29 +16464,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -20669,78 +20014,6 @@ "remove-accents": "0.5.0" } }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions/node_modules/@types/mdast": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", - "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/mdast-util-definitions/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/mdast-util-definitions/node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions/node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -21735,15 +21008,6 @@ "node": ">=10" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -27069,6 +26333,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -27591,18 +26870,6 @@ "tslib": "^2.1.0" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -30068,16 +29335,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", @@ -30336,33 +29593,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uvu/node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", diff --git a/govtool/frontend/package.json b/govtool/frontend/package.json index d4c6527cd..e9e3744b2 100644 --- a/govtool/frontend/package.json +++ b/govtool/frontend/package.json @@ -29,7 +29,7 @@ "@hookform/resolvers": "^3.3.1", "@intersect.mbo/govtool-outcomes-pillar-ui": "1.4.0", "@intersect.mbo/intersectmbo.org-icons-set": "^1.0.8", - "@intersect.mbo/pdf-ui": "0.7.0-beta-19", + "@intersect.mbo/pdf-ui": "0.7.0-beta-24", "@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 ea257d680..14d5adf21 100644 --- a/govtool/frontend/yarn.lock +++ b/govtool/frontend/yarn.lock @@ -1377,131 +1377,11 @@ resolved "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-asmjs/-/cardano-serialization-lib-asmjs-14.1.1.tgz" integrity sha512-Q2HVpPRt417Quxv3qagGWbkJQU8SiQCl1K/344ZtQMwsLoqTfRlCNzmSWMBN7jyBxbtKoh+vdbSiLqwG1NAjYg== -"@esbuild/aix-ppc64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz" - integrity sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ== - -"@esbuild/android-arm@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz" - integrity sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g== - -"@esbuild/android-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz" - integrity sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g== - -"@esbuild/android-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz" - integrity sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg== - -"@esbuild/darwin-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz" - integrity sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw== - -"@esbuild/darwin-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz" - integrity sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg== - -"@esbuild/freebsd-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz" - integrity sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w== - -"@esbuild/freebsd-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz" - integrity sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A== - -"@esbuild/linux-arm@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz" - integrity sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg== - -"@esbuild/linux-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz" - integrity sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg== - -"@esbuild/linux-ia32@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz" - integrity sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg== - -"@esbuild/linux-loong64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz" - integrity sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw== - -"@esbuild/linux-mips64el@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz" - integrity sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ== - -"@esbuild/linux-ppc64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz" - integrity sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw== - -"@esbuild/linux-riscv64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz" - integrity sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA== - -"@esbuild/linux-s390x@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz" - integrity sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA== - "@esbuild/linux-x64@0.25.0": version "0.25.0" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz" integrity sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw== -"@esbuild/netbsd-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz" - integrity sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw== - -"@esbuild/netbsd-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz" - integrity sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA== - -"@esbuild/openbsd-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz" - integrity sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw== - -"@esbuild/openbsd-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz" - integrity sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg== - -"@esbuild/sunos-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz" - integrity sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg== - -"@esbuild/win32-arm64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz" - integrity sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw== - -"@esbuild/win32-ia32@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz" - integrity sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA== - -"@esbuild/win32-x64@0.25.0": - version "0.25.0" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz" - integrity sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" @@ -1632,18 +1512,23 @@ 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.7.0-beta-19": - version "0.7.0-beta-19" - resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-19.tgz" - integrity sha512-7VxTZos1biINze2eijXX1qJ5zSlAEIbtbCbH12+9NPSfkRFHty4pZphgCka0/res/mI/wU6TNcweHnomjyJ2vQ== +"@intersect.mbo/pdf-ui@0.7.0-beta-24": + version "0.7.0-beta-24" + resolved "https://registry.npmjs.org/@intersect.mbo/pdf-ui/-/pdf-ui-0.7.0-beta-24.tgz" + integrity sha512-o/3thkna2DQjvtiSqMf4KHN2XgDQN8qHVRklF3VRVhPue8y99IWtbji0nhlvhoYDqmdEVL/3Nmrt9Xom3QjHwg== dependencies: "@emurgo/cardano-serialization-lib-asmjs" "^12.0.0-beta.2" "@fontsource/poppins" "^5.0.14" "@intersect.mbo/intersectmbo.org-icons-set" "^1.1.0" axios "^1.7.2" date-fns "^3.6.0" - react-markdown "^8.0.6" + highlight.js "^11.11.1" + react-markdown "^10.1.0" react-slick "^0.30.2" + rehype-katex "^7.0.1" + rehype-raw "^7.0.0" + remark-breaks "^4.0.0" + remark-math "^6.0.0" slick-carousel "^1.8.1" web-vitals "^2.1.4" @@ -2293,46 +2178,6 @@ resolved "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz" integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== -"@parcel/watcher-android-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz" - integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ== - -"@parcel/watcher-darwin-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz" - integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw== - -"@parcel/watcher-darwin-x64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz" - integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA== - -"@parcel/watcher-freebsd-x64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz" - integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw== - -"@parcel/watcher-linux-arm-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz" - integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA== - -"@parcel/watcher-linux-arm-musl@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz" - integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA== - -"@parcel/watcher-linux-arm64-glibc@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz" - integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA== - -"@parcel/watcher-linux-arm64-musl@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz" - integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q== - "@parcel/watcher-linux-x64-glibc@2.5.0": version "2.5.0" resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz" @@ -2343,21 +2188,6 @@ resolved "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz" integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA== -"@parcel/watcher-win32-arm64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz" - integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig== - -"@parcel/watcher-win32-ia32@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz" - integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA== - -"@parcel/watcher-win32-x64@2.5.0": - version "2.5.0" - resolved "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz" - integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw== - "@parcel/watcher@^2.4.1": version "2.5.0" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz" @@ -2469,81 +2299,6 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz" - integrity sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA== - -"@rollup/rollup-android-arm64@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz" - integrity sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg== - -"@rollup/rollup-darwin-arm64@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz" - integrity sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ== - -"@rollup/rollup-darwin-x64@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz" - integrity sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q== - -"@rollup/rollup-freebsd-arm64@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz" - integrity sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw== - -"@rollup/rollup-freebsd-x64@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz" - integrity sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g== - -"@rollup/rollup-linux-arm-gnueabihf@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz" - integrity sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg== - -"@rollup/rollup-linux-arm-musleabihf@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz" - integrity sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA== - -"@rollup/rollup-linux-arm64-gnu@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz" - integrity sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw== - -"@rollup/rollup-linux-arm64-musl@4.12.0": - version "4.12.0" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz" - integrity sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ== - -"@rollup/rollup-linux-arm64-musl@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz" - integrity sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A== - -"@rollup/rollup-linux-loongarch64-gnu@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz" - integrity sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg== - -"@rollup/rollup-linux-powerpc64le-gnu@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz" - integrity sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA== - -"@rollup/rollup-linux-riscv64-gnu@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz" - integrity sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg== - -"@rollup/rollup-linux-s390x-gnu@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz" - integrity sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ== - "@rollup/rollup-linux-x64-gnu@4.34.9": version "4.34.9" resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz" @@ -2554,21 +2309,6 @@ resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz" integrity sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA== -"@rollup/rollup-win32-arm64-msvc@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz" - integrity sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q== - -"@rollup/rollup-win32-ia32-msvc@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz" - integrity sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w== - -"@rollup/rollup-win32-x64-msvc@4.34.9": - version "4.34.9" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz" - integrity sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw== - "@rtsao/scc@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" @@ -3170,31 +2910,6 @@ "@svgr/plugin-svgo" "^5.5.0" loader-utils "^2.0.0" -"@swc/core-darwin-arm64@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.9.3.tgz" - integrity sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w== - -"@swc/core-darwin-x64@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.9.3.tgz" - integrity sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ== - -"@swc/core-linux-arm-gnueabihf@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.9.3.tgz" - integrity sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ== - -"@swc/core-linux-arm64-gnu@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.9.3.tgz" - integrity sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g== - -"@swc/core-linux-arm64-musl@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.9.3.tgz" - integrity sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg== - "@swc/core-linux-x64-gnu@1.9.3": version "1.9.3" resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.9.3.tgz" @@ -3205,21 +2920,6 @@ resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.9.3.tgz" integrity sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg== -"@swc/core-win32-arm64-msvc@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.9.3.tgz" - integrity sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg== - -"@swc/core-win32-ia32-msvc@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.9.3.tgz" - integrity sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA== - -"@swc/core-win32-x64-msvc@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.9.3.tgz" - integrity sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ== - "@swc/core@*", "@swc/core@^1.5.22", "@swc/core@^1.7.26": version "1.9.3" resolved "https://registry.npmjs.org/@swc/core/-/core-1.9.3.tgz" @@ -3505,13 +3205,6 @@ dependencies: "@types/node" "*" -"@types/hast@^2.0.0": - version "2.3.10" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz" - integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw== - dependencies: - "@types/unist" "^2" - "@types/hast@^3.0.0": version "3.0.4" resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" @@ -3580,13 +3273,6 @@ resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz" integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - "@types/mdast@^4.0.0": version "4.0.4" resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" @@ -3633,7 +3319,7 @@ resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== -"@types/prop-types@*", "@types/prop-types@^15.0.0", "@types/prop-types@^15.7.12": +"@types/prop-types@*", "@types/prop-types@^15.7.12": version "15.7.13" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== @@ -3758,7 +3444,7 @@ resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== @@ -6225,7 +5911,7 @@ diff-sequences@^29.6.3: resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -diff@^5.0.0, diff@^5.1.0: +diff@^5.1.0: version "5.2.0" resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== @@ -7526,16 +7212,6 @@ fs@^0.0.1-security: resolved "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz" integrity sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w== -fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -7886,6 +7562,25 @@ hast-util-parse-selector@^4.0.0: dependencies: "@types/hast" "^3.0.0" +hast-util-raw@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-to-jsx-runtime@^2.0.0: version "2.3.2" resolved "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz" @@ -7907,6 +7602,19 @@ hast-util-to-jsx-runtime@^2.0.0: unist-util-position "^5.0.0" vfile-message "^4.0.0" +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-to-text@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz" @@ -7917,11 +7625,6 @@ hast-util-to-text@^4.0.0: hast-util-is-element "^3.0.0" unist-util-find-after "^5.0.0" -hast-util-whitespace@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz" - integrity sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng== - hast-util-whitespace@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" @@ -7950,6 +7653,11 @@ headers-polyfill@^4.0.2: resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz" integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== +highlight.js@^11.11.1: + version "11.11.1" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz" + integrity sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w== + hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" @@ -8028,6 +7736,11 @@ html-url-attributes@^3.0.0: resolved "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz" integrity sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ== +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + html-webpack-plugin@^5.5.0: version "5.6.3" resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz" @@ -8262,11 +7975,6 @@ ini@^1.3.4, ini@^1.3.5: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - inline-style-parser@0.2.4: version "0.2.4" resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz" @@ -8359,11 +8067,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -9928,11 +9631,6 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - klona@^2.0.4, klona@^2.0.5: version "2.0.6" resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" @@ -10235,15 +9933,6 @@ match-sorter@^6.0.2: "@babel/runtime" "^7.23.8" remove-accents "0.5.0" -mdast-util-definitions@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz" - integrity sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - unist-util-visit "^4.0.0" - mdast-util-find-and-replace@^3.0.0: version "3.0.2" resolved "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz" @@ -10254,24 +9943,6 @@ mdast-util-find-and-replace@^3.0.0: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.0.0: - version "1.3.1" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - mdast-util-from-markdown@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz" @@ -10361,20 +10032,6 @@ mdast-util-phrasing@^4.0.0: "@types/mdast" "^4.0.0" unist-util-is "^6.0.0" -mdast-util-to-hast@^12.1.0: - version "12.3.0" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz" - integrity sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-definitions "^5.0.0" - micromark-util-sanitize-uri "^1.1.0" - trim-lines "^3.0.0" - unist-util-generated "^2.0.0" - unist-util-position "^4.0.0" - unist-util-visit "^4.0.0" - mdast-util-to-hast@^13.0.0: version "13.2.0" resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" @@ -10405,13 +10062,6 @@ mdast-util-to-markdown@^2.0.0, mdast-util-to-markdown@^2.1.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" -mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz" @@ -10485,28 +10135,6 @@ methods@~1.1.2: resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark-core-commonmark@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz" @@ -10542,15 +10170,6 @@ micromark-extension-math@^3.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-destination@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" @@ -10560,16 +10179,6 @@ micromark-factory-destination@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-factory-label@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" @@ -10580,14 +10189,6 @@ micromark-factory-label@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-space@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz" - integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-space@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" @@ -10596,16 +10197,6 @@ micromark-factory-space@^2.0.0: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-title@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" @@ -10616,16 +10207,6 @@ micromark-factory-title@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-whitespace@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" @@ -10636,14 +10217,6 @@ micromark-factory-whitespace@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-character@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz" - integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-character@^2.0.0: version "2.1.1" resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" @@ -10652,13 +10225,6 @@ micromark-util-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-chunked@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" @@ -10666,15 +10232,6 @@ micromark-util-chunked@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-classify-character@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" @@ -10684,14 +10241,6 @@ micromark-util-classify-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-combine-extensions@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" @@ -10700,13 +10249,6 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" @@ -10714,16 +10256,6 @@ micromark-util-decode-numeric-character-reference@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-decode-string@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" @@ -10734,33 +10266,16 @@ micromark-util-decode-string@^2.0.0: micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - micromark-util-encode@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - micromark-util-html-tag-name@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-normalize-identifier@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" @@ -10768,13 +10283,6 @@ micromark-util-normalize-identifier@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - micromark-util-resolve-all@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" @@ -10782,15 +10290,6 @@ micromark-util-resolve-all@^2.0.0: dependencies: micromark-util-types "^2.0.0" -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-sanitize-uri@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" @@ -10800,16 +10299,6 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-util-subtokenize@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz" @@ -10820,49 +10309,16 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-symbol@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz" - integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== - micromark-util-symbol@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz" - integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== - micromark-util-types@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz" @@ -11010,11 +10466,6 @@ mkdirp@~0.5.1: dependencies: minimist "^1.2.6" -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - mrmime@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz" @@ -12377,7 +11828,7 @@ prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.6.2, prop-types@^15.8.1: +prop-types@^15.6.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -12635,26 +12086,22 @@ react-json-tree@^0.19.0: "@types/lodash" "^4.17.0" react-base16-styling "^0.10.0" -react-markdown@^8.0.6: - version "8.0.7" - resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz" - integrity sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ== +react-markdown@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz" + integrity sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ== dependencies: - "@types/hast" "^2.0.0" - "@types/prop-types" "^15.0.0" - "@types/unist" "^2.0.0" - comma-separated-tokens "^2.0.0" - hast-util-whitespace "^2.0.0" - prop-types "^15.0.0" - property-information "^6.0.0" - react-is "^18.0.0" - remark-parse "^10.0.0" - remark-rehype "^10.0.0" - space-separated-tokens "^2.0.0" - style-to-object "^0.4.0" - unified "^10.0.0" - unist-util-visit "^4.0.0" - vfile "^5.0.0" + "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" + remark-parse "^11.0.0" + remark-rehype "^11.0.0" + unified "^11.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" react-markdown@^9.0.1: version "9.0.1" @@ -12945,6 +12392,15 @@ rehype-katex@^7.0.1: unist-util-visit-parents "^6.0.0" vfile "^6.0.0" +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + relateurl@^0.2.7: version "0.2.7" resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" @@ -12976,15 +12432,6 @@ remark-math@^6.0.0: micromark-extension-math "^3.0.0" unified "^11.0.0" -remark-parse@^10.0.0: - version "10.0.2" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz" - integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-from-markdown "^1.0.0" - unified "^10.0.0" - remark-parse@^11.0.0: version "11.0.0" resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz" @@ -12995,16 +12442,6 @@ remark-parse@^11.0.0: micromark-util-types "^2.0.0" unified "^11.0.0" -remark-rehype@^10.0.0: - version "10.1.0" - resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz" - integrity sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw== - dependencies: - "@types/hast" "^2.0.0" - "@types/mdast" "^3.0.0" - mdast-util-to-hast "^12.1.0" - unified "^10.0.0" - remark-rehype@^11.0.0: version "11.1.1" resolved "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz" @@ -13214,13 +12651,6 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" @@ -14044,13 +13474,6 @@ style-loader@^3.3.1: resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== -style-to-object@^0.4.0: - version "0.4.4" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz" - integrity sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg== - dependencies: - inline-style-parser "0.1.1" - style-to-object@^1.0.0: version "1.0.8" resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz" @@ -14654,19 +14077,6 @@ unidiff@^1.0.4: dependencies: diff "^5.1.0" -unified@^10.0.0: - version "10.1.2" - resolved "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz" - integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== - dependencies: - "@types/unist" "^2.0.0" - bail "^2.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^4.0.0" - trough "^2.0.0" - vfile "^5.0.0" - unified@^11.0.0: version "11.0.5" resolved "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz" @@ -14695,18 +14105,6 @@ unist-util-find-after@^5.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" -unist-util-generated@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz" - integrity sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A== - -unist-util-is@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz" - integrity sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" @@ -14714,13 +14112,6 @@ unist-util-is@^6.0.0: dependencies: "@types/unist" "^3.0.0" -unist-util-position@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz" - integrity sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-position@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" @@ -14736,13 +14127,6 @@ unist-util-remove-position@^5.0.0: "@types/unist" "^3.0.0" unist-util-visit "^5.0.0" -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" @@ -14750,14 +14134,6 @@ unist-util-stringify-position@^4.0.0: dependencies: "@types/unist" "^3.0.0" -unist-util-visit-parents@^5.1.1: - version "5.1.3" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz" - integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" @@ -14766,15 +14142,6 @@ unist-util-visit-parents@^6.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" -unist-util-visit@^4.0.0: - version "4.1.2" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz" - integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^5.0.0" - unist-util-visit-parents "^5.1.1" - unist-util-visit@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" @@ -14899,16 +14266,6 @@ uuid@^9.0.0: resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - v8-to-istanbul@^8.1.0: version "8.1.1" resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" @@ -14940,14 +14297,6 @@ vfile-location@^5.0.0: "@types/unist" "^3.0.0" vfile "^6.0.0" -vfile-message@^3.0.0: - version "3.1.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz" - integrity sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" @@ -14956,16 +14305,6 @@ vfile-message@^4.0.0: "@types/unist" "^3.0.0" unist-util-stringify-position "^4.0.0" -vfile@^5.0.0: - version "5.3.7" - resolved "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz" - integrity sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^3.0.0" - vfile-message "^3.0.0" - vfile@^6.0.0: version "6.0.3" resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" diff --git a/tests/govtool-backend/lib/govtool_api.py b/tests/govtool-backend/lib/govtool_api.py index 7036ddae5..7cc15d6c0 100644 --- a/tests/govtool-backend/lib/govtool_api.py +++ b/tests/govtool-backend/lib/govtool_api.py @@ -92,6 +92,12 @@ def validate_metadata(self, metadata) -> Response: def network_metrics(self) -> Response: return self.__get("/network/metrics") + + def network_total_stake(self) -> Response: + return self.__get("/network/total-stake") + + def network_info(self) -> Response: + return self.__get("/network/info") def get_transaction_status(self, tx_id) -> Response: return self.__get("/transaction/status", tx_id) diff --git a/tests/govtool-backend/models/TestData.py b/tests/govtool-backend/models/TestData.py index 3f89f4149..3cb21b829 100644 --- a/tests/govtool-backend/models/TestData.py +++ b/tests/govtool-backend/models/TestData.py @@ -128,13 +128,28 @@ class TxStatus(TypedDict): class NetworkMetrics(TypedDict): - currentTime: str - currentEpoch: int - currentBlock: int uniqueDelegators: int totalDelegations: int totalGovernanceActions: int totalDRepVotes: int totalRegisteredDReps: int + totalDRepDistr: int + totalActiveDReps: int + totalInactiveDReps: int + totalActiveCIP119CompliantDReps: int + totalRegisteredDirectVoters: int + noOfCommitteeMembers: int + quorumNumerator: int + quorumDenominator: int + +class NetworkTotalStake(TypedDict): + totalStakeControlledByDReps: int + totalStakeControlledBySPOs: int alwaysAbstainVotingPower: int alwaysNoConfidenceVotingPower: int + +class NetworkInfo(TypedDict): + currentTime: str + epochNo: int + blockNo: int + networkName: str \ No newline at end of file diff --git a/tests/govtool-backend/test_cases/test_misc.py b/tests/govtool-backend/test_cases/test_misc.py index c149ec962..f2dbc3673 100644 --- a/tests/govtool-backend/test_cases/test_misc.py +++ b/tests/govtool-backend/test_cases/test_misc.py @@ -1,7 +1,7 @@ import allure from lib.assertions import assert_data_type -from models.TestData import EpochParam, NetworkMetrics, TxStatus +from models.TestData import EpochParam, NetworkInfo, NetworkMetrics, NetworkTotalStake, TxStatus def validate_epoch_param(epoch_param): @@ -10,6 +10,12 @@ def validate_epoch_param(epoch_param): def validate_network_metrics(network_metrics): assert_data_type(NetworkMetrics, network_metrics) + +def validate_network_total_stake(network_total_stake): + assert_data_type(NetworkTotalStake, network_total_stake) + +def validate_network_info(network_info): + assert_data_type(NetworkInfo, network_info) @allure.story("Misc") @@ -22,6 +28,16 @@ def test_get_epoch_param(govtool_api): def test_get_network_metrics(govtool_api): network_metrics = govtool_api.network_metrics().json() validate_network_metrics(network_metrics) + +@allure.story("Misc") +def test_get_network_total_stake(govtool_api): + network_total_stake = govtool_api.network_total_stake().json() + validate_network_total_stake(network_total_stake) + +@allure.story("Misc") +def test_get_network_info(govtool_api): + network_info = govtool_api.network_info().json() + validate_network_info(network_info) @allure.story("Misc") diff --git a/tests/govtool-frontend/playwright/.env.example b/tests/govtool-frontend/playwright/.env.example index e007734f9..33e20db29 100644 --- a/tests/govtool-frontend/playwright/.env.example +++ b/tests/govtool-frontend/playwright/.env.example @@ -26,6 +26,7 @@ FAUCET_ADDRESS=addr_test1vqeux7xwusdju9dvsj8h7mca9aup2k439kfmwy773xxc2hcu7zy99 PROPOSAL_FAUCET_PAYMENT_PRIVATE=********************************************** PROPOSAL_FAUCET_STAKE_PRIVATE=********************************************** +PROPOSAL_FAUCET_DREP_PRIVATE=********************************************** CI=true TEST_WORKERS=6 \ No newline at end of file diff --git a/tests/govtool-frontend/playwright/lib/constants/auth.ts b/tests/govtool-frontend/playwright/lib/constants/auth.ts new file mode 100644 index 000000000..e2d85b948 --- /dev/null +++ b/tests/govtool-frontend/playwright/lib/constants/auth.ts @@ -0,0 +1,27 @@ +export const adaHolder01AuthFile = ".auth/adaHolder01.json"; +export const adaHolder02AuthFile = ".auth/adaHolder02.json"; +export const adaHolder03AuthFile = ".auth/adaHolder03.json"; +export const adaHolder04AuthFile = ".auth/adaHolder04.json"; +export const adaHolder05AuthFile = ".auth/adaHolder05.json"; +export const adaHolder06AuthFile = ".auth/adaHolder06.json"; + +export const user01AuthFile = ".auth/user01.json"; + +export const dRep01AuthFile = ".auth/dRep01.json"; +export const dRep02AuthFile = ".auth/dRep02.json"; +export const dRep03AuthFile = ".auth/dRep03.json"; + +export const proposal01AuthFile = ".auth/proposal01.json"; +export const proposal02AuthFile = ".auth/proposal02.json"; +export const proposal03AuthFile = ".auth/proposal03.json"; +export const proposal04AuthFile = ".auth/proposal04.json"; +export const proposal05AuthFile = ".auth/proposal05.json"; +export const proposal06AuthFile = ".auth/proposal06.json"; +export const proposal07AuthFile = ".auth/proposal07.json"; +export const proposal08AuthFile = ".auth/proposal08.json"; +export const proposal09AuthFile = ".auth/proposal09.json"; + +export const budgetProposal01AuthFile = ".auth/budgetProposal01.json"; +export const budgetProposal02AuthFile = ".auth/budgetProposal02.json"; +export const budgetProposal03AuthFile = ".auth/budgetProposal03.json"; +export const budgetProposal04AuthFile = ".auth/budgetProposal04.json"; diff --git a/tests/govtool-frontend/playwright/lib/constants/environments.ts b/tests/govtool-frontend/playwright/lib/constants/environments.ts index 411e80870..1d36e6417 100644 --- a/tests/govtool-frontend/playwright/lib/constants/environments.ts +++ b/tests/govtool-frontend/playwright/lib/constants/environments.ts @@ -37,6 +37,9 @@ const environments = { stake: { private: process.env.PROPOSAL_FAUCET_STAKE_PRIVATE, }, + dRep: { + private: process.env.PROPOSAL_FAUCET_DREP_PRIVATE, + }, }, }; diff --git a/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts b/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts index 751097259..44055abf5 100644 --- a/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts +++ b/tests/govtool-frontend/playwright/lib/constants/proposalFaucetWallet.ts @@ -11,7 +11,12 @@ export const proposalFaucetWallet = { public: "c2277f37f2fece309bad0d6ec1506e48b2a91f0ff4e7dcaad176891d6364aee3", pkh: "4e641f833be7026d9948ff6ab61791123166a1c84f58fd472a6b33a5", }, - dRepId: "drep1fejplqemuupxmx2gla4tv9u3zgckdgwgfav063e2dve622apcpr", + dRep: { + private: environments.proposalFaucet.dRep.private, + public: "e24809b52036894376295a724d32d225d98b29da515d87dc0bb1a769e28c0b59", + pkh: "ff3a5ff960ffae3726c80996ebbf0b3ec3992a62ea7c7818908a8cfe", + }, + dRepId: "drep1lua9l7tql7hrwfkgpxtwh0ct8mpej2nzaf78sxys32x0udvl8a5", address: "addr_test1qz3hqauh86zjg2c3wdqueava97mc4llr5pv5fvyfcgjc84jwvs0cxwl8qfkejj8ld2mp0ygjx9n2rjz0tr75w2ntxwjspd08dd", }; diff --git a/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts b/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts index 17f486606..7884a5be8 100644 --- a/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts +++ b/tests/govtool-frontend/playwright/lib/constants/staticWallets.ts @@ -44,7 +44,8 @@ export const adaHolderWallets = [ export const userWallets = [user01Wallet]; -export const dRepWallets = [dRep01Wallet, dRep02Wallet, dRep03Wallet]; +export const dRepWallets = [dRep01Wallet, dRep02Wallet]; +export const budgetProposalDRepWallets = [dRep03Wallet]; export const proposalWallets = [ proposal01Wallet, @@ -65,4 +66,5 @@ export const allStaticWallets = [ ...proposalWallets, faucetWallet, proposalFaucetWallet, + ...budgetProposalDRepWallets, ]; diff --git a/tests/govtool-frontend/playwright/lib/fixtures/budgetProposal.ts b/tests/govtool-frontend/playwright/lib/fixtures/budgetProposal.ts index f620d523a..e5c727559 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/budgetProposal.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/budgetProposal.ts @@ -1,3 +1,4 @@ +import { budgetProposal01AuthFile } from "@constants/auth"; import { budgetProposal01Wallet } from "@constants/staticWallets"; import { test as base } from "@fixtures/walletExtension"; import { createNewPageWithWallet } from "@helpers/page"; @@ -12,7 +13,7 @@ export const test = base.extend({ proposalId: async ({ browser }, use) => { // setup const budgetProposalPage = await createNewPageWithWallet(browser, { - storageState: ".auth/budgetProposal01.json", + storageState: budgetProposal01AuthFile, wallet: budgetProposal01Wallet, }); diff --git a/tests/govtool-frontend/playwright/lib/fixtures/loadExtension.ts b/tests/govtool-frontend/playwright/lib/fixtures/loadExtension.ts index e61609671..560051dc1 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/loadExtension.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/loadExtension.ts @@ -10,6 +10,7 @@ import path = require("path"); export default async function loadDemosExtension( page: Page, enableStakeSigning?: boolean, + enableDRepSigning?: boolean, supportedExtensions?: Record[] ) { const demosBundleScriptPath = path.resolve( @@ -18,6 +19,7 @@ export default async function loadDemosExtension( ); let walletConfig: CardanoTestWalletConfig = { enableStakeSigning, + enableDRepSigning, kuberApiUrl: environments.kuber.apiUrl, networkId: environments.networkId, kuberApiKey: environments.kuber.apiKey, diff --git a/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts b/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts index b52d043b6..5ae1e4b0d 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/proposal.ts @@ -1,3 +1,4 @@ +import { proposal01AuthFile } from "@constants/auth"; import { proposal01Wallet } from "@constants/staticWallets"; import { test as base } from "@fixtures/walletExtension"; import { createNewPageWithWallet } from "@helpers/page"; @@ -15,7 +16,7 @@ export const test = base.extend({ proposalId: async ({ browser, pollEnabled }, use) => { // setup const proposalPage = await createNewPageWithWallet(browser, { - storageState: ".auth/proposal01.json", + storageState: proposal01AuthFile, wallet: proposal01Wallet, }); diff --git a/tests/govtool-frontend/playwright/lib/fixtures/walletExtension.ts b/tests/govtool-frontend/playwright/lib/fixtures/walletExtension.ts index 304d7e9c3..6d577eede 100644 --- a/tests/govtool-frontend/playwright/lib/fixtures/walletExtension.ts +++ b/tests/govtool-frontend/playwright/lib/fixtures/walletExtension.ts @@ -7,6 +7,7 @@ import { injectLogger } from "@helpers/page"; type WalletExtensionTestOptions = { wallet?: StaticWallet; enableStakeSigning: boolean; + enableDRepSigning: boolean; supportedExtensions: Record[]; }; @@ -14,14 +15,26 @@ export const test = base.extend({ wallet: [null, { option: true }], enableStakeSigning: [true, { option: true }], + enableDRepSigning: [false, { option: true }], supportedExtensions: [[{ cip: 95 }], { option: true }], page: async ( - { page, wallet, enableStakeSigning, supportedExtensions }, + { + page, + wallet, + enableStakeSigning, + supportedExtensions, + enableDRepSigning, + }, use ) => { - await loadDemosExtension(page, enableStakeSigning, supportedExtensions); + await loadDemosExtension( + page, + enableStakeSigning, + enableDRepSigning, + supportedExtensions + ); if (wallet) { await importWallet(page, wallet); diff --git a/tests/govtool-frontend/playwright/lib/helpers/adaFormat.ts b/tests/govtool-frontend/playwright/lib/helpers/adaFormat.ts index 0943d84a1..4c75378c4 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/adaFormat.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/adaFormat.ts @@ -37,15 +37,26 @@ export const correctDRepDirectoryFormat = (ada: number | undefined) => { return "0"; }; -export const formatWithThousandSeparator = ( - amount: number | undefined, - isAda: boolean = true -) => { - const updatedAmount = !isAda ? Math.ceil(amount / LOVELACE) : amount; - if (updatedAmount) { - return updatedAmount.toLocaleString("en-us", { - maximumFractionDigits: 3, - }); +export function formatWithThousandSeparator( + value: number | string, + isAda = true +): string { + if (value === undefined || value === null) { + return "0"; } - return "0"; -}; + + let numericValue: number; + if (typeof value === "string") { + numericValue = parseInt(value.replace(/,/g, "")); + } else { + numericValue = value; + } + + if (!isAda) { + numericValue = Math.ceil(numericValue / LOVELACE); + } + + return numericValue.toLocaleString("en-US", { + maximumFractionDigits: 3, + }); +} diff --git a/tests/govtool-frontend/playwright/lib/helpers/auth.ts b/tests/govtool-frontend/playwright/lib/helpers/auth.ts index 12820ea34..980cfa4f6 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/auth.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/auth.ts @@ -14,6 +14,12 @@ import { proposal08Wallet, proposal09Wallet, } from "@constants/staticWallets"; +import { + proposal05AuthFile, + proposal07AuthFile, + proposal08AuthFile, + proposal09AuthFile, +} from "@constants/auth"; interface CreateUserProps { page: Page; @@ -91,22 +97,22 @@ export const getDraftProposalWalletAndState = (proposalType: string) => { switch (proposalType) { case ProposalType.info: return { - storageState: ".auth/proposal05.json", + storageState: proposal05AuthFile, wallet: proposal05Wallet, }; case ProposalType.treasury: return { - storageState: ".auth/proposal07.json", + storageState: proposal07AuthFile, wallet: proposal07Wallet, }; case ProposalType.updatesToTheConstitution: return { - storageState: ".auth/proposal08.json", + storageState: proposal08AuthFile, wallet: proposal08Wallet, }; case ProposalType.motionOfNoConfedence: return { - storageState: ".auth/proposal09.json", + storageState: proposal09AuthFile, wallet: proposal09Wallet, }; } diff --git a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts index ad7126a94..ae9528a7b 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/cardano.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/cardano.ts @@ -47,16 +47,6 @@ export async function skipIfNotInfoAndBootstrapping(type: ProposalType) { } } -export async function skipIfNotHardFork() { - const currentProtocolVersion = await getProtocolParamsMajorVersion(); - if (currentProtocolVersion < 9) { - await allure.description( - "Govtool Features will be available after hardfork." - ); - test.skip(); - } -} - export async function skipIfMainnet() { if (environments.networkId === 1) { await allure.description( diff --git a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts index e1b75f849..1ee98017f 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/crypto.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/crypto.ts @@ -136,8 +136,8 @@ export class ShelleyWallet { } dRepIdBech32() { - const stakePubKey = Buffer.from(this.stakeKey.public).toString("hex"); - const dRepKeyBytes = Buffer.from(stakePubKey, "hex"); + const dRepPubKey = Buffer.from(this.dRepKey.public).toString("hex"); + const dRepKeyBytes = Buffer.from(dRepPubKey, "hex"); const dRepId = blake.blake2bHex(dRepKeyBytes, undefined, 28); const words = bech32.toWords(Buffer.from(dRepId, "hex")); const dRepIdBech32 = bech32.encode("drep", words); @@ -178,6 +178,11 @@ export class ShelleyWallet { "ShelleyWallet.fromJson : Invalid stake key: It must be an object." ); } + if (!dRepKey || typeof dRepKey !== "object") { + throw new Error( + "ShelleyWallet.fromJson : Invalid dRep key: It must be an object." + ); + } return new ShelleyWallet( Ed25519Key.fromJson(paymentKey), Ed25519Key.fromJson(stakeKey), diff --git a/tests/govtool-frontend/playwright/lib/helpers/page.ts b/tests/govtool-frontend/playwright/lib/helpers/page.ts index 40ad1f7b6..d63af0711 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/page.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/page.ts @@ -8,6 +8,7 @@ interface NewPageConfig { storageState?: string; wallet: StaticWallet; enableStakeSigning?: boolean; + enableDRepSigning?: boolean; supportedExtensions?: Record[]; } @@ -25,6 +26,7 @@ export async function createNewPageWithWallet( await loadDemosExtension( newPage, extensionConfig.enableStakeSigning, + extensionConfig.enableDRepSigning, extensionConfig.supportedExtensions ); await importWallet(newPage, wallet); diff --git a/tests/govtool-frontend/playwright/lib/helpers/string.ts b/tests/govtool-frontend/playwright/lib/helpers/string.ts index 745928196..30093b65c 100644 --- a/tests/govtool-frontend/playwright/lib/helpers/string.ts +++ b/tests/govtool-frontend/playwright/lib/helpers/string.ts @@ -25,3 +25,9 @@ export function toCamelCase(str: string) { ) .join(""); } + +export function generateParagraph(isValid: boolean, isEmpty: boolean): string { + if (isValid) return faker.lorem.paragraph(2); + const text = isEmpty ? "" : faker.lorem.paragraph(15001); + return text; +} diff --git a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts index fef1c0fb7..66a0a20c7 100644 --- a/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/budgetDiscussionSubmissionPage.ts @@ -1,9 +1,9 @@ import environments from "@constants/environments"; import { faker } from "@faker-js/faker"; import { formatWithThousandSeparator } from "@helpers/adaFormat"; -import { extractProposalIdFromUrl } from "@helpers/string"; +import { extractProposalIdFromUrl, generateParagraph } from "@helpers/string"; import { invalid, valid } from "@mock/index"; -import { Page, expect } from "@playwright/test"; +import { Locator, Page, expect } from "@playwright/test"; import { AdministrationAndAuditingProps, BudgetCostingProps, @@ -58,7 +58,7 @@ export default class BudgetDiscussionSubmissionPage { readonly agreeCheckbox = this.page.getByLabel( "I agree to the information in" ); //BUG missing test Ids - readonly submitCheckbox = this.page.getByLabel("I consent to the public"); //BUG missing test Ids + readonly submitCheckbox = this.page.getByTestId("submit-checkbox"); // input readonly linkTextInput = this.page.getByTestId("link-0-text-input"); @@ -265,7 +265,8 @@ export default class BudgetDiscussionSubmissionPage { } async fillupProposalOwnershipForm( - proposalOwnership: BudgetProposalOwnershipProps + proposalOwnership: BudgetProposalOwnershipProps, + isNaviagted = true ) { await this.companyTypeSelect.click(); await this.page @@ -293,13 +294,16 @@ export default class BudgetDiscussionSubmissionPage { ) .click(); } - await this.agreeCheckbox.click(); - await this.continueBtn.click(); + if (isNaviagted) { + await this.agreeCheckbox.click(); + await this.continueBtn.click(); + } } async fillupProblemStatementAndBenefitsForm( - problemStatementAndBenefits: BudgetProposalProblemStatementAndBenefitProps + problemStatementAndBenefits: BudgetProposalProblemStatementAndBenefitProps, + isNaviagated = true ) { await this.problemStatementInput.fill( problemStatementAndBenefits.problemStatement @@ -341,10 +345,14 @@ export default class BudgetDiscussionSubmissionPage { ) .click(); - await this.continueBtn.click(); + if (isNaviagated) { + await this.continueBtn.click(); + } } - async fillupProposalDetailsForm(proposalDetails: BudgetProposalDetailsProps) { + async fillupProposalDetailsFormWithoutContractingType( + proposalDetails: BudgetProposalDetailsProps + ) { await this.proposalNameInput.fill(proposalDetails.proposalName); await this.proposalDescriptionInput.fill( proposalDetails.proposalDescription @@ -360,7 +368,10 @@ export default class BudgetDiscussionSubmissionPage { proposalDetails.teamSizeAndDuration ); await this.previousExperienceInput.fill(proposalDetails.previousExperience); + } + async fillupProposalDetailsForm(proposalDetails: BudgetProposalDetailsProps) { + await this.fillupProposalDetailsFormWithoutContractingType(proposalDetails); await this.contractingTypeSelect.click(); await this.page .getByTestId(`${proposalDetails.contracting.toLowerCase()}-button`) @@ -368,22 +379,27 @@ export default class BudgetDiscussionSubmissionPage { if (proposalDetails.contracting === "Other") { await this.otherDescriptionInput.fill(proposalDetails.otherDescription); } + await this.continueBtn.click(); } - async fillupCostingForm(costing: BudgetCostingProps) { + async fillupCostingFormWithoutPreferredCurrency(costing: BudgetCostingProps) { await this.adaAmountInput.fill(costing.adaAmount.toString()); await this.usaToAdaCnversionRateInput.fill( costing.usdToAdaConversionRate.toString() ); + await this.costBreakdownInput.fill(costing.costBreakdown); + await this.preferredCurrencyInput.fill( + costing.AmountInPreferredCurrency.toString() + ); + } + + async fillupCostingForm(costing: BudgetCostingProps) { + await this.fillupCostingFormWithoutPreferredCurrency(costing); await this.preferredCurrencySelect.click(); await this.page .getByTestId(`${costing.preferredCurrency.toLowerCase()}-button`) .click(); - await this.preferredCurrencyInput.fill( - costing.AmountInPreferredCurrency.toString() - ); - await this.costBreakdownInput.fill(costing.costBreakdown); await this.continueBtn.click(); } @@ -403,21 +419,25 @@ export default class BudgetDiscussionSubmissionPage { await this.continueBtn.click(); } - async fillCostingSectionExceptAmountInputs() { - const costing = this.generateValidCosting(); - await this.preferredCurrencySelect.click(); + async fillupAdministrationAndAuditing( + administrationAndAuditing: AdministrationAndAuditingProps + ) { + await this.intersectNamedAdministratorSelect.click(); await this.page - .getByTestId(`${costing.preferredCurrency.toLowerCase()}-button`) + .getByTestId( + `${administrationAndAuditing.intersectAdministration}-button` + ) .click(); - await this.preferredCurrencyInput.fill( - costing.AmountInPreferredCurrency.toString() - ); - await this.costBreakdownInput.fill(costing.costBreakdown.toString()); + if (!administrationAndAuditing.intersectAdministration) { + await this.venderDetailsInput.fill( + administrationAndAuditing.venderDetails + ); + } } async fillupForm( budgetProposal: BudgetProposalProps, - stage: BudgetProposalStageEnum = BudgetProposalStageEnum.AdministrationAndAuditing + stage: BudgetProposalStageEnum = BudgetProposalStageEnum.Review ) { await this.fillupProposalOwnershipForm(budgetProposal.proposalOwnership); @@ -437,22 +457,14 @@ export default class BudgetDiscussionSubmissionPage { await this.fillupFurtherInformation(budgetProposal.furtherInformation); } if (stage > BudgetProposalStageEnum.FurtherInformation) { - await this.intersectNamedAdministratorSelect.click(); - - await this.page - .getByTestId( - `${budgetProposal.administrationAndAuditing.intersectAdministration}-button` - ) - .click(); - if (!budgetProposal.administrationAndAuditing.intersectAdministration) { - await this.venderDetailsInput.fill( - budgetProposal.administrationAndAuditing.venderDetails - ); - } - await this.continueBtn.click(); - - await this.submitCheckbox.click(); + this.fillupAdministrationAndAuditing( + budgetProposal.administrationAndAuditing + ); await this.continueBtn.click(); + if (stage > BudgetProposalStageEnum.AdministrationAndAuditing) { + await this.submitCheckbox.click(); + await this.continueBtn.click(); + } } } @@ -537,6 +549,20 @@ export default class BudgetDiscussionSubmissionPage { ), }; } + generateInvalidProposalOwnerShip(): BudgetProposalOwnershipProps { + return { + groupName: invalid.paragraph(50), + groupType: invalid.paragraph(50), + groupKeyIdentity: invalid.paragraph(50), + companyName: invalid.paragraph(50), + companyDomainName: invalid.paragraph(50), + companyType: faker.helpers.arrayElement(Object.values(CompanyEnum)), + contactDetails: faker.lorem.paragraph(2), + countryOfIncorportation: faker.helpers.arrayElement( + Object.values(LocationEnum) + ), + }; + } generateValidBudgetProposalDetails(): BudgetProposalDetailsProps { return { @@ -566,6 +592,18 @@ export default class BudgetDiscussionSubmissionPage { }; } + generateInValidCosting(): BudgetCostingProps { + return { + adaAmount: faker.lorem.paragraph(2), + usdToAdaConversionRate: faker.lorem.paragraph(2), + preferredCurrency: faker.helpers.arrayElement( + Object.values(PreferredCurrencyEnum) + ), + AmountInPreferredCurrency: faker.lorem.paragraph(2), + costBreakdown: invalid.paragraph(150001), + }; + } + generateValidFurtherInformation(): Array { return [ { @@ -767,21 +805,200 @@ export default class BudgetDiscussionSubmissionPage { ); } - async validateCostingSection(isValid: boolean = true) { - const adaAmount = isValid - ? faker.number.int({ min: 100, max: 10000 }) - : faker.lorem.paragraph(2); - const usdToAdaCnversionRate = isValid - ? faker.number.int({ min: 1, max: 100 }) - : faker.lorem.paragraph(2); - const preferredCurrency = isValid - ? faker.number.int({ min: 100, max: 10000 }) - : faker.lorem.paragraph(2); - await this.adaAmountInput.fill(adaAmount.toString()); - await this.usaToAdaCnversionRateInput.fill( - usdToAdaCnversionRate.toString() + async assertInputTextEquality( + actualLocator: Locator, + expected: string, + isValid: boolean = true + ) { + const actual = await actualLocator.inputValue(); + + if (isValid) { + expect(actual, { + message: actual !== expected && `${actual} is not equal to ${expected}`, + }).toEqual(expected); + } else { + expect(actual, { + message: actual === expected && `${actual} is equal to ${expected}`, + }).not.toEqual(expected); + } + } + + async validateProposalOwnershipSection( + proposalOwnership: BudgetProposalOwnershipProps, + isValid: boolean = true + ) { + const companyTypeSelectContent = await this.companyTypeSelect.textContent(); + + if (isValid) { + if (proposalOwnership.companyType === "Company") { + const countryOfIncorporationBtnContent = + await this.countryOfIncorporationBtn.textContent(); + await this.assertInputTextEquality( + this.companyDomainNameInput, + proposalOwnership.companyDomainName + ); + await this.assertInputTextEquality( + this.companyNameInput, + proposalOwnership.companyName + ); + + expect(countryOfIncorporationBtnContent, { + message: + countryOfIncorporationBtnContent !== + proposalOwnership.countryOfIncorportation && + `${countryOfIncorporationBtnContent} is not equal to ${proposalOwnership.countryOfIncorportation}`, + }).toEqual(proposalOwnership.countryOfIncorportation); + } + if (proposalOwnership.companyType === "Group") { + await this.assertInputTextEquality( + this.groupNameInput, + proposalOwnership.groupName + ); + await this.assertInputTextEquality( + this.groupTypeInput, + proposalOwnership.groupType + ); + await this.assertInputTextEquality( + this.keyInformationOfGroupInput, + proposalOwnership.groupKeyIdentity + ); + } + + expect(companyTypeSelectContent, { + message: + companyTypeSelectContent !== proposalOwnership.companyType && + `${companyTypeSelectContent} is not equal to ${proposalOwnership.companyType}`, + }).toEqual(proposalOwnership.companyType); + + await this.assertInputTextEquality( + this.contactDetailsInput, + proposalOwnership.contactDetails + ); + + await expect(this.continueBtn).toBeEnabled(); + } else { + await expect(this.continueBtn).toBeDisabled(); + } + } + + async validateProblemStatementsAndProposalBenefitsSection( + isValid: boolean = true + ) { + const isFirst = Math.random() > 0.5; + + const problemStatement = generateParagraph(isValid, isFirst); + const proposalBenefit = generateParagraph(isValid, !isFirst); + const suplimentaryEndorsement = isValid + ? faker.lorem.paragraph(2) + : faker.lorem.paragraph(15001); + + await this.problemStatementInput.fill(problemStatement); + await this.suplimentaryEndorsementInput.fill(suplimentaryEndorsement); + await this.proposalBenefitInput.fill(proposalBenefit); + + if (problemStatement.length !== 0) { + await this.assertInputTextEquality( + this.problemStatementInput, + problemStatement, + isValid + ); + } + + await this.assertInputTextEquality( + this.suplimentaryEndorsementInput, + suplimentaryEndorsement, + isValid + ); + + if (proposalBenefit.length !== 0) { + await this.assertInputTextEquality( + this.proposalBenefitInput, + proposalBenefit, + isValid + ); + } + if (isValid) { + await expect(this.continueBtn).toBeEnabled(); + } else { + await expect(this.continueBtn).toBeDisabled(); + } + } + + async validateProposalDetailsSection(isValid: boolean = true) { + const isFirst = Math.random() > 0.5; + const isSecond = Math.random() > 0.5; + + const proposalName = isValid ? faker.lorem.paragraph(2) : ""; + const proposalDescription = generateParagraph(isValid, isFirst); + const proposalKeyDependencies = generateParagraph( + isValid, + isFirst && isSecond + ); + const proposalMaintainAndSupport = isValid ? faker.lorem.paragraph(2) : ""; + const milestones = generateParagraph(isValid, !isFirst); + const teamSizeAndDuration = generateParagraph( + isValid, + !isFirst && isSecond ); - await this.preferredCurrencyInput.fill(preferredCurrency.toString()); + const previousExperience = isValid ? faker.lorem.paragraph(2) : ""; + + const fieldValues = { + proposalName, + proposalDescription, + proposalKeyDependencies, + proposalMaintainAndSupport, + milestones, + teamSizeAndDuration, + previousExperience, + contracting: faker.helpers.arrayElement( + Object.values(ProposalContractingEnum) + ), + otherDescription: faker.lorem.paragraph(2), + }; + + await this.fillupProposalDetailsFormWithoutContractingType(fieldValues); + + if (proposalDescription.length !== 0) { + await this.assertInputTextEquality( + this.proposalDescriptionInput, + proposalDescription, + isValid + ); + } + if (proposalKeyDependencies.length !== 0) { + await this.assertInputTextEquality( + this.proposalKeyDependenciesInput, + proposalKeyDependencies, + isValid + ); + } + + if (milestones.length !== 0) { + await this.assertInputTextEquality( + this.milestonesInput, + milestones, + isValid + ); + } + if (teamSizeAndDuration.length !== 0) { + await this.assertInputTextEquality( + this.teamSizeAndDurationInput, + teamSizeAndDuration, + isValid + ); + } + if (isValid) { + await expect(this.continueBtn).toBeEnabled(); + } else { + await expect(this.continueBtn).toBeDisabled(); + } + } + + async validateCostingSection( + costingValue: BudgetCostingProps, + isValid: boolean = true + ) { + await this.fillupCostingFormWithoutPreferredCurrency(costingValue); const adaErrorElement = this.page.getByTestId(formErrors.adaAmount); const usdToAdaConversionRateErrorElement = this.page.getByTestId( formErrors.usdToAdaConversionError @@ -797,32 +1014,38 @@ export default class BudgetDiscussionSubmissionPage { if (isValid) { await expect(adaErrorElement, { - message: isAdaAmountErrorVisible && `${adaAmount} is an invalid amount`, + message: + isAdaAmountErrorVisible && + `${costingValue.adaAmount} is an invalid amount`, }).toBeHidden(); await expect(usdToAdaConversionRateErrorElement, { message: isUsdToAdaConversionRateErrorVisible && - `${usdToAdaCnversionRate} is an invalid amount`, + `${costingValue.usdToAdaConversionRate} is an invalid amount`, }).toBeHidden(); await expect(preferredCurrencyErrorElement, { message: isPreferredCurrencyErrorVisible && - `${preferredCurrency} is an invalid amount`, + `${costingValue.preferredCurrency} is an invalid amount`, }).toBeHidden(); + await expect(this.continueBtn).toBeEnabled(); } else { await expect(adaErrorElement, { - message: !isAdaAmountErrorVisible && `${adaAmount} is a valid amount`, + message: + !isAdaAmountErrorVisible && + `${costingValue.adaAmount} is a valid amount`, }).toBeVisible(); await expect(usdToAdaConversionRateErrorElement, { message: !isUsdToAdaConversionRateErrorVisible && - `${usdToAdaCnversionRate} is a valid amount`, + `${costingValue.usdToAdaConversionRate} is a valid amount`, }).toBeVisible(); await expect(preferredCurrencyErrorElement, { message: !isPreferredCurrencyErrorVisible && - `${preferredCurrency} is a valid amount`, + `${costingValue.preferredCurrency} is a valid amount`, }).toBeVisible(); + await expect(this.continueBtn).toBeDisabled(); } } @@ -842,10 +1065,31 @@ export default class BudgetDiscussionSubmissionPage { await expect(errorElement, { message: isErrorVisible && `${url} is an invalid URL`, }).toBeHidden(); + await expect(this.continueBtn).toBeEnabled(); } else { await expect(errorElement, { message: !isErrorVisible && `${url} is a valid URL`, }).toBeVisible(); + await expect(this.continueBtn).toBeDisabled(); + } + } + + async validateAdministrationAndAuditingSection(isValid: boolean = true) { + if (isValid) { + const validateAdministrationAndAuditingSection = + this.generateAdministrationAndAuditing(); + await this.fillupAdministrationAndAuditing( + validateAdministrationAndAuditingSection + ); + await expect(this.continueBtn).toBeEnabled(); + } else { + // continue button will be disabled if type is not selected or if the type is "No" and the vender details is not filled + const isFalse = faker.datatype.boolean(); + if (isFalse) { + await this.intersectNamedAdministratorSelect.click(); + await this.page.getByTestId("false-button").click(); + } + await expect(this.continueBtn).toBeDisabled(); } } } diff --git a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts index 5ac4a9512..d096b2965 100644 --- a/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts +++ b/tests/govtool-frontend/playwright/lib/pages/governanceActionsPage.ts @@ -114,7 +114,7 @@ export default class GovernanceActionsPage { const proposalCards = await this.getAllProposals(); for (const proposalCard of proposalCards) { - if (await proposalCard.isVisible()) { + if (await proposalCard.locator('[data-testid$="-type"]').isVisible()) { const hasFilter = await this._validateFiltersInProposalCard( proposalCard, filters diff --git a/tests/govtool-frontend/playwright/lib/types.ts b/tests/govtool-frontend/playwright/lib/types.ts index 07e1fe92b..2ea7c02a6 100644 --- a/tests/govtool-frontend/playwright/lib/types.ts +++ b/tests/govtool-frontend/playwright/lib/types.ts @@ -488,10 +488,10 @@ export enum PreferredCurrencyEnum { } export interface BudgetCostingProps { - adaAmount: number; - usdToAdaConversionRate: number; + adaAmount: string | number; + usdToAdaConversionRate: string | number; preferredCurrency: preferredCurrencyType; - AmountInPreferredCurrency: number; + AmountInPreferredCurrency: string | number; costBreakdown: string; } diff --git a/tests/govtool-frontend/playwright/package-lock.json b/tests/govtool-frontend/playwright/package-lock.json index 38e2cc8e7..9f2a897ee 100644 --- a/tests/govtool-frontend/playwright/package-lock.json +++ b/tests/govtool-frontend/playwright/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@cardanoapi/cardano-test-wallet": "^3.3.0", + "@cardanoapi/cardano-test-wallet": "^3.3.1", "@faker-js/faker": "^8.4.1", "@noble/curves": "^1.3.0", "@noble/ed25519": "^2.0.0", @@ -43,9 +43,9 @@ } }, "node_modules/@cardanoapi/cardano-test-wallet": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@cardanoapi/cardano-test-wallet/-/cardano-test-wallet-3.3.0.tgz", - "integrity": "sha512-tIrxGTE1XHNAYwsbY/DaJXSRm1b0gt2yabBxJjX//fL8zdHV8uIj4RMpjf+juX8xWivOTDA+heMBTtAKKLervQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@cardanoapi/cardano-test-wallet/-/cardano-test-wallet-3.3.1.tgz", + "integrity": "sha512-AOIDoEkVRYanW4O0pflfcJ2K4Pb3cUHf93cz8pJANU3qIZRQXW+ubGVM60s1WodTcJEmUccpxxXZJuuGRBGXCw==", "license": "MIT" }, "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { diff --git a/tests/govtool-frontend/playwright/package.json b/tests/govtool-frontend/playwright/package.json index 6fe35493c..652504847 100644 --- a/tests/govtool-frontend/playwright/package.json +++ b/tests/govtool-frontend/playwright/package.json @@ -29,7 +29,7 @@ "generate-wallets": "ts-node ./generate_wallets.ts 24" }, "dependencies": { - "@cardanoapi/cardano-test-wallet": "^3.3.0", + "@cardanoapi/cardano-test-wallet": "^3.3.1", "@faker-js/faker": "^8.4.1", "@noble/curves": "^1.3.0", "@noble/ed25519": "^2.0.0", diff --git a/tests/govtool-frontend/playwright/playwright.config.ts b/tests/govtool-frontend/playwright/playwright.config.ts index 4a254fcd7..457c8d0a4 100644 --- a/tests/govtool-frontend/playwright/playwright.config.ts +++ b/tests/govtool-frontend/playwright/playwright.config.ts @@ -44,8 +44,12 @@ export default defineConfig({ /* Configure projects for major browsers */ projects: [ { - name: "auth setup", - testMatch: "**/auth.setup.ts", + name: "adaholder auth setup", + testMatch: "**/adaholder.auth.setup.ts", + }, + { + name: "user auth setup", + testMatch: "**/user.auth.setup.ts", }, { name: "faucet setup", @@ -55,7 +59,25 @@ export default defineConfig({ { name: "dRep setup", testMatch: "**/dRep.setup.ts", - dependencies: environments.ci ? ["faucet setup"] : [], + dependencies: environments.ci ? ["faucet setup", "wallet bootstrap"] : [], + }, + { + name: "proposal budget dRep setup", + testMatch: "**/proposal-budget.dRep.setup.ts", + teardown: environments.ci && "cleanup faucet", + }, + { + name: "dRep auth setup", + testMatch: "**/dRep.auth.setup.ts", + dependencies: environments.ci ? ["dRep setup"] : [], + }, + { + name: "proposal discussion auth setup", + testMatch: "**/proposal-discussion.auth.setup.ts", + }, + { + name: "proposal budget auth setup", + testMatch: "**/proposal-budget.auth.setup.ts", }, { name: "proposal setup", @@ -71,7 +93,24 @@ export default defineConfig({ name: "transaction", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.tx.spec.ts", - dependencies: environments.ci ? ["auth setup", "wallet bootstrap"] : [], + dependencies: environments.ci ? ["adaholder auth setup", "wallet bootstrap"] : [], + }, + { + name: "proposal discussion", + use: { ...devices["Desktop Chrome"] }, + testMatch: "**/*.pd.spec.ts", + dependencies: environments.ci + ? ["proposal discussion auth setup"] + : [], + }, + { + name: "proposal budget", + use: { ...devices["Desktop Chrome"] }, + testMatch: "**/*.pb.spec.ts", + dependencies: environments.ci + ? ["proposal budget auth setup"] + : [], + testIgnore: ["**/*.dRep.pb.spec.ts"], }, { name: "proposal submission", @@ -85,14 +124,23 @@ export default defineConfig({ name: "loggedin (desktop)", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.loggedin.spec.ts", - dependencies: environments.ci ? ["auth setup"] : [], + dependencies: environments.ci ? ["user auth setup"] : [], + }, + { + name: "proposal budget dRep", + use: { ...devices["Desktop Chrome"] }, + testMatch: "**/*.dRep.pb.spec.ts", + dependencies: environments.ci + ? ["proposal budget auth setup","proposal budget dRep setup"] + : [], + teardown: environments.ci && "cleanup dRep", }, { name: "dRep", use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.dRep.spec.ts", dependencies: environments.ci - ? ["auth setup", "dRep setup", "wallet bootstrap"] + ? ["dRep setup", "dRep auth setup", "wallet bootstrap"] : [], teardown: environments.ci && "cleanup dRep", }, @@ -101,7 +149,7 @@ export default defineConfig({ use: { ...devices["Desktop Chrome"] }, testMatch: "**/*.delegation.spec.ts", dependencies: environments.ci - ? ["auth setup", "dRep setup", "wallet bootstrap"] + ? ["adaholder auth setup", "dRep setup", "wallet bootstrap"] : [], teardown: environments.ci && "cleanup delegation", }, @@ -114,6 +162,8 @@ export default defineConfig({ "**/*.dRep.spec.ts", "**/*.tx.spec.ts", "**/*.ga.spec.ts", + "**/*.pd.spec.ts", + "**/*.pb.spec.ts", ], }, { @@ -125,6 +175,8 @@ export default defineConfig({ "**/*.delegation.spec.ts", "**/*.tx.spec.ts", "**/*.ga.spec.ts", + "**/*.pd.spec.ts", + "**/*.pb.spec.ts", "**/walletConnect.spec.ts", ], }, diff --git a/tests/govtool-frontend/playwright/tests/1-wallet-connect/walletConnect.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/1-wallet-connect/walletConnect.loggedin.spec.ts index f073d6cb2..017a2ac2b 100644 --- a/tests/govtool-frontend/playwright/tests/1-wallet-connect/walletConnect.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/1-wallet-connect/walletConnect.loggedin.spec.ts @@ -1,9 +1,10 @@ +import { user01AuthFile } from "@constants/auth"; import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import LoginPage from "@pages/loginPage"; -test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); +test.use({ storageState: user01AuthFile, wallet: user01Wallet }); test.beforeEach(async () => { await setAllureEpic("1. Wallet connect"); }); diff --git a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.spec.ts b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.pb.spec.ts similarity index 91% rename from tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.spec.ts rename to tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.pb.spec.ts index 0b50b3f88..8e38001f0 100644 --- a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.spec.ts +++ b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.dRep.pb.spec.ts @@ -5,14 +5,17 @@ import BudgetDiscussionDetailsPage from "@pages/budgetDiscussionDetailsPage"; import { expect } from "@playwright/test"; import { dRep03Wallet } from "@constants/staticWallets"; import BudgetDiscussionPage from "@pages/budgetDiscussionPage"; +import { dRep03AuthFile } from "@constants/auth"; +import { skipIfMainnet } from "@helpers/cardano"; test.beforeEach(async () => { await setAllureEpic("11. Proposal Budget"); + await skipIfMainnet(); }); test.describe("Budget proposal dRep behaviour", () => { test.use({ - storageState: ".auth/dRep03.json", + storageState: dRep03AuthFile, wallet: dRep03Wallet, }); @@ -101,6 +104,15 @@ test.describe("Budget proposal dRep behaviour", () => { dRepCommentedCard.getByText("DRep", { exact: true }) ).toBeVisible(); + const isDRepGivenNameVisible = await dRepCommentedCard + .getByTestId("given-name") + .isVisible(); + + expect( + isDRepGivenNameVisible, + !isDRepGivenNameVisible && "Missing given-name testId" + ).toBeTruthy(); + await expect(dRepCommentedCard.getByTestId("given-name")).toHaveText( dRep03Wallet.givenName ); diff --git a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.pb.spec.ts similarity index 96% rename from tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.spec.ts rename to tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.pb.spec.ts index bf0912073..12c1ba5be 100644 --- a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.loggedin.pb.spec.ts @@ -1,3 +1,4 @@ +import { budgetProposal01AuthFile } from "@constants/auth"; import { budgetProposal01Wallet } from "@constants/staticWallets"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; @@ -12,7 +13,7 @@ test.beforeEach(async () => { test.describe("Budget proposal logged in state", () => { test.use({ - storageState: ".auth/budgetProposal01.json", + storageState: budgetProposal01AuthFile, wallet: budgetProposal01Wallet, }); diff --git a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.spec.ts b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.spec.ts index 22a041e45..733ed6fd7 100644 --- a/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.spec.ts +++ b/tests/govtool-frontend/playwright/tests/11-proposal-budget/proposalBudget.spec.ts @@ -8,7 +8,7 @@ import { functionWaitedAssert } from "@helpers/waitedLoop"; import BudgetDiscussionDetailsPage from "@pages/budgetDiscussionDetailsPage"; import BudgetDiscussionPage from "@pages/budgetDiscussionPage"; import { expect } from "@playwright/test"; -import { BudgetDiscussionEnum, CommentResponse } from "@types"; +import { BudgetDiscussionEnum } from "@types"; const mockBudgetProposal = require("../../lib/_mock/budgetProposal.json"); const mockPoll = require("../../lib/_mock/budgetProposalPoll.json"); diff --git a/tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.spec.ts b/tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.pb.spec.ts similarity index 59% rename from tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.spec.ts rename to tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.pb.spec.ts index 6ef9ed4ab..a2c320b8f 100644 --- a/tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.spec.ts +++ b/tests/govtool-frontend/playwright/tests/12-proposal-budget-submission/proposalBudgetSubmission.loggedin.pb.spec.ts @@ -1,9 +1,16 @@ +import { + budgetProposal01AuthFile, + budgetProposal02AuthFile, + budgetProposal03AuthFile, + budgetProposal04AuthFile, +} from "@constants/auth"; import { budgetProposal01Wallet, budgetProposal02Wallet, budgetProposal03Wallet, budgetProposal04Wallet, } from "@constants/staticWallets"; +import { faker } from "@faker-js/faker"; import { test } from "@fixtures/budgetProposal"; import { setAllureEpic } from "@helpers/allure"; import { createNewPageWithWallet } from "@helpers/page"; @@ -15,6 +22,8 @@ import { BudgetProposalProps, BudgetProposalStageEnum, CompanyEnum, + PreferredCurrencyEnum, + ProposalContractingEnum, } from "@types"; test.beforeEach(async () => { @@ -23,7 +32,7 @@ test.beforeEach(async () => { test.describe("Budget proposal 01 wallet", () => { test.use({ - storageState: ".auth/budgetProposal01.json", + storageState: budgetProposal01AuthFile, wallet: budgetProposal01Wallet, }); @@ -197,6 +206,19 @@ test.describe("Budget proposal 01 wallet", () => { ).toBeVisible(); await expect(budgetProposalSubmissionPage.continueBtn).toBeDisabled(); }); + + test("12D_7. Should verify all field of “Submit” section", async () => { + const proposalInformation = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformation, + BudgetProposalStageEnum.AdministrationAndAuditing + ); + + await expect(budgetProposalSubmissionPage.submitCheckbox).toBeVisible(); + await expect(budgetProposalSubmissionPage.saveDraftBtn).toBeVisible(); + await expect(budgetProposalSubmissionPage.continueBtn).toBeDisabled(); + }); }); test("12G. Should validate and review submitted budget proposal", async () => { @@ -209,76 +231,187 @@ test.describe("Budget proposal 01 wallet", () => { ); }); test.describe("Budget proposal field validation", () => { - test("12E_1. Should accept valid data in “Costing” section", async () => { - test.slow(); // Brute-force testing with 50 random data - const proposalInformation = - budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); - await budgetProposalSubmissionPage.fillupForm( - proposalInformation, - BudgetProposalStageEnum.ProposalDetails - ); + const budgetProposalValidationReason = [ + { title: "accept valid data", isValid: true }, + { title: "reject invalid data", isValid: false }, + ]; + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_1. Should ${title} in “Proposal Ownership” section`, async () => { + test.slow(); // Brute-force testing with 25 random data + + if (isValid) { + await budgetProposalSubmissionPage.agreeCheckbox.click(); + } + + for (let i = 0; i < 25; i++) { + const validProposalOwnership = + budgetProposalSubmissionPage.generateValidProposalOwnerShip(); + const invalidProposalOwnerShip = + budgetProposalSubmissionPage.generateInvalidProposalOwnerShip(); + const proposalOwnership = isValid + ? validProposalOwnership + : invalidProposalOwnerShip; + await budgetProposalSubmissionPage.fillupProposalOwnershipForm( + proposalOwnership, + false + ); + await budgetProposalSubmissionPage.validateProposalOwnershipSection( + proposalOwnership, + isValid + ); + } + }); + }); - for (let i = 0; i < 50; i++) { - await budgetProposalSubmissionPage.validateCostingSection(); - } + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_2. Should ${title} in “problem statements and proposal benefits” section`, async () => { + test.slow(); // Brute-force testing with 25 random data + const proposalInformations = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformations, + BudgetProposalStageEnum.ProposalOwnership + ); - await budgetProposalSubmissionPage.fillCostingSectionExceptAmountInputs(); - await expect(budgetProposalSubmissionPage.continueBtn).toBeEnabled(); - }); + const budgetProposalProblemStatementAndBenefits = + budgetProposalSubmissionPage.generateValidBudgetProposalProblemStatementAndBenefits(); + await budgetProposalSubmissionPage.fillupProblemStatementAndBenefitsForm( + budgetProposalProblemStatementAndBenefits, + false + ); - test("12E_2. Should accept valid data in “further information” section", async () => { - test.slow(); // Brute-force testing with 50 random data - const proposalInformation = - budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); - await budgetProposalSubmissionPage.fillupForm( - proposalInformation, - BudgetProposalStageEnum.Costing - ); + for (let i = 0; i < 25; i++) { + await budgetProposalSubmissionPage.validateProblemStatementsAndProposalBenefitsSection( + isValid + ); + } + }); + }); - for (let i = 0; i < 50; i++) { - await budgetProposalSubmissionPage.validateFurtherInformationSection(); - } + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_3. Should ${title} in “proposal details” section`, async () => { + test.slow(); // Brute-force testing with 25 random data + const proposalInformations = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformations, + BudgetProposalStageEnum.ProblemStatementAndBenefits + ); - for (let i = 0; i < 18; i++) { - await expect(budgetProposalSubmissionPage.addLinkBtn).toBeVisible(); - await budgetProposalSubmissionPage.addLinkBtn.click(); - } - await expect(budgetProposalSubmissionPage.addLinkBtn).toBeHidden(); - await expect(budgetProposalSubmissionPage.continueBtn).toBeEnabled(); + await budgetProposalSubmissionPage.contractingTypeSelect.click(); + const contractingType = faker.helpers + .arrayElement(Object.values(ProposalContractingEnum)) + .toLowerCase(); + await budgetProposalSubmissionPage.currentPage + .getByTestId(`${contractingType}-button`) + .click(); + if (contractingType === "Other") { + await budgetProposalSubmissionPage.otherDescriptionInput.fill( + faker.lorem.paragraph(2) + ); + } + + for (let i = 0; i < 25; i++) { + await budgetProposalSubmissionPage.validateProposalDetailsSection( + isValid + ); + } + }); }); - test("12F_1. Should reject valid data in “Costing” section", async () => { - test.slow(); // Brute-force testing with 50 random data - const proposalInformation = - budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); - await budgetProposalSubmissionPage.fillupForm( - proposalInformation, - BudgetProposalStageEnum.ProposalDetails - ); + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_4. Should ${title} in “Costing” section`, async () => { + test.slow(); // Brute-force testing with 25 random data + const proposalInformation = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformation, + BudgetProposalStageEnum.ProposalDetails + ); - for (let i = 0; i < 50; i++) { - await budgetProposalSubmissionPage.validateCostingSection(false); - } + await budgetProposalSubmissionPage.preferredCurrencySelect.click(); + await budgetProposalSubmissionPage.currentPage + .getByTestId( + `${faker.helpers + .arrayElement(Object.values(PreferredCurrencyEnum)) + .toLowerCase()}-button` + ) + .click(); + + for (let i = 0; i < 25; i++) { + const invalidCostingValues = + budgetProposalSubmissionPage.generateInValidCosting(); + const validCostingValues = + budgetProposalSubmissionPage.generateValidCosting(); + const costingValues = isValid + ? validCostingValues + : invalidCostingValues; + await budgetProposalSubmissionPage.validateCostingSection( + costingValues, + isValid + ); + } + }); + }); - await budgetProposalSubmissionPage.fillCostingSectionExceptAmountInputs(); - await expect(budgetProposalSubmissionPage.continueBtn).toBeDisabled(); + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_5. Should ${title} in “further information” section`, async () => { + test.slow(); // Brute-force testing with 25 random data + const proposalInformation = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformation, + BudgetProposalStageEnum.Costing + ); + + for (let i = 0; i < 25; i++) { + await budgetProposalSubmissionPage.validateFurtherInformationSection( + isValid + ); + } + for (let i = 0; i < 18; i++) { + await expect(budgetProposalSubmissionPage.addLinkBtn).toBeVisible(); + await budgetProposalSubmissionPage.addLinkBtn.click(); + } + await expect(budgetProposalSubmissionPage.addLinkBtn).toBeHidden(); + }); }); - test("12F_2. Should reject invalid data in “further information” section", async () => { - test.slow(); // Brute-force testing with 50 random data - const proposalInformation = - budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); - await budgetProposalSubmissionPage.fillupForm( - proposalInformation, - BudgetProposalStageEnum.Costing - ); + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_6. Should ${title} in “Administration and Auditing” section`, async () => { + const proposalInformation = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformation, + BudgetProposalStageEnum.FurtherInformation + ); + for (let i = 0; i < 25; i++) { + await budgetProposalSubmissionPage.validateAdministrationAndAuditingSection( + isValid + ); + } + }); + }); - for (let i = 0; i < 50; i++) { - await budgetProposalSubmissionPage.validateFurtherInformationSection( - false + budgetProposalValidationReason.forEach(({ isValid, title }) => { + test(`12${isValid ? "E" : "F"}_7. Should ${title} in “Submit” section`, async () => { + const proposalInformation = + budgetProposalSubmissionPage.generateValidBudgetProposalInformation(); + await budgetProposalSubmissionPage.fillupForm( + proposalInformation, + BudgetProposalStageEnum.AdministrationAndAuditing ); - } - await expect(budgetProposalSubmissionPage.continueBtn).toBeDisabled(); + if (isValid) { + await budgetProposalSubmissionPage.submitCheckbox.click(); + await expect( + budgetProposalSubmissionPage.continueBtn + ).toBeEnabled(); + } else { + await expect( + budgetProposalSubmissionPage.continueBtn + ).toBeDisabled(); + } + }); }); }); }); @@ -286,7 +419,7 @@ test.describe("Budget proposal 01 wallet", () => { test("12C. Should save and view draft proposal", async ({ browser }) => { const page = await createNewPageWithWallet(browser, { - storageState: ".auth/budgetProposal02.json", + storageState: budgetProposal02AuthFile, wallet: budgetProposal02Wallet, }); @@ -334,7 +467,7 @@ test("12C. Should save and view draft proposal", async ({ browser }) => { test("12H. Should submit a valid budget proposal", async ({ browser }) => { const page = await createNewPageWithWallet(browser, { - storageState: ".auth/budgetProposal03.json", + storageState: budgetProposal03AuthFile, wallet: budgetProposal03Wallet, }); const budgetSubmissionPage = new BudgetDiscussionSubmissionPage(page); @@ -355,7 +488,7 @@ test("12I. Should submit a valid draft budget proposal", async ({ }) => { test.slow(); const page = await createNewPageWithWallet(browser, { - storageState: ".auth/budgetProposal04.json", + storageState: budgetProposal04AuthFile, wallet: budgetProposal04Wallet, }); 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 01bc92533..c712f7ec2 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 @@ -3,7 +3,7 @@ import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { createNewPageWithWallet } from "@helpers/page"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -13,7 +13,6 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); - await skipIfNotHardFork(); await skipIfMainnet(); }); @@ -30,6 +29,7 @@ test("2N. Should show DRep information on details page", async ({ storageState: tempDRepAuth, wallet, enableStakeSigning: true, + enableDRepSigning: true, }); const dRepRegistrationPage = new DRepRegistrationPage(dRepPage); 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 d7a77489b..c0b6ed60a 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,7 +1,7 @@ +import { user01AuthFile } from "@constants/auth"; import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; import { fetchFirstActiveDRepDetails } from "@helpers/dRep"; import { isMobile } from "@helpers/mobile"; @@ -9,11 +9,10 @@ import extractDRepFromWallet from "@helpers/shellyWallet"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; import { expect } from "@playwright/test"; -test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); +test.use({ storageState: user01AuthFile, 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 1bab08af8..b5b859ac2 100644 --- a/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts +++ b/tests/govtool-frontend/playwright/tests/2-delegation/delegation.spec.ts @@ -1,6 +1,5 @@ import environments from "@constants/environments"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { convertDRep, fetchFirstActiveDRepDetails } from "@helpers/dRep"; import { functionWaitedAssert } from "@helpers/waitedLoop"; import DRepDetailsPage from "@pages/dRepDetailsPage"; @@ -11,7 +10,6 @@ import { DRepStatus, IDRep, PaginatedDRepResponse } from "@types"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); - await skipIfNotHardFork(); }); enum SortOption { 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 52e5ba376..0c5c1e2dd 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 @@ -1,3 +1,11 @@ +import { + adaHolder01AuthFile, + adaHolder02AuthFile, + adaHolder03AuthFile, + adaHolder04AuthFile, + adaHolder05AuthFile, + adaHolder06AuthFile, +} from "@constants/auth"; import environments from "@constants/environments"; import { adaHolder01Wallet, @@ -16,7 +24,7 @@ import { correctDRepDirectoryFormat, } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; @@ -27,13 +35,12 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("2. Delegation"); - await skipIfNotHardFork(); await skipIfMainnet(); }); test.describe("Delegate to others", () => { test.use({ - storageState: ".auth/adaHolder01.json", + storageState: adaHolder01AuthFile, wallet: adaHolder01Wallet, }); @@ -83,7 +90,7 @@ test.describe("Delegate to others", () => { test.describe("Change delegation", () => { test.use({ - storageState: ".auth/adaHolder02.json", + storageState: adaHolder02AuthFile, wallet: adaHolder02Wallet, }); @@ -134,6 +141,7 @@ test.describe("Register DRep state", () => { storageState: dRepAuth, wallet, enableStakeSigning: true, + enableDRepSigning: true, }); await dRepPage.goto("/"); @@ -142,7 +150,6 @@ test.describe("Register DRep state", () => { test("2E. Should register as Direct voter", async ({}, testInfo) => { test.setTimeout(testInfo.timeout + environments.txTimeOut); - const dRepId = wallet.dRepId; await dRepPage.getByTestId("register-as-sole-voter-button").click(); await dRepPage.getByTestId("continue-button").click(); @@ -220,7 +227,7 @@ test("2G. Should delegate to myself", async ({ page, browser }, testInfo) => { test.describe("Multiple delegations", () => { test.use({ - storageState: ".auth/adaHolder05.json", + storageState: adaHolder05AuthFile, wallet: adaHolder05Wallet, }); @@ -248,7 +255,7 @@ test.describe("Multiple delegations", () => { test.describe("Abstain delegation", () => { test.use({ - storageState: ".auth/adaHolder03.json", + storageState: adaHolder03AuthFile, wallet: adaHolder03Wallet, }); @@ -278,7 +285,7 @@ test.describe("Abstain delegation", () => { test.describe("No confidence delegation", () => { test.use({ - storageState: ".auth/adaHolder04.json", + storageState: adaHolder04AuthFile, wallet: adaHolder04Wallet, }); @@ -309,7 +316,7 @@ test.describe("No confidence delegation", () => { test.describe("Delegated ADA visibility", () => { test.use({ - storageState: ".auth/adaHolder06.json", + storageState: adaHolder06AuthFile, wallet: adaHolder06Wallet, }); 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 504248997..f97449614 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,7 +5,7 @@ import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { ShelleyWallet } from "@helpers/crypto"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; import DRepRegistrationPage from "@pages/dRepRegistrationPage"; @@ -14,15 +14,20 @@ import { expect } from "@playwright/test"; import walletManager from "lib/walletManager"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; import { GovernanceActionType } from "@types"; +import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); - await skipIfNotHardFork(); await skipIfMainnet(); }); test.describe("Logged in DReps", () => { - test.use({ storageState: ".auth/dRep01.json", wallet: dRep01Wallet }); + test.use({ + storageState: dRep01AuthFile, + wallet: dRep01Wallet, + enableDRepSigning: true, + enableStakeSigning: false, + }); test("3A. Should show dRepId on dashboard and enable voting on governance actions after connecting registered dRep Wallet", async ({ page, @@ -94,6 +99,15 @@ test.describe("Logged in DReps", () => { }); await page.getByTestId("confirm-modal-button").click(); }); + + test("3S. Should restrict dRep registration for dRep", async ({ page }) => { + await page.goto(`${environments.frontendUrl}/register_drep`); + + await expect(page.getByText("You already are a DRep")).toBeVisible({ + timeout: 60_000, + }); + await expect(page.getByTestId("name-input")).not.toBeVisible(); + }); }); test.describe("Temporary DReps", () => { @@ -109,6 +123,7 @@ test.describe("Temporary DReps", () => { const dRepPage = await createNewPageWithWallet(browser, { storageState: tempDRepAuth, wallet, + enableDRepSigning: true, enableStakeSigning: true, }); @@ -135,6 +150,7 @@ test.describe("Temporary DReps", () => { storageState: tempDRepAuth, wallet, enableStakeSigning: true, + enableDRepSigning: true, }); const dRepRegistrationPage = new DRepRegistrationPage(dRepPage); @@ -169,7 +185,7 @@ test.describe("Temporary DReps", () => { const dRepPage = await createNewPageWithWallet(browser, { storageState: tempDRepAuth, wallet, - enableStakeSigning: true, + enableDRepSigning: true, }); await dRepPage.goto("/"); @@ -194,7 +210,7 @@ test.describe("Temporary DReps", () => { const dRepPage = await createNewPageWithWallet(browser, { storageState: dRepAuth, wallet, - enableStakeSigning: true, + enableDRepSigning: true, }); await dRepPage.goto("/"); @@ -233,6 +249,7 @@ test.describe("Temporary DReps", () => { storageState: dRepAuth, wallet, enableStakeSigning: true, + enableDRepSigning: true, }); const dRepRegistrationPage = new DRepRegistrationPage(dRepPage); 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 2a19d17c0..35e20f006 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,19 +4,19 @@ 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"; import environments from "@constants/environments"; +import { user01AuthFile } from "@constants/auth"; +import EditDRepPage from "@pages/editDRepPage"; test.use({ - storageState: ".auth/user01.json", + storageState: user01AuthFile, wallet: user01Wallet, }); test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); - await skipIfNotHardFork(); }); test("3B. Should access DRep registration page", async ({ page }) => { @@ -223,3 +223,11 @@ test("3O. Should reject invalid dRep registration metadata", async ({ /your external data does not/i ); }); + +test("3R. Should restrict edit dRep for non dRep", async ({ page }) => { + const editDrepPage = new EditDRepPage(page); + await editDrepPage.goto(); + + await page.waitForTimeout(2_000); + await expect(editDrepPage.nameInput).not.toBeVisible(); +}); 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 594aaed3b..204762cb7 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,11 +1,9 @@ import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { expect } from "@playwright/test"; import { test } from "@fixtures/walletExtension"; 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 873755f55..59ee9f0eb 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,18 +4,18 @@ 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 { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import EditDRepPage from "@pages/editDRepPage"; import { expect } from "@playwright/test"; import environments from "@constants/environments"; +import { dRep02AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("3. DRep registration"); - await skipIfNotHardFork(); await skipIfMainnet(); }); -test.use({ wallet: dRep02Wallet, storageState: ".auth/dRep02.json" }); +test.use({ wallet: dRep02Wallet, storageState: dRep02AuthFile }); test.describe("Validation of edit dRep Form", () => { test("3M_1. Should accept valid data in edit dRep form", async ({ page }) => { 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 48e75c3ab..b9ceb02a8 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 @@ -8,7 +8,6 @@ import { isBootStrapingPhase, lovelaceToAda, skipIfMainnet, - skipIfNotHardFork, } from "@helpers/cardano"; import { createNewPageWithWallet } from "@helpers/page"; import GovernanceActionsPage from "@pages/governanceActionsPage"; @@ -23,15 +22,15 @@ import { areDRepVoteTotalsDisplayed, areSPOVoteTotalsDisplayed, } from "@helpers/featureFlag"; +import { dRep01AuthFile } from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); - await skipIfNotHardFork(); await skipIfMainnet(); }); test.describe("Logged in DRep", () => { - test.use({ storageState: ".auth/dRep01.json", wallet: dRep01Wallet }); + test.use({ storageState: dRep01AuthFile, wallet: dRep01Wallet }); test("4E. Should display DRep's voting power in governance actions page", async ({ page, @@ -111,7 +110,7 @@ test.describe("Temporary DReps", async () => { dRepPage = await createNewPageWithWallet(browser, { storageState: tempDRepAuth, wallet, - enableStakeSigning: true, + enableDRepSigning: true, }); }); @@ -135,7 +134,7 @@ test.describe("Temporary DReps", async () => { }); test.describe("Check vote count", () => { - test.use({ storageState: ".auth/dRep01.json", wallet: dRep01Wallet }); + test.use({ storageState: dRep01AuthFile, wallet: dRep01Wallet }); test("4G. Should display correct vote counts on governance details page for DRep", async ({ page, @@ -172,7 +171,7 @@ test.describe("Check vote count", () => { await Promise.all( uniqueProposalTypes.map(async (proposalToCheck) => { const dRepPage = await createNewPageWithWallet(browser, { - storageState: ".auth/dRep01.json", + storageState: dRep01AuthFile, wallet: dRep01Wallet, }); 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 a907f7f1e..afc6b5f5d 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,16 +1,15 @@ +import { user01AuthFile } from "@constants/auth"; import { user01Wallet } from "@constants/staticWallets"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { isMobile, openDrawer } from "@helpers/mobile"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect } from "@playwright/test"; -test.use({ storageState: ".auth/user01.json", wallet: user01Wallet }); +test.use({ storageState: user01AuthFile, 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 9447e2906..1127032ab 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,6 +1,5 @@ import { correctVoteAdaFormat } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { areCCVoteTotalsDisplayed, areDRepVoteTotalsDisplayed, @@ -19,7 +18,6 @@ import { InvalidMetadata } from "@constants/index"; test.beforeEach(async () => { await setAllureEpic("4. Proposal visibility"); - await skipIfNotHardFork(); }); const infoTypeProposal: PaginatedLiveProposal = require("../../lib/_mock/infoTypeProposal.json"); 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 0ad6f67b4..8a21e99f1 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 @@ -1,14 +1,11 @@ +import { dRep01AuthFile } from "@constants/auth"; import environments from "@constants/environments"; import { dRep01Wallet } from "@constants/staticWallets"; import { createTempDRepAuth } from "@datafactory/createAuth"; import { faker } from "@faker-js/faker"; import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { - isBootStrapingPhase, - skipIfMainnet, - skipIfNotHardFork, -} from "@helpers/cardano"; +import { isBootStrapingPhase, skipIfMainnet } from "@helpers/cardano"; import { encodeCIP129Identifier } from "@helpers/encodeDecode"; import { createNewPageWithWallet } from "@helpers/page"; import { waitForTxConfirmation } from "@helpers/transaction"; @@ -22,12 +19,11 @@ import walletManager from "lib/walletManager"; test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); - await skipIfNotHardFork(); await skipIfMainnet(); }); test.describe("Proposal checks", () => { - test.use({ storageState: ".auth/dRep01.json", wallet: dRep01Wallet }); + test.use({ storageState: dRep01AuthFile, wallet: dRep01Wallet }); let govActionDetailsPage: GovernanceActionDetailsPage; let currentPage: Page; @@ -147,7 +143,7 @@ test.describe("Perform voting", () => { const dRepPage = await createNewPageWithWallet(browser, { storageState: tempDRepAuth, wallet, - enableStakeSigning: true, + enableDRepSigning: true, }); const govActionsPage = new GovernanceActionsPage(dRepPage); @@ -306,7 +302,7 @@ test.describe("Check voting power", () => { const dRepPage = await createNewPageWithWallet(browser, { storageState: tempDRepAuth, wallet, - enableStakeSigning: true, + enableDRepSigning: true, }); await dRepPage.goto("/"); 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 91c71b26c..de7b3e4ce 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,14 +1,13 @@ +import { user01AuthFile } from "@constants/auth"; 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.use({ storageState: user01AuthFile, 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/5-proposal-functionality/proposalFunctionality.spec.ts b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.spec.ts index 595566e79..4d859570b 100644 --- a/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.spec.ts +++ b/tests/govtool-frontend/playwright/tests/5-proposal-functionality/proposalFunctionality.spec.ts @@ -1,13 +1,11 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import GovernanceActionsPage from "@pages/governanceActionsPage"; import { expect } from "@playwright/test"; const invalidInfinityProposals = require("../../lib/_mock/invalidInfinityProposals.json"); test.beforeEach(async () => { await setAllureEpic("5. Proposal functionality"); - await skipIfNotHardFork(); }); test.describe("Bad Proposals", () => { let govActionsPage: GovernanceActionsPage; 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 deleted file mode 100644 index 027f39f0c..000000000 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.dRep.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import environments from "@constants/environments"; -import { dRep01Wallet } from "@constants/staticWallets"; -import { test } from "@fixtures/walletExtension"; -import { setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; -import { expect } from "@playwright/test"; - -test.beforeEach(async () => { - await setAllureEpic("6. Miscellaneous"); - await skipIfNotHardFork(); - await skipIfMainnet(); -}); - -test.use({ - storageState: ".auth/dRep01.json", - wallet: dRep01Wallet, -}); - -test("6H. Should restrict dRep registration for dRep", async ({ page }) => { - await page.goto(`${environments.frontendUrl}/register_drep`); - - await expect(page.getByText("You already are a DRep")).toBeVisible({ - timeout: 60_000, - }); - await expect(page.getByTestId("name-input")).not.toBeVisible(); -}); 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 fff528bad..08c1bca6e 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 @@ -1,3 +1,4 @@ +import { user01AuthFile } from "@constants/auth"; import { ABSTAIN_VOTE_DOC_URL, DELEGATION_DOC_URL, @@ -11,23 +12,20 @@ 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"; import DRepDirectoryPage from "@pages/dRepDirectoryPage"; -import EditDRepPage from "@pages/editDRepPage"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import { Page, expect } from "@playwright/test"; test.beforeEach(async () => { await setAllureEpic("6. Miscellaneous"); - await skipIfNotHardFork(); }); test.describe("Logged in user", () => { test.use({ - storageState: ".auth/user01.json", + storageState: user01AuthFile, wallet: user01Wallet, }); @@ -94,14 +92,6 @@ test.describe("Logged in user", () => { ); }); - test("6G. Should restrict edit dRep for non dRep", async ({ page }) => { - const editDrepPage = new EditDRepPage(page); - await editDrepPage.goto(); - - await page.waitForTimeout(2_000); - await expect(editDrepPage.nameInput).not.toBeVisible(); - }); - test("6I. Should prompt for a username after clicking on proposal discussion link if username is not set", async ({ page, }) => { 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 f10ee426c..6692c6c55 100644 --- a/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts +++ b/tests/govtool-frontend/playwright/tests/6-miscellaneous/miscellaneous.spec.ts @@ -13,7 +13,6 @@ import { test } from "@fixtures/walletExtension"; import { setAllureEpic } from "@helpers/allure"; import { isMobile, openDrawer } from "@helpers/mobile"; import { expect, Page } from "@playwright/test"; -import { allure } from "allure-playwright"; import environments from "lib/constants/environments"; test.beforeEach(async () => { 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 fbfa52a6a..a9ab165f7 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 @@ -7,7 +7,7 @@ import { waitForTxConfirmation } from "@helpers/transaction"; import ProposalDiscussionPage from "@pages/proposalDiscussionPage"; import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; import { expect } from "@playwright/test"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { ProposalType } from "@types"; import { proposalFaucetWallet } from "@constants/proposalFaucetWallet"; import walletManager from "lib/walletManager"; @@ -15,7 +15,6 @@ import { valid } from "@mock/index"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); - await skipIfNotHardFork(); await skipIfMainnet(); }); 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.pd.spec.ts similarity index 98% rename from tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.spec.ts rename to tests/govtool-frontend/playwright/tests/7-proposal-submission/proposalSubmission.loggedin.pd.spec.ts index 2c53bb141..f4b0bdf36 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.pd.spec.ts @@ -1,3 +1,9 @@ +import { + proposal01AuthFile, + proposal03AuthFile, + proposal04AuthFile, + proposal06AuthFile, +} from "@constants/auth"; import environments from "@constants/environments"; import { proposal01Wallet, @@ -11,7 +17,6 @@ import { setAllureEpic } from "@helpers/allure"; import { getDraftProposalWalletAndState } from "@helpers/auth"; import { skipIfNotInfoAndBootstrapping, - skipIfNotHardFork, isBootStrapingPhase, } from "@helpers/cardano"; import { ShelleyWallet } from "@helpers/crypto"; @@ -24,11 +29,10 @@ import { ProposalCreateRequest, ProposalType } from "@types"; test.beforeEach(async () => { await setAllureEpic("7. Proposal submission"); - await skipIfNotHardFork(); }); test.describe("Proposal created logged state", () => { - test.use({ storageState: ".auth/proposal01.json", wallet: proposal01Wallet }); + test.use({ storageState: proposal01AuthFile, wallet: proposal01Wallet }); test("7B. Should access proposal creation page", async ({ page }) => { await page.goto("/"); await page.getByTestId("proposal-discussion-link").click(); @@ -368,7 +372,7 @@ test.describe("Proposal created logged state", () => { test.describe("Proposal Draft", () => { test("7C. Should list unfinished Draft ", async ({ browser }) => { const page = await createNewPageWithWallet(browser, { - storageState: ".auth/proposal03.json", + storageState: proposal03AuthFile, wallet: proposal03Wallet, }); const proposalSubmissionPage = new ProposalSubmissionPage(page); @@ -384,7 +388,7 @@ test.describe("Proposal Draft", () => { test("7L. Should save proposal as a draft", async ({ browser }) => { const page = await createNewPageWithWallet(browser, { - storageState: ".auth/proposal04.json", + storageState: proposal04AuthFile, wallet: proposal04Wallet, }); @@ -534,7 +538,7 @@ test.describe("Proposal Draft", () => { test("7N. Should submit a draft proposal", async ({ browser }) => { const page = await createNewPageWithWallet(browser, { - storageState: ".auth/proposal06.json", + storageState: proposal06AuthFile, wallet: proposal06Wallet, }); 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 41c1036be..a7063eb8c 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,11 +1,9 @@ import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import { expect } from "@playwright/test"; import { test } from "@fixtures/walletExtension"; 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.pd.spec.ts similarity index 96% rename from tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.spec.ts rename to tests/govtool-frontend/playwright/tests/8-proposal-discussion/proposalDiscussion.loggedin.pd.spec.ts index 5caee4fd3..62b91df76 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.pd.spec.ts @@ -9,17 +9,20 @@ 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"; import ProposalSubmissionPage from "@pages/proposalSubmissionPage"; +import { + proposal01AuthFile, + proposal02AuthFile, + user01AuthFile, +} from "@constants/auth"; test.beforeEach(async () => { await setAllureEpic("8. Proposal Discussion Forum"); - await skipIfNotHardFork(); }); test.describe("Proposal created logged in state", () => { test.use({ - storageState: ".auth/proposal02.json", + storageState: proposal02AuthFile, wallet: proposal02Wallet, }); @@ -76,7 +79,7 @@ test.describe("Proposal created logged in state", () => { test.describe("Proposal created with poll enabled (user auth)", () => { test.use({ - storageState: ".auth/proposal02.json", + storageState: proposal02AuthFile, wallet: proposal02Wallet, pollEnabled: true, }); @@ -136,7 +139,7 @@ test.describe("Proposal created with poll enabled (user auth)", () => { test.describe("Proposal created with poll enabled (proposal auth)", () => { test.use({ - storageState: ".auth/user01.json", + storageState: user01AuthFile, wallet: user01Wallet, pollEnabled: true, }); @@ -147,7 +150,7 @@ test.describe("Proposal created with poll enabled (proposal auth)", () => { test.beforeEach(async ({ browser, proposalId }) => { test.slow(); proposalPage = await createNewPageWithWallet(browser, { - storageState: ".auth/proposal01.json", + storageState: proposal01AuthFile, wallet: proposal01Wallet, }); ownerProposalDiscussionDetailsPage = new ProposalDiscussionDetailsPage( 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 84d6b408e..e4303ae9b 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 @@ -6,7 +6,7 @@ import { import { faker } from "@faker-js/faker"; import { test } from "@fixtures/proposal"; import { setAllureEpic } from "@helpers/allure"; -import { isBootStrapingPhase, skipIfNotHardFork } from "@helpers/cardano"; +import { isBootStrapingPhase } from "@helpers/cardano"; import { injectLogger } from "@helpers/page"; import { extractProposalIdFromUrl } from "@helpers/string"; import { functionWaitedAssert } from "@helpers/waitedLoop"; @@ -21,7 +21,6 @@ const mockComments = require("../../lib/_mock/proposalComments.json"); test.beforeEach(async () => { await setAllureEpic("8. Proposal Discussion Forum"); - await skipIfNotHardFork(); }); test("8A. Should access proposed governance actions in disconnected state", async ({ diff --git a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts index ea304163e..0976ebb49 100644 --- a/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts +++ b/tests/govtool-frontend/playwright/tests/9-outcomes/outcomes.spec.ts @@ -1,11 +1,7 @@ import { InvalidMetadata } from "@constants/index"; import { test } from "@fixtures/walletExtension"; -import { - correctVoteAdaFormat, - formatWithThousandSeparator, -} from "@helpers/adaFormat"; +import { formatWithThousandSeparator } from "@helpers/adaFormat"; import { setAllureEpic } from "@helpers/allure"; -import { skipIfNotHardFork } from "@helpers/cardano"; import extractExpiryDateFromText from "@helpers/extractExpiryDateFromText"; import { areCCVoteTotalsDisplayed, @@ -24,7 +20,6 @@ const invalidOutcomeProposals = require("../../lib/_mock/outcome.json"); test.beforeEach(async () => { await setAllureEpic("9. Outcomes"); - await skipIfNotHardFork(); }); const status = ["Expired", "Ratified", "Enacted", "Live"]; @@ -170,9 +165,7 @@ test.describe("Outcome details dependent test", () => { const outcomesPage = new OutComesPage(currentPage); await outcomesPage.searchInput.fill(governanceActionId); - await expect( - currentPage.getByRole("progressbar").getByRole("img") - ).toBeVisible(); + await page .getByTestId(`${governanceActionId}-CIP-105-id`) .getByTestId("copy-button") @@ -455,7 +448,7 @@ test("9G. Should display correct vote counts on outcome details page", async ({ name: "Explicit", }) ).toHaveText( - `Explicit${formatWithThousandSeparator(Math.ceil(proposalToCheck.pool_abstain_votes) / 1000000)}` + `Explicit${formatWithThousandSeparator(proposalToCheck.pool_abstain_votes, false)}` ); //BUG missing testIds await expect( govActionDetailsPage.sPosResultData diff --git a/tests/govtool-frontend/playwright/tests/adaholder.auth.setup.ts b/tests/govtool-frontend/playwright/tests/adaholder.auth.setup.ts new file mode 100644 index 000000000..e812af725 --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/adaholder.auth.setup.ts @@ -0,0 +1,72 @@ +import { + adaHolder01AuthFile, + adaHolder02AuthFile, + adaHolder03AuthFile, + adaHolder04AuthFile, + adaHolder05AuthFile, + adaHolder06AuthFile, +} from "@constants/auth"; +import { + adaHolder01Wallet, + adaHolder02Wallet, + adaHolder03Wallet, + adaHolder04Wallet, + adaHolder05Wallet, + adaHolder06Wallet, +} from "@constants/staticWallets"; +import { test as setup } from "@fixtures/walletExtension"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { createAuth, createAuthWithMultipleStake } from "@helpers/auth"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Authentication"); +}); + +const authConfigs = [ + { + name: "AdaHolder 01", + wallet: adaHolder01Wallet, + auth: adaHolder01AuthFile, + }, + { + name: "AdaHolder 02", + wallet: adaHolder02Wallet, + auth: adaHolder02AuthFile, + }, + { + name: "AdaHolder 03", + wallet: adaHolder03Wallet, + auth: adaHolder03AuthFile, + }, + { + name: "AdaHolder 04", + wallet: adaHolder04Wallet, + auth: adaHolder04AuthFile, + }, + { + name: "AdaHolder 05", + wallet: adaHolder05Wallet, + auth: adaHolder05AuthFile, + }, +]; + +for (const config of authConfigs) { + setup(`Create ${config.name} auth`, async ({ page, context }) => { + await createAuth({ + page, + context, + wallet: config.wallet, + auth: config.auth, + }); + }); +} + +setup("Create AdaHolder 06 auth", async ({ page, context }) => { + await createAuthWithMultipleStake({ + page, + context, + wallet: adaHolder06Wallet, + auth: adaHolder06AuthFile, + }); +}); diff --git a/tests/govtool-frontend/playwright/tests/auth.setup.ts b/tests/govtool-frontend/playwright/tests/auth.setup.ts deleted file mode 100644 index 2732ff065..000000000 --- a/tests/govtool-frontend/playwright/tests/auth.setup.ts +++ /dev/null @@ -1,276 +0,0 @@ -// Saves storage state to a file in the .auth directory - -import { - adaHolder01Wallet, - adaHolder02Wallet, - adaHolder03Wallet, - adaHolder04Wallet, - adaHolder05Wallet, - adaHolder06Wallet, - budgetProposal01Wallet, - budgetProposal02Wallet, - budgetProposal03Wallet, - budgetProposal04Wallet, - dRep01Wallet, - dRep02Wallet, - dRep03Wallet, - proposal01Wallet, - proposal02Wallet, - proposal03Wallet, - proposal04Wallet, - proposal05Wallet, - proposal06Wallet, - proposal07Wallet, - proposal08Wallet, - proposal09Wallet, - user01Wallet, -} from "@constants/staticWallets"; -import { test as setup } from "@fixtures/walletExtension"; -import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { - createAuth, - createAuthWithMultipleStake, - createAuthWithUserName, -} from "@helpers/auth"; -import { skipIfNotHardFork } from "@helpers/cardano"; - -const dRep01AuthFile = ".auth/dRep01.json"; -const dRep02AuthFile = ".auth/dRep02.json"; -const dRep03AuthFile = ".auth/dRep03.json"; - -const adaHolder01AuthFile = ".auth/adaHolder01.json"; -const adaHolder02AuthFile = ".auth/adaHolder02.json"; -const adaHolder03AuthFile = ".auth/adaHolder03.json"; -const adaHolder04AuthFile = ".auth/adaHolder04.json"; -const adaHolder05AuthFile = ".auth/adaHolder05.json"; -const adaHolder06AuthFile = ".auth/adaHolder06.json"; - -const user01AuthFile = ".auth/user01.json"; - -const proposal01AuthFile = ".auth/proposal01.json"; -const proposal02AuthFile = ".auth/proposal02.json"; -const proposal03AuthFile = ".auth/proposal03.json"; -const proposal04AuthFile = ".auth/proposal04.json"; -const proposal05AuthFile = ".auth/proposal05.json"; -const proposal06AuthFile = ".auth/proposal06.json"; -const proposal07AuthFile = ".auth/proposal07.json"; -const proposal08AuthFile = ".auth/proposal08.json"; -const proposal09AuthFile = ".auth/proposal09.json"; - -const budgetProposal01AuthFile = ".auth/budgetProposal01.json"; -const budgetProposal02AuthFile = ".auth/budgetProposal02.json"; -const budgetProposal03AuthFile = ".auth/budgetProposal03.json"; -const budgetProposal04AuthFile = ".auth/budgetProposal04.json"; - -setup.beforeEach(async () => { - await setAllureEpic("Setup"); - await setAllureStory("Authentication"); - await skipIfNotHardFork(); -}); - -setup("Create DRep 01 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: dRep01Wallet, - auth: dRep01AuthFile, - }); -}); - -setup("Create DRep 02 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: dRep02Wallet, - auth: dRep02AuthFile, - }); -}); - -setup("Create DRep 03 auth with username", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: dRep03Wallet, - auth: dRep03AuthFile, - }); -}); - -setup("Create User 01 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: user01Wallet, - auth: user01AuthFile, - }); -}); - -setup("Create AdaHolder 01 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: adaHolder01Wallet, - auth: adaHolder01AuthFile, - }); -}); - -setup("Create AdaHolder 02 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: adaHolder02Wallet, - auth: adaHolder02AuthFile, - }); -}); - -setup("Create AdaHolder 03 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: adaHolder03Wallet, - auth: adaHolder03AuthFile, - }); -}); - -setup("Create AdaHolder 04 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: adaHolder04Wallet, - auth: adaHolder04AuthFile, - }); -}); - -setup("Create AdaHolder 05 auth", async ({ page, context }) => { - await createAuth({ - page, - context, - wallet: adaHolder05Wallet, - auth: adaHolder05AuthFile, - }); -}); - -setup("Create AdaHolder 06 auth", async ({ page, context }) => { - await createAuthWithMultipleStake({ - page, - context, - wallet: adaHolder06Wallet, - auth: adaHolder06AuthFile, - }); -}); - -setup("Create Proposal 01 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal01Wallet, - auth: proposal01AuthFile, - }); -}); - -setup("Create Proposal 02 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal02Wallet, - auth: proposal02AuthFile, - }); -}); - -setup("Create Proposal 03 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal03Wallet, - auth: proposal03AuthFile, - }); -}); - -setup("Create Proposal 04 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal04Wallet, - auth: proposal04AuthFile, - }); -}); - -setup("Create Proposal 05 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal05Wallet, - auth: proposal05AuthFile, - }); -}); - -setup("Create Proposal 06 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal06Wallet, - auth: proposal06AuthFile, - }); -}); - -setup("Create Proposal 07 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal07Wallet, - auth: proposal07AuthFile, - }); -}); - -setup("Create Proposal 08 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal08Wallet, - auth: proposal08AuthFile, - }); -}); - -setup("Create Proposal 09 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: proposal09Wallet, - auth: proposal09AuthFile, - }); -}); - -setup("Create Budget Proposal 01 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: budgetProposal01Wallet, - auth: budgetProposal01AuthFile, - }); -}); - -setup("Create Budget Proposal 02 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: budgetProposal02Wallet, - auth: budgetProposal02AuthFile, - }); -}); - -setup("Create Budget Proposal 03 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: budgetProposal03Wallet, - auth: budgetProposal03AuthFile, - }); -}); - -setup("Create Budget Proposal 04 auth", async ({ page, context }) => { - await createAuthWithUserName({ - page, - context, - wallet: budgetProposal04Wallet, - auth: budgetProposal04AuthFile, - }); -}); diff --git a/tests/govtool-frontend/playwright/tests/dRep.auth.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.auth.setup.ts new file mode 100644 index 000000000..f1593d593 --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/dRep.auth.setup.ts @@ -0,0 +1,28 @@ +import { dRep01AuthFile, dRep02AuthFile } from "@constants/auth"; +import { dRep01Wallet, dRep02Wallet } from "@constants/staticWallets"; +import { test as setup } from "@fixtures/walletExtension"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { createAuth } from "@helpers/auth"; +import { skipIfMainnet } from "@helpers/cardano"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Authentication"); + await skipIfMainnet(); +}); + +const drepAuthConfigs = [ + { name: "DRep 01", wallet: dRep01Wallet, auth: dRep01AuthFile }, + { name: "DRep 02", wallet: dRep02Wallet, auth: dRep02AuthFile }, +]; + +for (const config of drepAuthConfigs) { + setup(`Create ${config.name} auth`, async ({ page, context }) => { + await createAuth({ + page, + context, + wallet: config.wallet, + auth: config.auth, + }); + }); +} diff --git a/tests/govtool-frontend/playwright/tests/dRep.setup.ts b/tests/govtool-frontend/playwright/tests/dRep.setup.ts index 9dde14e07..25792139f 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.setup.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.setup.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { dRepWallets } from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { uploadMetadataAndGetJsonHash } from "@helpers/metadata"; import { generateWallets } from "@helpers/shellyWallet"; import { pollTransaction } from "@helpers/transaction"; @@ -31,7 +31,6 @@ setup.beforeAll(async () => { setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Register DRep"); - await skipIfNotHardFork(); await skipIfMainnet(); }); diff --git a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts index 5a7272185..0e246b846 100644 --- a/tests/govtool-frontend/playwright/tests/dRep.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/dRep.teardown.ts @@ -1,5 +1,8 @@ import environments from "@constants/environments"; -import { dRepWallets } from "@constants/staticWallets"; +import { + budgetProposalDRepWallets, + dRepWallets, +} from "@constants/staticWallets"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; import { skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; @@ -26,6 +29,7 @@ cleanup("DRep de-registration", async () => { ...dRepWallets, ...registerDRep, ...registeredDRep, + ...budgetProposalDRepWallets, ]; try { const { txId, lockInfo } = await kuberService.multipleDRepDeRegistration( diff --git a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts index 5534439f1..f1d4b279b 100644 --- a/tests/govtool-frontend/playwright/tests/delegation.teardown.ts +++ b/tests/govtool-frontend/playwright/tests/delegation.teardown.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { adaHolderWallets } from "@constants/staticWallets"; import { setAllureStory, setAllureEpic } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { pollTransaction } from "@helpers/transaction"; import { test as cleanup } from "@fixtures/walletExtension"; import kuberService from "@services/kuberService"; @@ -10,7 +10,6 @@ cleanup.describe.configure({ timeout: environments.txTimeOut }); cleanup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Cleanup"); - await skipIfNotHardFork(); await skipIfMainnet(); }); cleanup(`Abstain delegation`, async () => { diff --git a/tests/govtool-frontend/playwright/tests/proposal-budget.auth.setup.ts b/tests/govtool-frontend/playwright/tests/proposal-budget.auth.setup.ts new file mode 100644 index 000000000..a4e24036b --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/proposal-budget.auth.setup.ts @@ -0,0 +1,65 @@ +import { + budgetProposal01AuthFile, + budgetProposal02AuthFile, + budgetProposal03AuthFile, + budgetProposal04AuthFile, + dRep03AuthFile, +} from "@constants/auth"; +import { + budgetProposal01Wallet, + budgetProposal02Wallet, + budgetProposal03Wallet, + budgetProposal04Wallet, + dRep03Wallet, +} from "@constants/staticWallets"; +import { test as setup } from "@fixtures/walletExtension"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { createAuthWithUserName } from "@helpers/auth"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Authentication"); +}); + +const walletAuthPairs = [ + { + wallet: budgetProposal01Wallet, + auth: budgetProposal01AuthFile, + name: "Budget Proposal 01", + }, + { + wallet: budgetProposal02Wallet, + auth: budgetProposal02AuthFile, + name: "Budget Proposal 02", + }, + { + wallet: budgetProposal03Wallet, + auth: budgetProposal03AuthFile, + name: "Budget Proposal 03", + }, + { + wallet: budgetProposal04Wallet, + auth: budgetProposal04AuthFile, + name: "Budget Proposal 04", + }, +]; + +walletAuthPairs.forEach(({ wallet, auth, name }) => { + setup(`Create ${name} auth`, async ({ page, context }) => { + await createAuthWithUserName({ + page, + context, + wallet, + auth, + }); + }); +}); + +setup("Create DRep 03 auth with username", async ({ page, context }) => { + await createAuthWithUserName({ + page, + context, + wallet: dRep03Wallet, + auth: dRep03AuthFile, + }); +}); diff --git a/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts b/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts new file mode 100644 index 000000000..48137cc4c --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/proposal-budget.dRep.setup.ts @@ -0,0 +1,58 @@ +import environments from "@constants/environments"; +import { + budgetProposalDRepWallets, + dRepWallets, +} from "@constants/staticWallets"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { skipIfMainnet } from "@helpers/cardano"; +import { uploadMetadataAndGetJsonHash } from "@helpers/metadata"; +import { pollTransaction } from "@helpers/transaction"; +import { expect } from "@playwright/test"; +import { test as setup } from "@fixtures/walletExtension"; + +import kuberService from "@services/kuberService"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Register DRep"); + await skipIfMainnet(); +}); + +setup("Register DRep of proposal budget static wallets", async () => { + setup.setTimeout(environments.txTimeOut); + + try { + // Submit metadata to obtain a URL and generate hash value. + const metadataPromises = budgetProposalDRepWallets.map( + async (dRepWallet) => { + const metadataResponse = await uploadMetadataAndGetJsonHash(); + const givenName = metadataResponse.givenName; + const index = dRepWallets.indexOf(dRepWallet); + dRepWallets[index] = { + ...dRepWallet, + givenName, + }; + return { + ...metadataResponse, + wallet: dRepWallet, + }; + } + ); + + const metadataAndDRepWallets = await Promise.all(metadataPromises); + const res = await kuberService.multipleDRepRegistration( + metadataAndDRepWallets + ); + + await pollTransaction(res.txId, res.lockInfo); + } catch (err) { + if ( + err.status === 400 && + err.message.includes("ConwayDRepAlreadyRegistered") + ) { + expect(true, "DRep already registered").toBeTruthy(); + } else { + throw err; + } + } +}); diff --git a/tests/govtool-frontend/playwright/tests/proposal-discussion.auth.setup.ts b/tests/govtool-frontend/playwright/tests/proposal-discussion.auth.setup.ts new file mode 100644 index 000000000..5240acd4e --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/proposal-discussion.auth.setup.ts @@ -0,0 +1,53 @@ +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { test as setup } from "@fixtures/walletExtension"; +import { createAuthWithUserName } from "@helpers/auth"; +import { + proposal01Wallet, + proposal02Wallet, + proposal03Wallet, + proposal04Wallet, + proposal05Wallet, + proposal06Wallet, + proposal07Wallet, + proposal08Wallet, + proposal09Wallet, +} from "@constants/staticWallets"; +import { + proposal01AuthFile, + proposal02AuthFile, + proposal03AuthFile, + proposal04AuthFile, + proposal05AuthFile, + proposal06AuthFile, + proposal07AuthFile, + proposal08AuthFile, + proposal09AuthFile, +} from "@constants/auth"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Authentication"); +}); + +const proposalSetups = [ + { name: "Proposal 01", wallet: proposal01Wallet, auth: proposal01AuthFile }, + { name: "Proposal 02", wallet: proposal02Wallet, auth: proposal02AuthFile }, + { name: "Proposal 03", wallet: proposal03Wallet, auth: proposal03AuthFile }, + { name: "Proposal 04", wallet: proposal04Wallet, auth: proposal04AuthFile }, + { name: "Proposal 05", wallet: proposal05Wallet, auth: proposal05AuthFile }, + { name: "Proposal 06", wallet: proposal06Wallet, auth: proposal06AuthFile }, + { name: "Proposal 07", wallet: proposal07Wallet, auth: proposal07AuthFile }, + { name: "Proposal 08", wallet: proposal08Wallet, auth: proposal08AuthFile }, + { name: "Proposal 09", wallet: proposal09Wallet, auth: proposal09AuthFile }, +]; + +for (const { name, wallet, auth } of proposalSetups) { + setup(`Create ${name} auth`, async ({ page, context }) => { + await createAuthWithUserName({ + page, + context, + wallet, + auth, + }); + }); +} diff --git a/tests/govtool-frontend/playwright/tests/proposal.setup.ts b/tests/govtool-frontend/playwright/tests/proposal.setup.ts index 09192d3c8..9f905b426 100644 --- a/tests/govtool-frontend/playwright/tests/proposal.setup.ts +++ b/tests/govtool-frontend/playwright/tests/proposal.setup.ts @@ -1,7 +1,7 @@ import environments from "@constants/environments"; import { proposalFaucetWallet } from "@constants/proposalFaucetWallet"; import { setAllureEpic, setAllureStory } from "@helpers/allure"; -import { skipIfMainnet, skipIfNotHardFork } from "@helpers/cardano"; +import { skipIfMainnet } from "@helpers/cardano"; import { generateWallets } from "@helpers/shellyWallet"; import { pollTransaction } from "@helpers/transaction"; import { test as setup } from "@fixtures/walletExtension"; @@ -26,7 +26,6 @@ setup.beforeAll(async () => { setup.beforeEach(async () => { await setAllureEpic("Setup"); await setAllureStory("Proposal"); - await skipIfNotHardFork(); await skipIfMainnet(); }); diff --git a/tests/govtool-frontend/playwright/tests/user.auth.setup.ts b/tests/govtool-frontend/playwright/tests/user.auth.setup.ts new file mode 100644 index 000000000..9f012a83e --- /dev/null +++ b/tests/govtool-frontend/playwright/tests/user.auth.setup.ts @@ -0,0 +1,19 @@ +import { user01AuthFile } from "@constants/auth"; +import { user01Wallet } from "@constants/staticWallets"; +import { test as setup } from "@fixtures/walletExtension"; +import { setAllureEpic, setAllureStory } from "@helpers/allure"; +import { createAuth } from "@helpers/auth"; + +setup.beforeEach(async () => { + await setAllureEpic("Setup"); + await setAllureStory("Authentication"); +}); + +setup("Create User 01 auth", async ({ page, context }) => { + await createAuth({ + page, + context, + wallet: user01Wallet, + auth: user01AuthFile, + }); +});