diff --git a/.changeset/config.json b/.changeset/config.json index aa33a3c477..e0bcad21d4 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -9,5 +9,5 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["@kadena/bootstrap-lib", "@kadena/tools"] + "ignore": ["@kadena/bootstrap-lib", "@kadena/tools", "@kadena-dev/e2e-tests", "@kadena/docs"] } diff --git a/.changeset/modern-bottles-change.md b/.changeset/modern-bottles-change.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/modern-bottles-change.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 439634efd9..989b25825b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,7 @@ on: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + CI: true jobs: build: @@ -80,12 +81,12 @@ jobs: run: pnpm run test:integration --filter ${{ matrix.package }} end-to-end-tests: - name: E2E - ${{ matrix.package }} + name: E2E - ${{ matrix.app }} needs: build runs-on: ubuntu-latest strategy: matrix: - package: ['@kadena/tools'] + app: ['tools', 'docs'] steps: - uses: actions/checkout@v4 @@ -111,17 +112,12 @@ jobs: # Disable remote caching for this step, otherwise env variables will not be used. - name: build dApp - run: pnpm --filter ${{ matrix.package }}... build - env: - # Dummy values for faucet transactions. - FAUCET_PUBLIC_KEY: 782127638ab9cc8fa8598ff0120464ceef6f367ddcd616b47afffbdb175dcc5e - FAUCET_PRIVATE_KEY: 93fd78bd1e79a3b593d4732b76050b418aeefa5e4e6ea80f351b4c3a5b0dd19f + run: pnpm turbo build --filter @kadena/${{ matrix.app }} - name: Run end-to-end tests - run: pnpm run test:e2e -- --project=${{ matrix.package }} + run: pnpm run test:e2e -- -c playwright.${{ matrix.app }}.config.ts env: - CI: true - TESTOBJECT: ${{ matrix.package }} + TESTOBJECT: ${{ matrix.app }} - uses: actions/upload-artifact@v3 if: always() diff --git a/packages.json b/packages.json index 4b838717ff..fc1d568c96 100644 --- a/packages.json +++ b/packages.json @@ -55,14 +55,20 @@ }, { "name": "@kadena/docs", - "version": "0.6.3", + "version": "0.8.0", "private": true, "path": "packages/apps/docs" }, { - "name": "@kadena/graph", - "version": "1.0.7", + "name": "@kadena/docs-tools", + "version": "0.1.0", "private": true, + "path": "packages/tools/docs-tools" + }, + { + "name": "@kadena/graph", + "version": "1.0.6", + "private": false, "path": "packages/apps/graph" }, { @@ -73,7 +79,7 @@ }, { "name": "@kadena/hd-wallet", - "version": "0.0.1", + "version": "0.2.0", "private": true, "path": "packages/libs/hd-wallet" }, @@ -109,7 +115,7 @@ }, { "name": "@kadena/proof-of-us", - "version": "0.1.0", + "version": "0.2.0", "private": true, "path": "packages/apps/proof-of-us" }, diff --git a/packages/apps/docs/.eslintrc.cjs b/packages/apps/docs/.eslintrc.cjs index db48a2f109..5ee0ade01d 100644 --- a/packages/apps/docs/.eslintrc.cjs +++ b/packages/apps/docs/.eslintrc.cjs @@ -4,6 +4,7 @@ require('@rushstack/eslint-config/patch/modern-module-resolution'); module.exports = { extends: ['@kadena-dev/eslint-config/profile/next'], parserOptions: { tsconfigRootDir: __dirname }, + ignorePatterns: ['playwright.config.ts'], rules: { '@typescript-eslint/strict-boolean-expressions': 'off', '@kadena-dev/typedef-var': 'off', diff --git a/packages/apps/docs/cypress.config.js b/packages/apps/docs/cypress.config.js deleted file mode 100644 index 7bd177cbea..0000000000 --- a/packages/apps/docs/cypress.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from 'cypress'; - -export default defineConfig({ - e2e: { - baseUrl: 'http://localhost:3000', - retries: { - runMode: 3, - }, - viewportHeight: 1080, - viewportWidth: 1920, - video: false, - screenshotOnRunFailure: false, - }, -}); diff --git a/packages/apps/docs/cypress/e2e/consent.cy.ts b/packages/apps/docs/cypress/e2e/consent.cy.ts deleted file mode 100644 index fc5b222853..0000000000 --- a/packages/apps/docs/cypress/e2e/consent.cy.ts +++ /dev/null @@ -1,39 +0,0 @@ -const COOKIECONSENTNAME = 'cookie_consent'; -describe('Consent box', () => { - beforeEach(() => { - cy.visit('/docs/__tests/pact/atom-sdk'); - }); - - afterEach(() => { - window.localStorage.clear(); - }); - - it('checks that consent modal is visible', () => { - cy.get('[data-cy="modal-background"]').should('exist'); - cy.get('[data-cy="modal"]').should('be.visible').contains('Cookie consent'); - cy.get('[data-cy="modal"]').find('button').should('have.length', 3); - }); - - describe('no consent set', () => { - beforeEach(() => { - window.localStorage.clear(); - }); - it('checks that the consent cookie is not set on start', () => { - const cookieValue = window.localStorage.getItem(COOKIECONSENTNAME); - cy.expect(cookieValue).to.equal(null); - cy.get('[data-cy="modal"]').should('be.visible'); - }); - - describe('no consent shown', () => { - beforeEach(() => { - window.localStorage.setItem(COOKIECONSENTNAME, 'true'); - }); - it('checks that modal is not shown, if COOKIECONSENTNAME is already set', () => { - cy.wait(500); - cy.get('[data-cy="modal"]').should('not.exist'); - }); - }); - }); -}); - -export {}; diff --git a/packages/apps/docs/cypress/e2e/layoutfull.cy.ts b/packages/apps/docs/cypress/e2e/layoutfull.cy.ts deleted file mode 100644 index 71344ae1d2..0000000000 --- a/packages/apps/docs/cypress/e2e/layoutfull.cy.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { closeConsentModal } from '../utils'; - -describe('full layout', () => { - const aside = () => cy.get('[data-cy="aside"]'); - const menu = () => cy.get('[data-cy="menu"]'); - const breadcrumbs = () => cy.get('[data-cy="breadcrumbs"]'); - - beforeEach(() => { - cy.visit('/docs/__tests/pact/atom-sdk'); - closeConsentModal(); - }); - describe('desktop', () => { - it('shows the breadcrumbs with icon', () => { - breadcrumbs().find('li').should('have.length', 3); - breadcrumbs().find('svg').should('exist'); - }); - it('shows the left sidemenu', () => { - cy.percySnapshot('test'); - menu().should('be.visible'); - cy.get('[data-cy="hamburgermenu"]').should('not.be.visible'); - }); - - it('shows the aside menu', () => { - aside().should('be.visible'); - aside().find('ul:first').children('li').should('have.length', 3); - - // first li child ("section 1") will not have children - aside() - .find('ul:first') - .children('li') - .first() - .children('ul') - .should('not.exist'); - - // second li child ("section 2") will have 2 children - aside() - .find('ul:first > li:nth-child(2)') - .children('ul') - .should('exist') - .children('li') - .should('have.length', 2); - - // second li child ("section 2.2") will have 1 children - aside() - .find('ul:first > li:nth-child(2) > ul > li:nth-child(2)') - .children('ul') - .should('exist') - .children('li') - .should('have.length', 1); - }); - - it('deeplink on the page when an option of the aside menu is clicked', () => { - cy.location().should((loc) => { - expect(loc.hash).to.eq(''); - }); - aside().find('ul:first > li:nth-child(3) ').click(10, 10); - cy.location().should((loc) => { - expect(loc.hash).to.eq('#section-3'); - }); - }); - }); - - describe('mobile', () => { - const hamburgerMenu = () => cy.get('[data-cy="hamburgermenu"]'); - const secondMenu = () => menu().get('[data-cy="sidemenu-submenu"]'); - const mainMenu = () => menu().get('[data-cy="sidemenu-main"]'); - const openMenu = () => { - hamburgerMenu().click(); - }; - beforeEach(() => { - cy.viewport(640, 720); - }); - - describe('test the functionality of the sidemenu', () => { - const ListMenu = () => secondMenu().find('ul > li:nth-child(2)'); - it('shows the left menu', () => { - openMenu(); - - const Atom = () => ListMenu().find('ul > li:nth-child(4)'); - const QuickStart = () => Atom().find(' > ul > li > a[data-active]'); - - // check if everything is there - menu().find('h5').contains('Test'); - secondMenu().find('ul:first-child > li').should('have.length', 4); - Atom().find(' > button').contains('Atom SDK'); - - QuickStart().contains('Quickstart'); - - Atom() - .find(' > ul') - .should('be.visible') - .children('li') - .should('have.length', 2); - }); - - it('opens and closes the basics menu when clicked', () => { - openMenu(); - const basics = () => ListMenu().find('li:nth-child(3)'); - basics().contains('Basics'); - basics().find('ul').should('not.be.visible'); - basics().click(); - basics().find('ul').should('be.visible'); - basics() - .children('ul') - .children('li > [data-active="true"]') - .should('have.length', 0); - basics().children('ul').children('li').should('have.length', 2); - basics().children('ul').children('li').eq(1).click(); - basics() - .children('ul') - .find('> li > [data-active="true"]') - .should('have.length', 1) - .first() - .contains('Build-in Functions'); - }); - - it('shows the main menu when "Pact" backbutton is clicked', () => { - openMenu(); - menu().find('h5').contains('Test').click(); - menu().find('h5').contains('Kadena Docs'); - - mainMenu().find('ul > li:last-child').contains('Test').click(); - - menu().find('h5').contains('Test'); - }); - it('opens a new page when Chainweb is clicked in the main menu', () => { - openMenu(); - menu().find('h5').contains('Test').click(); - mainMenu().find('ul').children('li:nth-child(3)').click(); - cy.wait(1000); - cy.percySnapshot('test'); - }); - }); - }); -}); - -export {}; diff --git a/packages/apps/docs/cypress/e2e/layoutlanding.cy.ts b/packages/apps/docs/cypress/e2e/layoutlanding.cy.ts deleted file mode 100644 index 1bd63b3d51..0000000000 --- a/packages/apps/docs/cypress/e2e/layoutlanding.cy.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { closeConsentModal } from '../utils'; - -describe('landing page layout', () => { - const menu = () => cy.get('[data-cy="menu"]'); - const header = () => cy.get('[data-cy="titleheader"]'); - beforeEach(() => { - cy.visit('/docs/__tests/chainweb'); - closeConsentModal(); - }); - - describe('desktop', () => { - it('does not have an asidemenu', () => { - cy.percySnapshot('test'); - cy.get('[data-cy="aside"]').should('not.exist'); - }); - - it('shows the sidemenu', () => { - menu().should('exist'); - menu() - .get('[data-cy="sidemenu-submenu"]') - .find('ul:first') - .children() - .should('have.length', 4); - }); - - it('shows the sidemenu with its own children', () => { - menu().should('exist'); - }); - - it('shows the title header', () => { - menu().should('be.visible'); - header().should('be.visible'); - header().find('h1').contains('Chainweb'); - header() - .find('h5') - .contains( - 'The safest, most user-friendly language for smart contracts', - ); - - header().find('svg').should('exist'); - - cy.get('header').first().find('nav > ul > li:last-child').click(); - header().find('h1').contains('Pact'); - }); - }); -}); diff --git a/packages/apps/docs/cypress/e2e/subscribe.cy.ts b/packages/apps/docs/cypress/e2e/subscribe.cy.ts deleted file mode 100644 index 870ad72930..0000000000 --- a/packages/apps/docs/cypress/e2e/subscribe.cy.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { IResponse } from '../../src/pages/api/subscribe'; -import { closeConsentModal } from '../utils'; - -describe('Subscribe to mailList', () => { - const subscribe = () => cy.get('[data-cy="subscribe"]'); - const getData = (data: IResponse<{}>) => { - cy.intercept( - { - method: 'POST', // Route all GET requests - url: '/api/subscribe', - }, - data, // and force the response to be: [] - ).as('postSubcribe'); // and assign an alias - }; - - beforeEach(() => { - cy.visit('/docs/__tests/pact/atom-sdk'); - closeConsentModal(); - }); - - it('submit a correct email, happy path', () => { - getData({ - status: 200, - message: 'Thank you for subscribing', - }); - - cy.percySnapshot('test'); - subscribe().should('be.visible'); - - subscribe() - .find('input[type="email"]') - .type('he-man@masteroftheuniverse.com{enter}', { delay: 10 }); - - subscribe().find('input[type="email"]').should('not.exist'); - - subscribe().contains('Thank you for subscribing'); - }); - - it('submit a correct email, breaks because of something wrong in BE', () => { - getData({ - status: 500, - message: 'Something went wrong', - }); - - subscribe() - .find('input[type="email"]') - .type('he-man@masteroftheuniverse.com{enter}', { delay: 10 }); - - subscribe().find('input[type="email"]').should('exist'); - subscribe().contains('Something went wrong'); - }); - - it('type a invalid email and the submit button should be disabled. and not submit', () => { - getData({ - status: 200, - message: 'Thank you for subscribing', - }); - - subscribe() - .find('input[type="email"]') - .type('!!skeletor@thundercars.com', { delay: 10 }); - subscribe() - .find('button[type="submit"]') - .should('have.attr', 'disabled', 'disabled'); - }); -}); - -export {}; diff --git a/packages/apps/docs/cypress/support/commands.ts b/packages/apps/docs/cypress/support/commands.ts deleted file mode 100644 index d341135372..0000000000 --- a/packages/apps/docs/cypress/support/commands.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// -// *********************************************** -// This example commands.ts shows you how to -// create various custom commands and overwrite -// existing commands. -// -// For more comprehensive examples of custom -// commands please read more here: -// https://on.cypress.io/custom-commands -// *********************************************** -// -// -// -- This is a parent command -- -// Cypress.Commands.add('login', (email, password) => { ... }) -// -// -// -- This is a child command -- -// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) -// -// -// -- This is a dual command -- -// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) -// -// -// -- This will overwrite an existing command -- -// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) -// -// declare global { -// namespace Cypress { -// interface Chainable { -// login(email: string, password: string): Chainable -// drag(subject: string, options?: Partial): Chainable -// dismiss(subject: string, options?: Partial): Chainable -// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable -// } -// } -// } -import '@percy/cypress'; - -export {}; diff --git a/packages/apps/docs/cypress/support/e2e.ts b/packages/apps/docs/cypress/support/e2e.ts deleted file mode 100644 index 598ab5f0d7..0000000000 --- a/packages/apps/docs/cypress/support/e2e.ts +++ /dev/null @@ -1,20 +0,0 @@ -// *********************************************************** -// This example support/e2e.ts is processed and -// loaded automatically before your test files. -// -// This is a great place to put global configuration and -// behavior that modifies Cypress. -// -// You can change the location of this file or turn off -// automatically serving support files with the -// 'supportFile' configuration option. -// -// You can read more here: -// https://on.cypress.io/configuration -// *********************************************************** - -// Import commands.js using ES2015 syntax: -import './commands'; - -// Alternatively you can use CommonJS syntax: -// require('./commands') diff --git a/packages/apps/docs/cypress/tsconfig.json b/packages/apps/docs/cypress/tsconfig.json deleted file mode 100644 index 6005415f4f..0000000000 --- a/packages/apps/docs/cypress/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "baseUrl": "./", - "sourceMap": false, - "inlineSourceMap": true, - "types": ["cypress", "node", "./support"] - } -} diff --git a/packages/apps/docs/cypress/utils.ts b/packages/apps/docs/cypress/utils.ts deleted file mode 100644 index 2f682b465e..0000000000 --- a/packages/apps/docs/cypress/utils.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const closeConsentModal = () => { - cy.get('[data-cy="modal-background"]', { timeout: 10000 }).click({ - x: 10, - y: 10, - force: true, - }); -}; diff --git a/packages/apps/docs/package.json b/packages/apps/docs/package.json index 25fcae0360..74e5e81b29 100644 --- a/packages/apps/docs/package.json +++ b/packages/apps/docs/package.json @@ -16,10 +16,6 @@ "build:scripts": "tsx ./src/scripts/build.ts", "build:storybook": "pnpm run build:scripts && storybook build", "chromatic": "chromatic -b build:storybook", - "cypress:ci": "NEXT_PUBLIC_APP_DEV=test start-server-and-test dev http://localhost:3000 cypress:run", - "cypress:cilocal": "NEXT_PUBLIC_APP_DEV=test start-server-and-test dev http://localhost:3000 cypress:open", - "cypress:open": "percy exec -- cypress open", - "cypress:run": "percy exec -- cypress run", "dev": "pnpm run build:scripts && next dev", "format": "pnpm run --sequential /^format:.*/", "format:lint": "pnpm run lint:src --fix", @@ -74,7 +70,6 @@ "@kadena-dev/lint-package": "workspace:*", "@kadena-dev/shared-config": "workspace:*", "@percy/cli": "~1.24.0", - "@percy/cypress": "~3.1.2", "@rushstack/eslint-config": "~3.3.0", "@storybook/addon-a11y": "^7.4.0", "@storybook/addon-actions": "^7.4.0", @@ -98,7 +93,6 @@ "@vanilla-extract/webpack-plugin": "2.3.1", "chalk": "^5.2.0", "chromatic": "6.20.0", - "cypress": "~12.12.0", "dotenv": "~16.0.3", "eslint": "^8.45.0", "log-update": "^5.0.1", diff --git a/packages/apps/docs/src/components/Layout/components/TreeMenu/Item.tsx b/packages/apps/docs/src/components/Layout/components/TreeMenu/Item.tsx index 4720e95ffb..2c06bd6c05 100644 --- a/packages/apps/docs/src/components/Layout/components/TreeMenu/Item.tsx +++ b/packages/apps/docs/src/components/Layout/components/TreeMenu/Item.tsx @@ -25,7 +25,10 @@ export const Item: FC = ({ item, level }) => { ); return ( -
  • +
  • {item.label} diff --git a/packages/apps/docs/src/components/Layout/components/TreeMenu/MainTreeItem.tsx b/packages/apps/docs/src/components/Layout/components/TreeMenu/MainTreeItem.tsx index 78f99501dc..02bfe51d5b 100644 --- a/packages/apps/docs/src/components/Layout/components/TreeMenu/MainTreeItem.tsx +++ b/packages/apps/docs/src/components/Layout/components/TreeMenu/MainTreeItem.tsx @@ -10,6 +10,7 @@ interface IProps { menuOpen?: boolean; root?: boolean; level?: LevelType; + testId?: string; } export const MainTreeItem: FC = ({ item, root = false, level = 1 }) => { @@ -65,7 +66,7 @@ export const MainTreeItem: FC = ({ item, root = false, level = 1 }) => { )} {!root && hasSubmenu ? ( -
  • +
  • setMenuOpen((v) => !v)} level={`l${level}`} diff --git a/packages/apps/docs/tsconfig.json b/packages/apps/docs/tsconfig.json index 68f87f1a6e..2bab7f8842 100644 --- a/packages/apps/docs/tsconfig.json +++ b/packages/apps/docs/tsconfig.json @@ -14,5 +14,5 @@ "isolatedModules": true, "jsx": "preserve" }, - "exclude": ["node_modules", "./cypress"] + "exclude": ["node_modules"] } diff --git a/packages/tools/e2e-tests/.eslintrc.js b/packages/tools/e2e-tests/.eslintrc.js index 528f11d5c8..7a01b78038 100644 --- a/packages/tools/e2e-tests/.eslintrc.js +++ b/packages/tools/e2e-tests/.eslintrc.js @@ -6,7 +6,6 @@ module.exports = { 'plugin:playwright/recommended', ], parserOptions: { tsconfigRootDir: __dirname }, - ignorePatterns: ['playwright.config.ts', '*.mocks.ts'], rules: { '@kadena-dev/typedef-var': 'off', '@rushstack/typedef-var': 'off', diff --git a/packages/tools/e2e-tests/README.MD b/packages/tools/e2e-tests/README.MD index 58444ebc89..f9067db687 100644 --- a/packages/tools/e2e-tests/README.MD +++ b/packages/tools/e2e-tests/README.MD @@ -20,18 +20,30 @@ This package contains the e2e tests and source code all Kadena dApps ## Installation & Usage -To run the tests locally, it is assumed that the dApp is served on -[http://localhost:3000][3]. For more information on how to achieve this, consult -the readme for the respective dApp. Running the tests locally can be achieved by -executing the commands below. +### dApp + +In order to run the tests, the dApp needs to be running on +[http://localhost:3000][3]. The tests will assume you deployed the dApp yourself +if a webserver is found on [http://localhost:3000][3]. if it is unable to find +one, the test framework will attempt to start the dApp for you. it is +recommended that you first execute a build of the monorepo to ensure performance +of the dev server. + +### Devnet + +In order to run these integrated tests, a version of devnet is also required. +`docker run -it --rm -p 127.0.0.1:8080:8080` + +Once these two components have been started, either by you or the Note: the following commands have been written to be executable from the root of the monorepository. -1. Install dependencies: +1. Install dependencies, build the monorepo: ```sh pnpm install +pnpn turbo build ``` 2. Install browsers required by Playwright @@ -40,14 +52,13 @@ pnpm install pnpm --filter @kadena-dev/e2e-tests run install:chromium ``` -3. Run test suite, substitute `tools-app` for any of the available projects - described in the [playwright.config.ts][4] +3. Run test suite, substitute `tools` for any of the available Apps. Each App + has it's own config file. ```sh - pnpm --filter @kadena-dev/e2e-tests run test:e2e --project=@kadena/tools +pnpm run test:e2e -- -c playwright.tools.config.ts ``` [1]: #table-of-contents [2]: #installation-#-usage [3]: http://localhost:3000 -[4]: ./playwright.config.ts diff --git a/packages/tools/e2e-tests/package.json b/packages/tools/e2e-tests/package.json index 70f4bb6b60..f3497436af 100644 --- a/packages/tools/e2e-tests/package.json +++ b/packages/tools/e2e-tests/package.json @@ -12,18 +12,22 @@ "lint:fmt": "prettier . --cache --check", "lint:pkg": "lint-package", "lint:src": "eslint src --ext .js,.ts", - "test:e2e": "playwright test" + "test:e2e": "playwright test", + "test:e2e:docs": "playwright test -c playwright.docs.config.ts", + "test:e2e:tools": "playwright test -c playwright.tools.config.ts" }, "devDependencies": { "@kadena-dev/eslint-config": "workspace:*", "@kadena-dev/lint-package": "workspace:*", "@kadena-dev/markdown": "workspace:*", "@kadena-dev/shared-config": "workspace:*", - "@playwright/test": "^1.39.0", + "@playwright/test": "^1.40.1", "@rushstack/eslint-config": "~3.3.0", "@types/node": "^18.17.14", + "directory-tree": "3.5.1", "eslint": "^8.45.0", "eslint-plugin-playwright": "0.16.0", + "parse-md": "2.0.5", "prettier": "~3.0.3" } } diff --git a/packages/tools/e2e-tests/playwright.base.config.ts b/packages/tools/e2e-tests/playwright.base.config.ts new file mode 100644 index 0000000000..dad4547fd4 --- /dev/null +++ b/packages/tools/e2e-tests/playwright.base.config.ts @@ -0,0 +1,27 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { join } from 'path'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export const baseConfig: PlaywrightTestConfig = { + testDir: join(__dirname, 'src/tests'), + fullyParallel: true, + forbidOnly: process.env.CI !== undefined, + retries: process.env.CI !== undefined ? 1 : 0, + workers: 1, + reporter: + process.env.CI !== undefined + ? [['github'], ['dot'], ['html', { open: 'never' }]] + : [['list'], ['html', { open: 'never' }]], + use: { + headless: process.env.CI !== undefined, + baseURL: 'http://localhost:3000/', + channel: 'chromium', + trace: 'retain-on-failure', + }, + timeout: 10 * 10000, + expect: { + timeout: 1 * 30000, + }, +}; diff --git a/packages/tools/e2e-tests/playwright.config.ts b/packages/tools/e2e-tests/playwright.config.ts deleted file mode 100644 index edb4ae36b6..0000000000 --- a/packages/tools/e2e-tests/playwright.config.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { defineConfig } from '@playwright/test'; - -/** - * See https://playwright.dev/docs/test-configuration. - */ -export default defineConfig({ - testDir: 'src/tests/*', - fullyParallel: true, - forbidOnly: !!process.env.CI, - retries: process.env.CI ? 1 : 0, - workers: process.env.CI ? 4 : 1, - reporter: [['github'], ['list'], ['html', { open: 'never' }]], - use: { - headless: !!process.env.CI, - baseURL: process.env.PLAYWRIGHT_BASE_URL - ? process.env.PLAYWRIGHT_BASE_URL - : 'http://127.0.0.1:3000', - channel: 'chromium', - trace: 'retain-on-failure', - }, - expect: { - timeout: 10 * 1000, - }, - webServer: { - command: `pnpm --filter ${process.env.TESTOBJECT} run start`, - url: 'http://127.0.0.1:3000', - reuseExistingServer: process.env.CI === undefined, - }, - - projects: [ - { - name: '@kadena/tools', - testDir: 'src/tests/tools-app', - }, - ], -}); diff --git a/packages/tools/e2e-tests/playwright.docs.config.ts b/packages/tools/e2e-tests/playwright.docs.config.ts new file mode 100644 index 0000000000..2d2daf2b0d --- /dev/null +++ b/packages/tools/e2e-tests/playwright.docs.config.ts @@ -0,0 +1,20 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { baseConfig } from './playwright.base.config'; + +const config: PlaywrightTestConfig = { + ...baseConfig, + webServer: { + // we explicitly use the start command here because docs dev is seriously slow. + command: `pnpm --filter @kadena/docs start`, + url: 'http://localhost:3000', + reuseExistingServer: process.env.CI === undefined, + }, + projects: [ + { + name: 'docs', + testDir: 'src/tests/docs-app/', + }, + ], +}; + +export default config; diff --git a/packages/tools/e2e-tests/playwright.tools.config.ts b/packages/tools/e2e-tests/playwright.tools.config.ts new file mode 100644 index 0000000000..3539d3852b --- /dev/null +++ b/packages/tools/e2e-tests/playwright.tools.config.ts @@ -0,0 +1,25 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { baseConfig } from './playwright.base.config'; + +const config: PlaywrightTestConfig = { + ...baseConfig, + webServer: { + command: `pnpm --filter @kadena/tools dev`, + url: 'http://localhost:3000', + reuseExistingServer: process.env.CI === undefined, + env: { + FAUCET_PUBLIC_KEY: + '782127638ab9cc8fa8598ff0120464ceef6f367ddcd616b47afffbdb175dcc5e', + FAUCET_PRIVATE_KEY: + '93fd78bd1e79a3b593d4732b76050b418aeefa5e4e6ea80f351b4c3a5b0dd19f', + }, + }, + projects: [ + { + name: 'tools', + testDir: 'src/tests/tools-app/', + }, + ], +}; + +export default config; diff --git a/packages/tools/e2e-tests/src/helpers/cookie.helper.ts b/packages/tools/e2e-tests/src/helpers/cookie.helper.ts new file mode 100644 index 0000000000..5bd16c16a3 --- /dev/null +++ b/packages/tools/e2e-tests/src/helpers/cookie.helper.ts @@ -0,0 +1,21 @@ +import type { Locator, Page } from '@playwright/test'; + +export default class CookieHelper { + private readonly _page: Page; + private _consentBar: Locator; + private _acceptButton: Locator; + + public constructor(page: Page) { + this._page = page; + this._consentBar = this._page.getByRole('region', { + name: 'Cookie Consent', + }); + this._acceptButton = this._consentBar.getByRole('button', { + name: 'Accept', + }); + } + + public async acceptCookies(): Promise { + await this._acceptButton.click(); + } +} diff --git a/packages/tools/e2e-tests/src/helpers/markdown.helper.ts b/packages/tools/e2e-tests/src/helpers/markdown.helper.ts new file mode 100644 index 0000000000..bc9c33b5a4 --- /dev/null +++ b/packages/tools/e2e-tests/src/helpers/markdown.helper.ts @@ -0,0 +1,36 @@ +const parseMD = require('parse-md').default; +import fs from 'fs'; + +export async function extractMetadataFromMarkdown( + parentPath: string, + childPath?: string, + grandChildPath?: string, +): Promise { + const metadata: IMetadata[] = []; + + const parentFile = fs.readFileSync(parentPath, 'utf8'); + const parent = parseMD(parentFile); + metadata.push(parent.metadata); + + if (childPath !== undefined) { + const childFile = fs.readFileSync(childPath, 'utf8'); + const child = parseMD(childFile); + metadata.push(child.metadata); + } + + if (grandChildPath !== undefined) { + const grandChildFile = fs.readFileSync(grandChildPath, 'utf8'); + const grandChild = parseMD(grandChildFile); + metadata.push(grandChild.metadata); + } + return metadata; +} + +export interface IMetadata { + title: string; + description: string; + menu: string; + label: string; + order: number; + layout: 'full'; +} diff --git a/packages/tools/e2e-tests/src/helpers/menu.helper.ts b/packages/tools/e2e-tests/src/helpers/menu.helper.ts new file mode 100644 index 0000000000..0b04ef1de8 --- /dev/null +++ b/packages/tools/e2e-tests/src/helpers/menu.helper.ts @@ -0,0 +1,33 @@ +import type { Locator, Page } from '@playwright/test'; +import { expect } from '@playwright/test'; + +export default class MenuHelper { + private readonly _page: Page; + private _levelTwo: Locator; + private _levelOne: Locator; + + public constructor(page: Page) { + this._page = page; + this._levelOne = this._page.locator( + '[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button', + ); + this._levelTwo = this._page.locator( + '[data-cy="sidemenu-submenu"] [data-testid="menuItem-2"] > button', + ); + } + + public async openCollapsedItems(): Promise { + const collapsedFirstLevelElements = await this._levelOne.all(); + + for (const collapsedElement of collapsedFirstLevelElements) { + await collapsedElement.click(); + await this._page.waitForTimeout(1000); + await expect(collapsedElement).toHaveAttribute('data-active', 'true'); + } + const collapsedSecondLevelElements = await this._levelTwo.all(); + for (const collapsedElement of collapsedSecondLevelElements) { + await collapsedElement.click(); + await expect(collapsedElement).toHaveAttribute('data-active', 'true'); + } + } +} diff --git a/packages/tools/e2e-tests/src/helpers/tree.helper.ts b/packages/tools/e2e-tests/src/helpers/tree.helper.ts new file mode 100644 index 0000000000..160e21f975 --- /dev/null +++ b/packages/tools/e2e-tests/src/helpers/tree.helper.ts @@ -0,0 +1,143 @@ +import type { Page } from '@playwright/test'; +import { expect } from '@playwright/test'; +import dirTree from 'directory-tree'; +import { extractMetadataFromMarkdown } from './markdown.helper'; + +export default class TreeHelper { + private readonly _page: Page; + + public constructor(page: Page) { + this._page = page; + } + + /** + This function reads the provided directory (based on a page) and validates if all markdown files are present in the menu. + @param {string} pageToCheck page to check, e.g. 'Kadena' + */ + public async validateTree(pageToCheck: string): Promise { + const directory = `../../apps/docs/src/pages/${pageToCheck}`; + const expectedTree = await dirTree(directory, { + extensions: /\.md/, + exclude: [/index.md/, /api/], + }); + const menuItems = expectedTree.children; + + if (expectedTree.children) { + for (const menuItem of menuItems!) { + // Validate top level menu items, without children + if (!menuItem.children) { + const metaData = await extractMetadataFromMarkdown(menuItem.path); + await this.validateParent(metaData[0].label); + } else { + // validate presence of first level children, this implicitly validates presence of top level menu items with children as well as the children. + for (const child of menuItem.children) { + if (!child.children) { + const metaData = await extractMetadataFromMarkdown( + `${menuItem.path}/index.md`, + child.path, + ); + await this.validateChild(metaData[0].menu, metaData[1].label); + } else { + // validate presence of first level children, this implicitly validates presence of top level menu items with children as well as the children. + for (const grandChild of child.children) { + const metaData = await extractMetadataFromMarkdown( + `${menuItem.path}/index.md`, + `${child.path}/index.md`, + grandChild.path, + ); + await this.validateGrandChild( + metaData[0].menu, + metaData[1].menu, + metaData[2].label, + ); + } + } + } + } + } + } + } + + /** + This function validates presence of parent items in the menu. + @param {string} label of the menu item to validate + */ + public async validateParent(label: string): Promise { + await expect( + this._page.locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > a:text-is("${label}")`, + ), + `Expected ${label} to be visible on level 1 in the menu.`, + ).toBeVisible(); + } + + /** + This function validates presence of a child item in the menu. + @param {string} parentLabel of the parent menu item + @param {string} childLabel of the menu item to validate + */ + public async validateChild( + parentMenu: string, + childLabel: string, + ): Promise { + // open parent menu first + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}")`, + ) + .click(); + await expect( + this._page.locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}") + ul [data-testid="menuItem-2"] > a:text-is("${childLabel}")`, + ), + `Expected ${childLabel} to be visible on level 2 in the menu.`, + ).toBeVisible(); + // then close parent menu again + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}")`, + ) + .click(); + } + + /** + This function validates presence of a grandchild item in the menu. + @param {string} parentMenu of the parent menu item + @param {string} childMenu of the child menu item + @param {string} grandChildLabel of the menu item to validate + */ + public async validateGrandChild( + parentMenu: string, + childMenu: string, + grandChildLabel: string, + ): Promise { + // open parent and child menu first + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}")`, + ) + .click(); + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}") + ul [data-testid="menuItem-2"] > button:text-is("${childMenu}")`, + ) + .click(); + await expect( + this._page.locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}") + ul [data-testid="menuItem-2"] > button:text-is("${childMenu}") + ul [data-testid="menuItem-3"] > a:text-is("${grandChildLabel}")`, + ), + `Expected ${grandChildLabel} to be visible on level 3 in the menu.`, + ).toBeVisible(); + // Close parent and child menu + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}")`, + ) + .click(); + await this._page + .locator( + `[data-cy="sidemenu-submenu"] [data-testid="menuItem-1"] > button:text-is("${parentMenu}") + ul [data-testid="menuItem-2"] > button:text-is("${childMenu}")`, + ) + .click(); + } +} diff --git a/packages/tools/e2e-tests/src/page-objects/tools-app/components/aside.component.ts b/packages/tools/e2e-tests/src/page-objects/tools-app/components/aside.component.ts index cbf18367e1..e5ede3aea9 100644 --- a/packages/tools/e2e-tests/src/page-objects/tools-app/components/aside.component.ts +++ b/packages/tools/e2e-tests/src/page-objects/tools-app/components/aside.component.ts @@ -8,6 +8,6 @@ export class AsideComponent { } public async navigateTo(ariaLabel: string): Promise { - await this._page.getByRole('button', { name: ariaLabel }).click(); + await this._page.getByRole('link', { name: ariaLabel }).click(); } } diff --git a/packages/tools/e2e-tests/src/page-objects/tools-app/pages/faucet.page.ts b/packages/tools/e2e-tests/src/page-objects/tools-app/pages/faucet.page.ts index df13e560f5..053c4627e4 100644 --- a/packages/tools/e2e-tests/src/page-objects/tools-app/pages/faucet.page.ts +++ b/packages/tools/e2e-tests/src/page-objects/tools-app/pages/faucet.page.ts @@ -1,23 +1,24 @@ import type { Page } from '@playwright/test'; import { CardComponent } from '../../react-ui/card.component'; import { NotificationContainerComponent } from '../../react-ui/notificationContainer.component'; - +import { AsideComponent } from '../components/aside.component'; export class FaucetPage { private readonly _page: Page; private _card: CardComponent; public notification: NotificationContainerComponent; + public asidePanel: AsideComponent; public constructor(page: Page) { this._page = page; this._card = new CardComponent(this._page); this.notification = new NotificationContainerComponent(this._page); + this.asidePanel = new AsideComponent(this._page); } public async fundExistingAccount( account: string, chainId: string, ): Promise { - await this._page.getByRole('link', { name: ' this page' }).click(); await this._card.setValueForTextbox( 'The account name to fund coins to', account, diff --git a/packages/tools/e2e-tests/src/tests/docs-app/page-crawler.spec.ts b/packages/tools/e2e-tests/src/tests/docs-app/page-crawler.spec.ts new file mode 100644 index 0000000000..b0e8d6f0f4 --- /dev/null +++ b/packages/tools/e2e-tests/src/tests/docs-app/page-crawler.spec.ts @@ -0,0 +1,28 @@ +/* eslint-disable @kadena-dev/no-eslint-disable */ +/* eslint-disable playwright/expect-expect */ +// The expect is performed by validateTree(), so the test does not need one. +import { test } from '@playwright/test'; +import CookieHelper from '../../helpers/cookie.helper'; +import TreeHelper from '../../helpers/tree.helper'; + +const pages = [ + 'kadena', + 'build', + 'pact', + 'chainweb', + 'marmalade', + 'contribute', +]; + +for (const pageToCheck of pages) { + test(`Page: ${pageToCheck} - All Markdown files should be present in the menu`, async ({ + page, + }) => { + const treeHelper = new TreeHelper(page); + const cookieHelper = new CookieHelper(page); + + await page.goto(pageToCheck); + await cookieHelper.acceptCookies(); + await treeHelper.validateTree(pageToCheck); + }); +} diff --git a/packages/tools/e2e-tests/src/tests/tools-app/faucet.spec.ts b/packages/tools/e2e-tests/src/tests/tools-app/faucet.spec.ts index 3d68427713..cf9dfb5a85 100644 --- a/packages/tools/e2e-tests/src/tests/tools-app/faucet.spec.ts +++ b/packages/tools/e2e-tests/src/tests/tools-app/faucet.spec.ts @@ -13,6 +13,7 @@ test('Fund existing account @mocks', async ({ page, toolsApp, mockHelper }) => { await test.step('Fund account on chain 0.', async () => { await mockHelper.mockResponse('**/send', sendMocks); + await toolsApp.faucetPage.asidePanel.navigateTo('Fund Existing Account'); await toolsApp.faucetPage.fundExistingAccount(accountsData.publicKey, '0'); await mockHelper.mockResponse('**/poll', pollInProgress); diff --git a/packages/tools/e2e-tests/tsconfig.json b/packages/tools/e2e-tests/tsconfig.json index 54d287b65c..9f4c7c2b4c 100644 --- a/packages/tools/e2e-tests/tsconfig.json +++ b/packages/tools/e2e-tests/tsconfig.json @@ -1,17 +1,8 @@ { "extends": "./node_modules/@kadena-dev/shared-config/tsconfig-base.json", "compilerOptions": { - "types": ["node"], - "target": "ES2020", - "skipLibCheck": true, - "noEmit": true, - "incremental": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "declaration": false, // fixes pnpm issue: https://github.com/microsoft/TypeScript/issues/42873 - "declarationMap": false, - "jsx": "preserve", - "allowJs": true - } + "rootDir": ".", + "types": ["node"] + }, + "include": ["**/*.ts", "/**/*.tsx"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 438fd6341f..7eaed42426 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -159,9 +159,6 @@ importers: '@percy/cli': specifier: ~1.24.0 version: 1.24.2 - '@percy/cypress': - specifier: ~3.1.2 - version: 3.1.2(cypress@12.12.0) '@rushstack/eslint-config': specifier: ~3.3.0 version: 3.3.0(eslint@8.45.0)(typescript@5.2.2) @@ -231,9 +228,6 @@ importers: chromatic: specifier: 6.20.0 version: 6.20.0 - cypress: - specifier: ~12.12.0 - version: 12.12.0 dotenv: specifier: ~16.0.3 version: 16.0.3 @@ -1929,20 +1923,26 @@ importers: specifier: workspace:* version: link:../shared-config '@playwright/test': - specifier: ^1.39.0 - version: 1.39.0 + specifier: ^1.40.1 + version: 1.40.1 '@rushstack/eslint-config': specifier: ~3.3.0 version: 3.3.0(eslint@8.45.0)(typescript@5.2.2) '@types/node': specifier: ^18.17.14 version: 18.17.14 + directory-tree: + specifier: 3.5.1 + version: 3.5.1 eslint: specifier: ^8.45.0 version: 8.45.0 eslint-plugin-playwright: specifier: 0.16.0 version: 0.16.0(eslint@8.45.0) + parse-md: + specifier: 2.0.5 + version: 2.0.5 prettier: specifier: ~3.0.3 version: 3.0.3 @@ -4163,39 +4163,6 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@cypress/request@2.88.12: - resolution: {integrity: sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==} - engines: {node: '>= 6'} - dependencies: - aws-sign2: 0.7.0 - aws4: 1.12.0 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - http-signature: 1.3.6 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.10.4 - safe-buffer: 5.2.1 - tough-cookie: 4.1.3 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - dev: true - - /@cypress/xvfb@1.2.4(supports-color@8.1.1): - resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - dependencies: - debug: 3.2.7(supports-color@8.1.1) - lodash.once: 4.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@design-sync/cli@0.11.1(prettier@3.0.3): resolution: {integrity: sha512-e5SzZL+qI61zT1xN/bbsdqv6h5quZtr6y9Yel5QgRY+ayJolAZBU1Gxoe4qRQc5tKpnCl/frrPmCCpM1fKQx7A==} hasBin: true @@ -6608,15 +6575,6 @@ packages: - utf-8-validate dev: true - /@percy/cypress@3.1.2(cypress@12.12.0): - resolution: {integrity: sha512-JXrGDZbqwkzQd2h5T5D7PvqoucNaiMh4ChPp8cLQiEtRuLHta9nf1lEuXH+jnatGL2j+3jJFIHJ0L7XrgVnvQA==} - peerDependencies: - cypress: '>=3' - dependencies: - '@percy/sdk-utils': 1.27.4 - cypress: 12.12.0 - dev: true - /@percy/dom@1.24.2: resolution: {integrity: sha512-C5nRMpHNGKS8xPflmYJCO2x6870wiR7TagMx+KOiIHfMEx/4LZhwPP4dkVS4WGeCfcKHOhi8BkJnhuSbL7WWDw==} dev: true @@ -6631,11 +6589,6 @@ packages: engines: {node: '>=14'} dev: true - /@percy/sdk-utils@1.27.4: - resolution: {integrity: sha512-vhPcdtmJlvTYJ5VOqiVzo02ujdtBFNw1/Bj+2ybiZgn7PkCDPFcITfXoWWPea319EIibGC4ZHjWHctRBgtW/tQ==} - engines: {node: '>=14'} - dev: true - /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -6652,12 +6605,12 @@ packages: picocolors: 1.0.0 tslib: 2.6.2 - /@playwright/test@1.39.0: - resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==} + /@playwright/test@1.40.1: + resolution: {integrity: sha512-EaaawMTOeEItCRvfmkI9v6rBkF1svM8wjl/YPRrg2N2Wmp+4qJYkWtJsbew1szfKKDm6fPLy4YAanBhIlf9dWw==} engines: {node: '>=16'} hasBin: true dependencies: - playwright: 1.39.0 + playwright: 1.40.1 dev: true /@pmmmwh/react-refresh-webpack-plugin@0.5.11(react-refresh@0.11.0)(webpack@5.88.2): @@ -11368,6 +11321,7 @@ packages: /@types/node@14.18.63: resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + dev: false /@types/node@16.18.48: resolution: {integrity: sha512-mlaecDKQ7rIZrYD7iiKNdzFb6e/qD5I9U1rAhq+Fd+DWvYVs+G2kv74UFHmSOlg5+i/vF3XxuR522V4u8BqO+Q==} @@ -11482,14 +11436,6 @@ packages: '@types/node': 18.17.14 dev: true - /@types/sinonjs__fake-timers@8.1.1: - resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} - dev: true - - /@types/sizzle@2.3.8: - resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} - dev: true - /@types/statuses@2.0.3: resolution: {integrity: sha512-NwCYScf83RIwCyi5/9cXocrJB//xrqMh5PMw3mYTSFGaI3DuVjBLfO/PCk7QVAC3Da8b9NjxNmTO9Aj9T3rl/Q==} dev: true @@ -13346,6 +13292,16 @@ packages: resolution: {integrity: sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==} dev: true + /array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + dev: true + + /array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + dev: true + /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: @@ -13458,12 +13414,6 @@ packages: /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - /asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - dependencies: - safer-buffer: 2.1.2 - dev: true - /asn1js@3.0.5: resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} engines: {node: '>=12.0.0'} @@ -13473,11 +13423,6 @@ packages: tslib: 2.6.2 dev: true - /assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - dev: true - /assert@2.0.0: resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} dependencies: @@ -13534,11 +13479,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -13614,14 +13554,6 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - /aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - dev: true - - /aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} - dev: true - /axe-core@4.7.2: resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} engines: {node: '>=4'} @@ -13813,12 +13745,6 @@ packages: engines: {node: '>=6.0.0'} dev: false - /bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - dependencies: - tweetnacl: 0.14.5 - dev: true - /before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: true @@ -13873,10 +13799,6 @@ packages: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} dev: false - /blob-util@2.0.2: - resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} - dev: true - /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -14085,11 +14007,6 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - /cachedir@2.4.0: - resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} - engines: {node: '>=6'} - dev: true - /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -14184,10 +14101,6 @@ packages: engines: {node: '>=4'} dev: true - /caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - /catharsis@0.9.0: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} @@ -14617,6 +14530,26 @@ packages: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false + /command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true + + /command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true + /commander@11.0.0: resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} engines: {node: '>=16'} @@ -14859,10 +14792,6 @@ packages: resolution: {integrity: sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==} requiresBuild: true - /core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - dev: true - /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -15089,56 +15018,6 @@ packages: array-find-index: 1.0.2 dev: false - /cypress@12.12.0: - resolution: {integrity: sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw==} - engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0} - hasBin: true - requiresBuild: true - dependencies: - '@cypress/request': 2.88.12 - '@cypress/xvfb': 1.2.4(supports-color@8.1.1) - '@types/node': 14.18.63 - '@types/sinonjs__fake-timers': 8.1.1 - '@types/sizzle': 2.3.8 - arch: 2.2.0 - blob-util: 2.0.2 - bluebird: 3.7.2 - buffer: 5.7.1 - cachedir: 2.4.0 - chalk: 4.1.2 - check-more-types: 2.24.0 - cli-cursor: 3.1.0 - cli-table3: 0.6.3 - commander: 6.2.1 - common-tags: 1.8.2 - dayjs: 1.11.10 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - eventemitter2: 6.4.7 - execa: 4.1.0 - executable: 4.1.1 - extract-zip: 2.0.1(supports-color@8.1.1) - figures: 3.2.0 - fs-extra: 9.1.0 - getos: 3.2.1 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - lazy-ass: 1.6.0 - listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.17.21 - log-symbols: 4.1.0 - minimist: 1.2.8 - ospath: 1.2.2 - pretty-bytes: 5.6.0 - proxy-from-env: 1.0.0 - request-progress: 3.0.0 - semver: 7.5.4 - supports-color: 8.1.1 - tmp: 0.2.1 - untildify: 4.0.0 - yauzl: 2.10.0 - dev: true - /d@1.0.1: resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} dependencies: @@ -15149,13 +15028,6 @@ packages: /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - /dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - dev: true - /data-uri-to-buffer@3.0.1: resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} engines: {node: '>= 6'} @@ -15191,10 +15063,6 @@ packages: time-zone: 1.0.0 dev: false - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: true - /debounce@1.2.1: resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} dev: true @@ -15210,7 +15078,7 @@ packages: ms: 2.0.0 dev: true - /debug@3.2.7(supports-color@8.1.1): + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -15219,7 +15087,6 @@ packages: optional: true dependencies: ms: 2.1.3 - supports-color: 8.1.1 /debug@4.3.4(supports-color@5.5.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -15233,19 +15100,6 @@ packages: ms: 2.1.2 supports-color: 5.5.0 - /debug@4.3.4(supports-color@8.1.1): - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -15528,6 +15382,15 @@ packages: dependencies: path-type: 4.0.0 + /directory-tree@3.5.1: + resolution: {integrity: sha512-HqjZ49fDzUnKYUhHxVw9eKBqbQ+lL0v4kSBInlDlaktmLtGoV9tC54a6A0ZfYeIrkMHWTE6MwwmUXP477+UEKQ==} + engines: {node: '>=10.0'} + hasBin: true + dependencies: + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + dev: true + /discontinuous-range@1.0.0: resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} dev: false @@ -15689,13 +15552,6 @@ packages: wcwidth: 1.0.1 dev: true - /ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - dev: true - /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: @@ -16101,7 +15957,7 @@ packages: /eslint-import-resolver-node@0.3.7: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 is-core-module: 2.13.0 resolve: 1.22.4 transitivePeerDependencies: @@ -16222,7 +16078,7 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.23.0(eslint@8.45.0)(typescript@5.2.2) - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.23.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) @@ -16251,7 +16107,7 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.59.11(eslint@8.45.0)(typescript@5.2.2) - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.11)(eslint-plugin-import@2.27.5)(eslint@8.45.0) @@ -16281,7 +16137,7 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.2.2) - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.27.5)(eslint@8.45.0) @@ -16302,7 +16158,7 @@ packages: array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 @@ -16334,7 +16190,7 @@ packages: array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 @@ -16367,7 +16223,7 @@ packages: array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.45.0 eslint-import-resolver-node: 0.3.7 @@ -16906,10 +16762,6 @@ packages: engines: {node: '>=6'} dev: false - /eventemitter2@6.4.7: - resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} - dev: true - /eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} dev: false @@ -16940,21 +16792,6 @@ packages: strip-eof: 1.0.0 dev: true - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -16998,13 +16835,6 @@ packages: strip-final-newline: 3.0.0 dev: true - /executable@4.1.1: - resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} - engines: {node: '>=4'} - dependencies: - pify: 2.3.0 - dev: true - /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -17096,25 +16926,6 @@ packages: - supports-color dev: true - /extract-zip@2.0.1(supports-color@8.1.1): - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: 4.3.4(supports-color@8.1.1) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - - /extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - dev: true - /fast-check@3.12.1: resolution: {integrity: sha512-aRN6WrO+q3TZV8CjXnpebx9bTHrpYIOVi6v3ttxciZiWqS739yy8b1oVx+qNEyV1b8RdVjlp/+miTY6yAp90HA==} engines: {node: '>=8.0.0'} @@ -17376,6 +17187,13 @@ packages: pkg-dir: 7.0.0 dev: true + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + dev: true + /find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -17488,10 +17306,6 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - dev: true - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.2.2)(webpack@5.88.2): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} @@ -17515,15 +17329,6 @@ packages: webpack: 5.88.2(@swc/core@1.3.80)(esbuild@0.18.20) dev: true - /form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - /form-data@2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} engines: {node: '>= 0.12'} @@ -17637,16 +17442,6 @@ packages: universalify: 0.1.2 dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} @@ -17828,18 +17623,6 @@ packages: resolve-pkg-maps: 1.0.0 dev: true - /getos@3.2.1: - resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - dependencies: - async: 3.2.4 - dev: true - - /getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - dependencies: - assert-plus: 1.0.0 - dev: true - /giget@1.1.3: resolution: {integrity: sha512-zHuCeqtfgqgDwvXlR84UNgnJDuUHQcNI5OqWqFxxuk2BshuKbYhJWdxBsEo4PvKqoGh23lUAIvBNpChMLv7/9Q==} hasBin: true @@ -17947,13 +17730,6 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - dependencies: - ini: 2.0.0 - dev: true - /global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} dependencies: @@ -18516,15 +18292,6 @@ packages: - supports-color dev: true - /http-signature@1.3.6: - resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} - engines: {node: '>=0.10'} - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - dev: true - /http2-client@1.3.5: resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==} dev: false @@ -18562,11 +18329,6 @@ packages: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} dev: true - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -18702,11 +18464,6 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: true - /ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - dev: true - /ini@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18996,14 +18753,6 @@ packages: dependencies: is-docker: 3.0.0 - /is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - dev: true - /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -19269,10 +19018,6 @@ packages: ws: 8.15.1 dev: true - /isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - dev: true - /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} @@ -19476,10 +19221,6 @@ packages: xmlcreate: 2.0.4 dev: false - /jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - dev: true - /jscodeshift@0.14.0(@babel/preset-env@7.22.9): resolution: {integrity: sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==} hasBin: true @@ -19612,10 +19353,6 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - dev: true - /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -19678,16 +19415,6 @@ packages: engines: {node: '>=10.0'} dev: true - /jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - dev: true - /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -19851,26 +19578,6 @@ packages: uc.micro: 1.0.6 dev: false - /listr2@3.14.0(enquirer@2.4.1): - resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} - engines: {node: '>=10.0.0'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.20 - enquirer: 2.4.1 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.8.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - /listr2@4.0.5: resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} engines: {node: '>=12'} @@ -19993,7 +19700,6 @@ packages: /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false /lodash.curry@4.1.1: resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} @@ -20024,10 +19730,6 @@ packages: resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} dev: false - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: true - /lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true @@ -22344,10 +22046,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /ospath@1.2.2: - resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} - dev: true - /outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: true @@ -22536,6 +22234,12 @@ packages: type-fest: 3.13.1 dev: false + /parse-md@2.0.5: + resolution: {integrity: sha512-7ZhRqwFRTAXyr/PcXSafJpx3g7ZUs5vPvoYww4H4YJuDFDK5LLvHGhP13Kp5d0tAHHxIBITERToBS90YWN0/VQ==} + dependencies: + js-yaml: 3.14.1 + dev: true + /parse-ms@3.0.0: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} @@ -22717,10 +22421,6 @@ packages: resolution: {integrity: sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==} dev: false - /performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: true - /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: @@ -22852,18 +22552,18 @@ packages: find-up: 3.0.0 dev: true - /playwright-core@1.39.0: - resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==} + /playwright-core@1.40.1: + resolution: {integrity: sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.39.0: - resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==} + /playwright@1.40.1: + resolution: {integrity: sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==} engines: {node: '>=16'} hasBin: true dependencies: - playwright-core: 1.39.0 + playwright-core: 1.40.1 optionalDependencies: fsevents: 2.3.2 dev: true @@ -23088,11 +22788,6 @@ packages: engines: {node: '>=14'} hasBin: true - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - /pretty-error@4.0.0: resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} dependencies: @@ -23268,10 +22963,6 @@ packages: resolution: {integrity: sha512-oyfc0Tx87Cpwva5ZXezSp5V9vht1c7dZBhvuV/y3ctkgMVUmiAGDVeeB0dKhGSyT0v1ZTEQYpe/RXlBVBNuCLA==} dev: false - /proxy-from-env@1.0.0: - resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} - dev: true - /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true @@ -23371,13 +23062,6 @@ packages: yargs: 15.4.1 dev: false - /qs@6.10.4: - resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -24048,6 +23732,11 @@ packages: - webpack dev: false + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true + /reftools@1.1.9: resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==} dev: false @@ -24355,12 +24044,6 @@ packages: strip-ansi: 6.0.1 dev: true - /request-progress@3.0.0: - resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} - dependencies: - throttleit: 1.0.1 - dev: true - /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -25133,22 +24816,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - dev: true - /ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -25582,7 +25249,7 @@ packages: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 extend: 3.0.2 form-data: 2.5.1 formidable: 1.2.6 @@ -25767,6 +25434,16 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: false + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + dev: true + /table@6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -25951,10 +25628,6 @@ packages: engines: {node: '>=10'} dev: false - /throttleit@1.0.1: - resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} - dev: true - /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: @@ -26019,6 +25692,7 @@ packages: engines: {node: '>=8.17.0'} dependencies: rimraf: 3.0.2 + dev: false /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -26278,12 +25952,6 @@ packages: yargs: 17.7.2 dev: true - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /turbo-darwin-64@1.10.16: resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] @@ -26344,10 +26012,6 @@ packages: turbo-windows-arm64: 1.10.16 dev: true - /tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - dev: true - /tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} dev: false @@ -26503,6 +26167,16 @@ packages: engines: {node: '>=14.17'} hasBin: true + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true + + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true + /ua-parser-js@1.0.37: resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} dev: true @@ -26969,11 +26643,6 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - /uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true @@ -27054,15 +26723,6 @@ packages: engines: {node: '>= 0.8'} dev: true - /verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - dev: true - /version-selector-type@3.0.0: resolution: {integrity: sha512-PSvMIZS7C1MuVNBXl/CDG2pZq8EXy/NW2dHIdm3bVP5N0PC8utDK8ttXLXj44Gn3J0lQE3U7Mpm1estAOd+eiA==} engines: {node: '>=10.13'} @@ -27849,6 +27509,14 @@ packages: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + dev: true + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'}