diff --git a/.eslintrc.json b/.eslintrc.json index 3509c20..edac55f 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -5,7 +5,7 @@ }, "overrides": [ { - "files": ["webpack.config.ts", "*.tsx?"], + "files": ["webpack.config.ts", "**/*.ts", "**/*.tsx"], "excludedFiles": ["*.d.ts"], "plugins": ["@typescript-eslint"], "parser": "@typescript-eslint/parser", diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ded24d4..6f46dd2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,8 +22,6 @@ jobs: ${{ runner.os }}-yarn- - name: Install Dependencies - env: - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true run: | yarn --ignore-platform --ignore-engines --frozen-lockfile --prefer-offline diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3bf2acb..c8380e6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,17 +47,32 @@ jobs: ${{ runner.os }}-yarn- - name: Install Dependencies - env: - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true run: | yarn --ignore-platform --ignore-engines --frozen-lockfile --prefer-offline + - name: Install Playwright Browsers + run: npx playwright install chromium + - name: E2E Test - uses: mymindstorm/puppeteer-headful@8f745c770f7f4c0f9f332d7c43a775f90e53779a env: CI: 'true' + run: xvfb-run yarn test + + - name: Upload Playwright Report + uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} with: - args: yarn test + name: playwright-report + path: playwright-report/ + retention-days: 30 + + - name: Upload Test Results + uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: test-results + path: test-results/ + retention-days: 30 unit-test: needs: build @@ -86,8 +101,6 @@ jobs: ${{ runner.os }}-yarn- - name: Install Dependencies - env: - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: true run: | yarn --ignore-platform --ignore-engines --frozen-lockfile --prefer-offline diff --git a/.gitignore b/.gitignore index b1aad19..906d76b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ dist-firefox yarn-error.log /vscode-icons firefox-profile +/test-results +/playwright-report diff --git a/__tests__/.eslintrc.json b/__tests__/.eslintrc.json deleted file mode 100644 index 6746bdb..0000000 --- a/__tests__/.eslintrc.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "env": { - "jest": true - }, - "overrides": [ - { - "files": ["*.ts"], - "excludedFiles": ["*.d.ts"], - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"] - } - ] -} diff --git a/__tests__/babel.config.js b/__tests__/babel.config.js deleted file mode 100644 index 8e0046f..0000000 --- a/__tests__/babel.config.js +++ /dev/null @@ -1,2 +0,0 @@ -// TS files cannot be transformed without this babel config -module.exports = require('../babel.config') diff --git a/__tests__/cases/baseline.ts b/__tests__/cases/baseline.ts deleted file mode 100644 index 2b85d40..0000000 --- a/__tests__/cases/baseline.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Confirm basic behaviors of puppeteer assertions - */ - -import { testURL } from '../testURL' -import { expectToFind, expectToNotFind, expectToReject } from '../utils' - -describe(`in random page`, () => { - beforeAll(() => page.goto(testURL`https://google.com`)) - - it('wait for hidden non-exist element should resolve null', async () => { - expect( - await page.waitForSelector('.non-exist-element', { hidden: true, timeout: 1000 }), - ).toBeNull() - }) - - it('wait for exist element', async () => { - expectToFind('*') - }) - - it('wait for exist element', async () => { - expectToNotFind('.non-exist-element') - }) - - it('wait for non-exist element reject should throw', async () => { - await expectToReject(page.waitForSelector('.non-exist-element', { timeout: 1000 })) - }) - - // Cases below are expected to fail to show how async test works - - // // This is expected to fail! - // it('wait for non-exist element reject should not throw', async () => { - // await expect( - // page.waitForSelector('.non-exist-element', { timeout: 1000 }), - // ).rejects.not.toThrow() - // }) - - // // This is expected to fail! - // it('wait for non-exist element should resolve throw', async () => { - // await expect(page.waitForSelector('.non-exist-element', { timeout: 1000 })).resolves.toThrow() - // }) - - // // This is expected to fail! - // it('wait for non-exist element should resolve not throw', async () => { - // await expect( - // page.waitForSelector('.non-exist-element', { timeout: 1000 }), - // ).resolves.not.toThrow() - // }) -}) diff --git a/__tests__/cases/empty-project.ts b/__tests__/cases/empty-project.ts deleted file mode 100644 index 0780e82..0000000 --- a/__tests__/cases/empty-project.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { getTextContent, sleep } from '../utils' - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/GitakoExtension/test-empty`)) - - it('should render error message', async () => { - await sleep(5000) - - expect(await getTextContent(selectors.gitako.errorMessage)).toBe( - 'This project seems to be empty.', - ) - }) -}) diff --git a/__tests__/cases/expand-to-target.ts b/__tests__/cases/expand-to-target.ts deleted file mode 100644 index ad605cf..0000000 --- a/__tests__/cases/expand-to-target.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { expectToFind, sleep, waitForRedirect } from '../utils' - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`)) - - it('expand to target on load and after redirect', async () => { - await sleep(3000) - - // Expect Gitako sidebar to have expanded src to see contents - await expectToFind(selectors.gitako.fileItemOf('src/components')) - - await page.click(selectors.github.fileListItemLinkOf('components')) - await waitForRedirect() - - // Expect Gitako sidebar to have expanded components and see contents - await expectToFind(selectors.gitako.fileItemOf('src/components/Gitako.tsx')) - }) -}) diff --git a/__tests__/cases/homepage.not-render.ts b/__tests__/cases/homepage.not-render.ts deleted file mode 100644 index ec196bd..0000000 --- a/__tests__/cases/homepage.not-render.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { testURL } from '../testURL' -import { expectToNotFind } from '../utils' - -describe(`in GitHub homepage`, () => { - beforeAll(() => page.goto(testURL`https://github.com`)) - - it('should not render Gitako', async () => { - await expectToNotFind('.gitako-side-bar .gitako-side-bar-body-wrapper') - }) -}) diff --git a/__tests__/cases/pjax.commits-page.ts b/__tests__/cases/pjax.commits-page.ts deleted file mode 100644 index 3d3cbf5..0000000 --- a/__tests__/cases/pjax.commits-page.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { expectToFind, expectToNotFind, sleep, waitForRedirect } from '../utils' - -jest.retryTimes(3) - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/commits/develop`)) - - it('should not break go back in history', async () => { - for (let i = 0; i < 3; i++) { - const commitLinks = await page.$$(selectors.github.commitLinks) - if (commitLinks.length < 2) throw new Error(`No enough commits`) - commitLinks[i].click() - await waitForRedirect() - await expectToFind(selectors.github.commitPage) - await sleep(1000) - - page.goBack() - await sleep(1000) - // The selector for file content - await expectToNotFind(selectors.github.commitPage) - } - }) -}) diff --git a/__tests__/cases/pjax.files-page.ts b/__tests__/cases/pjax.files-page.ts deleted file mode 100644 index 85a5cd2..0000000 --- a/__tests__/cases/pjax.files-page.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { expectToFind, expectToNotFind, sleep, waitForRedirect } from '../utils' - -jest.retryTimes(3) - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`)) - - it('should not break go back in history', async () => { - for (let i = 0; i < 3; i++) { - const fileItems = await page.$$(selectors.github.fileListItemFileLinks) - if (fileItems.length < 2) throw new Error(`No enough files`) - - await waitForRedirect(async () => { - await fileItems[i].click() - }) - await expectToFind(selectors.github.fileContent) - await sleep(1000) - - page.goBack() - await sleep(1000) - // The selector for file content - - await expectToNotFind(selectors.github.fileContent) - } - }) -}) diff --git a/__tests__/cases/pjax.general.ts b/__tests__/cases/pjax.general.ts deleted file mode 100644 index d839105..0000000 --- a/__tests__/cases/pjax.general.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { - collapseFloatModeSidebar, - expandFloatModeSidebar, - getTextContent, - patientClick, - sleep, - waitForRedirect, -} from '../utils' - -jest.retryTimes(3) - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`)) - - it('should work with PJAX', async () => { - await sleep(3000) - - await expandFloatModeSidebar() - await patientClick(selectors.gitako.fileItemOf('src/analytics.ts')) - await waitForRedirect() - await collapseFloatModeSidebar() - - await page.click(selectors.github.navBarItemIssues) - await waitForRedirect() - - await page.click(selectors.github.navBarItemPulls) - await waitForRedirect() - - page.goBack() - await sleep(1000) - - page.goBack() - await sleep(1000) - - expect(await getTextContent(selectors.github.breadcrumbFileName)).toBe('/analytics.ts') - }) -}) diff --git a/__tests__/cases/pjax.internal.ts b/__tests__/cases/pjax.internal.ts deleted file mode 100644 index c675e0c..0000000 --- a/__tests__/cases/pjax.internal.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { - expandFloatModeSidebar, - expectToFind, - expectToNotFind, - patientClick, - sleep, - waitForRedirect, -} from '../utils' - -jest.retryTimes(3) - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/tree/test/multiple-changes`)) - - it('should work with PJAX', async () => { - await sleep(3000) - - await expandFloatModeSidebar() - await patientClick(selectors.gitako.fileItemOf('.babelrc')) - await waitForRedirect() - - await expectToFind(selectors.github.fileContent) - - await waitForRedirect(async () => { - await sleep(1000) // This prevents failing in some cases due to some mystery scheduling issue of puppeteer or jest - page.goBack() - }) - - // The selector for file content - await expectToNotFind(selectors.github.fileContent) - }) -}) diff --git a/__tests__/cases/project-page.gitako.ts b/__tests__/cases/project-page.gitako.ts deleted file mode 100644 index 779ddce..0000000 --- a/__tests__/cases/project-page.gitako.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { expandFloatModeSidebar, expectToFind, expectToNotFind, scroll } from '../utils' - -jest.retryTimes(3) - -describe(`in Gitako project page`, () => { - beforeAll(() => - page.goto( - testURL`https://github.com/EnixCoda/Gitako/tree/test/200-changed-files-200-lines-each`, - ), - ) - - it('should render Gitako', async () => { - await expectToFind(selectors.gitako.bodyWrapper) - }) - - it('should render file list', async () => { - await expectToFind(selectors.gitako.fileItem) - }) - - it('should render while scroll', async () => { - await expandFloatModeSidebar() - - const filesEle = await page.waitForSelector(selectors.gitako.files) - // node of tsconfig.json should NOT be rendered before scroll down - await expectToNotFind(selectors.gitako.fileItemOf('tsconfig.json')) - const box = await filesEle?.boundingBox() - if (box) { - await page.mouse.move(box.x + 40, box.y + 40) - await scroll({ totalDistance: 10000, stepDistance: 100 }) - - // node of tsconfig.json should be rendered now - await expectToFind(selectors.gitako.fileItemOf('tsconfig.json')) - } - }) -}) diff --git a/__tests__/cases/pull-request-page.gitako.ts b/__tests__/cases/pull-request-page.gitako.ts deleted file mode 100644 index 4f36092..0000000 --- a/__tests__/cases/pull-request-page.gitako.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { selectors } from '../selectors' -import { testURL } from '../testURL' -import { expectToFind } from '../utils' - -describe(`in Gitako project page`, () => { - beforeAll(() => page.goto(testURL`https://github.com/EnixCoda/Gitako/pull/71`)) - - it('should render Gitako', async () => { - await expectToFind(selectors.gitako.bodyWrapper) - }) - - it('should render file list', async () => { - await expectToFind(selectors.gitako.fileItem) - }) -}) diff --git a/__tests__/global.d.ts b/__tests__/global.d.ts deleted file mode 100644 index 0e702f5..0000000 --- a/__tests__/global.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare var page: Puppeteer.Page diff --git a/__tests__/jest.config.js b/__tests__/jest.config.js deleted file mode 100644 index ab470d8..0000000 --- a/__tests__/jest.config.js +++ /dev/null @@ -1,185 +0,0 @@ -// For a detailed explanation regarding each configuration property, visit: -// https://jestjs.io/docs/en/configuration.html - -module.exports = { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // Respect "browser" field in package.json when resolving modules - // browser: false, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/private/var/folders/6j/kp9yt47x4872_k7d4gdjbwfm0000gn/T/jest_dx", - - // Automatically clear mock calls and instances between every test - // clearMocks: false, - - // Indicates whether the coverage information should be collected while executing the test - // collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - // collectCoverageFrom: null, - - // The directory where Jest should output its coverage files - // coverageDirectory: null, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // A list of reporter names that Jest uses when writing coverage reports - // coverageReporters: [ - // "json", - // "text", - // "lcov", - // "clover" - // ], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: null, - - // A path to a custom dependency extractor - // dependencyExtractor: null, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: null, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: null, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - maxWorkers: 1, - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "json", - // "jsx", - // "ts", - // "tsx", - // "node" - // ], - - // A map from regular expressions to module names that allow to stub out resources with a single module - // moduleNameMapper: {}, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: 'jest-puppeteer', - - // Run tests from one or more projects - // projects: null, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state between every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: null, - - // Automatically restore mock state between every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: null, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: 'node', - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - testMatch: ['**/?(*.)+(spec|test).ts?(x)'], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - testPathIgnorePatterns: ['/node_modules/', '.d.ts$'], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: null, - - // This option allows use of a custom test runner - // testRunner: "jasmine2", - - // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href - // testURL: "http://localhost", - - testTimeout: 30 * 1000, - - // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" - // timers: "real", - - // A map from regular expressions to paths to transformers - // transform: null, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: null, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/__tests__/jest.puppeteer.config.js b/__tests__/jest.puppeteer.config.js deleted file mode 100644 index 349eed8..0000000 --- a/__tests__/jest.puppeteer.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const baseConfig = require('./jest.config') - -module.exports = { - ...baseConfig, - testMatch: [...baseConfig.testMatch, '**/__tests__/cases/**/*.ts?(x)'], - setupFilesAfterEnv: ['/setup.ts'], -} diff --git a/__tests__/puppeteer.d.ts b/__tests__/puppeteer.d.ts deleted file mode 100644 index cc45d12..0000000 --- a/__tests__/puppeteer.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import * as Puppeteer from 'puppeteer' - -export as namespace Puppeteer -export = Puppeteer diff --git a/__tests__/setup.ts b/__tests__/setup.ts deleted file mode 100644 index 05366db..0000000 --- a/__tests__/setup.ts +++ /dev/null @@ -1 +0,0 @@ -jest.retryTimes(3) diff --git a/__tests__/tsconfig.json b/__tests__/tsconfig.json deleted file mode 100644 index 8fb0bd8..0000000 --- a/__tests__/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["."], - "exclude": ["tsconfig.json"], - "compilerOptions": { - "target": "ES5", - "module": "CommonJS", - "baseUrl": null - } -} diff --git a/__tests__/utils.ts b/__tests__/utils.ts deleted file mode 100644 index 063e0de..0000000 --- a/__tests__/utils.ts +++ /dev/null @@ -1,137 +0,0 @@ -export async function expectToResolve(promise: Promise) { - const pass = jest.fn() - await promise.then(pass) - expect(pass).toHaveBeenCalled() -} - -export async function expectToReject(promise: Promise) { - const pass = jest.fn() - await promise.catch(pass) - expect(pass).toHaveBeenCalled() -} - -export async function expectToFind(selector: string) { - await expectToResolve(page.waitForSelector(selector, { timeout: 2000 })) -} - -export async function expectToNotFind(selector: string) { - await expectToReject(page.waitForSelector(selector, { timeout: 1000 })) -} - -export function sleep(timeout: number) { - return new Promise(resolve => setTimeout(resolve, timeout)) -} - -export async function scroll({ - totalDistance, - stepDistance = 100, -}: { - totalDistance: number - stepDistance?: number -}) { - let distance = 0 - while ((distance += stepDistance) < totalDistance) { - await page.mouse.wheel({ deltaY: stepDistance }) - } -} - -export function assert(condition: boolean, err?: Error | string): asserts condition { - if (!condition) throw typeof err === 'string' ? new Error(err) : err -} - -let counter = 0 -export async function listenTo( - event: string, - target: 'document' | 'window', - callback: (...args: Args) => void, - oneTime?: boolean, -) { - const callbackName = 'onEvent' + ++counter - await page.exposeFunction(callbackName, callback) - await page.evaluate( - (event: string, target: 'window' | 'document', callbackName: string, oneTime?: boolean) => { - const t = target === 'document' ? document : window - const onEvent = (...args: unknown[]): void => { - const method = window[callbackName as keyof Window] - method?.(...args) - if (oneTime) t.removeEventListener(event, onEvent) - } - t.addEventListener(event, onEvent) - }, - event, - target, - callbackName, - oneTime || false, - ) -} - -export function once(event: string, target: 'document' | 'window') { - return new Promise(resolve => { - listenTo( - event, - target, - (...args) => { - resolve(args) - }, - true, - ) - }) -} - -export async function waitForLegacyPJAXRedirect(action?: () => void | Promise) { - const promise = once('pjax:end', 'document') - await action?.() - return promise -} - -export async function waitForTurboRedirect(action?: () => void | Promise) { - const promise = once('turbo:load', 'document') - await action?.() - return promise -} - -export async function waitForRedirect(action?: () => void | Promise) { - let fired = false - const $action = - action && - (() => { - if (fired) return - fired = true - return action() - }) - return Promise.race([ - waitForLegacyPJAXRedirect($action), - waitForTurboRedirect($action), - sleep(3 * 1000), - ]) -} - -export async function patientClick(selector: string) { - await page.waitForSelector(selector) - await page.click(selector) -} - -export async function expandFloatModeSidebar() { - const rect = await ( - await page.$('.gitako-toggle-show-button') - )?.evaluate(button => { - const { x, y, width, height } = button.getBoundingClientRect() - // pass required properties to avoid serialization issues - return { x, y, width, height } - }) - if (rect) { - await page.mouse.move(rect.x + rect.width / 2, rect.y + rect.height / 2) - await sleep(500) - } -} - -export async function collapseFloatModeSidebar() { - await page.mouse.move(600, 600, { - steps: 100, - }) - await sleep(500) -} - -export function getTextContent(query: string) { - return page.evaluate(query => document.querySelector(query)?.textContent, query) -} diff --git a/e2e/baseline.spec.ts b/e2e/baseline.spec.ts new file mode 100644 index 0000000..c8f7443 --- /dev/null +++ b/e2e/baseline.spec.ts @@ -0,0 +1,30 @@ +/** + * Confirm basic behaviors of playwright assertions + */ + +import { expect, test } from './fixtures' +import { testURL } from './testURL' + +test.describe('in random page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://google.com`) + }) + + test('wait for hidden non-exist element should resolve null', async ({ extensionPage }) => { + await expect(extensionPage.locator('.non-exist-element')).toHaveCount(0) + }) + + test('wait for exist element', async ({ extensionPage }) => { + await expect(extensionPage.locator('*').first()).toBeVisible() + }) + + test('wait for non-exist element should not be visible', async ({ extensionPage }) => { + await expect(extensionPage.locator('.non-exist-element')).not.toBeVisible() + }) + + test('wait for non-exist element should timeout', async ({ extensionPage }) => { + await expect(async () => { + await extensionPage.waitForSelector('.non-exist-element', { timeout: 1000 }) + }).rejects.toThrow() + }) +}) diff --git a/e2e/empty-project.spec.ts b/e2e/empty-project.spec.ts new file mode 100644 index 0000000..0c2acaf --- /dev/null +++ b/e2e/empty-project.spec.ts @@ -0,0 +1,17 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { getTextContent, sleep } from './utils' + +test.describe('in Gitako empty project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/GitakoExtension/test-empty`) + }) + + test('should render error message', async ({ extensionPage }) => { + await sleep(5000) + + const textContent = await getTextContent(extensionPage, selectors.gitako.errorMessage) + expect(textContent).toBe('This project seems to be empty.') + }) +}) diff --git a/e2e/expand-to-target.spec.ts b/e2e/expand-to-target.spec.ts new file mode 100644 index 0000000..7f73774 --- /dev/null +++ b/e2e/expand-to-target.spec.ts @@ -0,0 +1,27 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { sleep, waitForRedirect } from './utils' + +test.describe('in Gitako project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`) + }) + + test('expand to target on load and after redirect', async ({ extensionPage }) => { + await sleep(3000) + + // Expect Gitako sidebar to have expanded src to see contents + await expect(extensionPage.locator(selectors.gitako.fileItemOf('src/components'))).toBeVisible({ + timeout: 5000, + }) + + await extensionPage.click(selectors.github.fileListItemLinkOf('components')) + await waitForRedirect(extensionPage) + + // Expect Gitako sidebar to have expanded components and see contents + await expect( + extensionPage.locator(selectors.gitako.fileItemOf('src/components/Gitako.tsx')), + ).toBeVisible({ timeout: 5000 }) + }) +}) diff --git a/e2e/fixtures.ts b/e2e/fixtures.ts new file mode 100644 index 0000000..bc8e078 --- /dev/null +++ b/e2e/fixtures.ts @@ -0,0 +1,29 @@ +import { test as base, chromium, type BrowserContext, type Page } from '@playwright/test' +import path from 'path' + +const EXTENSION_PATH = path.resolve(__dirname, '..', 'dist') + +export const test = base.extend<{ + context: BrowserContext + extensionPage: Page +}>({ + // eslint-disable-next-line no-empty-pattern + context: async ({}, use) => { + const context = await chromium.launchPersistentContext('', { + headless: false, + args: [ + `--no-sandbox`, + `--disable-extensions-except=${EXTENSION_PATH}`, + `--load-extension=${EXTENSION_PATH}`, + ], + }) + await use(context) + await context.close() + }, + extensionPage: async ({ context }, use) => { + const page = await context.newPage() + await use(page) + }, +}) + +export const expect = test.expect diff --git a/e2e/homepage.not-render.spec.ts b/e2e/homepage.not-render.spec.ts new file mode 100644 index 0000000..dd77616 --- /dev/null +++ b/e2e/homepage.not-render.spec.ts @@ -0,0 +1,14 @@ +import { expect, test } from './fixtures' +import { testURL } from './testURL' + +test.describe('in GitHub homepage', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com`) + }) + + test('should not render Gitako', async ({ extensionPage }) => { + await expect( + extensionPage.locator('.gitako-side-bar .gitako-side-bar-body-wrapper'), + ).not.toBeVisible({ timeout: 2000 }) + }) +}) diff --git a/e2e/pjax.commits-page.spec.ts b/e2e/pjax.commits-page.spec.ts new file mode 100644 index 0000000..be1bdaf --- /dev/null +++ b/e2e/pjax.commits-page.spec.ts @@ -0,0 +1,31 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { sleep, waitForRedirect } from './utils' + +test.describe('in Gitako commits page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/commits/develop`) + }) + + test('should not break go back in history', async ({ extensionPage }) => { + for (let i = 0; i < 3; i++) { + const commitLinks = await extensionPage.locator(selectors.github.commitLinks).all() + if (commitLinks.length < 2) throw new Error(`No enough commits`) + + await commitLinks[i].click() + await waitForRedirect(extensionPage) + await expect(extensionPage.locator(selectors.github.commitPage).first()).toBeVisible({ + timeout: 5000, + }) + await sleep(1000) + + await extensionPage.goBack() + await sleep(1000) + // The selector for commit page should not be visible + await expect(extensionPage.locator(selectors.github.commitPage)).not.toBeVisible({ + timeout: 2000, + }) + } + }) +}) diff --git a/e2e/pjax.files-page.spec.ts b/e2e/pjax.files-page.spec.ts new file mode 100644 index 0000000..d3f9390 --- /dev/null +++ b/e2e/pjax.files-page.spec.ts @@ -0,0 +1,32 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { sleep, waitForRedirect } from './utils' + +test.describe('in Gitako project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`) + }) + + test('should not break go back in history', async ({ extensionPage }) => { + for (let i = 0; i < 3; i++) { + const fileItems = await extensionPage.locator(selectors.github.fileListItemFileLinks).all() + if (fileItems.length < 2) throw new Error(`No enough files`) + + await waitForRedirect(extensionPage, async () => { + await fileItems[i].click() + }) + await expect(extensionPage.locator(selectors.github.fileContent)).toBeVisible({ + timeout: 5000, + }) + await sleep(1000) + + await extensionPage.goBack() + await sleep(1000) + // The selector for file content should not be visible + await expect(extensionPage.locator(selectors.github.fileContent)).not.toBeVisible({ + timeout: 2000, + }) + } + }) +}) diff --git a/e2e/pjax.general.spec.ts b/e2e/pjax.general.spec.ts new file mode 100644 index 0000000..0c519d2 --- /dev/null +++ b/e2e/pjax.general.spec.ts @@ -0,0 +1,41 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { + collapseFloatModeSidebar, + expandFloatModeSidebar, + getTextContent, + patientClick, + sleep, + waitForRedirect, +} from './utils' + +test.describe('in Gitako project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/tree/develop/src`) + }) + + test('should work with PJAX', async ({ extensionPage }) => { + await sleep(3000) + + await expandFloatModeSidebar(extensionPage) + await patientClick(extensionPage, selectors.gitako.fileItemOf('src/analytics.ts')) + await waitForRedirect(extensionPage) + await collapseFloatModeSidebar(extensionPage) + + await extensionPage.click(selectors.github.navBarItemIssues) + await waitForRedirect(extensionPage) + + await extensionPage.click(selectors.github.navBarItemPulls) + await waitForRedirect(extensionPage) + + await extensionPage.goBack() + await sleep(1000) + + await extensionPage.goBack() + await sleep(1000) + + const textContent = await getTextContent(extensionPage, selectors.github.breadcrumbFileName) + expect(textContent).toBe('/analytics.ts') + }) +}) diff --git a/e2e/pjax.internal.spec.ts b/e2e/pjax.internal.spec.ts new file mode 100644 index 0000000..2785939 --- /dev/null +++ b/e2e/pjax.internal.spec.ts @@ -0,0 +1,30 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { expandFloatModeSidebar, patientClick, sleep, waitForRedirect } from './utils' + +test.describe('in Gitako project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/tree/test/multiple-changes`) + }) + + test('should work with PJAX', async ({ extensionPage }) => { + await sleep(3000) + + await expandFloatModeSidebar(extensionPage) + await patientClick(extensionPage, selectors.gitako.fileItemOf('.babelrc')) + await waitForRedirect(extensionPage) + + await expect(extensionPage.locator(selectors.github.fileContent)).toBeVisible({ timeout: 5000 }) + + await waitForRedirect(extensionPage, async () => { + await sleep(1000) // This prevents failing in some cases due to some mystery scheduling issue + await extensionPage.goBack() + }) + + // The selector for file content should not be visible + await expect(extensionPage.locator(selectors.github.fileContent)).not.toBeVisible({ + timeout: 2000, + }) + }) +}) diff --git a/e2e/project-page.gitako.spec.ts b/e2e/project-page.gitako.spec.ts new file mode 100644 index 0000000..bbadc91 --- /dev/null +++ b/e2e/project-page.gitako.spec.ts @@ -0,0 +1,46 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' +import { expandFloatModeSidebar, scroll } from './utils' + +test.describe('in Gitako project page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto( + testURL`https://github.com/EnixCoda/Gitako/tree/test/200-changed-files-200-lines-each`, + ) + }) + + test('should render Gitako', async ({ extensionPage }) => { + await expect(extensionPage.locator(selectors.gitako.bodyWrapper)).toBeVisible({ timeout: 5000 }) + }) + + test('should render file list', async ({ extensionPage }) => { + await expect(extensionPage.locator(selectors.gitako.fileItem).first()).toBeVisible({ + timeout: 5000, + }) + }) + + test('should render while scroll', async ({ extensionPage }) => { + await expandFloatModeSidebar(extensionPage) + + await extensionPage.waitForSelector(selectors.gitako.files) + // node of tsconfig.json should NOT be rendered before scroll down + await expect( + extensionPage.locator(selectors.gitako.fileItemOf('tsconfig.json')), + ).not.toBeVisible({ + timeout: 2000, + }) + + const filesEle = extensionPage.locator(selectors.gitako.files) + const box = await filesEle.boundingBox() + if (box) { + await extensionPage.mouse.move(box.x + 40, box.y + 40) + await scroll(extensionPage, { totalDistance: 10000, stepDistance: 100 }) + + // node of tsconfig.json should be rendered now + await expect(extensionPage.locator(selectors.gitako.fileItemOf('tsconfig.json'))).toBeVisible( + { timeout: 5000 }, + ) + } + }) +}) diff --git a/e2e/pull-request-page.gitako.spec.ts b/e2e/pull-request-page.gitako.spec.ts new file mode 100644 index 0000000..7da179d --- /dev/null +++ b/e2e/pull-request-page.gitako.spec.ts @@ -0,0 +1,19 @@ +import { expect, test } from './fixtures' +import { selectors } from './selectors' +import { testURL } from './testURL' + +test.describe('in Gitako pull request page', () => { + test.beforeEach(async ({ extensionPage }) => { + await extensionPage.goto(testURL`https://github.com/EnixCoda/Gitako/pull/71`) + }) + + test('should render Gitako', async ({ extensionPage }) => { + await expect(extensionPage.locator(selectors.gitako.bodyWrapper)).toBeVisible({ timeout: 5000 }) + }) + + test('should render file list', async ({ extensionPage }) => { + await expect(extensionPage.locator(selectors.gitako.fileItem).first()).toBeVisible({ + timeout: 5000, + }) + }) +}) diff --git a/__tests__/selectors.ts b/e2e/selectors.ts similarity index 100% rename from __tests__/selectors.ts rename to e2e/selectors.ts diff --git a/__tests__/testURL.ts b/e2e/testURL.ts similarity index 100% rename from __tests__/testURL.ts rename to e2e/testURL.ts diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..7275069 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "moduleResolution": "Node", + "module": "ESNext", + "target": "ESNext", + "strict": true, + "lib": ["dom", "es2017.object", "es2016", "ES2019.Array", "ES2020.String", "ES2022.Error"], + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["./**/*.ts"] +} diff --git a/e2e/utils.ts b/e2e/utils.ts new file mode 100644 index 0000000..24bee51 --- /dev/null +++ b/e2e/utils.ts @@ -0,0 +1,98 @@ +import type { Page } from '@playwright/test' + +export function sleep(timeout: number) { + return new Promise(resolve => setTimeout(resolve, timeout)) +} + +export async function scroll( + page: Page, + { + totalDistance, + stepDistance = 100, + }: { + totalDistance: number + stepDistance?: number + }, +) { + let distance = 0 + while ((distance += stepDistance) < totalDistance) { + await page.mouse.wheel(0, stepDistance) + } +} + +export function assert(condition: boolean, err?: Error | string): asserts condition { + if (!condition) throw typeof err === 'string' ? new Error(err) : err +} + +export async function waitForLegacyPJAXRedirect(page: Page, action?: () => void | Promise) { + const promise = page.evaluate(() => { + return new Promise(resolve => { + const onEvent = () => { + document.removeEventListener('pjax:end', onEvent) + resolve() + } + document.addEventListener('pjax:end', onEvent) + }) + }) + await action?.() + return promise +} + +export async function waitForTurboRedirect(page: Page, action?: () => void | Promise) { + const promise = page.evaluate(() => { + return new Promise(resolve => { + const onEvent = () => { + document.removeEventListener('turbo:load', onEvent) + resolve() + } + document.addEventListener('turbo:load', onEvent) + }) + }) + await action?.() + return promise +} + +export async function waitForRedirect(page: Page, action?: () => void | Promise) { + let fired = false + const $action = + action && + (() => { + if (fired) return + fired = true + return action() + }) + + return Promise.race([ + waitForLegacyPJAXRedirect(page, $action), + waitForTurboRedirect(page, $action), + sleep(3 * 1000), + ]) +} + +export async function patientClick(page: Page, selector: string) { + await page.waitForSelector(selector) + await page.click(selector) +} + +export async function expandFloatModeSidebar(page: Page) { + const button = page.locator('.gitako-toggle-show-button') + const rect = await button.boundingBox() + if (rect) { + await page.mouse.move(rect.x + rect.width / 2, rect.y + rect.height / 2) + await sleep(500) + } +} + +export async function collapseFloatModeSidebar(page: Page) { + await page.mouse.move(600, 600, { + steps: 100, + }) + await sleep(500) +} + +export async function getTextContent( + page: Page, + query: string, +): Promise { + return page.evaluate((query: string) => document.querySelector(query)?.textContent, query) +} diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js deleted file mode 100644 index 7aafbec..0000000 --- a/jest-puppeteer.config.js +++ /dev/null @@ -1,21 +0,0 @@ -const path = require('path') -if (process.arch === 'arm64' && process.platform === 'darwin') { - require('dotenv').config() -} - -const CRX_PATH = path.resolve(__dirname, 'dist') - -module.exports = { - launch: { - // set by mujo-code/puppeteer-headful on GitHub actions - // also for usages on ARM chip Mac - executablePath: process.env.PUPPETEER_EXEC_PATH, - // required for enabling extensions - headless: false, - args: [ - `--no-sandbox`, - `--disable-extensions-except=${CRX_PATH}`, - `--load-extension=${CRX_PATH}`, - ], - }, -} diff --git a/package.json b/package.json index 18bd658..7c567c2 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "build": "VERSION=v$(node scripts/get-version.js) NODE_OPTIONS=--openssl-legacy-provider NODE_ENV=production webpack", "build:all": "GITAKO_TARGET= yarn run build", "build:analyze": "ANALYZE= yarn run build", - "test": "NODE_ENV=test jest --config __tests__/jest.puppeteer.config.js", + "test": "playwright test", + "test:ui": "playwright test --ui", "test:unit": "NODE_ENV=test jest --config jest.config.js" }, "dependencies": { @@ -51,8 +52,10 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.7", "@babel/preset-typescript": "^7.16.7", + "@playwright/test": "^1.40.0", "@sentry/cli": "^1.64.2", "@testing-library/react": "^13.3.0", + "@types/dotenv": "^6", "@types/firefox-webext-browser": "^120.0.3", "@types/history": "^5.0.0", "@types/ini": "^1.3.31", @@ -60,7 +63,6 @@ "@types/js-base64": "^3.3.1", "@types/node": "^18", "@types/nprogress": "^0.0.29", - "@types/puppeteer": "^5.4.3", "@types/react": "^18.0.9", "@types/react-dom": "^18.0.3", "@types/react-window": "^1.8.5", @@ -83,13 +85,11 @@ "husky": "^8.0.1", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", - "jest-puppeteer": "^10.0.1", "json-loader": "^0.5.7", "lint-staged": "^13.0.3", "mini-css-extract-plugin": "^2.9.0", "patch-package": "^8.0.0", "prettier": "^2.8.3", - "puppeteer": "^22.12.1", "raw-loader": "^4.0.0", "sass": "^1.26.2", "sass-loader": "^8.0.2", diff --git a/playwright.config.mts b/playwright.config.mts new file mode 100644 index 0000000..b9e143b --- /dev/null +++ b/playwright.config.mts @@ -0,0 +1,45 @@ +import { defineConfig, devices } from '@playwright/test' +import * as dotenv from 'dotenv' +import * as path from 'path' +import { fileURLToPath } from 'url' + +if (process.arch === 'arm64' && process.platform === 'darwin') { + dotenv.config() +} + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const EXTENSION_PATH = path.resolve(__dirname, 'dist') + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 3 : 0, + workers: process.env.CI ? 2 : undefined, + reporter: 'html', + timeout: 60000, + expect: { + timeout: 10000, + }, + use: { + trace: 'on-first-retry', + video: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + // Load the extension + launchOptions: { + args: [ + `--no-sandbox`, + `--disable-extensions-except=${EXTENSION_PATH}`, + `--load-extension=${EXTENSION_PATH}`, + ], + headless: false, + }, + }, + }, + ], +}) diff --git a/scripts/vscode-icons/generate-icon-index.js b/scripts/vscode-icons/generate-icon-index.js index 5a02316..565a07e 100644 --- a/scripts/vscode-icons/generate-icon-index.js +++ b/scripts/vscode-icons/generate-icon-index.js @@ -1,6 +1,6 @@ const path = require('path') const { promises: fs, existsSync } = require('fs') -const puppeteer = require('puppeteer') +const { chromium } = require('@playwright/test') const generateFileIconIndex = require('./generate-file-icon-index') const generateFolderIconIndex = require('./generate-folder-icon-index') const { emitDirPath, checkEmitDir } = require('./check-emit-dir') @@ -8,8 +8,9 @@ const { emitDirPath, checkEmitDir } = require('./check-emit-dir') let browser async function getPage() { const headless = process.env.HEADLESS !== 'false' - browser = browser || (await puppeteer.launch({ headless })) - return await browser.newPage() + browser = browser || (await chromium.launch({ headless })) + const context = await browser.newContext() + return await context.newPage() } async function generateCSV() { diff --git a/yarn.lock b/yarn.lock index fa7689c..f4b616f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1931,23 +1931,6 @@ resolved "https://registry.yarnpkg.com/@github/paste-markdown/-/paste-markdown-1.3.5.tgz#de587494df7058700a29a53addbdbd51c317a0d3" integrity sha512-R86Vns99qRCqSUvvhjPGDQYp8sAutueMfKtep5F3d2vyJz2Es3ratU7Q3Q6/RJ0ac48sj99shtuUfUufoTcKlQ== -"@hapi/hoek@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.2.0.tgz#f3933a44e365864f4dad5db94158106d511e8131" - integrity sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug== - -"@hapi/hoek@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -2388,6 +2371,13 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@playwright/test@^1.40.0": + version "1.57.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.57.0.tgz#a14720ffa9ed7ef7edbc1f60784fc6134acbb003" + integrity sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA== + dependencies: + playwright "1.57.0" + "@pnpm/network.ca-file@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz#16f88d057c68cd5419c1ef3dfa281296ea80b047" @@ -2459,20 +2449,6 @@ react-intersection-observer "9.4.0" styled-system "^5.1.5" -"@puppeteer/browsers@2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.2.3.tgz#ad6b79129c50825e77ddaba082680f4dad0b674e" - integrity sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ== - dependencies: - debug "4.3.4" - extract-zip "2.0.1" - progress "2.0.3" - proxy-agent "6.4.0" - semver "7.6.0" - tar-fs "3.0.5" - unbzip2-stream "1.4.3" - yargs "17.7.2" - "@radix-ui/react-polymorphic@^0.0.14": version "0.0.14" resolved "https://registry.yarnpkg.com/@radix-ui/react-polymorphic/-/react-polymorphic-0.0.14.tgz#fc6cefee6686db8c5a7ff14c8c1b9b5abdee325b" @@ -2549,23 +2525,6 @@ "@sentry/types" "6.3.6" tslib "^1.9.3" -"@sideway/address@^4.1.5": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" - integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2744,11 +2703,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tootallnate/quickjs-emscripten@^0.23.0": - version "0.23.0" - resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" - integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== - "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -2834,6 +2788,13 @@ dependencies: "@types/node" "*" +"@types/dotenv@^6": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/dotenv/-/dotenv-6.1.1.tgz#f7ce1cc4fe34f0a4373ba99fefa437b0bec54b46" + integrity sha512-ftQl3DtBvqHl9L16tpqqzA4YzCSXZfi7g8cQceTz5rOlYtk/IZbFjAv3mLOQlNIgOaylCQWQoBdDQHPgEBJPHg== + dependencies: + "@types/node" "*" + "@types/eslint-scope@^3.7.3": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" @@ -3019,13 +2980,6 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.2.tgz#0e58ae66773d7fd7c372a493aff740878ec9ceaa" integrity sha512-f8JzJNWVhKtc9dg/dyDNfliTKNOJSLa7Oht/ElZdF/UbMUmAH3rLmAk3ODNjw0mZajDEgatA03tRjB4+Dp/tzA== -"@types/puppeteer@^5.4.3": - version "5.4.7" - resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.7.tgz#b8804737c62c6e236de0c03fa74f91c174bf96b6" - integrity sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ== - dependencies: - "@types/node" "*" - "@types/react-dom@^18.0.0", "@types/react-dom@^18.0.3": version "18.0.3" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.3.tgz#a022ea08c75a476fe5e96b675c3e673363853831" @@ -3132,13 +3086,6 @@ dependencies: "@types/node" "*" -"@types/yauzl@^2.9.1": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.1.tgz#d10f69f9f522eef3cf98e30afb684a1e1ec923af" - integrity sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA== - dependencies: - "@types/node" "*" - "@typescript-eslint/eslint-plugin@^5.33.1": version "5.33.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz#c0a480d05211660221eda963cc844732fe9b1714" @@ -3511,13 +3458,6 @@ agent-base@6: dependencies: debug "4" -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -3785,13 +3725,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -ast-types@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" - integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== - dependencies: - tslib "^2.0.1" - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -3827,20 +3760,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axios@^1.6.1: - version "1.7.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" - integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -b4a@^1.6.4: - version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" - integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== - babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -4046,54 +3965,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= -bare-events@^2.0.0, bare-events@^2.2.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.4.2.tgz#3140cca7a0e11d49b3edc5041ab560659fd8e1f8" - integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== - -bare-fs@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.1.tgz#cdbd63dac7a552dfb2b87d18c822298d1efd213d" - integrity sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== - dependencies: - bare-events "^2.0.0" - bare-path "^2.0.0" - bare-stream "^2.0.0" - -bare-os@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.0.tgz#5de5e3ba7704f459c9656629edca7cc736e06608" - integrity sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== - -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" - integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== - dependencies: - bare-os "^2.1.0" - -bare-stream@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.1.3.tgz#070b69919963a437cc9e20554ede079ce0a129b2" - integrity sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== - dependencies: - streamx "^2.18.0" - -base64-js@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -basic-ftp@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" - integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== - bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -4224,14 +4100,6 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== -buffer@^5.2.1: - version "5.7.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.0.tgz#88afbd29fc89fa7b58e82b39206f31f2cf34feed" - integrity sha512-cd+5r1VLBwUqTrmnzW+D7ABkJUM6mr7uv1dv+6jRw4Rcl7tFIFHDqHPL98LhpGFn3dbAt3gtLxtrWp4m1kFrqg== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - bunyan@1.8.15: version "1.8.15" resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.15.tgz#8ce34ca908a17d0776576ca1b2f6cbd916e93b46" @@ -4449,15 +4317,6 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -chromium-bidi@0.5.24: - version "0.5.24" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.24.tgz#0fe672fa30b1e6bcc63ae818442b21c41849c435" - integrity sha512-5xQNN2SVBdZv4TxeMLaI+PelrnZsHDhn8h2JtyriLr+0qHcZS8BMuo93qN6J1VmtmrgYP+rmcLHcbpnA8QJh+w== - dependencies: - mitt "3.0.1" - urlpattern-polyfill "10.0.0" - zod "3.23.8" - ci-info@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" @@ -4653,11 +4512,6 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" @@ -4820,7 +4674,7 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig@^8.2.0, cosmiconfig@^8.3.6: +cosmiconfig@^8.2.0: version "8.3.6" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== @@ -4830,16 +4684,6 @@ cosmiconfig@^8.2.0, cosmiconfig@^8.3.6: parse-json "^5.2.0" path-type "^4.0.0" -cosmiconfig@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" - integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== - dependencies: - env-paths "^2.2.1" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" @@ -4978,14 +4822,6 @@ csstype@^3.0.6: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== -cwd@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" - integrity sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc= - dependencies: - find-pkg "^0.1.2" - fs-exists-sync "^0.1.0" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4998,11 +4834,6 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== -data-uri-to-buffer@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" - integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== - data-urls@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143" @@ -5024,13 +4855,6 @@ debug@4, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -debug@4.3.4, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -5038,13 +4862,20 @@ debug@^2.6.8: dependencies: ms "2.0.0" -debug@^4.3.1, debug@^4.3.5, debug@~4.3.2, debug@~4.3.4: +debug@^4.3.1, debug@~4.3.2, debug@~4.3.4: version "4.3.5" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" +debug@^4.3.2, debug@^4.3.4, debug@~4.3.1: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-6.0.0.tgz#8cad4d916fde5c41a264a43d0ecc56fe3d31749e" @@ -5084,7 +4915,7 @@ deepcopy@2.1.0: dependencies: type-detect "^4.0.8" -deepmerge@4.3.1, deepmerge@^4.3.1: +deepmerge@4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -5135,15 +4966,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -degenerator@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" - integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== - dependencies: - ast-types "^0.13.4" - escodegen "^2.1.0" - esprima "^4.0.1" - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -5177,11 +4999,6 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -devtools-protocol@0.0.1299070: - version "0.0.1299070" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz#b3e4cf0b678a46f0f907ae6e07e03ad3a53c00df" - integrity sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg== - diff-sequences@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" @@ -5435,11 +5252,6 @@ entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== -env-paths@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - envinfo@^7.7.3: version "7.13.0" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" @@ -5578,17 +5390,6 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -escodegen@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" @@ -5893,18 +5694,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= - dependencies: - os-homedir "^1.0.1" - -expect-puppeteer@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/expect-puppeteer/-/expect-puppeteer-10.0.0.tgz#4b00c7a0636ecb776365d90396949ebf4710d804" - integrity sha512-E7sE6nVdEbrnpDOBMmcLgyqLJKt876AlBg1A+gsu5R8cWx+SLafreOgJAgzXg5Qko7Tk0cW5oZdRbHQLU738dg== - expect@^29.0.0: version "29.2.2" resolved "https://registry.yarnpkg.com/expect/-/expect-29.2.2.tgz#ba2dd0d7e818727710324a6e7f13dd0e6d086106" @@ -5946,17 +5735,6 @@ external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5982,11 +5760,6 @@ fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.2.0, fast-fifo@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -6126,30 +5899,6 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-file-up@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/find-file-up/-/find-file-up-0.1.3.tgz#cf68091bcf9f300a40da411b37da5cce5a2fbea0" - integrity sha1-z2gJG8+fMApA2kEbN9pczlovvqA= - dependencies: - fs-exists-sync "^0.1.0" - resolve-dir "^0.1.0" - -find-pkg@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-pkg/-/find-pkg-0.1.2.tgz#1bdc22c06e36365532e2a248046854b9788da557" - integrity sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc= - dependencies: - find-file-up "^0.1.2" - -find-process@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" - integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== - dependencies: - chalk "^4.0.0" - commander "^5.1.0" - debug "^4.1.1" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -6220,11 +5969,6 @@ focus-visible@^5.2.0: resolved "https://registry.yarnpkg.com/focus-visible/-/focus-visible-5.2.0.tgz#3a9e41fccf587bd25dcc2ef045508284f0a4d6b3" integrity sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ== -follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - foreground-child@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" @@ -6291,11 +6035,6 @@ fp-ts@^2.6.1: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.8.tgz#dfa1ea1c967ac6794c43ce877aeb8ed76f5e0df7" integrity sha512-nmDtNqmMZkOxu0M5hkrS9YA15/KPkYkILb6Axg9XBAoUoYEtzg+LFmVWqZrl9FNttsW0qIUpx9RCA9INbv+Bxw== -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - fs-extra@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" @@ -6314,15 +6053,6 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" - integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -6376,7 +6106,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.3.2, fsevents@^2.3.3, fsevents@~2.1.2, fsevents@~2.3.2: +fsevents@2.3.2, fsevents@^2.3.2, fsevents@^2.3.3, fsevents@~2.1.2, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -6497,16 +6227,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-uri@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" - integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== - dependencies: - basic-ftp "^5.0.2" - data-uri-to-buffer "^6.0.2" - debug "^4.3.4" - fs-extra "^11.2.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -6593,24 +6313,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= - dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" - -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= - dependencies: - homedir-polyfill "^1.0.0" - ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6864,13 +6566,6 @@ hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: dependencies: react-is "^16.7.0" -homedir-polyfill@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -6912,14 +6607,6 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" - integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -6953,14 +6640,6 @@ https-proxy-agent@^5.0.1: agent-base "6" debug "4" -https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== - dependencies: - agent-base "^7.0.2" - debug "4" - human-id@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/human-id/-/human-id-1.0.2.tgz#e654d4b2b0d8b07e45da9f6020d8af17ec0a5df3" @@ -7017,11 +6696,6 @@ icss-utils@^4.1.0: dependencies: postcss "^7.0.14" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" @@ -7172,14 +6846,6 @@ io-ts@^2.2.13: resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.21.tgz#4ef754176f7082a1099d04c7d5c4ea53267c530a" integrity sha512-zz2Z69v9ZIC3mMLYWIeoUcwWD6f+O7yP92FMVVaXEOSZH1jnVBmET/urd/uoarD1WGBY4rCj8TAyMPzsGNzMFQ== -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - is-absolute@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" @@ -7440,11 +7106,6 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" - integrity sha1-3hqm1j6indJIc3tp8f+LgALSEIw= - is-windows@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7644,19 +7305,6 @@ jest-config@^29.7.0: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-dev-server@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/jest-dev-server/-/jest-dev-server-10.0.0.tgz#a2f3ccd0b9c9e8a493ab73908bc082bedc6b86eb" - integrity sha512-FtyBBDxrAIfTX3hyKSOwj5KU6Z7fFLew5pQYOFpwyf+qpPpULL8aYxtsFkbkAwcs+Mb7qhcNbVLeiWsLOd7CKw== - dependencies: - chalk "^4.1.2" - cwd "^0.10.0" - find-process "^1.4.7" - prompts "^2.4.2" - spawnd "^10.0.0" - tree-kill "^1.2.2" - wait-on "^7.2.0" - jest-diff@^29.2.1: version "29.2.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.2.1.tgz#027e42f5a18b693fb2e88f81b0ccab533c08faee" @@ -7721,17 +7369,6 @@ jest-environment-node@^29.7.0: jest-mock "^29.7.0" jest-util "^29.7.0" -jest-environment-puppeteer@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/jest-environment-puppeteer/-/jest-environment-puppeteer-10.0.1.tgz#f69a62606b51beee2d6f21494218bea2ad6643a5" - integrity sha512-FxMzVRyqieQqSy5CPWiwdK5t9dkRHid5eoRTVa8RtYeXLlpW6lU0dAmxEfPkdnDVCiPUhC2APeKOXq0J72bgag== - dependencies: - chalk "^4.1.2" - cosmiconfig "^8.3.6" - deepmerge "^4.3.1" - jest-dev-server "^10.0.0" - jest-environment-node "^29.7.0" - jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" @@ -7833,14 +7470,6 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-puppeteer@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/jest-puppeteer/-/jest-puppeteer-10.0.1.tgz#c9537ed42b98f6764dc91fa33819e0b20aaaf83b" - integrity sha512-FzC35XbqeuQEt1smXh1EOqhJaRkWqJkyWDMfGkcZ8C59QHXeJ7F/iOmiNqYi6l/OsycUuOPCk+IkjfGfS9YbrQ== - dependencies: - expect-puppeteer "^10.0.0" - jest-environment-puppeteer "^10.0.1" - jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" @@ -8029,17 +7658,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -joi@^17.11.0: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - jose@4.13.1: version "4.13.1" resolved "https://registry.yarnpkg.com/jose/-/jose-4.13.1.tgz#449111bb5ab171db85c03f1bd2cb1647ca06db1c" @@ -8080,11 +7698,6 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" - integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== - jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -8533,11 +8146,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - lz-string@^1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" @@ -8735,21 +8343,11 @@ minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -minimist@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mitt@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" - integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== - mkdirp@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" @@ -8864,11 +8462,6 @@ neo-blessed@^0.2.0: resolved "https://registry.yarnpkg.com/neo-blessed/-/neo-blessed-0.2.0.tgz#30f9495fdd104494402b62c6273a9c9b82de4f2b" integrity sha512-C2kC4K+G2QnNQFXUIxTQvqmrdSIzGTX1ZRKeDW6ChmvPRw8rTkTEJzbEQHiHy06d36PCl/yMOCjquCRV8SpSQw== -netmask@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7" - integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== - node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" @@ -9157,11 +8750,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -os-homedir@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - os-locale@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-5.0.0.tgz#6d26c1d95b6597c5d5317bf5fba37eccec3672e0" @@ -9253,28 +8841,6 @@ 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== -pac-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" - integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== - dependencies: - "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" - debug "^4.3.4" - get-uri "^6.0.1" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.5" - pac-resolver "^7.0.1" - socks-proxy-agent "^8.0.4" - -pac-resolver@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" - integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== - dependencies: - degenerator "^5.0.0" - netmask "^2.0.2" - package-json@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.0.tgz#2a22806f1ed7c786c8e6ff26cfe20003bf4c6850" @@ -9317,11 +8883,6 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5-htmlparser2-tree-adapter@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" @@ -9534,6 +9095,20 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +playwright-core@1.57.0: + version "1.57.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.57.0.tgz#3dcc9a865af256fa9f0af0d67fc8dd54eecaebf5" + integrity sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ== + +playwright@1.57.0: + version "1.57.0" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.57.0.tgz#74d1dacff5048dc40bf4676940b1901e18ad0f46" + integrity sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw== + dependencies: + playwright-core "1.57.0" + optionalDependencies: + fsevents "2.3.2" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -9660,7 +9235,7 @@ process-warning@^3.0.0: resolved "https://registry.yarnpkg.com/process-warning/-/process-warning-3.0.0.tgz#96e5b88884187a1dce6f5c3166d611132058710b" integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== -progress@2.0.3, progress@^2.0.3: +progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -9680,14 +9255,6 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.4" -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -9702,20 +9269,6 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== -proxy-agent@6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" - integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - http-proxy-agent "^7.0.1" - https-proxy-agent "^7.0.3" - lru-cache "^7.14.1" - pac-proxy-agent "^7.0.1" - proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.2" - proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -9756,27 +9309,6 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" -puppeteer-core@22.12.1: - version "22.12.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.12.1.tgz#4dacc2e9ab127ef534a4bb4793d33f9424a5b48d" - integrity sha512-XmqeDPVdC5/3nGJys1jbgeoZ02wP0WV1GBlPtr/ULRbGXJFuqgXMcKQ3eeNtFpBzGRbpeoCGWHge1ZWKWl0Exw== - dependencies: - "@puppeteer/browsers" "2.2.3" - chromium-bidi "0.5.24" - debug "^4.3.5" - devtools-protocol "0.0.1299070" - ws "^8.17.1" - -puppeteer@^22.12.1: - version "22.12.1" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.12.1.tgz#a648715c24e65a9b0cee515687d8923bfa639a67" - integrity sha512-1GxY8dnEnHr1SLzdSDr0FCjM6JQfAh2E2I/EqzeF8a58DbGVk9oVjj4lFdqNoVbpgFSpAbz7VER9St7S1wDpNg== - dependencies: - "@puppeteer/browsers" "2.2.3" - cosmiconfig "^9.0.0" - devtools-protocol "0.0.1299070" - puppeteer-core "22.12.1" - pure-rand@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" @@ -9797,11 +9329,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - queue@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" @@ -10176,14 +9703,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= - dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -10291,13 +9810,6 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -rxjs@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -10435,13 +9947,6 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - semver@7.6.2, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" @@ -10597,7 +10102,7 @@ signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1, signal-exit@^4.1.0: +signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -10611,7 +10116,7 @@ sirv@^2.0.3: mrmime "^2.0.0" totalist "^3.0.0" -sisteransi@^1.0.4, sisteransi@^1.0.5: +sisteransi@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== @@ -10657,11 +10162,6 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - socket.io-adapter@~2.5.2: version "2.5.5" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" @@ -10701,23 +10201,6 @@ socket.io@^4.1.3: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" -socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" - integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== - dependencies: - agent-base "^7.1.1" - debug "^4.3.4" - socks "^2.8.3" - -socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - sonic-boom@^3.7.0: version "3.8.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-3.8.1.tgz#d5ba8c4e26d6176c9a1d14d549d9ff579a163422" @@ -10769,14 +10252,6 @@ spawn-sync@1.0.15: concat-stream "^1.4.7" os-shim "^0.1.2" -spawnd@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/spawnd/-/spawnd-10.0.0.tgz#cf1b222831272f4bef7e2abc9f98cd31c380a4dc" - integrity sha512-6GKcakMTryb5b1SWCvdubCDHEsR2k+5VZUD5G19umZRarkvj1RyCGyizcqhjewI7cqZo8fTVD8HpnDZbVOLMtg== - dependencies: - signal-exit "^4.1.0" - tree-kill "^1.2.2" - spawndamnit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/spawndamnit/-/spawndamnit-2.0.0.tgz#9f762ac5c3476abb994b42ad592b5ad22bb4b0ad" @@ -10802,11 +10277,6 @@ split@~1.0.1: dependencies: through "2" -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -10879,17 +10349,6 @@ stream-to-promise@3.0.0: end-of-stream "~1.4.1" stream-to-array "~2.3.0" -streamx@^2.15.0, streamx@^2.18.0: - version "2.18.0" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.18.0.tgz#5bc1a51eb412a667ebfdcd4e6cf6a6fc65721ac7" - integrity sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== - dependencies: - fast-fifo "^1.3.2" - queue-tick "^1.0.1" - text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" - string-argv@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -11178,26 +10637,6 @@ tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.5.tgz#f954d77767e4e6edf973384e1eb95f8f81d64ed9" - integrity sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" - optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" - -tar-stream@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - term-size@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54" @@ -11233,13 +10672,6 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-decoder@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.1.tgz#5df9c224cebac4a7977720b9f083f9efa1aefde8" - integrity sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA== - dependencies: - b4a "^1.6.4" - text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -11352,11 +10784,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - ts-easing@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec" @@ -11391,11 +10818,6 @@ tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslib@^2.0.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - tslib@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" @@ -11491,14 +10913,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unbzip2-stream@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" - integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -11659,11 +11073,6 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -urlpattern-polyfill@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" - integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11719,17 +11128,6 @@ w3c-xmlserializer@^3.0.0: dependencies: xml-name-validator "^4.0.0" -wait-on@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.2.0.tgz#d76b20ed3fc1e2bebc051fae5c1ff93be7892928" - integrity sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ== - dependencies: - axios "^1.6.1" - joi "^17.11.0" - lodash "^4.17.21" - minimist "^1.2.8" - rxjs "^7.8.1" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -12046,7 +11444,7 @@ which@1.2.4: is-absolute "^0.1.7" isexe "^1.1.1" -which@^1.2.12, which@^1.2.9: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12177,11 +11575,6 @@ ws@^7.3.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -ws@^8.17.1: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - ws@^8.9.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" @@ -12317,7 +11710,7 @@ yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yauzl@2.10.0, yauzl@^2.10.0: +yauzl@2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= @@ -12342,8 +11735,3 @@ zip-dir@2.0.0: dependencies: async "^3.2.0" jszip "^3.2.2" - -zod@3.23.8: - version "3.23.8" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" - integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==