From 411832770b94cee4156c416218ddf0111488bafc Mon Sep 17 00:00:00 2001 From: Anton Lantukh Date: Mon, 25 Sep 2023 10:54:25 +0200 Subject: [PATCH] fix: jwpltx crash fix and multiple test improvements * fix: null ref in jwpltx crashing e2e tests * chore(project): test fixes * chore: fix payments tests * chore: fix scrolling and finding tests * chore: fix more tests --------- Co-authored-by: Danny Budzinski --- package.json | 8 +- public/jwpltx.js | 9 +- .../DevConfigSelector/DevConfigSelector.tsx | 12 +- src/containers/Layout/Layout.module.scss | 4 + src/containers/Layout/Layout.tsx | 11 +- test-e2e/codecept.desktop.js | 4 +- test-e2e/codecept.mobile.js | 4 +- test-e2e/tests/account_test.ts | 33 +- test-e2e/tests/home_test.ts | 6 +- test-e2e/tests/language_test.ts | 3 +- test-e2e/tests/payments/coupons_test.ts | 11 +- test-e2e/tests/payments/subscription_test.ts | 26 +- .../tests/watch_history/logged_in_test.ts | 31 +- test-e2e/utils/payments.ts | 34 +- test-e2e/utils/steps_file.ts | 166 ++--- test-e2e/utils/watch_history.ts | 2 +- yarn.lock | 649 ++++++++++-------- 17 files changed, 558 insertions(+), 455 deletions(-) diff --git a/package.json b/package.json index 9a7d06ea5..0468ddacb 100644 --- a/package.json +++ b/package.json @@ -31,8 +31,8 @@ "lint:ts": "tsc --pretty --noEmit -p .", "lint:stylelint": "stylelint '**/*.{css,scss}'", "commit-msg": "commitlint --edit $1", - "codecept:mobile": "cd test-e2e && rm -rf \"./output/mobile\" && codeceptjs --config ./codecept.mobile.js run-workers --suites ${WORKER_COUNT:=8} ", - "codecept:desktop": "cd test-e2e && rm -rf \"./output/desktop\" && codeceptjs --config ./codecept.desktop.js run-workers --suites ${WORKER_COUNT:=8} ", + "codecept:mobile": "cd test-e2e && rm -rf \"./output/mobile\" && codeceptjs run-workers --suites ${WORKER_COUNT:=8} --config ./codecept.mobile.js", + "codecept:desktop": "cd test-e2e && rm -rf \"./output/desktop\" && codeceptjs run-workers --suites ${WORKER_COUNT:=8} --config ./codecept.desktop.js", "serve-report:mobile": "cd test-e2e && allure serve \"./output/mobile\"", "serve-report:desktop": "cd test-e2e && allure serve \"./output/desktop\"", "codecept-serve:mobile": "yarn codecept:mobile ; yarn serve-report:mobile", @@ -90,7 +90,7 @@ "@vitejs/plugin-react": "^4.0.4", "@vitest/coverage-v8": "^0.33.0", "allure-commandline": "^2.17.2", - "codeceptjs": "3.4.1", + "codeceptjs": "3.5.5", "confusing-browser-globals": "^1.0.10", "csv-parse": "^5.4.0", "depcheck": "^1.4.3", @@ -106,7 +106,7 @@ "lint-staged": "^10.5.4", "luxon": "^3.2.1", "npm-run-all": "^4.1.5", - "playwright": "^1.33.0", + "playwright": "^1.38.1", "postcss": "^8.3.5", "postcss-import": "^14.0.2", "postcss-scss": "^4.0.4", diff --git a/public/jwpltx.js b/public/jwpltx.js index 991b2eaf9..f66fbd828 100644 --- a/public/jwpltx.js +++ b/public/jwpltx.js @@ -41,11 +41,16 @@ window.jwpltx = window.jwpltx || {}; // Sends the last ping when closing the player or window function sendRemainingData() { + // This is rare, but happens in e2e tests and can occur if the user closes the player really fast before any ticks. + // There is no data, so just skip. + if (!uri) { + return; + } + if (uri.pw === -1) { clearLiveInterval(); } else { - const pw = getCurrentProgressQuantile(lastVp, uri.vd); - uri.pw = pw; + uri.pw = getCurrentProgressQuantile(lastVp, uri.vd); } clearSeekingTimeout(); diff --git a/src/components/DevConfigSelector/DevConfigSelector.tsx b/src/components/DevConfigSelector/DevConfigSelector.tsx index 4aa550609..a5020d4be 100644 --- a/src/components/DevConfigSelector/DevConfigSelector.tsx +++ b/src/components/DevConfigSelector/DevConfigSelector.tsx @@ -27,7 +27,17 @@ const DevConfigSelector = ({ selectedConfig }: Props) => { [configNavigate], ); - return ; + return ( + + ); }; export default DevConfigSelector; diff --git a/src/containers/Layout/Layout.module.scss b/src/containers/Layout/Layout.module.scss index d74885394..5fef6cf3a 100644 --- a/src/containers/Layout/Layout.module.scss +++ b/src/containers/Layout/Layout.module.scss @@ -27,6 +27,10 @@ div.footer { } } +div.testFixMargin { + margin-bottom: 50px; +} + .divider { width: 100%; border: none; diff --git a/src/containers/Layout/Layout.tsx b/src/containers/Layout/Layout.tsx index f2ec9a44b..b92249f0f 100644 --- a/src/containers/Layout/Layout.tsx +++ b/src/containers/Layout/Layout.tsx @@ -3,6 +3,7 @@ import { Helmet } from 'react-helmet'; import { useTranslation } from 'react-i18next'; import { Outlet, useLocation, useNavigate } from 'react-router'; import shallow from 'zustand/shallow'; +import classNames from 'classnames'; import styles from './Layout.module.scss'; @@ -21,6 +22,7 @@ import { addQueryParam } from '#src/utils/location'; import { getSupportedLanguages } from '#src/i18n/config'; import { useProfileStore } from '#src/stores/ProfileStore'; import { unpersistProfile, useProfiles } from '#src/hooks/useProfiles'; +import { IS_DEVELOPMENT_BUILD } from '#src/utils/common'; const Layout = () => { const location = useLocation(); @@ -169,7 +171,14 @@ const Layout = () => { - {!!footerText && } + {!!footerText && ( + + )} ); }; diff --git a/test-e2e/codecept.desktop.js b/test-e2e/codecept.desktop.js index 1c61faef8..386e936ef 100644 --- a/test-e2e/codecept.desktop.js +++ b/test-e2e/codecept.desktop.js @@ -11,7 +11,7 @@ exports.config = { grep: '(?=.*)^(?!.*@mobile-only)', tests: ['./tests/**/*.js', './tests/**/*.ts'], output: './output/desktop', - timeout: 3000, + timeout: 60, helpers: { Playwright: { url: 'http://localhost:8080', @@ -30,7 +30,7 @@ exports.config = { plugins: { pauseOnFail: {}, retryFailedStep: { - minTimeout: 100, + minTimeout: 1000, enabled: true, retries: 5, }, diff --git a/test-e2e/codecept.mobile.js b/test-e2e/codecept.mobile.js index f5e9e38e9..9f0b42000 100644 --- a/test-e2e/codecept.mobile.js +++ b/test-e2e/codecept.mobile.js @@ -12,7 +12,7 @@ exports.config = { grep: '(?=.*)^(?!.*@desktop-only)', tests: ['./tests/**/*.js', './tests/**/*.ts'], output: './output/mobile', - timeout: 3000, + timeout: 60, helpers: { Playwright: { url: 'http://localhost:8080', @@ -31,7 +31,7 @@ exports.config = { plugins: { pauseOnFail: {}, retryFailedStep: { - minTimeout: 100, + minTimeout: 1000, enabled: true, retries: 5, }, diff --git a/test-e2e/tests/account_test.ts b/test-e2e/tests/account_test.ts index 253a917a1..da43183c5 100644 --- a/test-e2e/tests/account_test.ts +++ b/test-e2e/tests/account_test.ts @@ -1,9 +1,9 @@ import passwordUtils, { LoginContext } from '#utils/password_utils'; -import constants from '#utils/constants'; +import constants, { longTimeout, normalTimeout } from '#utils/constants'; import { testConfigs } from '#test/constants'; const editAccount = 'Edit account'; -const editDetials = 'Edit information'; +const editDetails = 'Edit information'; const emailField = 'email'; const passwordField = 'confirmationPassword'; const firstNameField = 'firstName'; @@ -149,21 +149,21 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }); Scenario(`I can update firstName - ${providerName}`, async ({ I }) => { - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: '', }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: 'Jack', }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: firstName, @@ -172,21 +172,21 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }); Scenario(`I can update lastName - ${providerName}`, async ({ I }) => { - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: lastNameField, newValue: '', }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: lastNameField, newValue: 'Jones', }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: lastNameField, newValue: lastName, @@ -195,7 +195,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }); Scenario(`I can update details - ${providerName}`, async ({ I }) => { - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: '', @@ -206,7 +206,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: 'Newname', @@ -217,7 +217,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }, ]); - editAndSave(I, editDetials, [ + editAndSave(I, editDetails, [ { name: firstNameField, newValue: firstName, @@ -230,7 +230,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }); Scenario(`I see name limit errors - ${providerName}`, async ({ I }) => { - editAndCancel(I, editDetials, [ + editAndCancel(I, editDetails, [ { name: firstNameField, startingValue: firstName, @@ -248,6 +248,8 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res Scenario(`I can update my consents - ${providerName}`, async ({ I }) => { I.amOnPage(constants.accountsUrl); + I.waitForText('Profile info', longTimeout); + I.scrollTo('//*[text() = "Other registration details"]'); I.dontSeeCheckboxIsChecked(consentCheckbox); I.dontSee('Save'); @@ -259,6 +261,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res I.see('Save'); I.see('Cancel'); + I.scrollTo('//*[text() = "Cancel"]'); I.click('Cancel'); I.dontSeeCheckboxIsChecked(consentCheckbox); @@ -270,6 +273,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res I.see('Save'); I.see('Cancel'); + I.scrollTo('//*[text() = "Save"]'); I.click('Save'); I.waitForLoaderDone(); @@ -298,7 +302,8 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res function editAndSave(I: CodeceptJS.I, editButton: string, fields: { name: string; newValue: string; expectedError?: string }[]) { I.amOnPage(constants.accountsUrl); - + I.waitForElement(`//*[text() = "${editButton}"]`, normalTimeout); + I.scrollTo(`//*[text() = "${editButton}"]`); I.click(editButton); I.see('Save'); @@ -356,7 +361,7 @@ function runTestSuite(config: typeof testConfigs.svod, providerName: string, res }); for (const field of fieldsWithPaths) { - I.seeElement(field.xpath); + I.waitForElement(field.xpath); I.waitForValue(field.xpath, field.startingValue, 0); I.fillField(field.xpath, field.newValue); } diff --git a/test-e2e/tests/home_test.ts b/test-e2e/tests/home_test.ts index fe7b36ce3..ace43e78a 100644 --- a/test-e2e/tests/home_test.ts +++ b/test-e2e/tests/home_test.ts @@ -41,7 +41,7 @@ Scenario('Header button navigates to playlist screen', async ({ I }) => { Scenario('I can slide within the featured shelf', async ({ I }) => { const isDesktop = await I.isDesktop(); - async function slide(swipeText) { + async function slide(swipeText: string) { if (isDesktop) { I.click({ css: 'div[aria-label="Slide right"]' }); } else { @@ -61,10 +61,9 @@ Scenario('I can slide within the featured shelf', async ({ I }) => { I.see('8 min'); I.waitForInvisible('text="Blender Channel"', 3); I.dontSee('Blender Channel'); - I.dontSee('LIVE'); // Without this extra wait, the second slide action happens too fast after the first and even though the - // expected elements are present, the slide doesn't work. I think there must be a debounce on the carousel. + // expected elements are present, the slide doesn't work. I think there must be a debounce check on the carousel. I.wait(1); await slide('Spring'); @@ -132,6 +131,7 @@ Scenario('I can see the footer', ({ I }) => { I.see('© JW Player'); I.see('jwplayer.com'); I.click('jwplayer.com'); + I.wait(2); I.switchToNextTab(); I.seeCurrentUrlEquals('https://jwplayer.com/'); }); diff --git a/test-e2e/tests/language_test.ts b/test-e2e/tests/language_test.ts index 64cf3aefb..b301b2bc0 100644 --- a/test-e2e/tests/language_test.ts +++ b/test-e2e/tests/language_test.ts @@ -69,7 +69,7 @@ Scenario('Changing the language is persisted in the localStorage`', async ({ I } }); Scenario('The language is restored from localStorage`', async ({ I }) => { - await I.restartBrowser({ + I.restartBrowser({ storageState: { origins: [ { @@ -103,5 +103,6 @@ async function checkActiveLanguage(I: CodeceptJS.I, activeLanguage: keyof typeof } async function checkStyle(I: CodeceptJS.I, locator: CodeceptJS.LocatorOrString, styles: Record) { + I.waitForElement(locator); I.seeCssPropertiesOnElements(locator, styles); } diff --git a/test-e2e/tests/payments/coupons_test.ts b/test-e2e/tests/payments/coupons_test.ts index c05cbfbe6..254442eb1 100644 --- a/test-e2e/tests/payments/coupons_test.ts +++ b/test-e2e/tests/payments/coupons_test.ts @@ -39,18 +39,17 @@ function runTestSuite(props: ProviderProps, providerName: string) { const today = new Date(); // This is written as a second test suite so that the login context is a different user. - // Otherwise there's no way to re-enter payment info and add a coupon code + // Otherwise, there's no way to re-enter payment info and add a coupon code Feature(`payments-coupon - ${providerName}`).retry(Number(process.env.TEST_RETRY_COUNT) || 0); Before(async ({ I }) => { // This gets used in checkoutService.getOffer to make sure the offers are geolocated for NL overrideIP(I); I.useConfig(props.config); + couponLoginContext = await I.registerOrLogin(couponLoginContext); }); Scenario(`I can redeem coupons - ${providerName}`, async ({ I }) => { - couponLoginContext = await I.registerOrLogin(couponLoginContext); - await goToCheckout(I); I.click('Redeem coupon'); @@ -78,7 +77,7 @@ function runTestSuite(props: ProviderProps, providerName: string) { I.see(formatPrice(0, 'EUR', props.locale)); if (props.shouldMakePayment) { - I.payWithCreditCard( + await I.payWithCreditCard( props.paymentFields.creditCardholder, props.creditCard, props.paymentFields.cardNumber, @@ -92,14 +91,14 @@ function runTestSuite(props: ProviderProps, providerName: string) { }); Scenario(`I can cancel a free subscription - ${providerName}`, async ({ I }) => { - couponLoginContext = await I.registerOrLogin(couponLoginContext); cancelPlan(I, addYear(today), props.canRenewSubscription, providerName); }); Scenario(`I can renew a free subscription - ${providerName}`, async ({ I }) => { if (props.canRenewSubscription) { - couponLoginContext = await I.registerOrLogin(couponLoginContext); renewPlan(I, addYear(today), props.yearlyOffer.price); + } else { + I.say(`Provider ${providerName} does not support renewal. Skipping test...`); } }); } diff --git a/test-e2e/tests/payments/subscription_test.ts b/test-e2e/tests/payments/subscription_test.ts index 3b3291ea8..7a60bc0dc 100644 --- a/test-e2e/tests/payments/subscription_test.ts +++ b/test-e2e/tests/payments/subscription_test.ts @@ -127,22 +127,22 @@ function runTestSuite(props: ProviderProps, providerName: string) { await goToCheckout(I); - I.see('Credit card'); - I.see('PayPal'); - I.see(props.paymentFields.creditCardholder); - I.see('Card number'); - I.see('Expiry date'); - I.see('Security code'); - I.see('Continue'); + I.waitForText('Credit card'); + I.waitForText('PayPal'); + I.waitForText(props.paymentFields.creditCardholder); + I.waitForText('Card number'); + I.waitForText('Expiry date'); + I.waitForText('Security code'); + I.waitForText('Continue'); I.dontSee("Clicking 'continue' will bring you to the PayPal site."); I.click('PayPal'); - I.see("Clicking 'continue' will bring you to the PayPal site."); + I.waitForText("Clicking 'continue' will bring you to the PayPal site."); I.dontSee('Card number'); I.dontSee('Expiry date'); I.dontSee('Security code'); - I.see('Continue'); + I.waitForText('Continue'); }); Scenario(`I can open the PayPal site - ${providerName}`, async ({ I }) => { @@ -163,7 +163,7 @@ function runTestSuite(props: ProviderProps, providerName: string) { await goToCheckout(I); - I.payWithCreditCard( + await I.payWithCreditCard( props.paymentFields.creditCardholder, props.creditCard, props.paymentFields.cardNumber, @@ -174,7 +174,7 @@ function runTestSuite(props: ProviderProps, providerName: string) { await finishAndCheckSubscription(I, addYear(today), today, props.yearlyOffer.price, props.hasInlineOfferSwitch); - I.seeAll(cardInfo); + cardInfo.forEach((s) => I.waitForText(s)); }); Scenario(`I can cancel my subscription - ${providerName}`, async ({ I }) => { @@ -183,7 +183,7 @@ function runTestSuite(props: ProviderProps, providerName: string) { cancelPlan(I, addYear(today), props.canRenewSubscription, providerName); // Still see payment info - I.seeAll(cardInfo); + cardInfo.forEach((s) => I.waitForText(s)); }); Scenario(`I can renew my subscription - ${providerName}`, async ({ I }) => { @@ -201,7 +201,7 @@ function runTestSuite(props: ProviderProps, providerName: string) { I.see('Billing history'); I.dontSee('No transactions'); - I.scrollTo('[class*="mainColumn"] :last-child'); + I.scrollPageToBottom(); // Open the invoice which is opened in a new tab I.click('Show receipt'); diff --git a/test-e2e/tests/watch_history/logged_in_test.ts b/test-e2e/tests/watch_history/logged_in_test.ts index e9c8f4434..b3b8083d8 100644 --- a/test-e2e/tests/watch_history/logged_in_test.ts +++ b/test-e2e/tests/watch_history/logged_in_test.ts @@ -24,7 +24,7 @@ function runTestSuite(config: typeof testConfigs.svod, configNoWatchlist: typeof // New user has no continue watching history shelf I.dontSee(constants.continueWatchingShelfTitle); - await I.openVideoCard(videoTitle); + await I.openVideoCard(videoTitle, ShelfId.allFilms); await playVideo(I, 0, videoTitle); I.see(constants.startWatchingButton); @@ -81,23 +81,28 @@ function runTestSuite(config: typeof testConfigs.svod, configNoWatchlist: typeof I.seeInCurrentUrl('play=1'); }); - Scenario(`I do not see continue_watching videos on the home page and video page if there is not such config setting - ${providerName}`, async ({ I }) => { - I.useConfig(configNoWatchlist); + Scenario( + `I do not see continue_watching videos on the home page and video page if there is not such config setting (logged in) - ${providerName}`, + async ({ I }) => { + I.useConfig(configNoWatchlist); - await registerOrLogin(I); + await registerOrLogin(I); + I.wait(5); + I.waitForText('All Films'); - I.dontSee(constants.continueWatchingShelfTitle); + I.dontSee(constants.continueWatchingShelfTitle); - await I.openVideoCard(videoTitle); - I.dontSee(constants.continueWatchingButton); + await I.openVideoCard(videoTitle, ShelfId.allFilms); + I.dontSee(constants.continueWatchingButton); - await playVideo(I, 50, videoTitle); - I.see(constants.startWatchingButton); - I.dontSee(constants.continueWatchingButton); + await playVideo(I, 50, videoTitle); + I.see(constants.startWatchingButton); + I.dontSee(constants.continueWatchingButton); - I.amOnPage(constants.baseUrl); - I.dontSee(constants.continueWatchingShelfTitle); - }); + I.amOnPage(constants.baseUrl); + I.dontSee(constants.continueWatchingShelfTitle); + }, + ); async function registerOrLogin(I: CodeceptJS.I) { loginContext = await I.registerOrLogin(loginContext); diff --git a/test-e2e/utils/payments.ts b/test-e2e/utils/payments.ts index 8732da225..076b726d4 100644 --- a/test-e2e/utils/payments.ts +++ b/test-e2e/utils/payments.ts @@ -19,12 +19,6 @@ export function formatPrice(price: number, currency = 'EUR', country?: string) { }).format(price); } -export function addDays(date: Date, days: number) { - const newDate = new Date(date.valueOf()); - newDate.setDate(newDate.getDate() + days); - return newDate; -} - export function addYear(date: Date) { const newDate = new Date(date.valueOf()); newDate.setFullYear(newDate.getFullYear() + 1); @@ -37,11 +31,8 @@ export function formatDate(date: Date) { export async function finishAndCheckSubscription(I: CodeceptJS.I, billingDate: Date, today: Date, yearlyPrice: string, hasInlineOfferSwitch: boolean) { I.click('Continue'); - I.waitForLoaderDone(longTimeout); - I.wait(2); - I.waitForText(`Welcome to JW OTT Web App (SVOD)`); - I.see; - I.see(`Thank you for subscribing to JW OTT Web App (SVOD). Please enjoy all our content.`); + I.waitForText(`Welcome to JW OTT Web App (SVOD)`, longTimeout); + I.waitForText(`Thank you for subscribing to JW OTT Web App (SVOD). Please enjoy all our content.`); I.click('Start watching'); @@ -54,15 +45,15 @@ export async function finishAndCheckSubscription(I: CodeceptJS.I, billingDate: D if ((await I.grabTextFrom('body')).indexOf(transactionText) >= 0) { break; } - I.wait(1); + I.wait(2); I.refreshPage(); } - I.see(transactionText); + I.waitForText(transactionText); - I.see(yearlyPrice); - I.see('/year'); - I.see('Next billing date is on ' + formatDate(billingDate)); + I.waitForText(yearlyPrice); + I.waitForText('/year'); + I.waitForText('Next billing date is on ' + formatDate(billingDate)); if (hasInlineOfferSwitch) { I.waitForElement('[data-testid="change-subscription-button"]', 10); @@ -73,7 +64,7 @@ export async function finishAndCheckSubscription(I: CodeceptJS.I, billingDate: D I.waitForElement('[class*="transactionItem"]', 10); - I.see(formatDate(today)); + I.waitForText(formatDate(today)); } export function cancelPlan(I: CodeceptJS.I, expirationDate: Date, canRenewSubscription: boolean, providerName?: string) { @@ -98,16 +89,15 @@ export function cancelPlan(I: CodeceptJS.I, expirationDate: Date, canRenewSubscr I.waitForElement('[data-testid="cancel-subscription-button"]', 10); I.click('[data-testid="cancel-subscription-button"]'); I.click('Unsubscribe'); - I.waitForLoaderDone(); - I.see('Miss you already.'); + I.waitForText('Miss you already.', longTimeout); I.see('You have been successfully unsubscribed. Your current plan will expire on ' + formatDate(expirationDate)); I.click('Return to profile'); if (canRenewSubscription) { - I.see('Renew subscription'); + I.waitForText('Renew subscription'); } - I.see('This plan will expire on ' + formatDate(expirationDate)); + I.waitForText('This plan will expire on ' + formatDate(expirationDate), longTimeout); } export function renewPlan(I: CodeceptJS.I, billingDate: Date, yearlyPrice: string) { @@ -139,6 +129,6 @@ export function renewPlan(I: CodeceptJS.I, billingDate: Date, yearlyPrice: strin } export function overrideIP(I: CodeceptJS.I) { - // Set this as a cookie so it persists between page navigations (local storage would also work, but the permissions don't work) + // Set this as a cookie, so it persists between page navigations (local storage would also work, but the permissions don't work) I.setCookie({ name: overrideIPCookieKey, value: '5.132.0.0', domain: 'localhost', path: '/' }); } diff --git a/test-e2e/utils/steps_file.ts b/test-e2e/utils/steps_file.ts index 844eda47b..9b4205320 100644 --- a/test-e2e/utils/steps_file.ts +++ b/test-e2e/utils/steps_file.ts @@ -1,7 +1,5 @@ import * as assert from 'assert'; -import { overrideIP } from './payments'; - import constants, { makeShelfXpath, normalTimeout, ShelfId } from '#utils/constants'; import passwordUtils, { LoginContext } from '#utils/password_utils'; import { TestConfig } from '#test/types'; @@ -9,6 +7,9 @@ import { TestConfig } from '#test/types'; const configFileQueryKey = 'app-config'; const loaderElement = '[class*=_loadingOverlay]'; +type SwipeTarget = { text: string } | { xpath: string }; +type SwipeDirection = { direction: 'left' | 'right' } | { points: { x1: number; y1: number; x2: number; y2: number } }; + const stepsObj = { useConfig: function (this: CodeceptJS.I, config: TestConfig) { const url = new URL(constants.baseUrl); @@ -40,23 +41,6 @@ const stepsObj = { this.click('div[aria-label="Log out"]'); }, - beforeRegisterOrLogin: async function (this: CodeceptJS.I, config: TestConfig, mode: string) { - this.useConfig(config); - if (await this.isMobile()) { - this.openMenuDrawer(); - } - - let clickOnText = 'Sign in'; - let waitForElement = constants.loginFormSelector; - if (mode === 'signup') { - clickOnText = 'Sign up'; - waitForElement = constants.registrationFormSelector; - } - - this.click(clickOnText); - - this.waitForElement(waitForElement, normalTimeout); - }, // This function will register the user on the first call and return the context // then assuming context is passed in the next time, will log that same user back in // Use it for tests where you want a new user for the suite, but not for each test @@ -106,32 +90,29 @@ const stepsObj = { securityCode: string, fieldWrapper: string = '', ) { - this.see('Credit card'); + this.waitForText('Credit card'); if (creditCardFieldName) { - this.see(creditCardFieldName); - this.fillField(creditCardFieldName, 'John Doe'); + this.waitForText(creditCardFieldName); + this.fillByLabel(creditCardFieldName, 'John Doe'); } // Adyen credit card form is loaded asynchronously, so wait for it this.waitForElement(`[class*="${cardNumber}"]`, normalTimeout); // Each of the 3 credit card fields is a separate iframe - this.switchTo(`[class*="${cardNumber}"] ${fieldWrapper}`); + this.fillByLabel('Card number', creditCard, fieldWrapper ? `[class*="${cardNumber}"] ${fieldWrapper}` : undefined); - this.fillField('Card number', creditCard); - // @ts-expect-error - this.switchTo(null); // Exit the iframe context back to the main document + this.fillByLabel('Expiry date', '03/30', fieldWrapper ? `[class*="${expiryDate}"] ${fieldWrapper}` : undefined); - this.switchTo(`[class*="${expiryDate}"] ${fieldWrapper}`); - this.fillField('Expiry date', '03/30'); - // @ts-expect-error - this.switchTo(null); // Exit the iframe context back to the main document + this.fillByLabel('Security code', '737', fieldWrapper ? `[class*="${securityCode}"] ${fieldWrapper}` : undefined); + }, + fillByLabel: function (this: CodeceptJS.I, label: string, value: string, frameLocator?: string) { + this.usePlaywrightTo('Fill field by label', async ({ page }) => { + const locator = frameLocator ? page.frameLocator(frameLocator) : page; - this.switchTo(`[class*="${securityCode}"] ${fieldWrapper}`); - this.fillField('Security code', '737'); - // @ts-expect-error - this.switchTo(null); // Exit the iframe context back to the main document + await locator.getByLabel(label).fill(value); + }); }, waitForLoaderDone: function (this: CodeceptJS.I, timeout: number | false = normalTimeout) { // Specify false when the loader is NOT expected to be shown at all @@ -144,7 +125,7 @@ const stepsObj = { openSignUpModal: async function (this: CodeceptJS.I) { const { isMobile } = await this.openSignInMenu(); - // the sign up button is visible in header and in the mobile menu + // the sign-up button is visible in header and in the mobile menu this.click('Sign up'); return { isMobile }; @@ -191,15 +172,13 @@ const stepsObj = { waitForAllInvisible: function (this: CodeceptJS.I, allStrings: string[], timeout: number | undefined = undefined) { allStrings.forEach((s) => this.waitForInvisible(s, timeout)); }, - swipeLeft: async function (this: CodeceptJS.I, args) { - args.direction = 'left'; - await this.swipe(args); + swipeLeft: async function (this: CodeceptJS.I, args: SwipeTarget) { + await this.swipe({ ...args, direction: 'left' }); }, - swipeRight: async function (this: CodeceptJS.I, args) { - args.direction = 'right'; - await this.swipe(args); + swipeRight: async function (this: CodeceptJS.I, args: SwipeTarget) { + await this.swipe({ ...args, direction: 'right' }); }, - swipe: async function (this: CodeceptJS.I, args) { + swipe: async function (this: CodeceptJS.I, args: SwipeTarget & SwipeDirection) { await this.executeScript((args) => { const xpath = args.xpath || `//*[text() = "${args.text}"]`; @@ -250,12 +229,12 @@ const stepsObj = { ); }, args); }, - waitForPlayerPlaying: async function (title, tries = normalTimeout) { - this.seeElement('div[class*="jwplayer"]'); + waitForPlayerPlaying: async function (title: string, tries = 10) { + this.waitForElement('div[class*="jwplayer"]', normalTimeout); this.see(title); await this.waitForPlayerState('playing', ['buffering', 'idle', ''], tries); }, - waitForPlayerState: async function (this: CodeceptJS.I, expectedState, allowedStates: string[] = [], tries = 5) { + waitForPlayerState: async function (this: CodeceptJS.I, expectedState: string, allowedStates: string[] = [], tries = 5) { // Since this check executes a script in the browser, it won't use the codecept retries, // so we have to manually retry (this is because the video can take time to load and the state will be buffering) for (let i = 0; i < tries; i++) { @@ -264,7 +243,7 @@ const stepsObj = { typeof window.jwplayer === 'undefined' || typeof window.jwplayer().getState === 'undefined' ? '' : jwplayer().getState(), ); - await this.say(`Waiting for Player state. Expected: "${expectedState}", Current: "${state}"`); + this.say(`Waiting for Player state. Expected: "${expectedState}", Current: "${state}"`); if (state === expectedState) { return; @@ -286,50 +265,43 @@ const stepsObj = { assert.equal(await this.executeScript(() => (typeof jwplayer === 'undefined' ? undefined : jwplayer().getState)), undefined); }, isMobile: async function (this: CodeceptJS.I): Promise { - let isMobile = false; - - await this.usePlaywrightTo('Get is Mobile', async ({ browserContext }) => { - isMobile = Boolean(browserContext._options.isMobile); + return await this.executeScript(() => { + return window.navigator.userAgent.toLowerCase().includes('pixel'); }); - - return isMobile; }, isDesktop: async function (this: CodeceptJS.I) { return !(await this.isMobile()); }, enableClipboard: async function (this: CodeceptJS.I) { - await this.usePlaywrightTo('Setup the clipboard', async ({ browserContext }) => { + this.usePlaywrightTo('Setup the clipboard', async ({ browserContext }) => { await browserContext.grantPermissions(['clipboard-read', 'clipboard-write']); }); }, - readClipboard: async function (this: CodeceptJS.I) { - return this.executeScript(async () => navigator.clipboard.readText()); - }, writeClipboard: async function (this: CodeceptJS.I, text: string) { await this.executeScript((text) => navigator.clipboard.writeText(text), text); }, scrollToShelf: async function (this: CodeceptJS.I, shelf: ShelfId) { this.waitForLoaderDone(); + this.scrollPageToTop(); + this.wait(1); const targetSelector = makeShelfXpath(shelf); - let tries = 5; - // Scroll down until the target shelf is visible - while ((await this.grabNumberOfVisibleElements(targetSelector)) <= 0) { - // If we've run out of tries, fail and return - if (tries-- <= 0) { - assert.fail(`Shelf row not found with id '${shelf}'`); + for (let tries = 0; tries < 5; tries++) { + if ((await this.grabNumberOfVisibleElements(targetSelector)) > 0) { + // Scroll directly to the shelf + this.scrollTo(targetSelector); + return; } // Scroll to the bottom of the grid to trigger loading more virtualized rows - this.scrollTo('[role="row"]:last-child'); - this.wait(0.2); + this.scrollTo('header', undefined, tries * 800); + this.wait(1); } - // Scroll directly to the shelf - this.scrollTo(targetSelector); - return; + // If we've run out of tries, fail and return + assert.fail(`Shelf row not found with id '${shelf}'`); }, mockTimeGMT: async function (this: CodeceptJS.I, hours: number, minutes: number, seconds: number) { return this.usePlaywrightTo(`Mock current time as ${hours}:${minutes}:${seconds}`, async ({ page }) => { @@ -354,13 +326,6 @@ const stepsObj = { }`); }); }, - seeCardImageSrc: async function (this: CodeceptJS.I, name: string, shelf: ShelfId, src: string) { - const locator = `//img[@alt="${name}"]`; - await within(makeShelfXpath(shelf), async () => { - const cardSrc = await this.grabAttributeFrom(locator, 'src'); - assert.equal(cardSrc, src, "img element src attribute doesn't match"); - }); - }, seeVideoDetailsBackgroundImage: async function (this: CodeceptJS.I, name: string, src: string) { const imageLocator = locate({ css: `div[data-testid="video-details"] img[alt="${name}"]` }); const imgSrc = await this.grabAttributeFrom(imageLocator, 'src'); @@ -378,38 +343,37 @@ const stepsObj = { scrollToTheRight: boolean = true, preOpenCallback?: (locator: string) => void, ) { - const locator = `//a[@aria-label="${name}"]`; - const shelfXpath = shelf ? makeShelfXpath(shelf) : undefined; - - if (shelfXpath) { - for (let n = 0; n < 5; n++) { - const visible = await this.grabNumberOfVisibleElements(shelfXpath); - - if (visible > 0) { - this.scrollTo(shelfXpath); - break; - } else { - this.scrollPageToBottom(); - this.wait(0.2); - } + const cardLocator = `//a[@aria-label="${name}"]`; + const shelfLocator = shelf ? makeShelfXpath(shelf) : undefined; + + this.scrollPageToTop(); + this.wait(1); + + for (let n = 0; n < 5; n++) { + if ((await this.grabNumberOfVisibleElements(shelfLocator || cardLocator)) > 0) { + this.scrollTo(shelfLocator || cardLocator); + this.wait(1); + break; } - } else { - this.scrollTo(locator); + + // Scroll down from the top of the page + this.scrollTo('header', undefined, 800 * n); + this.wait(1); } const isMobile = await this.isMobile(); // Easy way to limit to 10 swipes for (let i = 0; i < 10; i++) { - const [isElementVisible, tabindex] = await within(shelfXpath || 'body', async () => { - const isElementVisible = (await this.grabNumberOfVisibleElements(locator)) === 1; - const tabindex = isElementVisible ? Number(await this.grabAttributeFrom(locator, 'tabindex')) : -1; + const [isElementVisible, tabindex] = await within(shelfLocator || 'body', async () => { + const isElementVisible = (await this.grabNumberOfVisibleElements(cardLocator)) >= 1; + const tabindex = isElementVisible ? Number(await this.grabAttributeFrom(cardLocator, 'tabindex')) : -1; return [isElementVisible, tabindex]; }); // If the item isn't virtualized yet, throw an error (we need more information) - if (!shelfXpath && !isElementVisible) { - throw `Can't find item with locator: "${locator}". Try specifying which shelf to look in.`; + if (!shelfLocator && !isElementVisible) { + throw `Can't find item with locator: "${cardLocator}". Try specifying which shelf to look in.`; } if (tabindex >= 0) { @@ -419,21 +383,21 @@ const stepsObj = { if (isMobile) { // This swipes on the current item in the carousel where the card we're trying to click is await this.swipe({ - xpath: shelfXpath ? `${shelfXpath}//*[@tabindex=0]` : `${locator}/ancestor::ul/li/a[@tabindex=0]`, + xpath: shelfLocator ? `${shelfLocator}//*[@tabindex=0]` : `${cardLocator}/ancestor::ul/li/a[@tabindex=0]`, direction: scrollToTheRight ? 'left' : 'right', }); } else { - this.click({ css: `div[aria-label="Slide ${scrollToTheRight ? 'right' : 'left'}"]` }, shelfXpath); + this.click({ css: `div[aria-label="Slide ${scrollToTheRight ? 'right' : 'left'}"]` }, shelfLocator); } - this.wait(0.5); + this.wait(1); } if (preOpenCallback) { - preOpenCallback(shelfXpath + locator); + preOpenCallback(shelfLocator + cardLocator); } - this.click(locator, shelfXpath); + this.click(cardLocator, shelfLocator); }, clickPlayerContainer: function (this: CodeceptJS.I) { // sometimes Playwright throws an error when the click hits a different element than specified @@ -450,7 +414,7 @@ const stepsObj = { }); }, clickHome: function (this: CodeceptJS.I) { - this.click('img[alt="logo"]'); + this.click('a[href="/"]'); }, }; declare global { diff --git a/test-e2e/utils/watch_history.ts b/test-e2e/utils/watch_history.ts index cad809612..1736e6f73 100644 --- a/test-e2e/utils/watch_history.ts +++ b/test-e2e/utils/watch_history.ts @@ -58,7 +58,7 @@ export async function checkElapsed(I: CodeceptJS.I, expectedMinutes: number, exp const [minutes, seconds] = elapsed.split(':').map((item) => Number.parseInt(item)); assert.strictEqual(minutes, expectedMinutes); - if (seconds < expectedSeconds || seconds > expectedSeconds + bufferSeconds) { + if (seconds < expectedSeconds - bufferSeconds || seconds > expectedSeconds + bufferSeconds) { assert.fail(`Elapsed time of ${minutes}m ${seconds}s is not within ${bufferSeconds} seconds of ${expectedMinutes}m ${expectedSeconds}s`); } else { assert.ok(expectedSeconds); diff --git a/yarn.lock b/yarn.lock index 05edd4b0e..4010d17bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1021,6 +1021,14 @@ dependencies: allure-js-commons "^1.3.2" +"@codeceptjs/configure@0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@codeceptjs/configure/-/configure-0.10.0.tgz#f7d57fcea2c9f1f32d13cbc73753486272867a2e" + integrity sha512-MxuXmvpZQuUalyU8YPCPTN7fHPLyzBNxJmktqmwsqlNQzh3h5S51Z7SCewZrG0qu6QG5BW3dahMjXq/z6v1Brg== + dependencies: + lodash.merge "^4.6.2" + lodash.mergewith "^4.6.2" + "@codeceptjs/configure@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@codeceptjs/configure/-/configure-0.8.0.tgz#5eba9dae3cfe8f8fd0049d157aff1a793ddf93bf" @@ -1029,10 +1037,10 @@ lodash.merge "^4.6.2" lodash.mergewith "^4.6.2" -"@codeceptjs/helper@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@codeceptjs/helper/-/helper-1.0.2.tgz#feefbdc7877e7cf98dabcda55ae313b72bda6d98" - integrity sha512-QKuyw4cGVa78YYj+g02RXitcUYpV4qKjZDHxfCIH2w8lJIr1FQohRD3o/MpcqEnvp475HQJN/OyWhdUBstJupA== +"@codeceptjs/helper@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@codeceptjs/helper/-/helper-2.0.1.tgz#e70a8a49140e05bb360cbd9a6d6dfa2a141f2e99" + integrity sha512-g1rng4RjGW/Vy5KcETpdwlfsAQJA2TN7tdO0MtAttjWe7TiUwI+8AeQp2mYpVr4FuWSCV5slyMtquBYexnGemA== "@commitlint/cli@^12.1.1": version "12.1.4" @@ -1178,21 +1186,21 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@cucumber/cucumber-expressions@^16": +"@cucumber/cucumber-expressions@16": version "16.1.2" resolved "https://registry.yarnpkg.com/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz#8c7200a4490b48a0309f5cc4e058cf6578b5b578" integrity sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA== dependencies: regexp-match-indices "1.0.2" -"@cucumber/gherkin@^26": +"@cucumber/gherkin@26": version "26.2.0" resolved "https://registry.yarnpkg.com/@cucumber/gherkin/-/gherkin-26.2.0.tgz#256129ef5e4d1cba87a673ce78d7296809d1e4c9" integrity sha512-iRSiK8YAIHAmLrn/mUfpAx7OXZ7LyNlh1zT89RoziSVCbqSVDxJS6ckEzW8loxs+EEXl0dKPQOXiDmbHV+C/fA== dependencies: "@cucumber/messages" ">=19.1.4 <=22" -"@cucumber/messages@>=19.1.4 <=22": +"@cucumber/messages@22.0.0", "@cucumber/messages@>=19.1.4 <=22": version "22.0.0" resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-22.0.0.tgz#2d86974ebd73046f66d217334c2245365c7990d4" integrity sha512-EuaUtYte9ilkxcKmfqGF9pJsHRUU0jwie5ukuZ/1NPTuHS1LxHPsGEODK17RPRbZHOFhqybNzG2rHAwThxEymg== @@ -1202,16 +1210,6 @@ reflect-metadata "0.1.13" uuid "9.0.0" -"@cucumber/messages@^21.0.1": - version "21.0.1" - resolved "https://registry.yarnpkg.com/@cucumber/messages/-/messages-21.0.1.tgz#1468cef60d6da4d4f540a70ab1265f6540f44f51" - integrity sha512-pGR7iURM4SF9Qp1IIpNiVQ77J9kfxMkPOEbyy+zRmGABnWWCsqMpJdfHeh9Mb3VskemVw85++e15JT0PYdcR3g== - dependencies: - "@types/uuid" "8.3.4" - class-transformer "0.5.1" - reflect-metadata "0.1.13" - uuid "9.0.0" - "@emotion/babel-plugin@^11.11.0": version "11.11.0" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c" @@ -1604,11 +1602,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@one-ini/wasm@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323" - integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== - "@remix-run/router@1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.7.2.tgz#cba1cf0a04bc04cb66027c51fa600e9cbc388bc8" @@ -1739,7 +1732,7 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.1": +"@sideway/formula@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== @@ -2084,11 +2077,6 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.7.tgz#5b06ad6894b236a1d2bd6b2f07850ca5c59cf4d6" integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== -"@types/uuid@8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - "@types/uuid@9.0.1": version "9.0.1" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.1.tgz#98586dc36aee8dacc98cc396dbca8d0429647aa6" @@ -2325,6 +2313,11 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== +"@xmldom/xmldom@0.8.10": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2338,7 +2331,7 @@ abab@^2.0.6: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== -abbrev@^1.0.0: +abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -2353,16 +2346,16 @@ acorn-walk@^8.1.1, acorn-walk@^8.2.0: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.4.0, acorn@^7.4.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.10.0, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@8.10.0, acorn@^8.10.0, acorn@^8.4.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2612,16 +2605,16 @@ arraybuffer.prototype.slice@^1.0.1: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" +arrify@2.0.1, arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -2697,6 +2690,15 @@ axe-core@4.4.1: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413" integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw== +axios@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.3.tgz#e7011384ba839b885007c9c9fae1ff23dceb295b" + integrity sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axios@^0.21.2: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" @@ -2704,14 +2706,12 @@ axios@^0.21.2: dependencies: follow-redirects "^1.14.0" -axios@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== +axios@^0.26.0: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" + follow-redirects "^1.14.8" babel-plugin-macros@^3.1.0: version "3.1.0" @@ -2776,7 +2776,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.0.2, bl@^4.0.3: +bl@^4.0.2, bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -2924,6 +2924,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" @@ -2956,7 +2964,7 @@ caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001517: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== -chai-deep-match@^1.2.1: +chai-deep-match@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/chai-deep-match/-/chai-deep-match-1.2.1.tgz#b0e578d55f6daef289106443eec3ec253184b800" integrity sha512-mSbtP1GXt3ypQyxBuduUcrGSR1gWO1Mhi8l93vrdXQidGYzHVs/vEn/h0FHTlTj3ga48+xroxlzHmh6hFEdWGQ== @@ -2965,7 +2973,20 @@ chai-deep-match@^1.2.1: lodash "^4.17.10" lodash-pickdeep "^1.0.2" -chai@^4.3.6, chai@^4.3.7: +chai@4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== @@ -2978,6 +2999,14 @@ chai@^4.3.6, chai@^4.3.7: pathval "^1.1.1" type-detect "^4.0.5" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2995,14 +3024,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - character-entities-legacy@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" @@ -3023,11 +3044,6 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -3103,6 +3119,13 @@ classnames@^2.3.1: resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== +clean-css@^4.2.1: + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + clean-css@^5.2.2: version "5.3.2" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" @@ -3129,6 +3152,11 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-spinners@^2.5.0: + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== + cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -3177,6 +3205,11 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag== +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -3191,45 +3224,49 @@ cloneable-readable@^1.0.0: process-nextick-args "^2.0.0" readable-stream "^2.3.5" -codeceptjs@3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/codeceptjs/-/codeceptjs-3.4.1.tgz#32154eb3ed11702131adbac898893ee1407e107a" - integrity sha512-cwYSNORIe6w/YsiZfujDlya1wqNmOE56f+U+wROQ4Vtcc6OWGGTd8kO5ojwHnVmTzkSjdL6lue4sBziDG219xQ== - dependencies: - "@codeceptjs/configure" "^0.8.0" - "@codeceptjs/helper" "^1.0.2" - "@cucumber/cucumber-expressions" "^16" - "@cucumber/gherkin" "^26" - "@cucumber/messages" "^21.0.1" - acorn "^7.4.1" - arrify "^2.0.1" - axios "^1.3.3" - chai "^4.3.6" - chai-deep-match "^1.2.1" - chalk "^4.1.2" - commander "^2.20.3" - cross-spawn "^7.0.3" - css-to-xpath "^0.1.0" - envinfo "^7.8.1" - escape-string-regexp "^1.0.3" - figures "^3.2.0" - fn-args "^4.0.0" - fs-extra "^8.1.0" - glob "^6.0.1" - inquirer "^6.5.2" - joi "^17.6.0" - js-beautify "^1.14.0" - lodash.clonedeep "^4.5.0" - lodash.merge "^4.6.2" - mkdirp "^1.0.4" - mocha "^10.2.0" - mocha-junit-reporter "^1.23.3" - ms "^2.1.3" - parse-function "^5.6.4" - promise-retry "^1.1.1" - resq "^1.10.2" - sprintf-js "^1.1.1" - uuid "^9.0" +codeceptjs@3.5.5: + version "3.5.5" + resolved "https://registry.yarnpkg.com/codeceptjs/-/codeceptjs-3.5.5.tgz#e9efd5230861bb5e8bbbb6f7dc838cdf730f95d4" + integrity sha512-A8ZDgEyMJ8iq27PYv1O3k+Vyx3tRAc7JnsBussCegQut4JQqv9hcMVJJKclLE+rQt5wqCq88P0wvTqHbdXNttQ== + dependencies: + "@codeceptjs/configure" "0.10.0" + "@codeceptjs/helper" "2.0.1" + "@cucumber/cucumber-expressions" "16" + "@cucumber/gherkin" "26" + "@cucumber/messages" "22.0.0" + "@xmldom/xmldom" "0.8.10" + acorn "8.10.0" + arrify "2.0.1" + axios "1.3.3" + chai "4.3.6" + chai-deep-match "1.2.1" + chalk "4.1.2" + commander "11.0.0" + cross-spawn "7.0.3" + css-to-xpath "0.1.0" + envinfo "7.8.1" + escape-string-regexp "4.0.0" + figures "3.2.0" + fn-args "4.0.0" + fs-extra "8.1.0" + glob "6.0.1" + html-minifier "4.0.0" + inquirer "6.5.2" + joi "17.6.0" + js-beautify "1.14.0" + lodash.clonedeep "4.5.0" + lodash.merge "4.6.2" + mkdirp "1.0.4" + mocha "10.2.0" + ms "2.1.3" + openai "3.2.1" + ora-classic "5.4.2" + parse-function "5.6.4" + parse5 "7.1.2" + promise-retry "1.1.1" + resq "1.10.2" + sprintf-js "1.1.1" + uuid "9.0" color-convert@^1.9.0: version "1.9.3" @@ -3272,12 +3309,12 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^10.0.0, commander@~10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-11.0.0.tgz#43e19c25dbedc8256203538e8d7e9346877a6f67" + integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== -commander@^2.18.0, commander@^2.20.0, commander@^2.20.3: +commander@^2.18.0, commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3292,6 +3329,11 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@~10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + commist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" @@ -3333,7 +3375,7 @@ concat-stream@^2.0.0, concat-stream@~2.0.0: readable-stream "^3.0.2" typedarray "^0.0.6" -config-chain@^1.1.13: +config-chain@^1.1.12: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== @@ -3459,6 +3501,15 @@ cross-fetch@3.1.6: dependencies: node-fetch "^2.6.11" +cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -3470,20 +3521,6 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - crypto-js@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" @@ -3531,7 +3568,7 @@ css-shorthand-properties@^1.0.0: resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935" integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A== -css-to-xpath@^0.1.0: +css-to-xpath@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/css-to-xpath/-/css-to-xpath-0.1.0.tgz#ac0d1c26cef023f7bd8cf2e1fc1f77134bc70c47" integrity sha512-izIAc99mgThUsc6DkUIC0nfy3whEX4qhZ4TrRhundaRUGg4TDjqE5aMJ8YWAohH1UZcqrkYNuNvD8O0JFaCr0g== @@ -3672,6 +3709,13 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + deep-eql@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" @@ -3718,6 +3762,13 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" @@ -3966,15 +4017,15 @@ duplexify@^4.1.1: readable-stream "^3.1.1" stream-shift "^1.0.0" -editorconfig@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3" - integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== +editorconfig@^0.15.3: + version "0.15.3" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" + integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== dependencies: - "@one-ini/wasm" "0.1.1" - commander "^10.0.0" - minimatch "9.0.1" - semver "^7.5.3" + commander "^2.19.0" + lru-cache "^4.1.5" + semver "^5.6.0" + sigmund "^1.0.1" ejs@^3.1.6: version "3.1.9" @@ -4038,10 +4089,10 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -envinfo@^7.8.1: - version "7.10.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" - integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== +envinfo@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== eol@^0.9.1: version "0.9.1" @@ -4183,7 +4234,7 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -4514,6 +4565,13 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +figures@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -4521,13 +4579,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4634,15 +4685,15 @@ flush-write-stream@^1.0.2: inherits "^2.0.3" readable-stream "^2.3.6" -fn-args@^4.0.0: +fn-args@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fn-args/-/fn-args-4.0.0.tgz#2e912f7a74c5e9ef25060bd60127d6a8680237a5" integrity sha512-M9XSagc92ejQhi+7kjpFPAO59xKbGRsbOg/9dfwSj84DfzB0pj+Q81DVD1pKr084Xf2oICwUNI0pCvGORmD9zg== -follow-redirects@^1.14.0, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -4665,6 +4716,15 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs-extra@8.1.0, fs-extra@^8.0.1, fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^10.0.1: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -4692,15 +4752,6 @@ fs-extra@^6.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.1, fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -4746,7 +4797,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -4873,26 +4924,26 @@ glob-stream@^6.1.0: to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.1.tgz#16a89b94ac361b2a670a0a141a21ad51b438d21d" + integrity sha512-kDh+dhHZZb/oFY9mI/Dj5vra6A1X+KzeDEqQ6TdY4Cd3OpDv/mLC4YgyQse+u+EXJhjfdmwYkwl0QRvgy01mUQ== dependencies: - fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "2 || 3" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -4908,17 +4959,6 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - 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" - global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5143,6 +5183,19 @@ html-minifier-terser@^6.1.0: relateurl "^0.2.7" terser "^5.10.0" +html-minifier@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-4.0.0.tgz#cca9aad8bce1175e02e17a8c33e46d8988889f56" + integrity sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig== + dependencies: + camel-case "^3.0.0" + clean-css "^4.2.1" + commander "^2.19.0" + he "^1.2.0" + param-case "^2.1.1" + relateurl "^0.2.7" + uglify-js "^3.5.1" + html-parse-stringify@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" @@ -5346,7 +5399,7 @@ ini@^3.0.1: resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== -inquirer@^6.5.2: +inquirer@6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -5458,7 +5511,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5, is-buffer@~1.1.6: +is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== @@ -5524,6 +5577,11 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" @@ -5832,15 +5890,15 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" -joi@^17.6.0: - version "17.9.2" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== +joi@17.6.0: + version "17.6.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" + integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" + "@sideway/formula" "^3.0.0" "@sideway/pinpoint" "^2.0.0" jpeg-js@^0.4.1, jpeg-js@^0.4.3: @@ -5848,15 +5906,15 @@ jpeg-js@^0.4.1, jpeg-js@^0.4.3: resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== -js-beautify@^1.14.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.9.tgz#a5db728bc5a0d84d3b1a597c376b29bd4d39c8e5" - integrity sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg== +js-beautify@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.0.tgz#2ce790c555d53ce1e3d7363227acf5dc69024c2d" + integrity sha512-yuck9KirNSCAwyNJbqW+BxJqJ0NLJ4PwBUzQQACl5O3qHMBXVkXb/rD0ilh/Lat/tn88zSZ+CAHOlk0DsY7GuQ== dependencies: - config-chain "^1.1.13" - editorconfig "^1.0.3" - glob "^8.1.0" - nopt "^6.0.0" + config-chain "^1.1.12" + editorconfig "^0.15.3" + glob "^7.1.3" + nopt "^5.0.0" js-library-detector@^6.5.0: version "6.7.0" @@ -6189,7 +6247,7 @@ lodash-pickdeep@^1.0.2: dependencies: lodash ">= 3.7.0" -lodash.clonedeep@^4.5.0: +lodash.clonedeep@4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== @@ -6199,7 +6257,7 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash.merge@^4.6.2: +lodash.merge@4.6.2, lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== @@ -6266,6 +6324,11 @@ loupe@^2.3.1, loupe@^2.3.6: dependencies: get-func-name "^2.0.0" +lower-case@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + lower-case@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" @@ -6273,6 +6336,14 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -6383,15 +6454,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -md5@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - mdast-util-from-markdown@^0.8.0: version "0.8.5" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" @@ -6528,7 +6590,7 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -"minimatch@2 || 3", minimatch@5.0.1, minimatch@9.0.1, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +"minimatch@2 || 3", minimatch@5.0.1, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6566,18 +6628,11 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^1.0.4: +mkdirp@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mktemp@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" @@ -6593,18 +6648,7 @@ mlly@^1.2.0, mlly@^1.4.0: pkg-types "^1.0.3" ufo "^1.1.2" -mocha-junit-reporter@^1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz#941e219dd759ed732f8641e165918aa8b167c981" - integrity sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA== - dependencies: - debug "^2.2.0" - md5 "^2.1.0" - mkdirp "~0.5.1" - strip-ansi "^4.0.0" - xml "^1.0.0" - -mocha@^10.2.0: +mocha@10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== @@ -6670,7 +6714,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: +ms@2.1.3, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6733,6 +6777,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +no-case@^2.2.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -6768,12 +6819,12 @@ node-releases@^2.0.13: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: - abbrev "^1.0.0" + abbrev "1" normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" @@ -6976,6 +7027,14 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +openai@3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-3.2.1.tgz#1fa35bdf979cbde8453b43f2dd3a7d401ee40866" + integrity sha512-762C9BNlJPbjjlWZi4WYK9iM2tAVAv0uUp1UmI34vb0CN5T2mjB/qM6RYBmNKMh/dN9fC+bxqPwWJZUTWW052A== + dependencies: + axios "^0.26.0" + form-data "^4.0.0" + optionator@^0.9.1: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -6988,6 +7047,21 @@ optionator@^0.9.1: prelude-ls "^1.2.1" type-check "^0.4.0" +ora-classic@5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/ora-classic/-/ora-classic-5.4.2.tgz#3d53a065d13a1f3b2f9c13ad89177e580f604588" + integrity sha512-/xX8D5AMHB+LnvEJHOglmq6pXwm65CQ/gqPrIjIN5GJ1Bl9KC9fSmgzR/FwjrtalDj/WVxukAVuH8GP00Zpiaw== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + ordered-read-streams@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" @@ -7047,6 +7121,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +param-case@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== + dependencies: + no-case "^2.2.0" + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -7079,10 +7160,10 @@ parse-entities@^2.0.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" -parse-function@^5.6.4: - version "5.6.10" - resolved "https://registry.yarnpkg.com/parse-function/-/parse-function-5.6.10.tgz#4db1688a50adca2d2e1941ed6b9c5c98a5f6e662" - integrity sha512-mrMwHEIn8mCgTTZxCVtXbcv8+Suf13z+81004BupjoAfZfIuwEzOYy9NNS3xKYXRRVR7Ej1sjvgjjcqQmYGK4A== +parse-function@5.6.4: + version "5.6.4" + resolved "https://registry.yarnpkg.com/parse-function/-/parse-function-5.6.4.tgz#cdec775829aaec9139ef7983f27878aea62e41ee" + integrity sha512-6e4fl3IfwRLuxLj3PaLc+QVK3odZ7/gEs3fkENoXFI35dCHAg/HA0kIOlsAnIWFGffG179sfSNcRTbyVtVVFEA== dependencies: "@babel/parser" "^7.8.3" arrify "^2.0.1" @@ -7113,7 +7194,7 @@ parse5-htmlparser2-tree-adapter@^7.0.0: domhandler "^5.0.2" parse5 "^7.0.0" -parse5@^7.0.0, parse5@^7.1.2: +parse5@7.1.2, parse5@^7.0.0, parse5@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== @@ -7271,17 +7352,19 @@ planby@^0.3.0: date-fns "^2.28.0" use-debounce "^7.0.1" -playwright-core@1.36.2: - version "1.36.2" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.36.2.tgz#32382f2d96764c24c65a86ea336cf79721c2e50e" - integrity sha512-sQYZt31dwkqxOrP7xy2ggDfEzUxM1lodjhsQ3NMMv5uGTRDsLxU0e4xf4wwMkF2gplIxf17QMBCodSFgm6bFVQ== +playwright-core@1.38.1: + version "1.38.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.38.1.tgz#75a3c470aa9576b7d7c4e274de3d79977448ba08" + integrity sha512-tQqNFUKa3OfMf4b2jQ7aGLB8o9bS3bOY0yMEtldtC2+spf8QXG9zvXLTXUeRsoNuxEYMgLYR+NXfAa1rjKRcrg== -playwright@^1.33.0: - version "1.36.2" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.36.2.tgz#4f25272209a31ad1138d7b9868e0325159f003e3" - integrity sha512-4Fmlq3KWsl85Bl4InJw1NC21aeQV0iSZuFvTDcy1F8zVmXmgQRe89GxF8zMSRt/KIS+2tUolak7EXVl9aC+JdA== +playwright@^1.38.1: + version "1.38.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.38.1.tgz#82ecd9bc4f4f64dbeee8a11c31793748e2528130" + integrity sha512-oRMSJmZrOu1FP5iu3UrCx8JEFRIMxLDM0c/3o4bpzU5Tz97BypefWf7TuTNPWeCe279TPal5RtPPZ+9lW/Qkow== dependencies: - playwright-core "1.36.2" + playwright-core "1.38.1" + optionalDependencies: + fsevents "2.3.2" please-upgrade-node@^3.2.0: version "3.2.0" @@ -7456,7 +7539,7 @@ promise-map-series@^0.3.0: resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.3.0.tgz#41873ca3652bb7a042b387d538552da9b576f8a1" integrity sha512-3npG2NGhTc8BWBolLLf8l/92OxMGaRLbqvIh9wjCHhDXNvk4zsxaTaCpiCunW09qWPrN2zeNSNwRLVBrQQtutA== -promise-retry@^1.1.1: +promise-retry@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" integrity sha512-StEy2osPr28o17bIW776GtwO6+Q+M9zPiZkYfosciUUMYqjhU/ffwRAH0zN2+uvGyUsn8/YICIHRzLbPacpZGw== @@ -7500,6 +7583,11 @@ ps-list@^8.0.0: resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-8.1.1.tgz#9ff1952b26a9a07fcc05270407e60544237ae581" integrity sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ== +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" @@ -8014,16 +8102,7 @@ resolve-options@^1.1.0: dependencies: value-or-function "^3.0.0" -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.3: +resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.22.1, resolve@^1.22.3: version "1.22.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.3.tgz#4b4055349ffb962600972da1fdc33c46a4eb3283" integrity sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw== @@ -8041,10 +8120,10 @@ resolve@^2.0.0-next.4: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resq@^1.10.2: - version "1.11.0" - resolved "https://registry.yarnpkg.com/resq/-/resq-1.11.0.tgz#edec8c58be9af800fd628118c0ca8815283de196" - integrity sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw== +resq@1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/resq/-/resq-1.10.2.tgz#cedf4f20d53f6e574b1e12afbda446ad9576c193" + integrity sha512-HmgVS3j+FLrEDBTDYysPdPVF9/hioDMJ/otOiQDKqk77YfZeeLOj0qi34yObumcud1gBpk+wpBTEg4kMicD++A== dependencies: fast-deep-equal "^2.0.1" @@ -8233,7 +8312,7 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -8321,6 +8400,11 @@ siginfo@^2.0.0: resolved "https://registry.yarnpkg.com/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== +sigmund@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== + signal-exit@^3.0.2: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -8443,6 +8527,11 @@ split2@^3.0.0, split2@^3.1.0: dependencies: readable-stream "^3.0.0" +sprintf-js@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c" + integrity sha512-h/U+VScR2Ft+aXDjGTLtguUEIrYuOjTj79BAOElUvdahYMaaa7SNLjJpOIn+Uzt0hsgHfYvlbcno3e9yXOSo8Q== + sprintf-js@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -9193,6 +9282,11 @@ ufo@^1.1.2: resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.2.0.tgz#28d127a087a46729133fdc89cb1358508b3f80ba" integrity sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg== +uglify-js@^3.5.1: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -9334,6 +9428,11 @@ update-browserslist-db@^1.0.11: escalade "^3.1.1" picocolors "^1.0.0" +upper-case@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -9359,7 +9458,12 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@9.0.0, uuid@^9.0: +uuid@9.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== @@ -9627,6 +9731,13 @@ walk-sync@^2.2.0: matcher-collection "^2.0.0" minimatch "^3.0.4" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -9985,11 +10096,6 @@ xml-name-validator@^4.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== -xml@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -10015,6 +10121,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"