diff --git a/.eslintignore b/.eslintignore index 80f8414..2c62716 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,7 +3,7 @@ static/* dist/* @types/* .eslintrc.cjs -integration-tests/* +e2e-tests/* commitlint.config.js **.config.js config/* diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 0fb3bf7..466e4f1 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -31,8 +31,12 @@ jobs: cache: 'yarn' - name: Install Dependencies 🥁 - run: yarn install --frozen-lockfile - + run: | + yarn install --frozen-lockfile + cd e2e-tests + yarn install + cd .. + - name: Lint ✅ run: yarn lint diff --git a/e2e-tests/.dockerignore b/e2e-tests/.dockerignore new file mode 100644 index 0000000..8e0bf91 --- /dev/null +++ b/e2e-tests/.dockerignore @@ -0,0 +1,2 @@ +cypress/ +node_modules \ No newline at end of file diff --git a/e2e-tests/.eslintrc.cjs b/e2e-tests/.eslintrc.cjs new file mode 100644 index 0000000..71afac9 --- /dev/null +++ b/e2e-tests/.eslintrc.cjs @@ -0,0 +1,39 @@ +module.exports = { + env: { + "cypress/globals": true, + "node": true + }, + extends: [ + "../.eslintrc.cjs", + "plugin:cypress/recommended", + "plugin:cypress/recommended" + ], + plugins: [ + "cypress" + ], + rules: { + "no-console": "off", + "no-namespace": "off", + "no-redeclare": "off", + "promise/catch-or-return": "off", + "promise/no-nesting": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "cypress/no-unnecessary-waiting": "off" + }, + settings: { + "import/resolver": { + "node": { + "extensions": [ + ".js", + ".jsx", + ".ts", + ".tsx" + ], + "moduleDirectory": [ + "node_modules", + "e2e-tests/" + ] + } + } + } +}; \ No newline at end of file diff --git a/e2e-tests/.gitignore b/e2e-tests/.gitignore new file mode 100644 index 0000000..8e0bf91 --- /dev/null +++ b/e2e-tests/.gitignore @@ -0,0 +1,2 @@ +cypress/ +node_modules \ No newline at end of file diff --git a/e2e-tests/Dockerfile b/e2e-tests/Dockerfile new file mode 100644 index 0000000..2a58dd3 --- /dev/null +++ b/e2e-tests/Dockerfile @@ -0,0 +1,26 @@ +FROM quay.io/hacdev/hac-tests:base + +RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" && \ + install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + +RUN wget "https://github.com/sigstore/cosign/releases/download/v2.0.0/cosign-linux-amd64" && \ + mv cosign-linux-amd64 /usr/local/bin/cosign && \ + chmod +x /usr/local/bin/cosign + +USER node:0 + +COPY --chown=node:root --chmod=775 . /tmp/e2e +RUN chmod -R 775 /tmp/e2e + +RUN cd /tmp/e2e && \ + umask 0002 && \ + npm i && \ + node_modules/.bin/cypress install && \ + mkdir -p /tmp/artifacts && \ + chmod -R a+rwx /tmp/artifacts ${CYPRESS_CACHE_FOLDER} + +WORKDIR /tmp/ +COPY --chown=node:root --chmod=775 entrypoint.sh /tmp/ + +ENTRYPOINT ["/tmp/entrypoint.sh"] +CMD [""] \ No newline at end of file diff --git a/e2e-tests/OWNERS b/e2e-tests/OWNERS new file mode 100644 index 0000000..176ed56 --- /dev/null +++ b/e2e-tests/OWNERS @@ -0,0 +1,6 @@ +reviewers: + - sahil143 + - Katka92 +approvers: + - sahil143 + - Katka92 diff --git a/e2e-tests/README.md b/e2e-tests/README.md new file mode 100644 index 0000000..4bea558 --- /dev/null +++ b/e2e-tests/README.md @@ -0,0 +1,149 @@ +# Konflux UI Tests +Functional tests using [Cypress](https://docs.cypress.io/guides/overview/why-cypress) + +## What can be found here +The important bits are as follows: + +| Path | Description | +| -- | -- | +| `cypress.config.ts` | cypress configuration file, contains all the environment and plugin setup | +| `support` | contains helper files for cypress, like hooks, custom commands, page objects or plugin integration | +| `tests` | the actual spec files reside here | +| `utils` | utilities for easier test development, from UI interaction tasks to network requests | +| `cypress` | test results, including screenshots, video recordings, HTML reports, xunit files, etc. | + +## Running the tests locally +Prerequisites: +* Nodejs (20+ version) +* Access (credentials) to Konflux staging instance + +Certain environment variables will need to be set up. The most convenient way is to export them from the CLI, in which case they need to be prefixed with `CYPRESS_`, e.g. `USERNAME` is set as `export CYPRESS_USERNAME=username`. Alternatively, they can be passed to cypress via `-e` flag, e.g `npx cypress run -e USERNAME=username`. + +Find the supported variables in the table below: +| Variable name | Description | Required | Default Value | +| -- | -- | -- | -- | +| `KONFLUX_BASE_URL` | The URL to the main page of RHTAP UI | Yes | 'https://prod.foo.redhat.com:1337/beta/hac/application-pipeline' | +| `USERNAME` | Username for SSO login | Yes | '' | +| `PASSWORD` | Password for SSO login | Yes | '' | +| `PR_CHECK` | Assume the test is a PR check, enable report portal, assume keycloak is used instead of RH-SSO | For PR checks | false | +| `PERIODIC_RUN` | Assume the test is a nightly run, keycloak is used instead of RH-SSO | For runs using ephemeral RHTAP environment | false | +| `REMOVE_APP_ON_FAIL` | Clean up applications from the cluster even if tests fail | No | false | +| `GH_TOKEN` | Github token for network requests | Yes | '' | +| | +| `RP_TOKEN` | Report portal token for PR checks | No | '' | +| `GH_PR_TITLE` | Report portal setup | No | '' | +| `GH_PR_LINK` | Report portal setup | No | '' | + +### Running from source +This is the recommended way when either developing tests, or a headed test runner is preferred. After running `yarn install` and setting the appropriate environment variables, use one of the following commands to run cypress. + +For the headed test runner: +``` +$ npx cypress open +``` +Select E2E testing and the browser of your choice (chrome is recommended though), then launch any spec by clicking it in the list, and watch as it runs. + +For headless execution: +``` +$ npx cypress run +``` +Runs all available specs, by default in the Electron browser. Flags that might come in handy are `-b` to specify the browser, or `-s` to filter spec files based on a glob pattern. For example, running the basic happy path spec in chrome: +``` +$ npx cypress run -b chrome -s 'tests/basic-happy-path*' +``` + +### Running using docker image +TBD - currently we don't have a docker image + + +## Tests on CI +TBD - CI setup is currently prepared. + + +## Reporting issues +If you find a problem with the tests, feel free to open an issue at the [Konflux-UI Jira project](https://issues.redhat.com/projects/KFLUXUI). You can set the label as `qe` to indicate it is a quality problem. + + \ No newline at end of file diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts new file mode 100644 index 0000000..955d8fa --- /dev/null +++ b/e2e-tests/cypress.config.ts @@ -0,0 +1,186 @@ +import { defineConfig } from 'cypress'; +import * as fs from 'fs-extra'; +import * as glob from 'glob'; +const { mergeLaunches } = require('@reportportal/agent-js-cypress/lib/mergeLaunches'); +const registerReportPortalPlugin = require('@reportportal/agent-js-cypress/lib/plugin'); +const { beforeRunHook, afterRunHook } = require('cypress-mochawesome-reporter/lib'); +function deleteLaunchFiles() { + const getLaunchTempFiles = () => { + return glob.sync('rplaunch*.tmp'); + }; + const deleteTempFile = (filename) => { + fs.unlinkSync(filename); + }; + const files = getLaunchTempFiles(); + files.forEach(deleteTempFile); +} + +export default defineConfig({ + defaultCommandTimeout: 40000, + execTimeout: 150000, + pageLoadTimeout: 90000, + requestTimeout: 15000, + responseTimeout: 15000, + animationDistanceThreshold: 20, + chromeWebSecurity: false, + viewportWidth: 1920, + viewportHeight: 1080, + reporter: 'cypress-multi-reporters', + reporterOptions: { + reporterEnabled: + 'cypress-mochawesome-reporter, spec, mocha-junit-reporter, @reportportal/agent-js-cypress', + mochaJunitReporterReporterOptions: { + mochaFile: 'cypress/junit-[hash].xml', + }, + reportportalAgentJsCypressReporterOptions: { + endpoint: 'https://reportportal-appstudio-qe.apps.ocp-c1.prod.psi.redhat.com/api/v1', + token: 'xxx', + launch: 'hac-dev-pr-check', + project: 'hac-dev', + description: 'Konflux UI e2e test suite', + debug: true, + isLaunchMergeRequired: true, + }, + cypressMochawesomeReporterReporterOptions: { + charts: true, + embeddedScreenshots: false, + ignoreVideos: true, + reportDir: 'cypress', + inlineAssets: true, + }, + }, + e2e: { + supportFile: 'support/commands/index.ts', + specPattern: 'tests/*.spec.ts', + testIsolation: false, + excludeSpecPattern: + process.env.CYPRESS_PERIODIC_RUN || process.env.GH_COMMENTBODY?.toLowerCase() === '[test]' + ? 'tests/*-private-git-*' // TODO: remove once https://issues.redhat.com/browse/RHTAPBUGS-111 is resolved + : 'tests/{advanced-happy-path*,private-basic*,*-private-git-*}', + setupNodeEvents(on, config) { + require('cypress-mochawesome-reporter/plugin')(on); + + const logOptions = { + outputRoot: `${config.projectRoot}/cypress`, + outputTarget: { + 'cypress-log.txt': 'txt', + }, + printLogsToFile: 'always', + }; + require('cypress-terminal-report/src/installLogsPrinter')(on, logOptions); + + on('task', { + log(message) { + // eslint-disable-next-line no-console + console.log(message); + return null; + }, + logTable(data) { + // eslint-disable-next-line no-console + console.table(data); + return null; + }, + readFileIfExists(filename: string) { + if (fs.existsSync(filename)) { + return fs.readFileSync(filename, 'utf8'); + } + return null; + }, + deleteFile(filename: string) { + if (fs.existsSync(filename)) { + fs.unlinkSync(filename); + } + return null; + }, + }); + + on('before:run', async (details) => { + // cypress-mochawesome-reporter + await beforeRunHook(details); + }); + + // workaround for report portal runs not finishing + on('after:run', async () => { + // cypress-mochawesome-reporter + await afterRunHook(); + + if (config.env.PR_CHECK === true) { + let retries = 10; + console.log('Wait for reportportal agent to finish...'); + while (glob.sync('rplaunchinprogress*.tmp').length > 0) { + if (retries < 1) { + console.log('reportportal agent timed out after 20s'); + return; + } + retries--; + await new Promise((res) => setTimeout(res, 2000)); + } + console.log('reportportal agent finished'); + + if ( + config.reporterOptions.reportportalAgentJsCypressReporterOptions.isLaunchMergeRequired + ) { + try { + console.log('Merging launches...'); + await mergeLaunches(config.reporterOptions.reportportalAgentJsCypressReporterOptions); + console.log('Launches successfully merged!'); + deleteLaunchFiles(); + } catch (mergeError: unknown) { + console.error(mergeError); + } + } + } + }); + + const defaultValues: { [key: string]: string | boolean } = { + KONFLUX_BASE_URL: 'https://prod.foo.redhat.com:1337/preview/application-pipeline', + USERNAME: '', + PASSWORD: '', + GH_USERNAME: 'hac-test', + GH_PASSWORD: '', + GH_TOKEN: '', + GH_SETUP_KEY: '', + KUBECONFIG: '~/.kube/appstudio-config', + CLEAN_NAMESPACE: 'false', + PR_CHECK: false, + PERIODIC_RUN: false, + resolution: 'high', + REMOVE_APP_ON_FAIL: false, + SNYK_TOKEN: '', + SSO_URL: 'https://sso.redhat.com/auth/', + }; + + for (const key in defaultValues) { + if (!config.env[key]) { + config.env[key] = defaultValues[key]; + } + } + + if (config.env.GH_TOKEN == '') { + throw new Error('GH_TOKEN variable needs to be set to run a test.'); + } + + config.env.HAC_WORKSPACE = config.env.USERNAME.toLowerCase(); + config.env.HAC_NAMESPACE = `${config.env.HAC_WORKSPACE}-tenant`; + + if ( + config.env.PR_CHECK === true && + config.reporterOptions.reportportalAgentJsCypressReporterOptions + ) { + config.reporterOptions.reportportalAgentJsCypressReporterOptions.token = + config.env.RP_TOKEN; + config.reporterOptions.reportportalAgentJsCypressReporterOptions.description = `${config.env.GH_PR_TITLE}\n${config.env.GH_PR_LINK}`; + registerReportPortalPlugin(on, config); + } else { + const reporters = (config.reporterOptions.reporterEnabled as string) + .split(',') + .filter((value) => { + return !value.includes('@reportportal/agent-js-cypress'); + }); + config.reporterOptions.reporterEnabled = reporters.join(','); + } + require('cypress-high-resolution')(on, config); + return config; + }, + }, +}); diff --git a/e2e-tests/delete-script.sh b/e2e-tests/delete-script.sh new file mode 100755 index 0000000..d68ce5d --- /dev/null +++ b/e2e-tests/delete-script.sh @@ -0,0 +1,14 @@ +#!/bin/bash +for value in $(oc get components -o name) +do + echo "Deleting $value" + oc delete $value +done + +for value in $(oc get applications -o name) +do + echo "Deleting $value" + oc delete $value +done + +echo "Done running the script" diff --git a/e2e-tests/entrypoint.sh b/e2e-tests/entrypoint.sh new file mode 100644 index 0000000..0fa8286 --- /dev/null +++ b/e2e-tests/entrypoint.sh @@ -0,0 +1,25 @@ +#!/bin/bash +args="-b chrome"; +for var in "$@" +do + args="$args $var" +done + +if [ -d "/e2e" ]; then + cd /e2e + npm i + npx cypress install + chmod -R a+rwx ../e2e +else + cd /tmp/e2e +fi + +npx cypress run $args + +if [ -d "/e2e/cypress" ]; then + cp -a /e2e/cypress/* /tmp/artifacts + chmod -R a+rwx /tmp/artifacts + chmod -R a+rwx /e2e/cypress +else + cp -a /tmp/e2e/cypress/* /tmp/artifacts +fi \ No newline at end of file diff --git a/e2e-tests/package.json b/e2e-tests/package.json new file mode 100644 index 0000000..61fa4b8 --- /dev/null +++ b/e2e-tests/package.json @@ -0,0 +1,33 @@ +{ + "name": "@konflux-ui/e2e-tests", + "version": "0.0.1", + "description": "Konflux UI Cypress tests", + "private": true, + "scripts": { + "clean-reports": "rm -rf cypress/", + "cy:run": "cypress run -b chrome", + "cy:open": "cypress open" + }, + "devDependencies": { + "@reportportal/agent-js-cypress": "^5.1.2", + "@types/fs-extra": "^9.0.13", + "@types/node": "^17.0.13", + "axe-core": "^4.4.2", + "cypress": "12.7.0", + "cypress-axe": "^1.4.0", + "cypress-high-resolution": "^1.0.0", + "cypress-mochawesome-reporter": "^3.4.0", + "cypress-multi-reporters": "^1.6.0", + "cypress-terminal-report": "^5.0.2", + "deepmerge": "^4.2.2", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-cypress": "^4.1.0", + "fs-extra": "^10.1.0", + "glob": "^9.3.0", + "mocha-junit-reporter": "^2.0.2", + "npm-run-all": "^4.1.5", + "otplib": "^12.0.1", + "prettier": "^3.4.2", + "typescript": "^4.9.5" + } +} diff --git a/e2e-tests/support/commands/a11y.ts b/e2e-tests/support/commands/a11y.ts new file mode 100644 index 0000000..2f53452 --- /dev/null +++ b/e2e-tests/support/commands/a11y.ts @@ -0,0 +1,44 @@ +import 'cypress-axe'; +import { Result } from 'axe-core'; + +export const a11yTestResults: a11yTestResultsType = { + numberViolations: 0, + numberChecks: 0, +}; + +const logA11yViolations = (violations: Result[], target: string) => { + const violationData = violations.map(({ id, impact, description, nodes }) => ({ + id, + impact, + description, + nodes: nodes.length, + })); + a11yTestResults.numberViolations += violations.length; + cy.task( + 'log', + `${violations.length} accessibility violation${violations.length === 1 ? '' : 's'} ${ + violations.length === 1 ? 'was' : 'were' + } detected ${target ? `for ${target}` : ''}`, + ); + cy.task('logTable', violationData); +}; + +// TODO: Enable errors on failure once HAC-1991 is done +Cypress.Commands.add('testA11y', (target: string, selector?: string) => { + cy.injectAxe(); + cy.configureAxe(); + a11yTestResults.numberChecks += 1; + cy.checkA11y( + selector, + { + includedImpacts: ['serious', 'critical'], + }, + (violations) => logA11yViolations(violations, target), + true, + ); +}); + +type a11yTestResultsType = { + numberViolations: number; + numberChecks: number; +}; diff --git a/e2e-tests/support/commands/hooks.ts b/e2e-tests/support/commands/hooks.ts new file mode 100644 index 0000000..372fb42 --- /dev/null +++ b/e2e-tests/support/commands/hooks.ts @@ -0,0 +1,29 @@ +import { Common } from '../../utils/Common'; +import { Login } from '../../utils/Login'; + +before(() => { + //Clear namespace before running the tests + Common.cleanNamespace(); + + const url = new URL(Cypress.env('KONFLUX_BASE_URL')); + cy.setCookie('notice_gdpr_prefs', '0,1,2:', { domain: url.hostname }); + cy.setCookie('cmapi_cookie_privacy', 'permit 1,2,3', { domain: url.hostname }); + cy.setCookie('notice_preferences', '2:', { domain: url.hostname }); + + // set local storage to avoid getting started modal + localStorage.setItem( + 'getting-started-modal', + JSON.stringify({ 'application-list-getting-started-modal': true }), + ); + + if (Cypress.env('PR_CHECK') || Cypress.env('PERIODIC_RUN')) { + Login.prCheckLogin(); + } else { + Login.login(); + } +}); + +after(() => { + //Clear namespace after running the tests + Common.cleanNamespace(); +}); diff --git a/e2e-tests/support/commands/index.ts b/e2e-tests/support/commands/index.ts new file mode 100644 index 0000000..55ef496 --- /dev/null +++ b/e2e-tests/support/commands/index.ts @@ -0,0 +1,30 @@ +// Include the cypress customized commands related files +import './hooks'; +import './a11y'; +import 'cypress-mochawesome-reporter/register'; +import { Result } from 'axe-core'; +import { initPerfMeasuring } from './perf'; + +declare global { + namespace Cypress { + interface Chainable { + logA11yViolations(violations: Result[], target: string): Chainable; + testA11y(target: string, selector?: string): Chainable; + perfGroupStart(groupName: string): void; + perfGroupEnd(groupName: string): void; + } + } +} + +// Handling errors from application +// eslint-disable-next-line no-unused-vars,@typescript-eslint/no-unused-vars +Cypress.on('uncaught:exception', (err) => { + return false; +}); + +// Add browser logs collector +const logOptions = { + enableExtendedCollector: true, +}; +require('cypress-terminal-report/src/installLogsCollector')(logOptions); +initPerfMeasuring('cypress/perfstats.json'); diff --git a/e2e-tests/support/commands/perf.ts b/e2e-tests/support/commands/perf.ts new file mode 100644 index 0000000..ca5167d --- /dev/null +++ b/e2e-tests/support/commands/perf.ts @@ -0,0 +1,78 @@ +interface CommandPerfStats { + name: string; + startTime: number; + endTime?: number; +} + +interface CommandPerfGroup { + name: string; + start: number; + end?: number; + duration?: number; + commands?: CommandPerfStats[]; +} + +let commands: CommandPerfStats[]; +let groups: CommandPerfGroup[]; +let fileName: string; + +export const initPerfMeasuring = (logFile: string) => { + commands = []; + groups = []; + fileName = logFile; + + Cypress.on('command:start', (command) => { + commands.push({ + name: command.attributes.name, + startTime: Date.now(), + }); + }); + + Cypress.on('command:end', (command) => { + const c = commands[commands.length - 1]; + if (c.name !== command.attributes.name) { + throw new Error('command does not match'); + } + c.endTime = Date.now(); + }); + + Cypress.Commands.add('perfGroupStart', (groupName: string) => { + if (Cypress.browser.isHeaded && !Cypress.env('perfmark')) { + Cypress.env('perfmark', true); + cy.task('deleteFile', fileName); + } + + groups.push({ + name: groupName, + start: Date.now(), + }); + }); + + Cypress.Commands.add('perfGroupEnd', (groupName: string) => { + const group = groups.find((value) => value.name === groupName); + if (group) { + group.end = Date.now(); + } + const groupCommands = commands.filter((value) => { + return value.startTime >= group.start && value.endTime <= group.end; + }); + group.duration = group.end - group.start; + group.commands = Cypress._.cloneDeep(groupCommands); + + cy.task('readFileIfExists', fileName).then((contents: string | null) => { + if (contents) { + const items = JSON.parse(contents); + if (!items.length) { + const temp = [items]; + temp.push(group); + cy.writeFile(fileName, temp); + } else { + items.push(group); + cy.writeFile(fileName, items); + } + } else { + cy.writeFile(fileName, [group]); + } + }); + }); +}; diff --git a/e2e-tests/support/constants/PageTitle.ts b/e2e-tests/support/constants/PageTitle.ts new file mode 100644 index 0000000..ed16ebf --- /dev/null +++ b/e2e-tests/support/constants/PageTitle.ts @@ -0,0 +1,18 @@ +export const pageTitles = { + applications: 'Applications', + createApp: 'Create an application', + sampleStart: 'Start with a sample', + reviewComponent: 'Review your new components', + deploymentSettings: 'Edit deployment settings', + getStartedPage: 'Get started with', +}; + +export enum NavItem { + overview = 'Overview', + applications = 'Applications', + secrets = 'Secrets', + releases = 'Releases', + userAcces = 'User Access', +} + +export const FULL_APPLICATION_TITLE = 'Konflux'; diff --git a/e2e-tests/support/constants/Units.ts b/e2e-tests/support/constants/Units.ts new file mode 100644 index 0000000..2686d7c --- /dev/null +++ b/e2e-tests/support/constants/Units.ts @@ -0,0 +1,9 @@ +export enum MemoryUnit { + megabyte = 'Mi', + gigabyte = 'Gi', +} + +export enum CPUUnit { + core = 'cores', + millicore = 'millicores', +} diff --git a/e2e-tests/support/pageObjects/atlas-po.ts b/e2e-tests/support/pageObjects/atlas-po.ts new file mode 100644 index 0000000..7f8e784 --- /dev/null +++ b/e2e-tests/support/pageObjects/atlas-po.ts @@ -0,0 +1,7 @@ +export const atlasPO = { + username: '#username', + password: '#password', + loginButton: '#submit', + headerTitle: '.pf-v5-c-page__main-section', + cardTitle: '.pf-v5-c-card__title-text', +}; diff --git a/e2e-tests/support/pageObjects/createApplication-po.ts b/e2e-tests/support/pageObjects/createApplication-po.ts new file mode 100644 index 0000000..74798fb --- /dev/null +++ b/e2e-tests/support/pageObjects/createApplication-po.ts @@ -0,0 +1,89 @@ +export const addComponentPagePO = { + samples: 'Start with a sample.', + addComponent: '[data-test="add-component"] > a', + enterSource: '[id="form-input-source-git-url-field"]', + verifiedSource: '[class="pf-v5-c-form-control pf-m-success"]', + gitOptions: 'Git options', + gitReference: '[data-test="git-reference"]', + contextDir: '[data-test="context-dir"]', + next: 'button[type=submit]', + cancel: 'button[type=reset]', + componentCard: '[data-ouia-component-type="PF5/Card"]', + toggleButton: '[id^="toggle"]', + username: '[data-test="auth-username"]', + token: '[data-test="auth-token"]', + authenticateButton: '[data-test="authenticate-token"]', + notValidatedMessage: 'Unable to access repository', + useTokenButton: 'Use a token instead', + privateInputId: '[id="form-checkbox-isPrivateRepo-field"]', +}; + +export const componentSamplesPagePO = { + grid: '.catalog-page__grid', + sample: (name: string) => `[data-test="${name}"]`, + import: (name: string) => `[data-test="import-${name}"]`, + nodejs: 'sample-Node', + python: 'sample-Python', + quarkus: 'sample-Quarkus', + spring: 'sample-Spring Boot', +}; + +export const createApplicationPagePO = { + applicationName: '[id="form-input-application-field"]', + next: 'button[type=submit]', + createApplication: 'Create application', + addComponentButton: 'Add a component', +}; + +export const ComponentsPagePO = { + appInput: '[data-test="app-name-field"] input', + create: 'button[type=submit]', + createText: 'Create application', + componentNameField: '[id="form-input-componentName-field"]', + checkIcon: '[data-test="check-icon"]', + closeIcon: '[data-test="close-icon"]', + showAdvancedSetting: 'Show advanced deployment options', + cpuInput: 'input[name*="cpuValue"]', + cpuPlusButton: 'button[data-ouia-component-id="OUIA-Generated-Button-control-2"]', + cpuMinusButton: 'button[data-ouia-component-id="OUIA-Generated-Button-control-1"]', + memoryInput: 'input[name*="memoryValue"]', + dropdown: 'button[data-test="dropdown-toggle"]', + replicaInput: 'input[id*="replicas-field"]', + nameInput: '[data-test="pairs-list-name"][value=""]', + valueInput: '[data-test="pairs-list-value"][value=""]', + addEnvVar: '[data-test="add-button"]', + loading: '[data-test="loading-indicator"]', + saveButton: '[data-test="submit-button"]', + editNameInput: '[data-test="editable-label-input"]', + customBuildPipelineRadioBtn: '[for*="defaultBuildPipeline"] .pf-v5-c-switch__toggle', + customBuildRequestedState: '[data-test="requested-state"]', + label: '[class="pf-v5-c-label__content"]', + customBuildPipelineModalCloseBtn: '[data-test="close-button custom-pipeline-modal"]', + dockerfileInput: '[id="form-input-source-git-dockerfileUrl-field"]', +}; + +export const applicationDetailPagePO = { + item: '[data-test="component-list-item-name"] > a > b', + componentBuildLog: (param: string) => `[data-test="view-build-logs-${param}"]`, + componentPodLog: (param: string) => `[data-test="view-pod-logs-${param}"]`, + deploymentSettings: '[data-test="Edit deployment settings"]', + detailsArrow: '[aria-label="Details"]', + cpuRamLabel: 'CPU / Memory', + replicaLabel: 'Instances', + route: (param: string) => `[data-test-id="${param}-route"]`, +}; + +export const componentsListPagePO = { + addComponent: '[pf-v5-c-button pf-m-primary]', + applicationName: 'pf-v5-c-title pf-m-4xl hacDev-page__heading', + items: '[pf-v5-c-data-list__item]', +}; + +export const buildLogModalContentPO = { + modal: 'div[data-ouia-component-type="PF5/ModalContent"]', + closeButton: '[aria-label="Close"]', + logText: '[class="logs__content"]', + logsTasklist: 'div[data-test="logs-tasklist"]', + failedPipelineRunLogs: 'div[class="pipeline-run-logs"] [class*="pf-m-danger"]', + podLogNavList: '[data-ouia-component-type="PF5/Nav"]', +}; diff --git a/e2e-tests/support/pageObjects/global-po.ts b/e2e-tests/support/pageObjects/global-po.ts new file mode 100644 index 0000000..aad6473 --- /dev/null +++ b/e2e-tests/support/pageObjects/global-po.ts @@ -0,0 +1,64 @@ +export const formPO = { + create: 'button[type=submit]', + cancel: '[data-test-id="reset-button"]', +}; +export const alert = '.pf-v5-c-alert'; +export const alertTitle = '.pf-v5-c-alert__title'; + +export const consentButton = '[id="truste-consent-button"]'; + +export const loginPO = { + usernameForm: '.pf-c-login__main', + username: '#rh-username-verification-form', + nextButton: '#login-show-step2', + passwordForm: '#login-show-step2', + password: '#rh-password-verification-form', + loginButton: '#rh-password-verification-submit-button', +}; + +export const kcLoginPO = { + username: '#username', + password: '#password', + loginButton: '#kc-login', +}; + +export const waits = { + loader: '.loader', + spinner: '.pf-v5-c-spinner', + gridPlaceholder: '.skeleton-catalog--tile', + tablePlaceholder: '.loading-skeleton--table', + viewPlaceholder: '[data-test="skeleton-detail-view"]', + linkPlaceholder: '.pf-v5-c-skeleton', +}; + +export const actions = { + kebabButton: '[data-test="kebab-button"]', + delete: '[data-test="Delete"]', + deleteApp: '[data-test="Delete application"]', + deleteComponent: '[data-test="Delete component"]', + deleteModalInput: 'input[name*="resourceName"]', + deleteModalButton: 'button[data-test="delete-resource"]', + editItem: '[data-test="Edit"]', +}; + +export const navigation = { + sideNavigation: `[id="page-sidebar"]`, + navigationItem: (link: string) => `[href*=${link}]`, +}; + +export const breadcrumb = { + breadcrumbLink: 'nav[data-ouia-component-type="PF5/Breadcrumb"]', +}; + +export const UIhelperPO = { + graphNode: 'g[data-kind="node"]', + pipelineStatusSuccess: 'g[class="pf-topology-pipelines__pill-status pf-m-success"]', + pipelineNode: 'g[class^="pf-topology__pipelines__task-node"]', + tabs: 'div[data-ouia-component-type="PF5/Tabs"] button span', + formGroup: 'div.pf-v5-c-form__group', + formGroupLabelText: 'div.pf-v5-c-form__group span.pf-v5-c-form__label-text', + listGroup_dt: 'div[class*="list__group"] dt', + pf5_button: '[data-ouia-component-type="PF5/Button"]', + tableRow: (tableAriaLabel: string) => `[aria-label="${tableAriaLabel}"] tr[role="row"]`, + dropdownToggle: 'button[data-ouia-component-type="PF5/DropdownToggle"]', +}; diff --git a/e2e-tests/support/pageObjects/pages-po.ts b/e2e-tests/support/pageObjects/pages-po.ts new file mode 100644 index 0000000..8e425fb --- /dev/null +++ b/e2e-tests/support/pageObjects/pages-po.ts @@ -0,0 +1,95 @@ +export const applicationsPagePO = { + appStatus: '[data-test="details__status"]', + formGroup: 'div[class="pf-v5-c-form__group"]', + secretKey: 'input[label="Key"]', + secretValue: 'textarea[id="value"]', +}; + +export const overviewTabPO = { + clickTab: '[data-test="app-details__tabItem overview"]', + goToComponents: '[data-test="go-to-components-tab"]', + addComponent: '[data-test="add-component"] > a', +}; + +export const activityTabPO = { + clickTab: '[data-test="app-details__tabItem activity"]', +}; + +export const componentsTabPO = { + clickTab: '[data-test="app-details__tabItem components"]', + addComponent: '[data-test="add-component-button"]', + componentListItem: (param: string) => `[data-test="${param}-component-list-item"]`, +}; + +export const latestCommitsTabPO = { + clickTab: '[data-test="activity__tabItem latest-commits"]', +}; + +export const pipelinerunsTabPO = { + clickTab: '[data-test="activity__tabItem pipelineruns"]', + + statusPO: '[data-test="pipelinerun-details status"]', + + clickTaskRunsTab: '[data-test="details__tabItem taskruns"]', + taskRunStatus: '[data-test="taskrun-status"]', + + downloadAllTaskLogsButton: 'Download all task logs', + relatedPipelinePopup: 'div[class="pf-v5-c-popover__content"]', + relatedPipelineCloseBtn: 'button[aria-label="Close"]', + + node: (nodeId) => `g[data-id="${nodeId}"]`, + logText: '[class="logs__content"]', + drawerPanel: 'div[class*="drawer__panel-main"]', + drawerClose: 'div[class="pf-v5-c-drawer__close"]', + listGroup: 'div[class$="list__group"]', + PF5TableRow: '[data-ouia-component-type="PF5/TableRow"]', + + ecResultSummary: 'div[data-test="result-summary"]', + ecSecurityRulesTableRow: 'tr[data-ouia-component-type="PF5/TableRow"]:not([hidden])', +}; + +export const integrationTestsTabPO = { + clickTab: '[data-test="app-details__tabItem integrationtests"]', + filterInputField: '[data-test="name-input-filter"]', + saveChangesButton: '[data-test="submit-button"]', +}; + +export const actionsDropdown = { + dropdown: '[data-test="details__actions"]', + itemAddComponent: '[data-test="add-component"]', + itemAddEnvironment: '[data-test="add-environment"]', + itemAddIntegrationTest: '[data-test="add-integration-tests"]', + itemDeleteApplication: '[data-test="delete-application"]', + itemLearningResources: '[data-test="learning-resources"]', +}; + +export const createBuildStepPO = { + mergePRButton: '[data-test="merge-button"]', + next: 'button[type=submit]', +}; + +export const addIntegrationTestStepPO = { + displayNameInput: '[data-test="display-name-input"]', + optionalreleaseCheckbox: '[data-test="optional-release-checkbox"]', + accessValidationMsg: 'div[class="pf-v5-c-form__helper-text"]', +}; + +export const environmentsPagePO = { + kubconfigTextArea: 'textarea[id="text-file-kubeconfig"]', + kubeconfigValidationMsg: 'div[class="pf-v5-c-form__helper-text"]', + envCard: '[data-ouia-component-type="PF5/Card"]', + label: 'div[class*="list__group"]', + kebabButton: 'button[data-test="kebab-button"]', + envDropdownDeleteBtn: 'li[data-test="Delete"]', + envDeleteBtn: 'button[data-test="delete-resource"]', + envCardConnectionLabel: 'div[class="pf-v5-c-card__title"] span[class="pf-v5-c-label__content"]', +}; + +export const getStartedPagePO = { + createAppButton: '[data-test="create-application"]', +}; + +export const componentDetailsPO = { + buildImage: '[data-test="build-container-image-test"] input', + route: '[data-test="environment-cell"] > div > a', +}; diff --git a/e2e-tests/support/pages/AbstractWizardPage.ts b/e2e-tests/support/pages/AbstractWizardPage.ts new file mode 100644 index 0000000..acf065a --- /dev/null +++ b/e2e-tests/support/pages/AbstractWizardPage.ts @@ -0,0 +1,11 @@ +import { formPO } from '../pageObjects/global-po'; + +export class AbstractWizardPage { + clickNext() { + cy.get(formPO.create).click(); + } + + clickCancel() { + cy.get(formPO.cancel).click(); + } +} diff --git a/e2e-tests/support/pages/AddComponentPage.ts b/e2e-tests/support/pages/AddComponentPage.ts new file mode 100644 index 0000000..3842332 --- /dev/null +++ b/e2e-tests/support/pages/AddComponentPage.ts @@ -0,0 +1,51 @@ +import { Common } from '../../utils/Common'; +import { pageTitles } from '../constants/PageTitle'; +import { addComponentPagePO } from '../pageObjects/createApplication-po'; +import { AbstractWizardPage } from './AbstractWizardPage'; + +export class AddComponentPage extends AbstractWizardPage { + setPrivate() { + cy.get(addComponentPagePO.privateInputId).check({ force: true }); + cy.get(addComponentPagePO.privateInputId).should('be.checked'); + } + waitUnableToAccess(timeoutDuration: number = 90000) { + cy.contains('div', addComponentPagePO.notValidatedMessage, { timeout: timeoutDuration }); + } + waitRepoValidated(timeoutDuration: number = 140000) { + cy.get(addComponentPagePO.verifiedSource, { timeout: timeoutDuration }).should('be.visible'); + } + + openSamplesPage() { + cy.contains(addComponentPagePO.samples).click(); + Common.waitForLoad(); + cy.testA11y(`${pageTitles.sampleStart} page`); + } + + setSource(source: string) { + cy.get(addComponentPagePO.enterSource).clear().type(source); + } + + setGitReference(gitReference: string) { + cy.get(addComponentPagePO.gitReference).clear().type(gitReference); + } + + setContextDir(contextDir: string) { + cy.get(addComponentPagePO.contextDir).clear().type(contextDir); + } + + submit() { + cy.contains('button', 'Import code').should('be.enabled').invoke('click'); + } + + clickCancel() { + cy.get(addComponentPagePO.cancel).trigger('click'); + } + + loginByToken(username: string, token: string) { + cy.contains('button', addComponentPagePO.useTokenButton, { timeout: 120000 }).click(); + cy.get(addComponentPagePO.username).type(username); + cy.get(addComponentPagePO.token).type(token, { log: false }); + cy.wait(2000); + cy.get(addComponentPagePO.authenticateButton).click(); + } +} diff --git a/e2e-tests/support/pages/ApplicationDetailPage.ts b/e2e-tests/support/pages/ApplicationDetailPage.ts new file mode 100644 index 0000000..d96ab17 --- /dev/null +++ b/e2e-tests/support/pages/ApplicationDetailPage.ts @@ -0,0 +1,86 @@ +import { Common } from '../../utils/Common'; +import { pageTitles } from '../constants/PageTitle'; +import { + addComponentPagePO, + buildLogModalContentPO, + applicationDetailPagePO, +} from '../pageObjects/createApplication-po'; +import { actions } from '../pageObjects/global-po'; + +export class ApplicationDetailPage { + openDeploymentSettings(componentName: string) { + this.openActionList(componentName); + cy.get(applicationDetailPagePO.deploymentSettings).click(); + Common.verifyPageTitle(pageTitles.deploymentSettings); + Common.waitForLoad(); + cy.testA11y(`${pageTitles.deploymentSettings} page`); + } + + checkBuildLog(tasklistItem: string, textToVerify: string, taskTimeout: number = 20000) { + cy.wait(10000); + cy.get('span[class="pipeline-run-logs__namespan"]') + .contains(tasklistItem, { timeout: taskTimeout }) + .scrollIntoView() + .should('be.visible') + .click(); + cy.get(buildLogModalContentPO.logText).should('contain.text', textToVerify); + } + + checkPodLog(podName: string, textToVerify: string) { + cy.get(buildLogModalContentPO.podLogNavList).contains('a', podName).click(); + cy.get(buildLogModalContentPO.logText).should('contain.text', textToVerify); + } + + openBuildLog(componentName: string) { + cy.get(applicationDetailPagePO.componentBuildLog(componentName), { timeout: 60000 }).click(); + cy.get(buildLogModalContentPO.modal).should('exist'); + } + + verifyBuildLogTaskslist(tasklistItems: string[]) { + tasklistItems.forEach((item) => { + cy.contains(buildLogModalContentPO.logsTasklist, item).should('be.visible'); + }); + } + + verifyFailedLogTasksNotExists() { + cy.get(buildLogModalContentPO.failedPipelineRunLogs).should('not.exist'); + } + + closeBuildLog() { + cy.get(buildLogModalContentPO.closeButton).click(); + cy.get(buildLogModalContentPO.modal).should('not.exist'); + } + + createdComponentExists(component: string, application: string) { + Common.verifyPageTitle(application); + Common.waitForLoad(); + cy.testA11y('Application details page'); + this.getComponentListItem(component).should('exist'); + } + + createdComponentNotExists(application: string) { + this.getComponentListItem(application).should('not.exist'); + } + + getComponentListItem(application: string) { + return cy.contains(applicationDetailPagePO.item, application, { timeout: 60000 }); + } + + openAddComponentPage() { + cy.contains(addComponentPagePO.addComponent, 'Add component').click({ force: true }); + Common.verifyPageTitle(pageTitles.createApp); + Common.waitForLoad(); + cy.testA11y(`${pageTitles.createApp} page`); + } + + deleteComponent(componentName: string) { + this.openActionList(componentName); + cy.get(actions.deleteComponent).click(); + cy.get(actions.deleteModalInput).clear().type(componentName); + cy.get(actions.deleteModalButton).click(); + } + + private openActionList(componentName: string) { + cy.get(`[aria-label="${componentName}"]`).find(actions.kebabButton).click(); + } +} diff --git a/e2e-tests/support/pages/ComponentDetailsPage.ts b/e2e-tests/support/pages/ComponentDetailsPage.ts new file mode 100644 index 0000000..6e6bc26 --- /dev/null +++ b/e2e-tests/support/pages/ComponentDetailsPage.ts @@ -0,0 +1,64 @@ +import { APIHelper } from '../../utils/APIHelper'; +import { UIhelper } from '../../utils/UIhelper'; +import { buildLogModalContentPO } from '../pageObjects/createApplication-po'; +import { componentDetailsPO } from '../pageObjects/pages-po'; + +export class ComponentDetailsPage { + static openTab(tab: ComponentPageTabs) { + UIhelper.clickTab(tab); + } + + static checkBuildImage() { + cy.get(componentDetailsPO.buildImage) + .invoke('val') + .then((value) => { + cy.exec(`skopeo inspect -f "Name: {{.Name}} Digest: {{.Digest}}" docker://${value}`, { + timeout: 300000, + }) + .its('code') + .should('eq', 0); + }); + } + + static editComponent() { + cy.contains('button', 'Edit deployment settings').click(); + } + + static checkSBOM() { + cy.contains('.pf-v5-c-description-list__group', 'SBOM') + .find('input') + .should('contain.value', `cosign download sbom quay.io/`) + .and('be.visible'); + } + + static openPodLogs() { + cy.contains('button', 'View pod logs').click(); + cy.get(buildLogModalContentPO.modal).should('exist'); + } +} + +export class DeploymentsTab { + static verifyRoute( + responseBodyContent: string, + waitInterval: number = 10000, + maxRetryNum: number = 10, + ) { + cy.get(componentDetailsPO.route) + .invoke('attr', 'href') + .then((route) => { + APIHelper.checkResponseBodyAndStatusCode( + route, + responseBodyContent, + waitInterval, + 0, + maxRetryNum, + ); + }); + } +} + +export enum ComponentPageTabs { + detail = 'Component details', + activity = 'Activity', + deployments = 'Deployments', +} diff --git a/e2e-tests/support/pages/ComponentSamplesPage.ts b/e2e-tests/support/pages/ComponentSamplesPage.ts new file mode 100644 index 0000000..2350dcc --- /dev/null +++ b/e2e-tests/support/pages/ComponentSamplesPage.ts @@ -0,0 +1,21 @@ +import { Common } from '../../utils/Common'; +import { componentSamplesPagePO } from '../pageObjects/createApplication-po'; +import { AbstractWizardPage } from './AbstractWizardPage'; + +export class ComponentSamplesPage extends AbstractWizardPage { + selectNodeJSSample() { + this.selectSample(componentSamplesPagePO.nodejs); + } + + selectQuarkusSample() { + this.selectSample(componentSamplesPagePO.quarkus); + } + + selectSample(sampleName: string) { + cy.get(componentSamplesPagePO.sample(sampleName)).within(() => { + cy.get(componentSamplesPagePO.import(sampleName)).click(); + }); + cy.contains('Importing sample...').should('not.exist'); + Common.waitForLoad(); + } +} diff --git a/e2e-tests/support/pages/ComponentsPage.ts b/e2e-tests/support/pages/ComponentsPage.ts new file mode 100644 index 0000000..03820ba --- /dev/null +++ b/e2e-tests/support/pages/ComponentsPage.ts @@ -0,0 +1,180 @@ +import { Common } from '../../utils/Common'; +import { UIhelper } from '../../utils/UIhelper'; +import { CPUUnit, MemoryUnit } from '../constants/Units'; +import { ComponentsPagePO } from '../pageObjects/createApplication-po'; +import { UIhelperPO, alertTitle } from '../pageObjects/global-po'; +import { AbstractWizardPage } from './AbstractWizardPage'; + +export class ComponentPage extends AbstractWizardPage { + static checkQuayImageIsPrivate() { + let label = 'Build container image'; + cy.contains(UIhelperPO.listGroup_dt, new RegExp(`^\\s*${label}\\s*$`)) + .siblings('dd') + .find('input') + .then(($quay) => { + let quayLink = $quay.val().toString(); + // remove "quay.io/" prefix from the quay link + let quayRepoIdentifier = quayLink.replace('quay.io/', ''); + let curlLink = `https://quay.io/api/v1/repository/${quayRepoIdentifier}`; + cy.exec( + `curl -X GET -H "Authorization: Bearer ${Cypress.env( + 'QUAY_TOKEN', + )}" -H "Content-Type: application/json" ${curlLink}`, + ).then((obj) => { + let response = JSON.parse(obj.stdout); + expect(response.is_public).to.be.false; + }); + }); + } + + setDockerfilePath(dockerfilePath: string) { + cy.get(ComponentsPagePO.dockerfileInput).clear().type(dockerfilePath); + } + + clickSubmitButton() { + cy.get(ComponentsPagePO.create).should('be.enabled').click(); + } + + clickManageBuildPipelinesLink() { + cy.contains('button', 'Manage build pipelines').should('be.visible').click(); + } + + clickMergePullRequest() { + cy.contains('button', 'Merge pull request').should('be.visible').click(); + } + + clickSendingPullRequest() { + cy.contains('button', 'Sending pull request').should('be.visible').click(); + } + + setPipeline(pipeline: string) { + cy.contains('.pf-v5-c-form__group', 'Pipeline').within(($form) => { + cy.get(ComponentsPagePO.dropdown).click(); + cy.contains('li', pipeline).click(); + }); + } + + public componentName: string; + + editComponentName(newName: string) { + cy.get(ComponentsPagePO.dropdown, { timeout: 80000 }).eq(0).should('be.enabled'); // Work around for issue : HAC-3585 to reduce test flakiness + cy.get(ComponentsPagePO.componentNameField).clear().type(newName); + cy.get(ComponentsPagePO.componentNameField).should('have.value', newName); + } + + extractComponentName() { + cy.get(ComponentsPagePO.componentNameField) + .invoke('val') + .then((val: string) => { + this.componentName = val.trim(); + }); + } + + setApplicationName(name: string) { + cy.get(ComponentsPagePO.appInput).clear().type(name); + } + + saveChanges() { + cy.get(ComponentsPagePO.saveButton).click(); + Common.waitForLoad(); + } + + addEnvVar(name: string, value: string) { + cy.get('body').then((body) => { + if (body.find(ComponentsPagePO.nameInput).length === 0) { + this.clickAddEnvVar(); + } + this.setEnvVar(name, value); + }); + } + + setEnvVar(name: string, value: string) { + cy.get(ComponentsPagePO.nameInput).type(name); + cy.get(ComponentsPagePO.valueInput).type(value); + } + + clickAddEnvVar() { + cy.get(ComponentsPagePO.addEnvVar).click(); + } + + setReplicas(value: number) { + cy.get(ComponentsPagePO.replicaInput).clear().type(value.toString()); + } + + setCpuByButton(value: number, unit: CPUUnit) { + cy.contains(`[data-test="dropdown"]`, 'cores').click(); + cy.contains('li', new RegExp(`^${unit}$`)).click(); + + cy.get(ComponentsPagePO.cpuInput).then(($cpu) => { + const diff = value - Number($cpu.val()); + if (diff === 0) { + return; + } + const button = diff > 0 ? ComponentsPagePO.cpuPlusButton : ComponentsPagePO.cpuMinusButton; + + for (let i = 0; i < Math.abs(diff); i++) { + cy.get(button).click(); + } + }); + + this.checkCpu(value); + } + + checkCpu(expectedVal: number) { + cy.get(ComponentsPagePO.cpuInput).then(($cpu) => { + const realCpu = Number($cpu.val()); + expect(expectedVal).equal(realCpu); + }); + } + + setRam(value: number, unit: MemoryUnit) { + cy.get(ComponentsPagePO.memoryInput).clear().type(value.toString()); + cy.contains(`[data-test="resource-limit-field"]`, 'Memory') + .find(ComponentsPagePO.dropdown) + .click(); + cy.contains('li', unit).click(); + } + + selectRuntime(runtimeName: string) { + UIhelper.selectValueInDropdownbyLabelName('Runtime', runtimeName); + } + + clickCreateApplication() { + cy.contains('button', 'Create application', { timeout: 80000 }) + .should('be.enabled') + .invoke('click') + .should('be.disabled'); + Common.waitForLoad(); + } + + checkAlert(message: string) { + cy.contains(alertTitle, message).should('exist'); + } + + selectCustomBuildPipeline() { + cy.get(ComponentsPagePO.customBuildPipelineRadioBtn).click(); + cy.contains('Default build pipeline').should('be.visible'); + } + + checkStatusOnModal(labelText: string) { + cy.contains(ComponentsPagePO.label, labelText, { timeout: 150000 }).should('be.visible'); + } + + verifyAndWaitForPRIsSent() { + this.checkStatusOnModal('Merge pull request'); + cy.contains('a', 'Merge in GitHub').should('be.visible'); + } + + verifyAndWaitForPRMerge() { + this.checkStatusOnModal('Custom'); + cy.contains('a', 'Edit pipeline in GitHub').should('be.visible'); + } + + closeModal() { + cy.get(ComponentsPagePO.customBuildPipelineModalCloseBtn).click(); + } + + verifyComponentGHReferenceAndLink(linkText: string, link: string) { + cy.contains('a', linkText).should('be.visible').and('have.attr', 'href', link); + } +} diff --git a/e2e-tests/support/pages/CreateApplicationPage.ts b/e2e-tests/support/pages/CreateApplicationPage.ts new file mode 100644 index 0000000..e0f897a --- /dev/null +++ b/e2e-tests/support/pages/CreateApplicationPage.ts @@ -0,0 +1,46 @@ +import { Common } from '../../utils/Common'; +import { pageTitles } from '../constants/PageTitle'; +import { createApplicationPagePO } from '../pageObjects/createApplication-po'; +import { AbstractWizardPage } from './AbstractWizardPage'; + +export class CreateApplicationPage extends AbstractWizardPage { + waitAppCreated(applicationName: string) { + Common.verifyPageTitle(applicationName); + } + + clickAddComponent() { + cy.contains(createApplicationPagePO.addComponentButton).click({ force: true }); + } + + getApplicationName() { + return cy.get(createApplicationPagePO.applicationName); + } + + setApplicationName(name: string) { + cy.wait(500); + this.clearApplicationName(); + cy.get(createApplicationPagePO.applicationName).type(name); + } + + clearApplicationName() { + cy.get(createApplicationPagePO.applicationName).clear(); + } + + clickCreateApplication() { + cy.get('body').then((body) => { + if (body.find("h4:contains('No applications')").length > 0) { + cy.get('.pf-v5-c-empty-state__content') + .contains(createApplicationPagePO.createApplication) + .click({ force: true }); + } else { + cy.contains(createApplicationPagePO.createApplication).click({ force: true }); + } + Common.verifyPageTitle(pageTitles.createApp); + Common.waitForLoad(); + }); + } + + clickNext() { + cy.get(createApplicationPagePO.next).click({ force: true }); + } +} diff --git a/e2e-tests/support/pages/DeploymentSettingsPage.ts b/e2e-tests/support/pages/DeploymentSettingsPage.ts new file mode 100644 index 0000000..ed2cd4c --- /dev/null +++ b/e2e-tests/support/pages/DeploymentSettingsPage.ts @@ -0,0 +1,36 @@ +import { CPUUnit, MemoryUnit } from '../constants/Units'; + +export class DeploymentSettingsPage { + static checkCpuAndMemory( + cpuValue: number, + cpuUnit: CPUUnit, + ramValue: number, + ramUnit: MemoryUnit, + ) { + this.checkCpu(cpuValue, cpuUnit); + this.checkMemory(ramValue, ramUnit); + } + + static checkInstances(replicaCount: number) { + this.checkValue('Number of instances', replicaCount); + } + + static checkCpu(value: number, unit: CPUUnit) { + this.checkValue('Amount of CPU', value, unit); + } + + static checkMemory(value: number, unit: MemoryUnit) { + this.checkValue('Amount of memory', value, unit); + } + + private static checkValue(label: string, value: number, unit?: string) { + cy.contains('.pf-v5-c-form__helper-text', label) + .parent() + .within(() => { + cy.get('input[type="number"]').should('have.value', value); + if (unit) { + cy.get('[data-test="dropdown-toggle"]').should('contain.text', unit); + } + }); + } +} diff --git a/e2e-tests/support/pages/EnvironmentsPage.ts b/e2e-tests/support/pages/EnvironmentsPage.ts new file mode 100644 index 0000000..dd7a07d --- /dev/null +++ b/e2e-tests/support/pages/EnvironmentsPage.ts @@ -0,0 +1,88 @@ +import { hacAPIEndpoints } from '../../utils/APIEndpoints'; +import { APIHelper } from '../../utils/APIHelper'; +import { UIhelper } from '../../utils/UIhelper'; +import { environmentsPagePO } from '../pageObjects/pages-po'; + +export class EnvironmentsPage { + static createEnvironment( + envName: string, + selectCluster: string, + clusterType: string, + ingressDomain: string, + kubeconfig: string, + targetNamespace: string, + ) { + UIhelper.inputValueInTextBoxByLabelName('Environment name', envName); + UIhelper.selectValueInDropdownbyLabelName('Select cluster', selectCluster); + UIhelper.selectValueInDropdownbyLabelName('Cluster type', clusterType); + UIhelper.inputValueInTextBoxByLabelName('Ingress domain', ingressDomain); + + cy.get(environmentsPagePO.kubconfigTextArea) + .clear() + .invoke('attr', 'style', 'color: transparent;text-shadow: 0 0 8px rgba(0,0,0,0.5);') + .type(kubeconfig, { log: false }); + cy.contains( + environmentsPagePO.kubeconfigValidationMsg, + 'Contents verified. Everything looks good.', + ).should('be.visible'); + + UIhelper.inputValueInTextBoxByLabelName( + 'Target namespace on the selected cluster', + targetNamespace, + ); + this.clickOnCreateEnv(); + } + + static clickOnCreateEnv() { + UIhelper.clickButton('Create environment'); + } + + static verifyEnvCardDetails( + envName: string, + type: string, + deploymentStrategy: string, + clusterType: string, + applicationStatus?: string, + ) { + cy.contains(environmentsPagePO.envCard, envName).within(() => { + cy.get(environmentsPagePO.envCardConnectionLabel) + .trigger('mouseenter') + .should('be.visible') + .and('contain.text', 'Connection successful'); + this.verifyCardLabelAndValue('Type', type); + this.verifyCardLabelAndValue('Deployment strategy', deploymentStrategy); + this.verifyCardLabelAndValue('Cluster type', clusterType); + if (applicationStatus) { + this.verifyCardLabelAndValue('Application status', applicationStatus, 180000); + } + }); + } + + static verifyCardLabelAndValue(label: string, value: string, timeout = 40000) { + cy.contains(environmentsPagePO.label, label).contains(value, { timeout }).should('be.visible'); + } + + static deleteEnvironment(envName) { + cy.contains(environmentsPagePO.envCard, envName).find(environmentsPagePO.kebabButton).click(); + cy.get(environmentsPagePO.envDropdownDeleteBtn).should('have.text', 'Delete').click(); + cy.get(environmentsPagePO.envDeleteBtn) + .should('have.text', 'Delete') + .and('be.disabled') + .and('be.visible'); + UIhelper.inputValueInTextBoxByLabelName(`Type "${envName}" to confirm deletion`, envName); + cy.get(environmentsPagePO.envDeleteBtn) + .should('be.enabled') + .and('be.visible') + .click() + .should('not.exist'); + cy.contains(environmentsPagePO.envCard, envName).should('not.exist'); + } + + static deleteEnvironmentUsingAPI(envName: string) { + APIHelper.requestHACAPI({ + method: 'DELETE', + url: hacAPIEndpoints.environments(envName), + failOnStatusCode: false, + }); + } +} diff --git a/e2e-tests/support/pages/GetStartedPage.ts b/e2e-tests/support/pages/GetStartedPage.ts new file mode 100644 index 0000000..24488fc --- /dev/null +++ b/e2e-tests/support/pages/GetStartedPage.ts @@ -0,0 +1,12 @@ +import { Common } from '../../utils/Common'; +import { pageTitles } from '../constants/PageTitle'; +import { getStartedPagePO } from '../pageObjects/pages-po'; + +export class GetStartedPage { + static waitForLoad() { + Common.verifyPageTitle(pageTitles.getStartedPage); + cy.get(getStartedPagePO.createAppButton) + .should('be.visible') + .and('have.attr', 'aria-disabled', 'false'); + } +} diff --git a/e2e-tests/support/pages/SecretsPage.ts b/e2e-tests/support/pages/SecretsPage.ts new file mode 100644 index 0000000..45ceb18 --- /dev/null +++ b/e2e-tests/support/pages/SecretsPage.ts @@ -0,0 +1,16 @@ +import { UIhelper } from '../../utils/UIhelper'; +import { actions } from '../pageObjects/global-po'; + +export class SecretsPage { + static searchSecret(secretName: string) { + cy.get('[name="nameInput"]').clear().type(secretName); + } + + static deleteSecret(secretName: string) { + UIhelper.getTableRow('Secret List', secretName).find(actions.kebabButton).click(); + cy.get(actions.delete).click(); + UIhelper.inputValueInTextBoxByLabelName(`Type "${secretName}" to confirm deletion`, secretName); + UIhelper.clickButton('Delete').should('not.exist'); + cy.contains(secretName).should('not.exist'); + } +} diff --git a/e2e-tests/support/pages/tabs/ComponentsTabPage.ts b/e2e-tests/support/pages/tabs/ComponentsTabPage.ts new file mode 100644 index 0000000..2c45ae9 --- /dev/null +++ b/e2e-tests/support/pages/tabs/ComponentsTabPage.ts @@ -0,0 +1,20 @@ +import { Common } from '../../../utils/Common'; +import { applicationDetailPagePO } from '../../pageObjects/createApplication-po'; +import { componentsTabPO } from '../../pageObjects/pages-po'; + +export class ComponentsTabPage { + static clickAddComponent() { + Common.waitForLoad(); + cy.get(componentsTabPO.addComponent).click(); + } + + static getComponentListItem(name: string) { + return cy.contains(applicationDetailPagePO.item, name, { timeout: 60000 }); + } + + static openComponent(name: string) { + this.getComponentListItem(name).click(); + Common.waitForLoad(); + cy.contains('h2', name).should('be.visible'); + } +} diff --git a/e2e-tests/support/pages/tabs/IntegrationTestsTabPage.ts b/e2e-tests/support/pages/tabs/IntegrationTestsTabPage.ts new file mode 100644 index 0000000..7f53e35 --- /dev/null +++ b/e2e-tests/support/pages/tabs/IntegrationTestsTabPage.ts @@ -0,0 +1,91 @@ +import { Applications } from '../../../utils/Applications'; +import { Common } from '../../../utils/Common'; +import { UIhelper } from '../../../utils/UIhelper'; +import { actions } from '../../pageObjects/global-po'; +import { integrationTestsTabPO, addIntegrationTestStepPO } from '../../pageObjects/pages-po'; + +type integrationTableRow = { + name: string; + githubURL: string; + optionalForRelease: string; + revision: string; +}; + +export class IntegrationTestsTabPage { + filterByName(inputString: string) { + cy.get(integrationTestsTabPO.filterInputField).clear().type(inputString); + } + + hasIntegrationTest(integrationTestName: string) { + UIhelper.verifyRowInTable('Integration tests', integrationTestName, [integrationTestName]); + } + + openAndClickKebabMenu(integrationTestName: string, option: string) { + cy.get(`[data-id="${integrationTestName}"]`).find(actions.kebabButton).click(); + cy.contains('li', option).click(); + } + + addIntegrationTest( + integrationTestName: string, + githubURL: string, + revision: string, + pathInRepository: string, + markOptionalForRelease?: string, + ) { + this.verifySaveChangesIsDisabled(); + UIhelper.inputValueInTextBoxByLabelName('Integration test name', integrationTestName); + UIhelper.inputValueInTextBoxByLabelName('GitHub URL', githubURL); + UIhelper.inputValueInTextBoxByLabelName('Revision', revision); + UIhelper.inputValueInTextBoxByLabelName('Path in repository', pathInRepository); + if (markOptionalForRelease === 'uncheck') { + cy.get(addIntegrationTestStepPO.optionalreleaseCheckbox).uncheck(); + } else if (markOptionalForRelease === 'check') { + cy.get(addIntegrationTestStepPO.optionalreleaseCheckbox).check(); + } + + UIhelper.clickButton('Add integration test').should('not.exist'); + Common.waitForLoad(); + } + + editIntegrationTest(githubURL: string, markOptionalForRelease?: string) { + this.verifyIntegrationNameIsDisabled(); + this.verifySaveChangesIsDisabled(); + + if (githubURL) { + UIhelper.inputValueInTextBoxByLabelName('GitHub URL', githubURL); + } + + if (markOptionalForRelease === 'uncheck') + cy.get(addIntegrationTestStepPO.optionalreleaseCheckbox).uncheck(); + else if (markOptionalForRelease === 'check') + cy.get(addIntegrationTestStepPO.optionalreleaseCheckbox).check(); + + cy.get(integrationTestsTabPO.saveChangesButton).click().should('not.exist'); + Common.waitForLoad(); + } + + clickOnAddIntegrationTestBtn() { + UIhelper.clickButton('Add integration test').should('not.exist'); + } + + verifyIntegrationNameIsDisabled() { + cy.get(addIntegrationTestStepPO.displayNameInput).should('have.attr', 'disabled'); + } + + verifySaveChangesIsDisabled() { + cy.get(integrationTestsTabPO.saveChangesButton).should('be.disabled'); + } + + verifyRowInIntegrationTestsTable(rowDetails: integrationTableRow) { + UIhelper.verifyRowInTable('Integration tests', rowDetails.name, [ + new RegExp(rowDetails.githubURL), + new RegExp(`^\\s*${rowDetails.optionalForRelease}\\s*$`), + new RegExp(`^\\s*${rowDetails.revision}\\s*$`), + ]); + } + + deleteIntegrationTestFromActions() { + Applications.clickActionsDropdown('Delete'); + UIhelper.clickButton('Delete'); + } +} diff --git a/e2e-tests/support/pages/tabs/LatestCommitsTabPage.ts b/e2e-tests/support/pages/tabs/LatestCommitsTabPage.ts new file mode 100644 index 0000000..723b5d0 --- /dev/null +++ b/e2e-tests/support/pages/tabs/LatestCommitsTabPage.ts @@ -0,0 +1,68 @@ +import { githubAPIEndpoints } from '../../../utils/APIEndpoints'; +import { APIHelper } from '../../../utils/APIHelper'; +import { UIhelper } from '../../../utils/UIhelper'; + +type commitsRow = { + name: string; + component: string; +}; + +// Latest Commits List view page +export class LatestCommitsTabPage { + editFile( + gitRepo: string, + filePath: string, + commitMessage: string, + updatedFileContentInBase64: string, + fileSHA: string, + ) { + const owner = gitRepo.split('/')[3]; + const repoName = gitRepo.split('/')[4]; + const body = { + message: `${commitMessage}`, + content: `${updatedFileContentInBase64}`, + sha: `${fileSHA}`, + }; + APIHelper.githubRequest( + 'PUT', + `https://api.github.com/repos/${owner}/${repoName}/contents/${filePath}`, + body, + ).then((result) => { + cy.log(`${commitMessage}_SHA : ${result.body.commit.sha}`); + Cypress.env(`${commitMessage}_SHA`, result.body.commit.sha); + }); + } + + clickOnCommit(commit: string) { + UIhelper.clickRowCellInTable('Commit List', commit, commit); + } + + verifyCommitsPageTitleAndStatus(commitTitle: string) { + cy.contains('h2', commitTitle).contains('Succeeded'); + } + + verifyCommitID(sha: string, repoLink: string) { + UIhelper.verifyLabelAndValue('Commit', sha.slice(0, 7)).should( + 'have.attr', + 'href', + `${repoLink}/commit/${sha}`, + ); + } + + verifyNodesOnCommitOverview(nodes: string[]) { + nodes.forEach((nodetext) => { + UIhelper.verifyGraphNodes(nodetext); + }); + } + + verifyLatestCommits(commitsRows: commitsRow[]) { + commitsRows.forEach((commitsRow) => { + UIhelper.verifyRowInTable('Commit List', commitsRow.name, [ + 'main', + commitsRow.component, + Cypress.env('GH_USERNAME'), + 'Succeeded', + ]); + }); + } +} diff --git a/e2e-tests/support/pages/tabs/OverviewTabPage.ts b/e2e-tests/support/pages/tabs/OverviewTabPage.ts new file mode 100644 index 0000000..22c34a7 --- /dev/null +++ b/e2e-tests/support/pages/tabs/OverviewTabPage.ts @@ -0,0 +1,13 @@ +import { Common } from '../../../utils/Common'; +import { overviewTabPO } from '../../pageObjects/pages-po'; + +export class OverviewTabPage { + goToComponentsTab() { + cy.get(overviewTabPO.goToComponents).click(); + } + + addComponent() { + Common.waitForLoad(); + cy.wait(500).contains(overviewTabPO.addComponent, 'Add component').click(); + } +} diff --git a/e2e-tests/support/pages/tabs/PipelinerunsTabPage.ts b/e2e-tests/support/pages/tabs/PipelinerunsTabPage.ts new file mode 100644 index 0000000..f39cdf8 --- /dev/null +++ b/e2e-tests/support/pages/tabs/PipelinerunsTabPage.ts @@ -0,0 +1,219 @@ +import { hacAPIEndpoints } from '../../../utils/APIEndpoints'; +import { APIHelper } from '../../../utils/APIHelper'; +import { UIhelper } from '../../../utils/UIhelper'; +import { pipelinerunsTabPO } from '../../pageObjects/pages-po'; + +type taskRunDetailsRow = { + name: string | RegExp; + task: string; + status: string; +}; + +type ecSecurityRulesRow = { + rule: string | RegExp; + status: string | RegExp; + message: string | RegExp; +}; + +// Pipelineruns List view page +export class PipelinerunsTabPage { + static clickOnRunningPipelinerun(pipelinerun: string) { + UIhelper.clickRowCellInTable('Pipeline run List', 'Running', `${pipelinerun}-`); + } + + static verifyRelatedPipelines(pipelineName: string) { + cy.contains(pipelinerunsTabPO.relatedPipelinePopup, 'Related pipelines').within(() => { + cy.contains(pipelineName).scrollIntoView().should('be.visible'); + cy.get(pipelinerunsTabPO.relatedPipelineCloseBtn).click().should('not.exist'); + }); + } + + static getPipelineRunNameByLabel( + applicationName: string, + label: string, + annotations?: { key: string; value: string }, + retries = 4, + ) { + return APIHelper.requestHACAPI({ + url: hacAPIEndpoints.pipelinerunsFilter(applicationName, label), + }) + .its('body.items') + .then((items) => { + if (items.length < 1 && retries > 0) { + cy.wait(5000); + return PipelinerunsTabPage.getPipelineRunNameByLabel( + applicationName, + label, + annotations, + retries--, + ); + } + if (!annotations) { + return items[0].metadata.name; + } + for (const i in items) { + if (items[i].metadata.annotations[annotations.key] === annotations.value) { + return items[i].metadata.name; + } + } + }); + } + + static verifyECSecurityRulesResultSummary(summary: RegExp) { + cy.contains(pipelinerunsTabPO.ecResultSummary, summary).should('be.visible'); + } + + static verifyECSecurityRules(UniqueTextInRow: string | RegExp, rowValues: ecSecurityRulesRow) { + cy.contains(pipelinerunsTabPO.ecSecurityRulesTableRow, UniqueTextInRow).within(() => { + cy.contains(rowValues.rule).scrollIntoView().should('be.visible'); + cy.contains(rowValues.status).scrollIntoView().should('be.visible'); + cy.contains(rowValues.message).scrollIntoView().should('be.visible'); + }); + } +} + +// Pipelineruns Details view page +export class DetailsTab { + static goToDetailsTab() { + UIhelper.clickTab('Details'); + } + + static waitUntilStatusIsNotRunning() { + cy.get(pipelinerunsTabPO.statusPO, { timeout: 1000000 }) + .should('not.have.text', 'Pending') + .and('not.have.text', 'Running'); + } + + static clickOnNode(nodeId: string) { + cy.get(pipelinerunsTabPO.node(nodeId)).click(); + } + + static checkNodeDrawerPanelResult(section: string, value: string) { + cy.contains(pipelinerunsTabPO.PF5TableRow, section) + .contains(value) + .scrollIntoView() + .should('be.visible'); + } + + static checkVulScanOnClairDrawer(vulnerabilities: RegExp) { + cy.get(pipelinerunsTabPO.drawerPanel) + .contains(pipelinerunsTabPO.listGroup, 'Fixable vulnerabilities scan') + .contains(vulnerabilities) + .scrollIntoView() + .should('be.visible'); + } + + static checkVulScanOnPipelinerunDetails(vulnerabilities: RegExp) { + cy.contains(pipelinerunsTabPO.listGroup, 'Fixable vulnerabilities scan') + .contains(vulnerabilities) + .scrollIntoView() + .should('be.visible'); + } + + static clickOnVulScanViewLogs() { + cy.contains(pipelinerunsTabPO.listGroup, 'Fixable vulnerabilities scan') + .contains('View logs') + .click(); + } + + static clickOnDrawerPanelLogsTab() { + cy.get(pipelinerunsTabPO.drawerPanel).contains('button', 'Logs').click(); + } + + static verifyLogs(logText: string | RegExp) { + cy.get(pipelinerunsTabPO.logText) + .contains(logText, { timeout: 80000 }) + .scrollIntoView() + .should('be.visible'); + } + + static closeDrawerPanel() { + cy.get(pipelinerunsTabPO.drawerClose).click().should('not.exist'); + } + + static downloadSBOMAndCheckUsingCosign() { + cy.contains(pipelinerunsTabPO.listGroup, 'Download SBOM') + .find('input') + .invoke('val') + .then((value) => { + cy.exec(`${value}`).then((obj) => { + expect(obj.code).to.equal(0); + expect(JSON.parse(obj.stdout).components.length).to.greaterThan(0); + }); + }); + } + + static waitForPLRAndDownloadAllLogs(allTaskLogs = true) { + DetailsTab.waitUntilStatusIsNotRunning(); + LogsTab.downloadAllTaskLogs(allTaskLogs); + UIhelper.verifyLabelAndValue('Status', 'Succeeded'); + } +} + +export class TaskRunsTab { + static goToTaskrunsTab() { + UIhelper.clickTab('Task runs'); + } + + static getAdvancedTaskNamesList(pipelineName: string): taskRunDetailsRow[] { + return [ + { name: `${pipelineName}-init`, task: 'init', status: 'Succeeded' }, + { name: `${pipelineName}-clone-repository`, task: 'clone-repository', status: 'Succeeded' }, + { name: `${pipelineName}-build-container`, task: 'build-container', status: 'Succeeded' }, + { + name: `${pipelineName}-sast-snyk-check`, + task: 'sast-snyk-check', + status: 'Succeeded|Test Failures', + }, + { + name: `${pipelineName}-deprecated-base-image-check`, + task: 'deprecated-base-image-check', + status: 'Succeeded', + }, + { name: `${pipelineName}-clair-scan`, task: 'clair-scan', status: 'Succeeded|Test Failures' }, // Adding Test Warnings as some packages might have medium vulnerabilities sometimes + { + name: `${pipelineName}-clamav-scan`, + task: 'clamav-scan', + status: 'Succeeded|Test Failures', + }, + { name: `${pipelineName}-show-sbom`, task: 'show-sbom', status: 'Succeeded' }, + { name: `${pipelineName}-show-summary`, task: 'show-summary', status: 'Succeeded' }, + ]; + } + static getbasicTaskNamesList(pipelineName: string): taskRunDetailsRow[] { + return [ + { name: `${pipelineName}-init`, task: 'init', status: 'Succeeded' }, + { name: `${pipelineName}-clone-repository`, task: 'clone-repository', status: 'Succeeded' }, + { name: `${pipelineName}-build-container`, task: 'build-container', status: 'Succeeded' }, + { name: `${pipelineName}-show-sbom`, task: 'show-sbom', status: 'Succeeded' }, + ]; + } + + static assertTaskAndTaskRunStatus(taskNames: taskRunDetailsRow[]) { + taskNames.forEach((taskNameRow) => { + UIhelper.verifyRowInTable('TaskRun List', taskNameRow.task, [ + new RegExp(`${taskNameRow.status}`), + ]); + }); + } +} + +export class LogsTab { + static goToLogsTab() { + UIhelper.clickTab('Logs'); + } + + static downloadAllTaskLogs(allTaskLogs = true) { + LogsTab.goToLogsTab(); + if (allTaskLogs) { + cy.contains('button', pipelinerunsTabPO.downloadAllTaskLogsButton) + .should('be.enabled') + .click(); + } else { + cy.contains('button', /^Download$/) + .should('be.enabled') + .click(); + } + DetailsTab.goToDetailsTab(); + } +} diff --git a/e2e-tests/tests/basic-happy-path.spec.ts b/e2e-tests/tests/basic-happy-path.spec.ts new file mode 100644 index 0000000..7c59a33 --- /dev/null +++ b/e2e-tests/tests/basic-happy-path.spec.ts @@ -0,0 +1,212 @@ +import { FULL_APPLICATION_TITLE, NavItem } from '../support/constants/PageTitle'; +import { actions } from '../support/pageObjects/global-po'; +import { ApplicationDetailPage } from '../support/pages/ApplicationDetailPage'; +import { + ComponentDetailsPage, + ComponentPageTabs, + DeploymentsTab, +} from '../support/pages/ComponentDetailsPage'; +import { ComponentPage } from '../support/pages/ComponentsPage'; +import { ComponentsTabPage } from '../support/pages/tabs/ComponentsTabPage'; +import { IntegrationTestsTabPage } from '../support/pages/tabs/IntegrationTestsTabPage'; +import { + DetailsTab, + PipelinerunsTabPage, + TaskRunsTab, +} from '../support/pages/tabs/PipelinerunsTabPage'; +import { APIHelper } from '../utils/APIHelper'; +import { Applications } from '../utils/Applications'; +import { Common } from '../utils/Common'; +import { UIhelper } from '../utils/UIhelper'; + +describe('Basic Happy Path', () => { + const applicationName = Common.generateAppName(); + // const applicationName = "test-app-173261349"; + const applicationDetailPage = new ApplicationDetailPage(); + const integrationTestsTab = new IntegrationTestsTabPage(); + const componentPage = new ComponentPage(); + + const sourceOwner = 'hac-test'; + const sourceRepo = 'devfile-sample-code-with-quarkus'; + const repoName = Common.generateAppName(sourceRepo); + // const repoName = "java-quarkus-173261349" + const repoOwner = 'redhat-hac-qe'; + const publicRepo = `https://github.com/${repoOwner}/${repoName}`; + // const publicRepo = 'https://github.com/redhat-hac-qe/devfile-sample-code-with-quarkus-173218691' + const componentName: string = Common.generateAppName('java-quarkus'); + // const componentName = "java-quarkus-173261349" + const piplinerunlogsTasks = ['init', 'clone-repository', 'build-container', 'show-sbom']; + const quarkusDeplomentBody = 'Congratulations, you have created a new Quarkus cloud application'; + // this is default option and should be the fastest one + const pipeline = 'docker-build-oci-ta'; + + before(function () { + APIHelper.createRepositoryFromTemplate(sourceOwner, sourceRepo, repoOwner, repoName); + }); + + after(function () { + // If some test failed, don't remove the app + let allTestsSucceeded = true; + this.test.parent.eachTest((test) => { + if (test.state === 'failed') { + allTestsSucceeded = false; + } + }); + if (allTestsSucceeded || Cypress.env('REMOVE_APP_ON_FAIL')) { + // use UI to remove the application to test the flow + Common.navigateTo(NavItem.applications); + Applications.openKebabMenu(applicationName); + cy.get(actions.deleteApp).click(); + cy.get(actions.deleteModalInput).clear().type(applicationName); + cy.get(actions.deleteModalButton).click(); + cy.get(`[data-id="${applicationName}"]`).should('not.exist'); + APIHelper.deleteGitHubRepository(repoName); + } + }); + + it('Create an Application with a component', () => { + Applications.createApplication(applicationName); + Applications.createComponent(publicRepo, componentName, pipeline); + // cy.visit("https://localhost:8080/workspaces/kkanova-tenant/applications/test-app-173261349") + Applications.checkComponentInListView(componentName, applicationName, 'Build not started'); + }); + + it('Check default Integration Test', () => { + Applications.goToIntegrationTestsTab(); + integrationTestsTab.hasIntegrationTest(`${applicationName}-enterprise-contract`); + }); + + describe('Check different ways to add a component', () => { + afterEach(() => { + Applications.clickBreadcrumbLink(applicationName); + cy.url().should('include', `${applicationName}`); + }); + + it("Use 'Components' tabs to start adding a new component", () => { + Applications.goToOverviewTab().addComponent(); + cy.url().should('include', `/import?application=${applicationName}`); + }); + + it("Use HACBS 'Components' tabs to start adding a new component", () => { + Applications.goToComponentsTab(); + ComponentsTabPage.clickAddComponent(); + cy.url().should('include', `/import?application=${applicationName}`); + }); + + it("Click 'Actions' dropdown to add a component", () => { + Applications.clickActionsDropdown('Add component'); + cy.url().should('include', `/import?application=${applicationName}`); + }); + }); + + describe('Explore Pipeline runs Tab', () => { + after(() => { + Applications.clickBreadcrumbLink(applicationName); + }); + + it('Merge the auto-generated PR, and verify the event status on modal', () => { + Applications.goToComponentsTab(); + // Pipeline build plan was removed from the Pipeline runs Tab + // See https://issues.redhat.com/browse/KFLUXBUGS-603 + ComponentsTabPage.openComponent(componentName); + // Use clickSendingPullRequest() until the bug is fixed + // https://issues.redhat.com/browse/KFLUXUI-226 + componentPage.clickSendingPullRequest(); + // componentPage.clickMergePullRequest(); + componentPage.verifyAndWaitForPRIsSent(); + + APIHelper.mergePR( + repoOwner, + repoName, + 1, + 'firstCommit', + 'This PR was auto-generated by appstudio-ci__bot', + ); + + // Disabled due to bug https://issues.redhat.com/browse/KFLUXBUGS-1307 + // componentPage.verifyAndWaitForPRMerge(); + + componentPage.closeModal(); + // Go back to Components tab + Applications.clickBreadcrumbLink(applicationName); + Applications.goToComponentsTab(); + }); + + it('Verify the Pipeline run details and Node Graph view', () => { + Applications.goToPipelinerunsTab(); + UIhelper.getTableRow('Pipeline run List', `${componentName}-on-pull-request`) + .contains(componentName) + .invoke('text') + .then((pipelinerunName) => { + UIhelper.checkTableHasRows('Pipeline run List', componentName, 2); + UIhelper.clickRowCellInTable('Pipeline run List', pipelinerunName, pipelinerunName); + UIhelper.verifyLabelAndValue('Namespace', Cypress.env('HAC_NAMESPACE')); + UIhelper.verifyLabelAndValue('Pipeline', pipelinerunName); + UIhelper.verifyLabelAndValue('Application', applicationName); + UIhelper.verifyLabelAndValue('Component', componentName); + UIhelper.verifyLabelAndValue('Related pipelines', '0 pipelines'); + + DetailsTab.waitForPLRAndDownloadAllLogs(); + + //Verify the Pipeline run details Graph + piplinerunlogsTasks.forEach((item) => { + UIhelper.verifyGraphNodes(item); + }); + + TaskRunsTab.goToTaskrunsTab(); + TaskRunsTab.assertTaskAndTaskRunStatus( + TaskRunsTab.getbasicTaskNamesList(pipelinerunName), + ); + }); + }); + + it('Wait for on-push build to finish', () => { + Applications.clickBreadcrumbLink('Pipeline runs'); + UIhelper.checkTableHasRows('Pipeline run List', 'test', 2); + }); + + it('Verify Enterprise contract Test pipeline run Details', () => { + UIhelper.clickRowCellInTable('Pipeline run List', 'Test', `${applicationName}-`); + DetailsTab.waitForPLRAndDownloadAllLogs(false); + }); + }); + + describe('Check Component in Components tab', () => { + before(() => { + Applications.goToComponentsTab(); + }); + + it('Check component build status', () => { + Applications.checkComponentStatus(componentName, 'Build completed'); + }); + + it('Validate Build Logs are successful', () => { + applicationDetailPage.openBuildLog(componentName); + applicationDetailPage.verifyBuildLogTaskslist(piplinerunlogsTasks); //TO DO : Fetch the piplinerunlogsTasks from cluster using api At runtime. + applicationDetailPage.verifyFailedLogTasksNotExists(); + applicationDetailPage.checkBuildLog('push-dockerfile', 'Selecting auth for quay.io'); + applicationDetailPage.closeBuildLog(); + }); + }); + + describe('Check Component Details', () => { + before(() => { + ComponentsTabPage.openComponent(componentName); + }); + + it('Verify deployed image exists', () => { + ComponentDetailsPage.checkBuildImage(); + }); + }); + + describe('Check Application Overview', () => { + before(() => { + Common.openApplicationURL(applicationName); + }); + + it('Validate the graph views for the created application', () => { + UIhelper.verifyGraphNodes('Components', false); + UIhelper.verifyGraphNodes('Builds'); + }); + }); +}); diff --git a/e2e-tests/tsconfig.json b/e2e-tests/tsconfig.json new file mode 100644 index 0000000..0a70e9f --- /dev/null +++ b/e2e-tests/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": [ + "es5", + "dom" + ], + "types": [ + "cypress", + "node", + "cypress-axe" + ] + }, + "include": [ + "./**/*.ts" + ] +} \ No newline at end of file diff --git a/e2e-tests/utils/APIEndpoints.ts b/e2e-tests/utils/APIEndpoints.ts new file mode 100644 index 0000000..99c7258 --- /dev/null +++ b/e2e-tests/utils/APIEndpoints.ts @@ -0,0 +1,43 @@ +export const hacAPIEndpoints = { + applications: (applicationName: string) => + `/api/k8s/apis/appstudio.redhat.com/v1alpha1/namespaces/${Cypress.env( + 'HAC_NAMESPACE', + )}/applications/${applicationName}`, + + environments: (envName: string) => + `/api/k8s/workspaces/${Cypress.env( + 'HAC_WORKSPACE', + )}/apis/appstudio.redhat.com/v1alpha1/namespaces/${Cypress.env( + 'HAC_NAMESPACE', + )}/environments/${envName}`, + + pipelinerunsFilter: (applicationName: string, label: string) => + `/api/k8s/workspaces/${Cypress.env( + 'HAC_WORKSPACE', + )}/apis/tekton.dev/v1beta1/namespaces/${Cypress.env( + 'HAC_NAMESPACE', + )}/pipelineruns?labelSelector=appstudio.openshift.io/application=${applicationName},${label}&limit=250`, + + secrets: (secretName: string) => + `/api/k8s/workspaces/${Cypress.env('HAC_WORKSPACE')}/api/v1/namespaces/${Cypress.env( + 'HAC_NAMESPACE', + )}/secrets/${secretName}`, + + resources: (resourceType: string) => + `/api/k8s/apis/appstudio.redhat.com/v1beta1/namespaces/${Cypress.env( + 'HAC_NAMESPACE', + )}/${resourceType}s`, +}; + +export const githubAPIEndpoints = { + orgRepos: `https://api.github.com/orgs/redhat-hac-qe/repos`, + qeRepos: (repoName: string) => `https://api.github.com/repos/redhat-hac-qe/${repoName}`, + templateRepo: (owner: string, templateName: string) => + `https://api.github.com/repos/${owner}/${templateName}/generate`, + merge: (owner: string, repoName: string, pullNumber: number) => + `https://api.github.com/repos/${owner}/${repoName}/pulls/${pullNumber}/merge`, + contents: (owner: string, repoName: string, filePath: string) => + `https://api.github.com/repos/${owner}/${repoName}/contents/${filePath}`, + commits: (owner: string, repoName: string) => + `https://api.github.com/repos/${owner}/${repoName}/commits`, +}; diff --git a/e2e-tests/utils/APIHelper.ts b/e2e-tests/utils/APIHelper.ts new file mode 100644 index 0000000..0f41611 --- /dev/null +++ b/e2e-tests/utils/APIHelper.ts @@ -0,0 +1,126 @@ +import { githubAPIEndpoints } from './APIEndpoints'; + +export class APIHelper { + static readonly githubHeaders = { + Accept: 'application/vnd.github+json', + Authorization: `Bearer ${Cypress.env('GH_TOKEN')}`, + 'X-GitHub-Api-Version': '2022-11-28', + }; + + static requestHACAPI(options: Partial) { + const oidcUser = JSON.parse( + localStorage.getItem(`oidc.user:${Cypress.env('SSO_URL')}:cloud-services`), + ); + const token = oidcUser.access_token as string; + + options.headers = { + authorization: `Bearer ${token}`, + accept: 'application/json', + }; + + return cy.request(options); + } + + static githubRequest(method: Cypress.HttpMethod, url: string, body?: Cypress.RequestBody) { + const options: Partial = { + method, + url, + headers: this.githubHeaders, + }; + if (body) { + options.body = body; + } + return cy.request(options); + } + + static checkResponseBodyAndStatusCode( + url: string, + responseBodyContent: string, + waitInterval: number = 2000, + retryNum: number = 0, + maxRetryNum: number = 10, + headers?: object, + ) { + expect(retryNum).to.be.lessThan(maxRetryNum); + const options: Partial = { + url, + timeout: 30000, + failOnStatusCode: false, + }; + if (headers) { + options.headers = headers; + } + cy.request(options).then((resp) => { + if (resp.status === 200 && JSON.stringify(resp.body).includes(responseBodyContent) === true) { + cy.log( + `The response body of URL: ${url}, now contains the content: ${responseBodyContent}`, + ); + return; + } + + cy.log('The response body of URL doesnt contain the expected content yet, retrying...'); + cy.wait(waitInterval); + this.checkResponseBodyAndStatusCode( + url, + responseBodyContent, + waitInterval, + retryNum + 1, + maxRetryNum, + headers, + ); + }); + } + + static createGitHubRepository(repoName: string) { + const body = { name: repoName }; + this.githubRequest('POST', githubAPIEndpoints.orgRepos, body); + this.checkResponseBodyAndStatusCode( + githubAPIEndpoints.qeRepos(repoName), + `"name":"${repoName}"`, + 2000, + 0, + 3, + this.githubHeaders, + ); + } + + static deleteGitHubRepository(repoName: string) { + this.githubRequest('DELETE', githubAPIEndpoints.qeRepos(repoName)); + } + + static createRepositoryFromTemplate( + templateOwner: string, + templateRepoName: string, + targetOwner: string, + targetRepoName: string, + isPrivate: boolean = false, + ) { + const body = { + owner: targetOwner, + name: targetRepoName, + private: isPrivate, + }; + this.githubRequest( + 'POST', + githubAPIEndpoints.templateRepo(templateOwner, templateRepoName), + body, + ); + } + + static mergePR( + owner: string, + repoName: string, + pullNumber: number, + commitTitle: string, + commitMessage: string, + ) { + const body = { commit_title: `${commitTitle}`, commit_message: `${commitMessage}` }; + APIHelper.githubRequest( + 'PUT', + githubAPIEndpoints.merge(owner, repoName, pullNumber), + body, + ).then((result) => { + expect(result.body.merged).to.be.true; + }); + } +} diff --git a/e2e-tests/utils/Applications.ts b/e2e-tests/utils/Applications.ts new file mode 100644 index 0000000..69c2211 --- /dev/null +++ b/e2e-tests/utils/Applications.ts @@ -0,0 +1,188 @@ +import { pageTitles, FULL_APPLICATION_TITLE } from '../support/constants/PageTitle'; +import { actions, breadcrumb } from '../support/pageObjects/global-po'; +import { + actionsDropdown, + componentsTabPO, + pipelinerunsTabPO, + integrationTestsTabPO, + overviewTabPO, + activityTabPO, + latestCommitsTabPO, + applicationsPagePO, +} from '../support/pageObjects/pages-po'; +import { AddComponentPage } from '../support/pages/AddComponentPage'; +import { ComponentPage } from '../support/pages/ComponentsPage'; +import { CreateApplicationPage } from '../support/pages/CreateApplicationPage'; +import { ComponentsTabPage } from '../support/pages/tabs/ComponentsTabPage'; +import { OverviewTabPage } from '../support/pages/tabs/OverviewTabPage'; +import { hacAPIEndpoints } from '../utils/APIEndpoints'; +import { APIHelper } from '../utils/APIHelper'; +import { Common } from './Common'; +import { UIhelper } from './UIhelper'; + +export class Applications { + static createCleanApp(applicationName: string) { + cy.title().should('eq', `Applications | ${FULL_APPLICATION_TITLE}`); + const createApplicationPage = new CreateApplicationPage(); + createApplicationPage.clickCreateApplication(); + cy.testA11y(`${pageTitles.createApp} page`); + createApplicationPage.setApplicationName(applicationName); + createApplicationPage.clickCreateApplication(); + } + + static deleteApplication(applicationName: string) { + APIHelper.requestHACAPI({ + method: 'DELETE', + url: hacAPIEndpoints.applications(applicationName), + failOnStatusCode: false, + }); + } + + static openKebabMenu(applicationName: string) { + cy.get(`[data-id="${applicationName}"]`).find(actions.kebabButton).click(); + } + + static createApplication(applicationName: string) { + cy.title().should('eq', `${FULL_APPLICATION_TITLE}`); + const createApplicationPage = new CreateApplicationPage(); + createApplicationPage.clickCreateApplication(); + cy.title().should('eq', `${FULL_APPLICATION_TITLE}`); + cy.testA11y(`${pageTitles.createApp} page`); + createApplicationPage.setApplicationName(applicationName); + createApplicationPage.clickAddComponent(); + } + + static createComponent( + publicGitRepo: string, + componentName: string, + pipeline: string, + isPrivate: boolean = false, + applicationName?: string, + dockerfilePath?: string, + secret?: { secretName: string; key: string; value: string }, + ) { + const addComponent = new AddComponentPage(); + const componentPage = new ComponentPage(); + + addComponent.setSource(publicGitRepo); + this.configureComponentsStep(componentName, pipeline, applicationName, dockerfilePath, secret); + addComponent.waitRepoValidated(); + if (isPrivate) { + addComponent.setPrivate(); + } + componentPage.clickSubmitButton(); + } + + static checkComponentInListView( + componentName: string, + applicationName: string, + componentStatus: string, + ) { + this.createdComponentExists(componentName, applicationName); + this.checkComponentStatus(componentName, componentStatus); + } + + static createdComponentExists(componentName: string, applicationName: string) { + this.goToComponentsTab(); + + Common.verifyPageTitle(applicationName); + Common.waitForLoad(); + ComponentsTabPage.getComponentListItem(componentName).should('exist'); + } + + static checkComponentStatus(componentName: string, componentStatus: string) { + cy.get(componentsTabPO.componentListItem(componentName)).contains(componentStatus, { + timeout: 80000, + }); + } + + static checkBuildTrigger(componentName: string, componentLabel: string) { + cy.get(componentsTabPO.componentListItem(componentName)).contains(componentLabel, { + timeout: 15000, + }); + } + + static clickActionsDropdown(dropdownItem: string) { + cy.get(actionsDropdown.dropdown).click(); + cy.contains(dropdownItem).click(); + } + + static clickBreadcrumbLink(link: string) { + cy.get(breadcrumb.breadcrumbLink).contains(link).click(); + Common.waitForLoad(); + } + + static goToOverviewTab() { + cy.get(overviewTabPO.clickTab).click(); + Common.waitForLoad(); + return new OverviewTabPage(); + } + + static goToComponentsTab() { + cy.get(componentsTabPO.clickTab).click(); + } + + static goToActivityTab() { + cy.get(activityTabPO.clickTab, { timeout: 30000 }).click(); + Common.waitForLoad(); + } + + static goToLatestCommitsTab() { + this.goToActivityTab(); + cy.get(latestCommitsTabPO.clickTab, { timeout: 30000 }).click(); + } + + static goToPipelinerunsTab() { + this.goToActivityTab(); + cy.get(pipelinerunsTabPO.clickTab, { timeout: 30000 }).click(); + Common.waitForLoad(); + } + + static goToIntegrationTestsTab() { + cy.get(integrationTestsTabPO.clickTab).click(); + Common.waitForLoad(); + } + + static configureComponentsStep( + componentName: string, + pipeline: string, + applicationName?: string, + dockerfilePath?: string, + secret?: { secretName: string; key: string; value: string }, + ) { + const componentPage = new ComponentPage(); + componentPage.editComponentName(componentName); + componentPage.setPipeline(pipeline); + + if (applicationName) { + componentPage.setApplicationName(applicationName); + } + if (dockerfilePath) { + componentPage.setDockerfilePath(dockerfilePath); + } + if (secret) { + UIhelper.clickButton('Add secret'); + cy.contains(applicationsPagePO.formGroup, 'Select or enter secret name').within(() => { + cy.get('input').clear().type(secret.secretName); + cy.contains( + 'button', + `${secret.secretName === 'snyk-secret' ? '' : 'Create "'}${secret.secretName}`, + ).click(); + }); + if (secret.secretName !== 'snyk-secret') { + cy.get(applicationsPagePO.secretKey).clear().type(secret.key); + } + cy.get(applicationsPagePO.secretValue) + .clear() + .invoke('attr', 'style', 'color: transparent;text-shadow: 0 0 8px rgba(0,0,0,0.5);') + .type(secret.value, { log: false }); + UIhelper.clickButton('Create').should('not.exist'); + } + } + + static verifySecretUsingAPI(secretName: string, key: string, value: string) { + APIHelper.requestHACAPI({ url: hacAPIEndpoints.secrets(secretName) }) + .its(`body.data.${key}`) + .should('eq', Buffer.from(value, 'utf8').toString('base64')); + } +} diff --git a/e2e-tests/utils/Common.ts b/e2e-tests/utils/Common.ts new file mode 100644 index 0000000..a87d062 --- /dev/null +++ b/e2e-tests/utils/Common.ts @@ -0,0 +1,93 @@ +import { NavItem } from '../support/constants/PageTitle'; +import { consentButton, navigation, waits } from '../support/pageObjects/global-po'; + +export class Common { + static openAppStudioBaseURL() { + cy.visit(Cypress.env('KONFLUX_BASE_URL')); + } + + static navigateTo(link: NavItem) { + for (const item in NavItem) { + cy.get(navigation.sideNavigation) + .contains('a', NavItem[item], { timeout: 30000 }) + .should('be.visible'); + } + cy.get(navigation.sideNavigation).contains('a', NavItem[link]).click(); + Common.waitForLoad(); + } + + static openURL(URL: string) { + cy.url().then(($url) => { + if ($url !== URL) { + cy.visit(URL); + } + }); + } + + static generateAppName(prefix = 'test-app') { + const name = `${prefix}-${new Date().getTime()}`; + return name.substring(0, name.length - 4); + } + + static openApplicationURL(applicationName: string) { + const workspacePathMatcher = new RegExp(/workspaces\/([^/]+)/); + cy.url().then((url) => { + const [, workspace = ''] = url.match(workspacePathMatcher) || []; + + Common.openURL( + `${Cypress.env( + 'KONFLUX_BASE_URL', + )}/workspaces/${workspace}/applications/${applicationName.replace('.', '-')}`, + ); + Common.verifyPageTitle(applicationName); + Common.waitForLoad(); + }); + } + + static waitForLoad(timeout = 120000) { + for (const item of Object.values(waits)) { + cy.get(item, { timeout }).should('not.exist'); + } + } + + static verifyPageTitle(title: string) { + cy.contains('h1', title, { timeout: 180000 }).should('be.visible'); + } + + static clickOnConsentButton() { + cy.get('body') + .find(consentButton) + .its('length') + .then((res) => { + if (res > 0) { + cy.get(consentButton).click(); + } + }); + } + + static cleanNamespace() { + if (Cypress.env('CLEAN_NAMESPACE') === 'true') { + cy.exec('export KUBECONFIG=~/.kube/appstudio-config && ./delete-script.sh', { + timeout: 600000, + }) + .its('stdout') + .should('contain', 'Done running the script'); + } + } + + static getOrigin() { + return new URL(Cypress.env('KONFLUX_BASE_URL')).origin; + } + + static checkRowValues(locator: string, valuesToAssert: string[]) { + for (const value of valuesToAssert) { + cy.contains(`[data-id="${locator}"]`, value, { timeout: 20000 }).should('exist'); + } + } + + static getGitHub2FAOTP(): string { + const secret = Cypress.env('GH_SETUP_KEY'); + const token = require('otplib').authenticator.generate(secret); + return token; + } +} diff --git a/e2e-tests/utils/Login.ts b/e2e-tests/utils/Login.ts new file mode 100644 index 0000000..1056b81 --- /dev/null +++ b/e2e-tests/utils/Login.ts @@ -0,0 +1,39 @@ +import { NavItem, pageTitles } from '../support/constants/PageTitle'; +import { loginPO, kcLoginPO } from '../support/pageObjects/global-po'; +import { GetStartedPage } from '../support/pages/GetStartedPage'; +import { Common } from './Common'; + +export class Login { + static login( + username: string = Cypress.env('USERNAME'), + password: string = Cypress.env('PASSWORD'), + ) { + cy.visit(Cypress.env('KONFLUX_BASE_URL')); + // cy.get(loginPO.usernameForm); + // cy.get(loginPO.username).find('[type="text"]').type(username); + // cy.get(loginPO.nextButton).click(); + // cy.get(loginPO.password).find('[type="password"]').type(password, { log: false }); + // cy.get(loginPO.loginButton).click(); + this.waitForApps(); + } + + static prCheckLogin( + username: string = Cypress.env('USERNAME'), + password: string = Cypress.env('PASSWORD'), + ) { + cy.visit(Cypress.env('KONFLUX_BASE_URL')); + // cy.get(kcLoginPO.username).type(username); + // cy.get(kcLoginPO.password).type(password, { log: false }); + // cy.get(kcLoginPO.loginButton).click(); + this.waitForApps(); + } + + private static waitForApps() { + Common.waitForLoad(); + GetStartedPage.waitForLoad(); + Common.navigateTo(NavItem.applications); + Common.verifyPageTitle(pageTitles.applications); + Common.waitForLoad(); + cy.testA11y(`${pageTitles.applications} page`); + } +} diff --git a/e2e-tests/utils/Tokens.ts b/e2e-tests/utils/Tokens.ts new file mode 100644 index 0000000..a006cc6 --- /dev/null +++ b/e2e-tests/utils/Tokens.ts @@ -0,0 +1,28 @@ +import { hacAPIEndpoints } from './APIEndpoints'; +import { APIHelper } from './APIHelper'; + +export class Tokens { + static removeBindingsAndTokens() { + removeAllResources('spiaccesstokenbinding'); + removeAllResources('spiaccesstoken'); + } +} + +function removeAllResources(resourceType: string) { + const getResources = { + method: 'GET', + url: hacAPIEndpoints.resources(resourceType), + }; + APIHelper.requestHACAPI(getResources) + .its('body') + .then((respBody) => { + for (const item of respBody.items) { + const resourceName = item.metadata.name; + const removeResources = { + method: 'DELETE', + url: `${hacAPIEndpoints.resources(resourceType)}/${resourceName}`, + }; + APIHelper.requestHACAPI(removeResources).its('status').should('equal', 200); + } + }); +} diff --git a/e2e-tests/utils/UIhelper.ts b/e2e-tests/utils/UIhelper.ts new file mode 100644 index 0000000..fb994f4 --- /dev/null +++ b/e2e-tests/utils/UIhelper.ts @@ -0,0 +1,120 @@ +import { UIhelperPO } from '../support/pageObjects/global-po'; +import { Common } from './Common'; + +export class UIhelper { + static checkTableHasRows(tableAriaLabel: string, text: string, occurrence: number) { + cy.get(`[aria-label="${tableAriaLabel}"]`) + .find('tr') + .filter(`:contains(${text})`) + .should('have.length', occurrence); + } + + static clickTab(tabName: string, waitForLoad: boolean = true) { + cy.contains(UIhelperPO.tabs, new RegExp(`^\\s*${tabName}\\s*$`)).click(); + if (waitForLoad) { + Common.waitForLoad(); + } + } + + static inputValueInTextBoxByLabelName(label: string, value: string) { + return cy + .contains(UIhelperPO.formGroupLabelText, new RegExp(`^\\s*${label}\\s*$`)) + .parentsUntil(UIhelperPO.formGroup) + .eq(-1) + .parent() + .find('input') + .clear() + .type(value); + } + + static selectValueInDropdownbyLabelName(label: string, value: string) { + cy.contains(UIhelperPO.formGroup, label).within(() => { + cy.get('div[data-test="dropdown"] > button').click(); + cy.contains('a', value).click().should('not.exist'); + }); + } + + static verifyValueInDropdownbyLabelName(label: string, value: string, disabled: boolean = false) { + cy.contains(UIhelperPO.formGroup, label).within(() => { + if (disabled) { + cy.contains(UIhelperPO.dropdownToggle, value).should('be.visible').should('be.disabled'); + } else { + cy.contains(UIhelperPO.dropdownToggle, value).should('be.visible').should('be.enabled'); + } + }); + } + + static verifyLabelAndValue(label: string, value: string) { + cy.log(`Validate Label : "${label}" should have value : "${value}"`); + return cy + .contains(UIhelperPO.listGroup_dt, new RegExp(`^\\s*${label}\\s*$`)) + .siblings('dd') + .contains(new RegExp(`^\\s*${value}\\s*$`)) + .scrollIntoView() + .should('be.visible'); + } + + static clickButton(label: string, options?: { invoke?: boolean; force?: boolean }) { + if (options?.invoke) { + return cy.contains(UIhelperPO.pf5_button, new RegExp(`^\\s*${label}\\s*$`)).invoke('click'); + } else if (options?.force) { + return cy + .contains(UIhelperPO.pf5_button, new RegExp(`^\\s*${label}\\s*$`)) + .click({ force: true }); + } + return cy.contains(UIhelperPO.pf5_button, new RegExp(`^\\s*${label}\\s*$`)).click(); + } + + static clickLink( + link: string, + options?: { invoke?: boolean; force?: boolean; removeTarget?: boolean }, + ) { + if (options?.invoke) { + return cy.contains('a', new RegExp(`^\\s*${link}\\s*$`)).invoke('click'); + } else if (options?.force) { + return cy.contains('a', new RegExp(`^\\s*${link}\\s*$`)).click({ force: true }); + } else if (options?.removeTarget) { + return cy + .contains('a', new RegExp(`^\\s*${link}\\s*$`)) + .invoke('removeAttr', 'target') + .click(); + } + return cy.contains('a', new RegExp(`^\\s*${link}\\s*$`)).click(); + } + + static getTableRow(tableAriaLabel: string, uniqueRowText: string | RegExp) { + return cy + .contains(UIhelperPO.tableRow(tableAriaLabel), uniqueRowText, { timeout: 60000 }) + .scrollIntoView(); + } + + static verifyRowInTable( + tableAriaLabel: string, + uniqueRowText: string | RegExp, + rowValues: string[] | RegExp[], + ) { + UIhelper.getTableRow(tableAriaLabel, uniqueRowText).within(() => { + rowValues.forEach((val) => { + cy.contains(val).should('be.visible'); + }); + }); + } + + static clickRowCellInTable( + tableAriaLabel: string, + uniqueRowText: string | RegExp, + cellTextToClick: string | RegExp, + ) { + UIhelper.getTableRow(tableAriaLabel, uniqueRowText).contains(cellTextToClick).click(); + } + + static verifyGraphNodes(nodeText: string, success = true) { + cy.contains(UIhelperPO.graphNode, nodeText).within(() => { + cy.get(success ? UIhelperPO.pipelineStatusSuccess : UIhelperPO.pipelineNode, { + timeout: 60000, + }) + .scrollIntoView() + .should('be.visible'); + }); + } +} diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock new file mode 100644 index 0000000..e6ab059 --- /dev/null +++ b/e2e-tests/yarn.lock @@ -0,0 +1,3491 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^2.88.10": + version "2.88.12" + resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz" + integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + performance-now "^2.1.0" + qs "~6.10.3" + safe-buffer "^5.1.2" + tough-cookie "^4.1.3" + tunnel-agent "^0.6.0" + uuid "^8.3.2" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.1" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" + integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.19.0": + version "0.19.1" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz" + integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + dependencies: + "@eslint/object-schema" "^2.1.5" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.9.0": + version "0.9.1" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz" + integrity sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz" + integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.16.0": + version "9.16.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz" + integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg== + +"@eslint/object-schema@^2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz" + integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== + +"@eslint/plugin-kit@^0.2.3": + version "0.2.4" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz" + integrity sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg== + dependencies: + levn "^0.4.1" + +"@ffmpeg-installer/ffmpeg@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@ffmpeg-installer/ffmpeg/-/ffmpeg-1.1.0.tgz" + integrity sha512-Uq4rmwkdGxIa9A6Bd/VqqYbT7zqh1GrT5/rFwCwKM70b42W5gIjWeVETq6SdcL0zXqDtY081Ws/iJWhr1+xvQg== + optionalDependencies: + "@ffmpeg-installer/darwin-arm64" "4.1.5" + "@ffmpeg-installer/darwin-x64" "4.1.0" + "@ffmpeg-installer/linux-arm" "4.1.3" + "@ffmpeg-installer/linux-arm64" "4.1.4" + "@ffmpeg-installer/linux-ia32" "4.1.0" + "@ffmpeg-installer/linux-x64" "4.1.0" + "@ffmpeg-installer/win32-ia32" "4.1.0" + "@ffmpeg-installer/win32-x64" "4.1.0" + +"@ffmpeg-installer/linux-x64@4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@ffmpeg-installer/linux-x64/-/linux-x64-4.1.0.tgz" + integrity sha512-Y5BWhGLU/WpQjOArNIgXD3z5mxxdV8c41C+U15nsE5yF8tVcdCGet5zPs5Zy3Ta6bU7haGpIzryutqCGQA/W8A== + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== + +"@humanwhocodes/retry@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz" + integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== + +"@otplib/core@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@otplib/core/-/core-12.0.1.tgz" + integrity sha512-4sGntwbA/AC+SbPhbsziRiD+jNDdIzsZ3JUyfZwjtKyc/wufl1pnSIaG4Uqx8ymPagujub0o92kgBnB89cuAMA== + +"@otplib/plugin-crypto@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@otplib/plugin-crypto/-/plugin-crypto-12.0.1.tgz" + integrity sha512-qPuhN3QrT7ZZLcLCyKOSNhuijUi9G5guMRVrxq63r9YNOxxQjPm59gVxLM+7xGnHnM6cimY57tuKsjK7y9LM1g== + dependencies: + "@otplib/core" "^12.0.1" + +"@otplib/plugin-thirty-two@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@otplib/plugin-thirty-two/-/plugin-thirty-two-12.0.1.tgz" + integrity sha512-MtT+uqRso909UkbrrYpJ6XFjj9D+x2Py7KjTO9JDPhL0bJUYVu5kFP4TFZW4NFAywrAtFRxOVY261u0qwb93gA== + dependencies: + "@otplib/core" "^12.0.1" + thirty-two "^1.0.2" + +"@otplib/preset-default@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@otplib/preset-default/-/preset-default-12.0.1.tgz" + integrity sha512-xf1v9oOJRyXfluBhMdpOkr+bsE+Irt+0D5uHtvg6x1eosfmHCsCC6ej/m7FXiWqdo0+ZUI6xSKDhJwc8yfiOPQ== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/plugin-crypto" "^12.0.1" + "@otplib/plugin-thirty-two" "^12.0.1" + +"@otplib/preset-v11@^12.0.1": + version "12.0.1" + resolved "https://registry.npmjs.org/@otplib/preset-v11/-/preset-v11-12.0.1.tgz" + integrity sha512-9hSetMI7ECqbFiKICrNa4w70deTUfArtwXykPUvSHWOdzOlfa9ajglu7mNCntlvxycTiOAXkQGwjQCzzDEMRMg== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/plugin-crypto" "^12.0.1" + "@otplib/plugin-thirty-two" "^12.0.1" + +"@reportportal/agent-js-cypress@^5.1.2": + version "5.4.0" + resolved "https://registry.npmjs.org/@reportportal/agent-js-cypress/-/agent-js-cypress-5.4.0.tgz" + integrity sha512-PCXEZ6PrHm/lAf5D7vHngNmRG0bhU8AUkav7oRbg9jrYA1mEQb5IJQVRbm8ltRzFurTShiGcZr95XVeRp5/EjQ== + dependencies: + "@ffmpeg-installer/ffmpeg" "^1.1.0" + "@reportportal/client-javascript" "~5.3.0" + ffmpeg "^0.0.4" + ffprobe-static "^3.1.0" + fluent-ffmpeg "^2.1.3" + glob "^9.3.5" + minimatch "^3.1.2" + mocha "^10.2.0" + node-ipc "9.1.1" + +"@reportportal/client-javascript@~5.3.0": + version "5.3.0" + resolved "https://registry.npmjs.org/@reportportal/client-javascript/-/client-javascript-5.3.0.tgz" + integrity sha512-328279/aC6rXe6BNEZeCXJ1/b5k05RdC5HSR8GYnr6TFWvYV5DQd4/E33ekhT0+Psenf6sMcccl24lZZdxKOvA== + dependencies: + axios "^1.7.7" + axios-retry "^4.1.0" + glob "^8.1.0" + ini "^2.0.0" + microtime "^3.1.1" + uniqid "^5.4.0" + uuid "^9.0.1" + +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/fs-extra@^9.0.13": + version "9.0.13" + resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@*": + version "22.10.1" + resolved "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz" + integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== + dependencies: + undici-types "~6.20.0" + +"@types/node@^14.14.31": + version "14.18.63" + resolved "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz" + integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== + +"@types/node@^17.0.13": + version "17.0.45" + resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + +"@types/sinonjs__fake-timers@8.1.1": + version "8.1.1" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" + integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== + +"@types/sizzle@^2.3.2": + version "2.3.9" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz" + integrity sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w== + +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@^1.0.0, assert-plus@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async@^0.2.9: + version "0.2.10" + resolved "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + integrity sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ== + +async@^3.2.0: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.13.2" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== + +"axe-core@^3 || ^4", axe-core@^4.4.2: + version "4.10.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz" + integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w== + +axios-retry@^4.1.0: + version "4.5.0" + resolved "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz" + integrity sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ== + dependencies: + is-retry-allowed "^2.2.0" + +axios@^1.7.7, "axios@0.x || 1.x": + version "1.7.9" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +cachedir@^2.3.0: + version "2.4.0" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== + +call-bind-apply-helpers@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-table3@~0.6.1: + version "0.6.5" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cross-spawn@^6.0.5: + version "6.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" + integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.5: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +cypress-axe@^1.4.0: + version "1.5.0" + resolved "https://registry.npmjs.org/cypress-axe/-/cypress-axe-1.5.0.tgz" + integrity sha512-Hy/owCjfj+25KMsecvDgo4fC/781ccL+e8p+UUYoadGVM2ogZF9XIKbiM6KI8Y3cEaSreymdD6ZzccbI2bY0lQ== + +cypress-high-resolution@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/cypress-high-resolution/-/cypress-high-resolution-1.0.0.tgz" + integrity sha512-uZRmUVBYbh7Hdid6dwzFp2/iCf9FWlK6qPTQZ7twzqkmpRtfTGOXlUttBSts8EHBu9wye3HgwVY/Lr2Pzipckw== + dependencies: + debug "^4.3.2" + +cypress-mochawesome-reporter@^3.4.0: + version "3.8.2" + resolved "https://registry.npmjs.org/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-3.8.2.tgz" + integrity sha512-oJZkNzhNmN9ZD+LmZyFuPb8aWaIijyHyqYh52YOBvR6B6ckfJNCHP3A98a+/nG0H4t46CKTNwo+wNpMa4d2kjA== + dependencies: + commander "^10.0.1" + fs-extra "^10.0.1" + mochawesome "^7.1.3" + mochawesome-merge "^4.2.1" + mochawesome-report-generator "^6.2.0" + +cypress-multi-reporters@^1.6.0: + version "1.6.4" + resolved "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.6.4.tgz" + integrity sha512-3xU2t6pZjZy/ORHaCvci5OT1DAboS4UuMMM8NBAizeb2C9qmHt+cgAjXgurazkwkPRdO7ccK39M5ZaPCju0r6A== + dependencies: + debug "^4.3.4" + lodash "^4.17.21" + +cypress-terminal-report@^5.0.2: + version "5.3.12" + resolved "https://registry.npmjs.org/cypress-terminal-report/-/cypress-terminal-report-5.3.12.tgz" + integrity sha512-rtqPJN7YF9LeMUICSKAF25qEscEzG6ECnRYuNVVq8rZFF5u0HXSJsrtPMqIZXeJP6NP9plZrVXoaQkOhQ8cckA== + dependencies: + chalk "^4.0.0" + fs-extra "^10.1.0" + process "^0.11.10" + semver "^7.5.4" + tv4 "^1.3.0" + +"cypress@^10 || ^11 || ^12 || ^13", cypress@>=10.0.0, cypress@>=6.2.0, cypress@12.7.0: + version "12.7.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-12.7.0.tgz" + integrity sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA== + dependencies: + "@cypress/request" "^2.88.10" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "8.1.1" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + buffer "^5.6.0" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.1" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.4" + enquirer "^2.3.6" + eventemitter2 "6.4.7" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.6" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + request-progress "^3.0.0" + semver "^7.3.2" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + yauzl "^2.10.0" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +dateformat@^4.5.1: + version "4.6.3" + resolved "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz" + integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== + +dayjs@^1.10.4: + version "1.11.13" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +diff@^5.0.0, diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +dunder-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz" + integrity sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-errors "^1.3.0" + gopd "^1.2.0" + +easy-stack@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz" + integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": + version "2.4.1" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2, es-abstract@^1.23.5: + version "1.23.5" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz" + integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.3" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.3" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-to-primitive@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" + integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== + +eslint-plugin-cypress@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-4.1.0.tgz" + integrity sha512-JhqkMY02mw74USwK9OFhectx3YSj6Co1NgWBxlGdKvlqiAp9vdEuQqt33DKGQFvvGS/NWtduuhWXWNnU29xDSg== + dependencies: + globals "^15.11.0" + +eslint-scope@^8.2.0: + version "8.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz" + integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@>=7.0.0, eslint@>=9: + version "9.16.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz" + integrity sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.19.0" + "@eslint/core" "^0.9.0" + "@eslint/eslintrc" "^3.2.0" + "@eslint/js" "9.16.0" + "@eslint/plugin-kit" "^0.2.3" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.5" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.2.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== + dependencies: + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" + +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +event-pubsub@4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz" + integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== + +eventemitter2@6.4.7: + version "6.4.7" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" + integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +ffmpeg@^0.0.4: + version "0.0.4" + resolved "https://registry.npmjs.org/ffmpeg/-/ffmpeg-0.0.4.tgz" + integrity sha512-3TgWUJJlZGQn+crJFyhsO/oNeRRnGTy6GhgS98oUCIfZrOW5haPPV7DUfOm3xJcHr5q3TJpjk2GudPutrNisRA== + dependencies: + when ">= 0.0.1" + +ffprobe-static@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/ffprobe-static/-/ffprobe-static-3.1.0.tgz" + integrity sha512-Dvpa9uhVMOYivhHKWLGDoa512J751qN1WZAIO+Xw4L/mrUSPxS4DApzSUDbCFE/LUq2+xYnznEahTd63AqBSpA== + +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +fluent-ffmpeg@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.3.tgz" + integrity sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q== + dependencies: + async "^0.2.9" + which "^1.1.1" + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fs-extra@^10.0.0, fs-extra@^10.0.1, fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsu@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz" + integrity sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.5" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz" + integrity sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg== + dependencies: + call-bind-apply-helpers "^1.0.0" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +glob@^9.3.0, glob@^9.3.5: + version "9.3.5" + resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +global-dirs@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== + dependencies: + ini "2.0.0" + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^15.11.0: + version "15.13.0" + resolved "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz" + integrity sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g== + +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + +gopd@^1.0.1, gopd@^1.1.0, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-proto@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^2.0.0, ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" + +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz" + integrity sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw== + dependencies: + call-bind "^1.0.7" + has-tostringtag "^1.0.2" + +is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +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" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== + dependencies: + hasown "^2.0.2" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz" + integrity sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA== + dependencies: + call-bind "^1.0.7" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz" + integrity sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw== + dependencies: + call-bind "^1.0.7" + has-tostringtag "^1.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.4: + version "1.2.0" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz" + integrity sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA== + dependencies: + call-bind "^1.0.7" + gopd "^1.1.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-retry-allowed@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz" + integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg== + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.7, is-string@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz" + integrity sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g== + dependencies: + call-bind "^1.0.7" + has-tostringtag "^1.0.2" + +is-symbol@^1.0.4, is-symbol@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz" + integrity sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A== + dependencies: + call-bind "^1.0.7" + has-symbols "^1.0.3" + safe-regex-test "^1.0.3" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +js-message@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/js-message/-/js-message-1.0.5.tgz" + integrity sha512-hTqHqrm7jrZ+iN93QsKcNOTSgX3F+2NSgdnF+xvf8FfhC2MPqYRzzgXQ1LlhfyIzPTS6hL6Zea0/gIb6hktkHw== + +js-queue@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/js-queue/-/js-queue-2.0.0.tgz" + integrity sha512-SW0rTTG+TBPVD1Kp6HtnOr9kX3//EWA6qMlP2Y/WxbKsSNCBuJbWv3EDB5noKJBEkHYi2mDY+xqMn4Y0QHyjyg== + dependencies: + easy-stack "^1.0.0" + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +listr2@^3.8.3: + version "3.14.0" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.1" + through "^2.3.8" + wrap-ansi "^7.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz" + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz" + integrity sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg== + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isobject@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz" + integrity sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +md5@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +microtime@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz" + integrity sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg== + dependencies: + node-addon-api "^5.0.0" + node-gyp-build "^4.4.0" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +mkdirp@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mocha-junit-reporter@^2.0.2: + version "2.2.1" + resolved "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz" + integrity sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw== + dependencies: + debug "^4.3.4" + md5 "^2.3.0" + mkdirp "^3.0.0" + strip-ansi "^6.0.1" + xml "^1.0.1" + +mocha@^10.2.0, mocha@>=2.2.5, mocha@>=3.1.2, mocha@>=7: + version "10.8.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +mochawesome-merge@^4.2.1: + version "4.3.0" + resolved "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.3.0.tgz" + integrity sha512-1roR6g+VUlfdaRmL8dCiVpKiaUhbPVm1ZQYUM6zHX46mWk+tpsKVZR6ba98k2zc8nlPvYd71yn5gyH970pKBSw== + dependencies: + fs-extra "^7.0.1" + glob "^7.1.6" + yargs "^15.3.1" + +mochawesome-report-generator@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-6.2.0.tgz" + integrity sha512-Ghw8JhQFizF0Vjbtp9B0i//+BOkV5OWcQCPpbO0NGOoxV33o+gKDYU0Pr2pGxkIHnqZ+g5mYiXF7GMNgAcDpSg== + dependencies: + chalk "^4.1.2" + dateformat "^4.5.1" + escape-html "^1.0.3" + fs-extra "^10.0.0" + fsu "^1.1.1" + lodash.isfunction "^3.0.9" + opener "^1.5.2" + prop-types "^15.7.2" + tcomb "^3.2.17" + tcomb-validation "^3.3.0" + validator "^13.6.0" + yargs "^17.2.1" + +mochawesome@^7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/mochawesome/-/mochawesome-7.1.3.tgz" + integrity sha512-Vkb3jR5GZ1cXohMQQ73H3cZz7RoxGjjUo0G5hu0jLaW+0FdUxUwg3Cj29bqQdh0rFcnyV06pWmqmi5eBPnEuNQ== + dependencies: + chalk "^4.1.2" + diff "^5.0.0" + json-stringify-safe "^5.0.1" + lodash.isempty "^4.4.0" + lodash.isfunction "^3.0.9" + lodash.isobject "^3.0.2" + lodash.isstring "^4.0.1" + mochawesome-report-generator "^6.2.0" + strip-ansi "^6.0.1" + uuid "^8.3.2" + +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-gyp-build@^4.4.0: + version "4.8.4" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +node-ipc@9.1.1: + version "9.1.1" + resolved "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.1.tgz" + integrity sha512-FAyICv0sIRJxVp3GW5fzgaf9jwwRQxAKDJlmNFUL5hOy+W4X/I5AypyHoq0DXXbo9o/gt79gj++4cMr4jVWE/w== + dependencies: + event-pubsub "4.3.0" + js-message "1.0.5" + js-queue "2.0.0" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-all@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz" + integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ== + dependencies: + ansi-styles "^3.2.1" + chalk "^2.4.1" + cross-spawn "^6.0.5" + memorystream "^0.3.1" + minimatch "^3.0.4" + pidtree "^0.3.0" + read-pkg "^3.0.0" + shell-quote "^1.6.1" + string.prototype.padend "^3.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.1, object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== + +otplib@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/otplib/-/otplib-12.0.1.tgz" + integrity sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg== + dependencies: + "@otplib/core" "^12.0.1" + "@otplib/preset-default" "^12.0.1" + "@otplib/preset-v11" "^12.0.1" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.6.1: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pidtree@^0.3.0: + version "0.3.1" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" + integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA== + +pify@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@^3.4.2: + version "3.4.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz" + integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== + +pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== + +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@~6.10.3: + version "6.10.5" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz" + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reflect.getprototypeof@^1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz" + integrity sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + dunder-proto "^1.0.0" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + gopd "^1.2.0" + which-builtin-type "^1.2.0" + +regexp.prototype.flags@^1.5.3: + version "1.5.3" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz" + integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.2" + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== + dependencies: + throttleit "^1.0.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@^1.10.0: + version "1.22.8" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.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" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" + +safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +semver@^5.5.0, "semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^7.3.2: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +semver@^7.5.4: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1: + version "1.8.2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.padend@^3.0.0: + version "3.1.6" + resolved "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz" + integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tcomb-validation@^3.3.0: + version "3.4.1" + resolved "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz" + integrity sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA== + dependencies: + tcomb "^3.0.0" + +tcomb@^3.0.0, tcomb@^3.2.17: + version "3.2.29" + resolved "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz" + integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ== + +thirty-two@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/thirty-two/-/thirty-two-1.0.2.tgz" + integrity sha512-OEI0IWCe+Dw46019YLl6V10Us5bi574EvlJEOcAkB29IzQ/mYD1A6RyNHLjZPiHCmuodxvgF6U+vZO1L15lxVA== + +throttleit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tmp@~0.2.1: + version "0.2.3" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tough-cookie@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tslib@^2.1.0: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tv4@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz" + integrity sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" + +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-byte-offset@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz" + integrity sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + reflect.getprototypeof "^1.0.6" + +typed-array-length@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +uniqid@^5.4.0: + version "5.4.0" + resolved "https://registry.npmjs.org/uniqid/-/uniqid-5.4.0.tgz" + integrity sha512-38JRbJ4Fj94VmnC7G/J/5n5SC7Ab46OM5iNtSstB/ko3l1b5g7ALt4qzHFgGciFkyiRNtDXtLNb+VsxtMSE77A== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validator@^13.6.0: + version "13.12.0" + resolved "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz" + integrity sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +"when@>= 0.0.1": + version "3.7.8" + resolved "https://registry.npmjs.org/when/-/when-3.7.8.tgz" + integrity sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw== + +which-boxed-primitive@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz" + integrity sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.0" + is-number-object "^1.1.0" + is-string "^1.1.0" + is-symbol "^1.1.0" + +which-builtin-type@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz" + integrity sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA== + dependencies: + call-bind "^1.0.7" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.2" + which-typed-array "^1.1.15" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.16" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz" + integrity sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^1.1.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xml@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz" + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^15.3.1: + version "15.4.1" + resolved "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.2.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==