From 9abf33eb4570528fd9540905e9cea3540491aaab Mon Sep 17 00:00:00 2001 From: KshitijThareja Date: Wed, 19 Jun 2024 19:39:46 +0530 Subject: [PATCH 1/8] Setup initial configuration --- .gitignore | 3 + jest-puppeteer.config.js | 15 + jest.conf/setup.js | 2 + jest.conf/setup.visual.js | 72 ++ jest.conf/testUtils.js | 12 + jest.conf/visual.index.js | 34 + lib/KImg/__tests__/KImg.spec.js | 136 +-- lib/composables/useKResponsiveWindow/index.js | 2 +- package.json | 10 +- start-server-and-test.js | 95 ++ yarn.lock | 1007 ++++++++++++++++- 11 files changed, 1288 insertions(+), 100 deletions(-) create mode 100644 jest-puppeteer.config.js create mode 100644 jest.conf/setup.visual.js create mode 100644 jest.conf/visual.index.js create mode 100644 start-server-and-test.js diff --git a/.gitignore b/.gitignore index 6cda9f046..e9dcb9f63 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,6 @@ kolibri-design-system.iml # env .envrc .python-version + +# local +myenv diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js new file mode 100644 index 000000000..6d75519f7 --- /dev/null +++ b/jest-puppeteer.config.js @@ -0,0 +1,15 @@ +module.exports = { + launch: { + headless: true, + timeout: 180000, + }, + browserContext: 'default', + // server: { + // command: 'yarn dev', + // port: 4000, + // launchTimeout: 360000, + // usedPortAction: 'kill', + // debug: true, + // }, + }; + \ No newline at end of file diff --git a/jest.conf/setup.js b/jest.conf/setup.js index 389293a46..34f6c268b 100644 --- a/jest.conf/setup.js +++ b/jest.conf/setup.js @@ -12,6 +12,8 @@ import VueIntl from 'vue-intl'; import VueCompositionAPI from '@vue/composition-api'; import KThemePlugin from '../lib/KThemePlugin'; +process.env.TEST_TYPE = 'unit'; // Set the test type to unit + global.beforeEach(() => { return new Promise(resolve => { Aphrodite.StyleSheetTestUtils.suppressStyleInjection(); diff --git a/jest.conf/setup.visual.js b/jest.conf/setup.visual.js new file mode 100644 index 000000000..33a32b51b --- /dev/null +++ b/jest.conf/setup.visual.js @@ -0,0 +1,72 @@ +import 'regenerator-runtime/runtime'; +import '@testing-library/jest-dom'; +import * as Aphrodite from 'aphrodite'; +import * as AphroditeNoImportant from 'aphrodite/no-important'; + +// eslint-disable-next-line import/no-unresolved +import 'mock-match-media/jest-setup'; + +import Vue from 'vue'; +import VueRouter from 'vue-router'; +import VueIntl from 'vue-intl'; +import VueCompositionAPI from '@vue/composition-api'; +import { percySnapshot } from '@percy/puppeteer'; +import KThemePlugin from '../lib/KThemePlugin'; + +process.env.TEST_TYPE = 'visual'; // Set the test type to visual + +if (typeof window !== 'undefined') { + global.matchMedia = + global.matchMedia || + function() { + return { + matches: false, + addListener: function() {}, + removeListener: function() {}, + }; + }; +} + +global.beforeEach(() => { + return new Promise(resolve => { + Aphrodite.StyleSheetTestUtils.suppressStyleInjection(); + AphroditeNoImportant.StyleSheetTestUtils.suppressStyleInjection(); + return process.nextTick(resolve); + }); +}); + +global.afterEach(() => { + return new Promise(resolve => { + Aphrodite.StyleSheetTestUtils.clearBufferAndResumeStyleInjection(); + AphroditeNoImportant.StyleSheetTestUtils.clearBufferAndResumeStyleInjection(); + return process.nextTick(resolve); + }); +}); + +global.percySnapshot = percySnapshot; + +// Register Vue plugins and components +Vue.use(VueRouter); +Vue.use(VueCompositionAPI); +Vue.use(KThemePlugin); +Vue.use(VueIntl); + +Vue.config.silent = true; +Vue.config.devtools = false; +Vue.config.productionTip = false; + +// Object.defineProperty(window, 'scrollTo', { value: () => {}, writable: true }); + +// Shows better NodeJS unhandled promise rejection errors +process.on('unhandledRejection', (reason, p) => { + /* eslint-disable no-console */ + console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); + console.log(reason.stack); +}); + +// Copied from https://github.com/kentor/flush-promises/blob/f33ac564190c784019f1f689dd544187f4b77eb2/index.js +global.flushPromises = function flushPromises() { + return new Promise(function(resolve) { + setImmediate(resolve); + }); +}; diff --git a/jest.conf/testUtils.js b/jest.conf/testUtils.js index 0023aaf00..23ed0a980 100644 --- a/jest.conf/testUtils.js +++ b/jest.conf/testUtils.js @@ -10,6 +10,18 @@ export const resizeWindow = (width, height = 768) => { }); }; +export function takeScreenshot() { + const percyToken = process.env.PERCY_TOKEN; + const runVisualTests = process.env.TEST_TYPE === 'visual'; + if (runVisualTests && !percyToken) { + /* eslint-disable no-console */ + console.warn( + 'Warning: Visual tests cannot be run because PERCY_TOKEN environment variable is not set.' + ); + } + return runVisualTests && percyToken; +} + export const testAfterResize = testFunction => { let animationFrameId; const assertAfterResize = () => { diff --git a/jest.conf/visual.index.js b/jest.conf/visual.index.js new file mode 100644 index 000000000..344906837 --- /dev/null +++ b/jest.conf/visual.index.js @@ -0,0 +1,34 @@ +const path = require('node:path'); + +process.env.JEST_PUPPETEER_CONFIG = require.resolve('../jest-puppeteer.config.js'); + +const moduleNameMapper = { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css)$': path.resolve( + __dirname, + './fileMock.js' + ), +}; + +module.exports = { + rootDir: path.resolve(__dirname, '..'), + preset: 'jest-puppeteer', + moduleFileExtensions: ['js', 'json', 'vue'], + moduleNameMapper, + testEnvironmentOptions: { + url: 'http://localhost:4000/', + }, + transform: { + '^.+\\.js$': require.resolve('babel-jest'), + '^.+\\.vue$': require.resolve('vue-jest'), + }, + snapshotSerializers: ['jest-serializer-vue'], + globals: { + URL: 'http://localhost:4000/', + 'vue-jest': { + hideStyleWarn: true, + experimentalCSSCompile: true, + }, + }, + setupFilesAfterEnv: [path.resolve(__dirname, './setup.visual')], + verbose: true, +}; diff --git a/lib/KImg/__tests__/KImg.spec.js b/lib/KImg/__tests__/KImg.spec.js index 86ca046fc..34e743af9 100644 --- a/lib/KImg/__tests__/KImg.spec.js +++ b/lib/KImg/__tests__/KImg.spec.js @@ -1,92 +1,102 @@ import { shallowMount } from '@vue/test-utils'; import KImg from '../'; +import { takeScreenshot } from '../../../jest.conf/testUtils'; function makeWrapper(opts) { return shallowMount(KImg, opts); } describe('KImg', () => { - it(`renders without any errors when a valid 'src' and 'altText' are provided`, () => { - const error = jest.fn(); - const wrapper = makeWrapper({ - propsData: { src: '/le-logo.svg', altText: 'LE logo' }, - listeners: { error }, - }); - - expect(wrapper.exists()).toBe(true); - expect(error).not.toHaveBeenCalled(); + if (process.env.TEST_TYPE !== 'visual') { + it(`renders without any errors when a valid 'src' and 'altText' are provided`, () => { + const error = jest.fn(); + const wrapper = makeWrapper({ + propsData: { src: '/le-logo.svg', altText: 'LE logo' }, + listeners: { error }, + }); - const img = wrapper.find('img'); - expect(img.exists()).toBe(true); - expect(img.attributes('src')).toBe('/le-logo.svg'); - expect(img.attributes('alt')).toBe('LE logo'); - }); + expect(wrapper.exists()).toBe(true); + expect(error).not.toHaveBeenCalled(); - it(`throws an error when no 'altText' is provided`, () => { - const error = jest.fn(); - makeWrapper({ - propsData: { src: '/le-logo.svg', altText: undefined }, - listeners: { error }, + const img = wrapper.find('img'); + expect(img.exists()).toBe(true); + expect(img.attributes('src')).toBe('/le-logo.svg'); + expect(img.attributes('alt')).toBe('LE logo'); }); - expect(error).toHaveBeenCalled(); - expect(error.mock.calls[0][0]).toBeInstanceOf(Error); - expect(error.mock.calls[0][0].message).toBe( - 'Missing required prop - provide altText or indicate isDecorative' - ); - }); - describe(`when no 'altText' is provided and it is a decorative image`, () => { - it(`does not throw an error`, () => { + it(`throws an error when no 'altText' is provided`, () => { const error = jest.fn(); makeWrapper({ - propsData: { src: '/le-logo.svg', altText: undefined, isDecorative: true }, + propsData: { src: '/le-logo.svg', altText: undefined }, listeners: { error }, }); - expect(error).not.toHaveBeenCalled(); + expect(error).toHaveBeenCalled(); + expect(error.mock.calls[0][0]).toBeInstanceOf(Error); + expect(error.mock.calls[0][0].message).toBe( + 'Missing required prop - provide altText or indicate isDecorative' + ); }); - it(`sets 'alt' attribute to an empty string`, () => { - const wrapper = makeWrapper({ - propsData: { src: '/le-logo.svg', altText: undefined, isDecorative: true }, + describe(`when no 'altText' is provided and it is a decorative image`, () => { + it(`does not throw an error`, () => { + const error = jest.fn(); + makeWrapper({ + propsData: { src: '/le-logo.svg', altText: undefined, isDecorative: true }, + listeners: { error }, + }); + expect(error).not.toHaveBeenCalled(); }); - expect(wrapper.exists()).toBe(true); - expect(wrapper.find('img').attributes('alt')).toBe(''); - }); - }); - it(`throws an error when 'aspectRatio' has an invalid format`, () => { - const error = jest.fn(); - makeWrapper({ - propsData: { src: '/le-logo.svg', altText: 'LE logo', aspectRatio: '16/9' }, - listeners: { error }, + it(`sets 'alt' attribute to an empty string`, () => { + const wrapper = makeWrapper({ + propsData: { src: '/le-logo.svg', altText: undefined, isDecorative: true }, + }); + expect(wrapper.exists()).toBe(true); + expect(wrapper.find('img').attributes('alt')).toBe(''); + }); }); - expect(error).toHaveBeenCalled(); - expect(error.mock.calls[0][0]).toBeInstanceOf(Error); - expect(error.mock.calls[0][0].message).toBe('Invalid aspect ratio provided: 16/9'); - }); - it(`doesn't throw an error when 'aspectRatio' has a valid format`, () => { - const error = jest.fn(); - makeWrapper({ - propsData: { src: '/le-logo.svg', altText: 'LE logo', aspectRatio: '16:9' }, - listeners: { error }, + it(`throws an error when 'aspectRatio' has an invalid format`, () => { + const error = jest.fn(); + makeWrapper({ + propsData: { src: '/le-logo.svg', altText: 'LE logo', aspectRatio: '16/9' }, + listeners: { error }, + }); + expect(error).toHaveBeenCalled(); + expect(error.mock.calls[0][0]).toBeInstanceOf(Error); + expect(error.mock.calls[0][0].message).toBe('Invalid aspect ratio provided: 16/9'); }); - expect(error).not.toHaveBeenCalled(); - }); - it(`emits an 'error' event when there is an error in loading the image`, async () => { - const error = jest.fn(); - const wrapper = makeWrapper({ - propsData: { src: '/le-logo.svg', altText: 'LE logo' }, - listeners: { error }, + it(`doesn't throw an error when 'aspectRatio' has a valid format`, () => { + const error = jest.fn(); + makeWrapper({ + propsData: { src: '/le-logo.svg', altText: 'LE logo', aspectRatio: '16:9' }, + listeners: { error }, + }); + expect(error).not.toHaveBeenCalled(); }); - // Manually trigger the onError method to simulate the image load failure - const e = new Event('error'); - wrapper.vm.onError(e); + it(`emits an 'error' event when there is an error in loading the image`, async () => { + const error = jest.fn(); + const wrapper = makeWrapper({ + propsData: { src: '/le-logo.svg', altText: 'LE logo' }, + listeners: { error }, + }); + + // Manually trigger the onError method to simulate the image load failure + const e = new Event('error'); + wrapper.vm.onError(e); - expect(error).toHaveBeenCalled(); - expect(error.mock.calls[0][0]).toBeInstanceOf(Event); - expect(error.mock.calls[0][0]).toEqual(e); + expect(error).toHaveBeenCalled(); + expect(error.mock.calls[0][0]).toBeInstanceOf(Event); + expect(error.mock.calls[0][0]).toEqual(e); + }); + } + describe('KImg Visual Tests', () => { + it('renders correctly (mock test)', async () => { + if (takeScreenshot()) { + await global.page.goto('http://localhost:4000/'); + } + }); }); }); diff --git a/lib/composables/useKResponsiveWindow/index.js b/lib/composables/useKResponsiveWindow/index.js index 60d25a84f..d770b604b 100644 --- a/lib/composables/useKResponsiveWindow/index.js +++ b/lib/composables/useKResponsiveWindow/index.js @@ -36,7 +36,7 @@ function initProps() { if (isNuxtServerSideRendering()) { return; } - if (window.matchMedia) { + if (typeof window !== 'undefined' && window.matchMedia) { orientationQuery.eventHandler(orientationQuery.mediaQueryList); heightQuery.eventHandler(heightQuery.mediaQueryList); } diff --git a/package.json b/package.json index 6d29feb17..2d05b87f8 100644 --- a/package.json +++ b/package.json @@ -16,25 +16,33 @@ "precompile-svgs": "node utils/precompileSvgs/index.js && yarn run pregenerate", "precompile-custom-svgs": "node utils/precompileSvgs/index.js --custom && yarn run pregenerate", "_lint-watch-fix": "yarn lint -w -m", - "test": "jest --config=jest.conf/index.js", + "test": "yarn test:unit && yarn test:visual", + "test:unit": "jest --config=jest.conf/index.js", + "test:visual": "JEST_PUPPETEER_CONFIG=./jest-puppeteer.config.js node start-server-and-test.js", "_api-watch": "chokidar \"**/lib/**\" -c \"node utils/extractApi.js\"" }, "files": [ "lib" ], "dependencies": { + "@percy/cli": "^1.28.7", + "@percy/puppeteer": "^2.0.2", "@vue/composition-api": "1.7.2", "aphrodite": "https://github.com/learningequality/aphrodite/", "autosize": "3.0.21", "css-element-queries": "1.2.0", "date-fns": "1.30.1", + "fkill": "^9.0.0", "frame-throttle": "3.0.0", "fuzzysearch": "1.0.3", + "jest-puppeteer": "^10.0.1", "lodash": "4.17.21", "popper.js": "1.16.1", + "puppeteer": "^22.11.0", "purecss": "2.2.0", "tippy.js": "4.2.1", "vue-intl": "3.1.0", + "wait-on": "^7.2.0", "xstate": "4.38.3" }, "peerDependencies": {}, diff --git a/start-server-and-test.js b/start-server-and-test.js new file mode 100644 index 000000000..da6b9a493 --- /dev/null +++ b/start-server-and-test.js @@ -0,0 +1,95 @@ +const { spawn } = require('child_process'); +const fetch = require('node-fetch'); + +const serverUrl = 'http://localhost:4000'; +const serverTimeout = 360000; // 6 minutes + +const waitForServer = async (url, timeout = 30000) => { + const start = Date.now(); + while (Date.now() - start < timeout) { + try { + const response = await fetch(url); + if (response.ok) { + return; + } + } catch (err) { + } + await new Promise(resolve => setTimeout(resolve, 1000)); + } + throw new Error('Server did not start within the timeout period'); +}; + +const killPortProcess = async (port) => { + try { + const fkill = await import('fkill'); + await fkill(`:${port}`, { force: true }); + console.log(`Another process detected on port: ${port}. The process will be killed automatically.`); + } catch (error) { + console.log(`Starting devserver on port: ${port}`); + } +}; + +const startServer = () => { + return new Promise((resolve, reject) => { + const server = spawn('yarn', ['dev-only']); + + // server.stdout.on('data', data => { + // console.log(`Server: ${data}`); + // }); + + // server.stderr.on('data', data => { + // console.error(`Server error: ${data}`); + // }); + + server.on('close', code => { + console.log(`Server process exited with code ${code}`); + if (code !== 0) { + reject(new Error('Server failed to start')); + } + }); + + waitForServer(serverUrl, serverTimeout) + .then(() => { + console.log('Server is up and running'); + resolve(server); + }) + .catch(error => { + server.kill(); + reject(error); + }); + }); +}; + +const runTests = () => { + return new Promise((resolve, reject) => { + const tests = spawn( + 'jest', + ['--config', 'jest.conf/visual.index.js', '-i', './lib/KImg/__tests__/KImg.spec.js'], + { stdio: 'inherit' } + ); + + tests.on('close', code => { + console.log(`Tests process exited with code ${code}`); + resolve(code); + }); + + tests.on('error', error => { + reject(error); + }); + }); +}; + +const start = async () => { + try { + await killPortProcess(4000); + const server = await startServer(); + const testExitCode = await runTests(); + server.kill(); + process.exit(testExitCode); + } catch (error) { + console.error(error); + process.exit(1); + } +}; + +start(); diff --git a/yarn.lock b/yarn.lock index 2d2612fae..20087f51b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1109,6 +1109,18 @@ resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@hapi/hoek@^9.0.0", "@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" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" @@ -1749,11 +1761,192 @@ mustache "^2.3.0" stack-trace "0.0.10" +"@percy/cli-app@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-app/-/cli-app-1.28.7.tgz#0b77c98a6f0fc87321015b0b7709148719f23f4e" + integrity sha512-5Dgtx3m+eX2NPYrt11gOAhH0q4UYFORzOTkocELQZ6+9naKOi0PD9e9/T8A6yRQ5dbfMoNfi/xQ9tLoxCPcM5g== + dependencies: + "@percy/cli-command" "1.28.7" + "@percy/cli-exec" "1.28.7" + +"@percy/cli-build@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-build/-/cli-build-1.28.7.tgz#8a7aa9ba464aefdf070d7bb013704273e350b4a4" + integrity sha512-LXDXbE3G994K1Wovivukjbzj7wqENPa/A3WvveVdLqfTLepTcJZ3LvPV79BsgJgIMN2vksaeCxwIgjMn1vT8mQ== + dependencies: + "@percy/cli-command" "1.28.7" + +"@percy/cli-command@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-command/-/cli-command-1.28.7.tgz#673b859fa4585ea72551a03fa82ba2dca900d14d" + integrity sha512-Rs66JVZLdb4D/+hPXNdd9Qi9+FA9xCgrzpmdKak8HzstcfsRdJ999J5exQZc7dM1N3Th76wrA5d4woCgDskYDQ== + dependencies: + "@percy/config" "1.28.7" + "@percy/core" "1.28.7" + "@percy/logger" "1.28.7" + +"@percy/cli-config@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-config/-/cli-config-1.28.7.tgz#c3a4f11d4c23d4773c61c4835708429d35903280" + integrity sha512-26Wo9EYQt2uDROSjNyYMX8XuJ30IPIwR4JsNKO0DbQUBqq071to5AiaROXs2QLH0m2KGFyYavLxHJ54ZCDbMQQ== + dependencies: + "@percy/cli-command" "1.28.7" + +"@percy/cli-exec@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-exec/-/cli-exec-1.28.7.tgz#aae8b21b20736baf5d1bbca3d4fe3ef4ab59d480" + integrity sha512-0HEOmMNexRbn09Ju3Etd5agEhBtgqNrT3eiRMcX4ThbQgOFkAQIll6IFfVqafujJHNL1SF+HjcyZmyoEF9tJOw== + dependencies: + "@percy/cli-command" "1.28.7" + cross-spawn "^7.0.3" + which "^2.0.2" + +"@percy/cli-snapshot@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-snapshot/-/cli-snapshot-1.28.7.tgz#0fd99733cb9fa2199133c0b429fb9fd310a6d733" + integrity sha512-nWk2/sjIh8Vy6+T7BNwSVdtXUdR0cYpXJrbO1hfxRB56pUf8KFcG7GqUzOZ7QDHqlyQGH/posAjAoPmy8okyAQ== + dependencies: + "@percy/cli-command" "1.28.7" + yaml "^2.0.0" + +"@percy/cli-upload@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli-upload/-/cli-upload-1.28.7.tgz#ab8f178f0001ec5e66fc5bcade0efffcf5e5bd91" + integrity sha512-hcIe9RGHDk+G+lanlLy1IrDRgODsTYzjmtPex9wEg4yo/JzubVwkF3r/0iQuT+srkELKUcTSJ1iX7/d0kK61uQ== + dependencies: + "@percy/cli-command" "1.28.7" + fast-glob "^3.2.11" + image-size "^1.0.0" + +"@percy/cli@^1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/cli/-/cli-1.28.7.tgz#4608d5347da6858d4f11720dc15947ee14d17024" + integrity sha512-FvvyTFTGuIiBsSs8epENGq2U62oKnzfXW6F80JFShaZ5ZjMc2t6riVq4EPEsBANstql+j4Y853tYe2aGVX9pbw== + dependencies: + "@percy/cli-app" "1.28.7" + "@percy/cli-build" "1.28.7" + "@percy/cli-command" "1.28.7" + "@percy/cli-config" "1.28.7" + "@percy/cli-exec" "1.28.7" + "@percy/cli-snapshot" "1.28.7" + "@percy/cli-upload" "1.28.7" + "@percy/client" "1.28.7" + "@percy/logger" "1.28.7" + +"@percy/client@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/client/-/client-1.28.7.tgz#7baced7a2b2cb82de294f9943d749f8bc440e1f3" + integrity sha512-3ocKEej268Xj3q98seUi88mtFcTYNy3F/zMTwk+pdnoWc1QVOGsCQ3elIS2X35hhBFgYw2i1bbuzmt7UdOK79A== + dependencies: + "@percy/env" "1.28.7" + "@percy/logger" "1.28.7" + pako "^2.1.0" + +"@percy/config@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.28.7.tgz#b304fd2bb8da08b05046605645583870d4a1887e" + integrity sha512-N8fZAj8ejgddxz4lzNIK9cCQdoIuISK7a/JyGAD5vY+CuZutCBM0zuN9g/Higv/LI78Sct69Qpik/+rLIyBZxA== + dependencies: + "@percy/logger" "1.28.7" + ajv "^8.6.2" + cosmiconfig "^8.0.0" + yaml "^2.0.0" + +"@percy/core@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/core/-/core-1.28.7.tgz#7576ecf1f69b45e160c59bb5f8adbb8af139eb2d" + integrity sha512-OOTVMHU+0O7Qh3TIL21fxX9H5ctRWPIG03IJsFpIXIIh2Wni5nf8tSUWroFwSSneZihxaA8ETQxCtJXBVe+JUA== + dependencies: + "@percy/client" "1.28.7" + "@percy/config" "1.28.7" + "@percy/dom" "1.28.7" + "@percy/logger" "1.28.7" + "@percy/webdriver-utils" "1.28.7" + content-disposition "^0.5.4" + cross-spawn "^7.0.3" + extract-zip "^2.0.1" + fast-glob "^3.2.11" + micromatch "^4.0.4" + mime-types "^2.1.34" + pako "^2.1.0" + path-to-regexp "^6.2.0" + rimraf "^3.0.2" + ws "^8.0.0" + yaml "^2.4.1" + +"@percy/dom@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/dom/-/dom-1.28.7.tgz#6d07e96ee630ac3762e1e94804d94a1d038f8558" + integrity sha512-aYm/xTqNWaLodRdmWqiA0zekaUMkE8boJ1ApljO8KTKihv7eJWpgSDJT7m73xOd/JAplER5LSGjrUpnWLOTDYQ== + +"@percy/env@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/env/-/env-1.28.7.tgz#3dc71ff9e30e53681618f8ab389721acc1f734a4" + integrity sha512-ExpCDSm2bMwTlF7LOuE6dDB0QFa2VzpuFF/t9O0TyUgBgaiDZzcdsMQrLxDlUbuqjA8vc+vo8931x0i2sN5LBQ== + dependencies: + "@percy/logger" "1.28.7" + +"@percy/logger@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.28.7.tgz#3ef2e35cefdc717ace4918fb9e42ef6e60a4beb4" + integrity sha512-OktqjykPT3FMUKkwyafjQdRWMQ8jnXOOcSkvyVIT9P7cbU1USeRUWw8Z6+W1cLk50RdsimChnab6F/GRWRdBew== + +"@percy/puppeteer@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@percy/puppeteer/-/puppeteer-2.0.2.tgz#3143e882d9e2250b8d934034e1af51c6992ef9de" + integrity sha512-DPyh5UyttPPXMNl3o6Owox7bnV54aQ7sIWfcsXUBZ6q1wLVmBjc5KP4x51dpPiuTDn3SMzFExMrXBFugfDJHPA== + dependencies: + "@percy/sdk-utils" "^1.0.0" + +"@percy/sdk-utils@1.28.7", "@percy/sdk-utils@^1.0.0": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/sdk-utils/-/sdk-utils-1.28.7.tgz#22393f76d69ffee2f4def79aa41f15a7369f7503" + integrity sha512-LIhfHnkcS0fyIdo3gvKn7rwodZjbEtyLkgiDRSRulcBOatI2mhn2Bh269sXXiiFTyAW2BDQjyE3DWc4hkGbsbQ== + +"@percy/webdriver-utils@1.28.7": + version "1.28.7" + resolved "https://registry.yarnpkg.com/@percy/webdriver-utils/-/webdriver-utils-1.28.7.tgz#b17573f8e42f2830c4ca95a388dcc41d9f8351b5" + integrity sha512-BviRMj/oHgdniHoz1nzInpIXl4JTk4vZ0+9azWntGCThITc/HhQE1sLDcHhZGYvviY+NQ4ofCcBSzZRu1z1GcQ== + dependencies: + "@percy/config" "1.28.7" + "@percy/sdk-utils" "1.28.7" + "@polka/url@^1.0.0-next.24": version "1.0.0-next.25" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== +"@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" + +"@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.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" @@ -1797,6 +1990,11 @@ 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== + "@trysound/sax@0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" @@ -2138,6 +2336,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/experimental-utils@^2.5.0": version "2.34.0" resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz" @@ -2700,6 +2905,13 @@ agent-base@6, agent-base@^6.0.2: 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" + agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -2715,6 +2927,14 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +aggregate-error@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" + integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== + dependencies: + clean-stack "^5.2.0" + indent-string "^5.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" @@ -2759,6 +2979,16 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: require-from-string "^2.0.2" uri-js "^4.4.1" +ajv@^8.6.2: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + dependencies: + fast-deep-equal "^3.1.3" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.4.1" + alphanum-sort@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" @@ -2884,6 +3114,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^5.0.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -3051,6 +3286,13 @@ ast-traverse@^0.1.1: resolved "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz" integrity sha1-ac8rg4bxnc2hux4F1o/jWdiJfeY= +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" + ast-types@^0.16.1: version "0.16.1" resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz" @@ -3135,6 +3377,20 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +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.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz" @@ -3366,6 +3622,39 @@ balanced-match@^2.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== +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.3.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" + integrity sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg== + +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.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" @@ -3384,6 +3673,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +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== + batch@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" @@ -3631,6 +3925,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" @@ -3655,7 +3954,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.1.0: +buffer@^5.1.0, buffer@^5.2.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3983,6 +4282,15 @@ chrome-trace-event@^1.0.2: resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== +chromium-bidi@0.5.23: + version "0.5.23" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.23.tgz#0fbebc8b0c908d33f870b961d04fca3e2d4fa0ba" + integrity sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + ci-info@^3.0.0, ci-info@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz" @@ -4042,6 +4350,13 @@ clean-stack@^2.0.0: resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== +clean-stack@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" + integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== + dependencies: + escape-string-regexp "5.0.0" + cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" @@ -4229,6 +4544,11 @@ commander@^4.1.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" @@ -4368,7 +4688,7 @@ constants-browserify@^1.0.0: resolved "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -content-disposition@0.5.4: +content-disposition@0.5.4, content-disposition@^0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -4444,6 +4764,16 @@ core-util-is@~1.0.0: resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +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" + cosmiconfig@^5.0.0: version "5.2.1" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz" @@ -4465,6 +4795,16 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.0.0, cosmiconfig@^8.3.6: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + crc@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" @@ -4936,11 +5276,24 @@ cuint@^0.2.2: resolved "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz" integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= +cwd@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/cwd/-/cwd-0.10.0.tgz#172400694057c22a13b0cf16162c7e4b7a7fe567" + integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== + dependencies: + find-pkg "^0.1.2" + fs-exists-sync "^0.1.0" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +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" @@ -5007,13 +5360,20 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4: 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@4.3.5: + 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@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -5054,9 +5414,9 @@ deep-is@~0.1.3: resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -deepmerge@^4.2.2: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== default-gateway@^6.0.3: @@ -5126,6 +5486,15 @@ defu@^6.0.0, defu@^6.1.3, defu@^6.1.4: resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== +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@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -5213,6 +5582,11 @@ devalue@^2.0.1: resolved "https://registry.yarnpkg.com/devalue/-/devalue-2.0.1.tgz#5d368f9adc0928e47b77eea53ca60d2f346f9762" integrity sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q== +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.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" @@ -5522,7 +5896,7 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== -env-paths@^2.2.0: +env-paths@^2.2.0, 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== @@ -5674,6 +6048,11 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -5988,6 +6367,36 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" + integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^3.0.1" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + +execa@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -6006,6 +6415,18 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + integrity sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q== + 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.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" @@ -6109,11 +6530,27 @@ extract-from-css@^0.4.4: dependencies: css "^2.1.0" +extract-zip@2.0.1, 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" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-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.1.1: version "3.2.7" resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz" @@ -6177,6 +6614,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz" @@ -6300,6 +6744,30 @@ find-cache-dir@^4.0.0: common-path-prefix "^3.0.0" pkg-dir "^7.0.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 sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A== + 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 sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== + 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@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" @@ -6323,6 +6791,18 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" +fkill@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fkill/-/fkill-9.0.0.tgz#9ee08e55e3e67ac9f14e1bea66115cfe5bb5cc51" + integrity sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA== + dependencies: + aggregate-error "^5.0.0" + execa "^8.0.1" + pid-port "^1.0.0" + process-exists "^5.0.0" + ps-list "^8.1.1" + taskkill "^5.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" @@ -6369,7 +6849,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0: +follow-redirects@^1.0.0, 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== @@ -6430,6 +6910,20 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +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 sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg== + +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@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" @@ -6595,11 +7089,23 @@ get-stdin@^6.0.0: resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz" integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== -get-stream@^6.0.0: +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" @@ -6609,6 +7115,16 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" +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" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" @@ -6694,6 +7210,14 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.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 sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" @@ -6701,6 +7225,16 @@ global-modules@^2.0.0: dependencies: global-prefix "^3.0.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 sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" @@ -6999,6 +7533,13 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +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" + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" @@ -7182,6 +7723,14 @@ 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-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" @@ -7215,11 +7764,29 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: agent-base "6" debug "4" +https-proxy-agent@^7.0.2, https-proxy-agent@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz#8e97b841a029ad8ddc8731f26595bad868cb4168" + integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" + integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -7288,6 +7855,13 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +image-size@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" + integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== + dependencies: + queue "6.0.2" + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz" @@ -7303,7 +7877,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -7341,6 +7915,11 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" @@ -7804,6 +8383,11 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -7837,6 +8421,11 @@ is-whitespace@^0.3.0: resolved "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz" integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" @@ -8014,6 +8603,19 @@ 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.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" @@ -8068,6 +8670,17 @@ 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.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" @@ -8139,6 +8752,14 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== +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" @@ -8336,6 +8957,17 @@ jiti@^1.21.0, jiti@^1.9.2: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +joi@^17.11.0: + version "17.13.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.2.tgz#21adee350465211cbc5e92281cdc0d058b1974c1" + integrity sha512-QJQKY10YowIi6yUpDQG9YpeWLD+OHYlY/La8gk7VitrXfy34quHwCu4QKNlBV1rpgQj0YpnWWl4JM+3DU6GapQ== + 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" + js-base64@^2.4.9: version "2.6.4" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" @@ -8374,6 +9006,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz" @@ -8886,7 +9525,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.7.1: +lru-cache@^7.14.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -9194,7 +9833,7 @@ mime-types@^2.1.12, mime-types@^2.1.19, mime-types@~2.1.17, mime-types@~2.1.24: dependencies: mime-db "1.49.0" -mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@^2.1.30, mime-types@^2.1.31, mime-types@^2.1.34, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9221,6 +9860,11 @@ mimic-fn@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -9274,7 +9918,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -9372,6 +10016,11 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" +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== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" @@ -9491,6 +10140,11 @@ neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +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== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" @@ -9733,6 +10387,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + npmlog@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -9923,6 +10584,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open-iconic@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/open-iconic/-/open-iconic-1.1.1.tgz" @@ -9967,6 +10635,11 @@ os-browserify@^0.3.0: resolved "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" @@ -10039,6 +10712,33 @@ p-try@^2.0.0: resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +pac-proxy-agent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" + integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== + 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.2" + pac-resolver "^7.0.0" + socks-proxy-agent "^8.0.2" + +pac-resolver@^7.0.0: + 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" + +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + pako@~1.0.5: version "1.0.11" resolved "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" @@ -10124,6 +10824,11 @@ parse-json@^5.0.0, 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 sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + parse-path@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" @@ -10203,6 +10908,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -10213,6 +10923,11 @@ path-to-regexp@0.1.7: resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz" @@ -10236,6 +10951,11 @@ pbkdf2@^3.0.3, pbkdf2@^3.1.2: safe-buffer "^5.0.1" sha.js "^2.4.8" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" @@ -10246,6 +10966,13 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pid-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pid-port/-/pid-port-1.0.0.tgz#b99a4d53dfeeae8b4e123d02c77e268de0413225" + integrity sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ== + dependencies: + execa "^8.0.1" + pidtree@^0.3.0: version "0.3.1" resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" @@ -11321,6 +12048,13 @@ prismjs@^1.27.0: resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== +process-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/process-exists/-/process-exists-5.0.0.tgz#0b6dcd3d19e85e1f72c633f56d38e498196e2855" + integrity sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA== + dependencies: + ps-list "^8.0.0" + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -11331,7 +12065,7 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^2.0.0: +progress@2.0.3, progress@^2.0.0: version "2.0.3" resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -11356,9 +12090,9 @@ promise@^7.0.1: dependencies: asap "~2.0.3" -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" @@ -11391,11 +12125,35 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +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" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + prr@~1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +ps-list@^8.0.0, ps-list@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-8.1.1.tgz#9ff1952b26a9a07fcc05270407e60544237ae581" + integrity sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ== + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" @@ -11561,6 +12319,27 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer-core@22.11.0: + version "22.11.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.11.0.tgz#82b77f306c3665d65a1ad0115402c98ee404baee" + integrity sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA== + dependencies: + "@puppeteer/browsers" "2.2.3" + chromium-bidi "0.5.23" + debug "4.3.5" + devtools-protocol "0.0.1299070" + ws "8.17.0" + +puppeteer@^22.11.0: + version "22.11.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.11.0.tgz#290eeff6e993d8258c59333d2454079aad75c2ff" + integrity sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA== + dependencies: + "@puppeteer/browsers" "2.2.3" + cosmiconfig "9.0.0" + devtools-protocol "0.0.1299070" + puppeteer-core "22.11.0" + pure-rand@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" @@ -11624,6 +12403,18 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 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" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" @@ -11952,6 +12743,14 @@ 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 sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" @@ -12097,6 +12896,13 @@ rxjs@^6.6.0: dependencies: tslib "^1.9.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-array-concat@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" @@ -12263,6 +13069,13 @@ selfsigned@^2.1.1: resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +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@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -12476,6 +13289,11 @@ 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.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-html-tokenizer@^0.4.0: version "0.4.3" resolved "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.4.3.tgz" @@ -12587,7 +13405,16 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.6.2: +socks-proxy-agent@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz#6b2da3d77364fde6292e810b496cb70440b9b89d" + integrity sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.6.2, socks@^2.7.1: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -12676,6 +13503,14 @@ sourcemap-codec@^1.4.4: resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +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" + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" @@ -12861,6 +13696,17 @@ stream-shift@^1.0.0: resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +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" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" @@ -12993,6 +13839,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -13314,6 +14165,26 @@ 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" + tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" @@ -13326,6 +14197,13 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" +taskkill@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/taskkill/-/taskkill-5.0.0.tgz#57b449a3fa8a441f5e9a0336c55230894049bdba" + integrity sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ== + dependencies: + execa "^6.1.0" + temp@^0.8.3: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" @@ -13402,6 +14280,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-decoder@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.0.tgz#3379e728fcf4d3893ec1aea35e8c2cac215ef190" + integrity sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw== + dependencies: + b4a "^1.6.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" @@ -13426,7 +14311,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -13566,6 +14451,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +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== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -13621,6 +14511,11 @@ tslib@^2.0.3, tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.1.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + tsutils@^3.17.1: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -13752,6 +14647,14 @@ 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" + unfetch@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" @@ -13921,6 +14824,11 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.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== + use@^3.1.0: version "3.1.1" resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" @@ -14200,6 +15108,17 @@ w3c-xmlserializer@^4.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.npmjs.org/walker/-/walker-1.0.8.tgz" @@ -14538,9 +15457,9 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15: gopd "^1.0.1" has-tostringtag "^1.0.2" -which@^1.2.9, which@^1.3.1: +which@^1.2.12, which@^1.2.9, which@^1.3.1: version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" @@ -14661,16 +15580,16 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@8.17.0, ws@^8.0.0, ws@^8.11.0, ws@^8.13.0: + version "8.17.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" + integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + ws@^7.3.1: version "7.5.9" resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -ws@^8.11.0, ws@^8.13.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== - xml-loader@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/xml-loader/-/xml-loader-1.2.1.tgz" @@ -14754,6 +15673,11 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.0.0, yaml@^2.4.1: + version "2.4.5" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" + integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" @@ -14772,6 +15696,19 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs@17.7.2, yargs@^17.2.1, yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yargs@^13.3.0: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" @@ -14788,18 +15725,13 @@ yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@^17.2.1, yargs@^17.3.1: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yocto-queue@^0.1.0: version "0.1.0" @@ -14810,3 +15742,8 @@ yocto-queue@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + +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== From 9b01670d1a07e37b2886e9ade77f35ec095ce1d4 Mon Sep 17 00:00:00 2001 From: KshitijThareja Date: Fri, 21 Jun 2024 07:36:35 +0530 Subject: [PATCH 2/8] Add and configure percy for visual tests --- .eslintrc.js | 15 +++++++++++++++ .percy.yml | 19 +++++++++++++++++++ jest-puppeteer.config.js | 20 ++++++-------------- jest.conf/testUtils.js | 5 ++--- jest.conf/visual.index.js | 6 ++---- lib/KImg/__tests__/KImg.spec.js | 14 ++++++++------ start-server-and-test.js | 31 +++++++++++++++++++------------ 7 files changed, 71 insertions(+), 39 deletions(-) create mode 100644 .percy.yml diff --git a/.eslintrc.js b/.eslintrc.js index 1c0936ab2..2bfacc600 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,4 +20,19 @@ esLintConfig.settings['import/resolver'].nuxt = { nuxtSrcDir: 'docs', }; +// Remove linting errors for the globals defined in the jest-puppeteer package +esLintConfig.env = { + ...esLintConfig.env, + 'jest': true, +}; + +esLintConfig.globals = { + ...esLintConfig.globals, + page: true, + browser: true, + context: true, + puppeteerConfig: true, + jestPuppeteer: true, +}; + module.exports = esLintConfig; diff --git a/.percy.yml b/.percy.yml new file mode 100644 index 000000000..56546a986 --- /dev/null +++ b/.percy.yml @@ -0,0 +1,19 @@ +version: 2 +snapshot: + widths: + - 375 + - 1280 + minHeight: 1024 + percyCSS: "" + enableJavaScript: false + cliEnableJavaScript: true + disableShadowDOM: false +discovery: + allowedHostnames: [] + disallowedHostnames: [] + networkIdleTimeout: 100 + captureMockedServiceWorker: false +upload: + files: "**/*.{png,jpg,jpeg}" + ignore: "" + stripExtensions: false diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js index 6d75519f7..a4bbe4a92 100644 --- a/jest-puppeteer.config.js +++ b/jest-puppeteer.config.js @@ -1,15 +1,7 @@ module.exports = { - launch: { - headless: true, - timeout: 180000, - }, - browserContext: 'default', - // server: { - // command: 'yarn dev', - // port: 4000, - // launchTimeout: 360000, - // usedPortAction: 'kill', - // debug: true, - // }, - }; - \ No newline at end of file + launch: { + headless: true, + timeout: 180000, + }, + browserContext: 'default', +}; diff --git a/jest.conf/testUtils.js b/jest.conf/testUtils.js index 23ed0a980..c74afdc5d 100644 --- a/jest.conf/testUtils.js +++ b/jest.conf/testUtils.js @@ -14,9 +14,8 @@ export function takeScreenshot() { const percyToken = process.env.PERCY_TOKEN; const runVisualTests = process.env.TEST_TYPE === 'visual'; if (runVisualTests && !percyToken) { - /* eslint-disable no-console */ - console.warn( - 'Warning: Visual tests cannot be run because PERCY_TOKEN environment variable is not set.' + throw new Error( + 'Error: Visual tests cannot be run because PERCY_TOKEN environment variable is not set.' ); } return runVisualTests && percyToken; diff --git a/jest.conf/visual.index.js b/jest.conf/visual.index.js index 344906837..f7fb5baf2 100644 --- a/jest.conf/visual.index.js +++ b/jest.conf/visual.index.js @@ -12,18 +12,16 @@ const moduleNameMapper = { module.exports = { rootDir: path.resolve(__dirname, '..'), preset: 'jest-puppeteer', + testTimeout: 50000, moduleFileExtensions: ['js', 'json', 'vue'], moduleNameMapper, - testEnvironmentOptions: { - url: 'http://localhost:4000/', - }, transform: { '^.+\\.js$': require.resolve('babel-jest'), '^.+\\.vue$': require.resolve('vue-jest'), }, snapshotSerializers: ['jest-serializer-vue'], globals: { - URL: 'http://localhost:4000/', + HOST: 'http://localhost:4000/', 'vue-jest': { hideStyleWarn: true, experimentalCSSCompile: true, diff --git a/lib/KImg/__tests__/KImg.spec.js b/lib/KImg/__tests__/KImg.spec.js index 34e743af9..aa8c18bef 100644 --- a/lib/KImg/__tests__/KImg.spec.js +++ b/lib/KImg/__tests__/KImg.spec.js @@ -1,4 +1,5 @@ import { shallowMount } from '@vue/test-utils'; +import percySnapshot from '@percy/puppeteer'; import KImg from '../'; import { takeScreenshot } from '../../../jest.conf/testUtils'; @@ -92,11 +93,12 @@ describe('KImg', () => { expect(error.mock.calls[0][0]).toEqual(e); }); } - describe('KImg Visual Tests', () => { - it('renders correctly (mock test)', async () => { - if (takeScreenshot()) { - await global.page.goto('http://localhost:4000/'); - } + if (takeScreenshot()) { + describe('KImg Visual Tests', () => { + it('renders correctly (mock test)', async () => { + await global.page.goto('http://localhost:4000/', { waitUntil: 'networkidle2' }); + await percySnapshot(page, 'HomePage'); + }); }); - }); + } }); diff --git a/start-server-and-test.js b/start-server-and-test.js index da6b9a493..c26ce6ee7 100644 --- a/start-server-and-test.js +++ b/start-server-and-test.js @@ -1,6 +1,8 @@ const { spawn } = require('child_process'); const fetch = require('node-fetch'); +/* eslint-disable no-console */ + const serverUrl = 'http://localhost:4000'; const serverTimeout = 360000; // 6 minutes @@ -13,17 +15,20 @@ const waitForServer = async (url, timeout = 30000) => { return; } } catch (err) { + console.error('Waiting for server to respond.'); } await new Promise(resolve => setTimeout(resolve, 1000)); } throw new Error('Server did not start within the timeout period'); }; -const killPortProcess = async (port) => { +const killPortProcess = async port => { try { const fkill = await import('fkill'); await fkill(`:${port}`, { force: true }); - console.log(`Another process detected on port: ${port}. The process will be killed automatically.`); + console.log( + `Another process detected on port: ${port}. The process will be killed automatically.` + ); } catch (error) { console.log(`Starting devserver on port: ${port}`); } @@ -33,14 +38,6 @@ const startServer = () => { return new Promise((resolve, reject) => { const server = spawn('yarn', ['dev-only']); - // server.stdout.on('data', data => { - // console.log(`Server: ${data}`); - // }); - - // server.stderr.on('data', data => { - // console.error(`Server error: ${data}`); - // }); - server.on('close', code => { console.log(`Server process exited with code ${code}`); if (code !== 0) { @@ -63,8 +60,18 @@ const startServer = () => { const runTests = () => { return new Promise((resolve, reject) => { const tests = spawn( - 'jest', - ['--config', 'jest.conf/visual.index.js', '-i', './lib/KImg/__tests__/KImg.spec.js'], + 'npx', + [ + 'percy', + 'exec', + '-v', + '--', + 'jest', + '--config', + 'jest.conf/visual.index.js', + '-i', + './lib/KImg/__tests__/KImg.spec.js', + ], { stdio: 'inherit' } ); From f01b65d64c88b14da87e904f43ab236f5ecf2072 Mon Sep 17 00:00:00 2001 From: Kshitij Thareja Date: Sat, 29 Jun 2024 16:40:22 +0530 Subject: [PATCH 3/8] Change server configuration and file names for visual tests --- .percy.yml | 4 +- jest.conf/setup.js | 6 +- jest.conf/setup.visual.js | 72 ------------------ jest.conf/testUtils.js | 2 +- jest.conf/visual.index.js | 4 +- jest.conf/visual.setup.js | 20 +++++ lib/KImg/__tests__/KImg.spec.js | 9 +-- package.json | 4 +- ...-server-and-test.js => startVisualTests.js | 74 ++++++++++++++----- yarn.lock | 55 +++++++++++++- 10 files changed, 142 insertions(+), 108 deletions(-) delete mode 100644 jest.conf/setup.visual.js create mode 100644 jest.conf/visual.setup.js rename start-server-and-test.js => startVisualTests.js (55%) diff --git a/.percy.yml b/.percy.yml index 56546a986..66f3edb0f 100644 --- a/.percy.yml +++ b/.percy.yml @@ -5,8 +5,8 @@ snapshot: - 1280 minHeight: 1024 percyCSS: "" - enableJavaScript: false - cliEnableJavaScript: true + enableJavaScript: false #disable Javascript by default to capture initial page state without JS-driven changes + cliEnableJavaScript: true #enable Javascript when running Percy through CLI, for dynamic content disableShadowDOM: false discovery: allowedHostnames: [] diff --git a/jest.conf/setup.js b/jest.conf/setup.js index 34f6c268b..d62049c5d 100644 --- a/jest.conf/setup.js +++ b/jest.conf/setup.js @@ -12,8 +12,6 @@ import VueIntl from 'vue-intl'; import VueCompositionAPI from '@vue/composition-api'; import KThemePlugin from '../lib/KThemePlugin'; -process.env.TEST_TYPE = 'unit'; // Set the test type to unit - global.beforeEach(() => { return new Promise(resolve => { Aphrodite.StyleSheetTestUtils.suppressStyleInjection(); @@ -40,7 +38,9 @@ Vue.config.silent = true; Vue.config.devtools = false; Vue.config.productionTip = false; -Object.defineProperty(window, 'scrollTo', { value: () => {}, writable: true }); +if (process.env.TEST_TYPE !== 'visual' && typeof window !== 'undefined') { + Object.defineProperty(window, 'scrollTo', { value: () => {}, writable: true }); +} // Shows better NodeJS unhandled promise rejection errors process.on('unhandledRejection', (reason, p) => { diff --git a/jest.conf/setup.visual.js b/jest.conf/setup.visual.js deleted file mode 100644 index 33a32b51b..000000000 --- a/jest.conf/setup.visual.js +++ /dev/null @@ -1,72 +0,0 @@ -import 'regenerator-runtime/runtime'; -import '@testing-library/jest-dom'; -import * as Aphrodite from 'aphrodite'; -import * as AphroditeNoImportant from 'aphrodite/no-important'; - -// eslint-disable-next-line import/no-unresolved -import 'mock-match-media/jest-setup'; - -import Vue from 'vue'; -import VueRouter from 'vue-router'; -import VueIntl from 'vue-intl'; -import VueCompositionAPI from '@vue/composition-api'; -import { percySnapshot } from '@percy/puppeteer'; -import KThemePlugin from '../lib/KThemePlugin'; - -process.env.TEST_TYPE = 'visual'; // Set the test type to visual - -if (typeof window !== 'undefined') { - global.matchMedia = - global.matchMedia || - function() { - return { - matches: false, - addListener: function() {}, - removeListener: function() {}, - }; - }; -} - -global.beforeEach(() => { - return new Promise(resolve => { - Aphrodite.StyleSheetTestUtils.suppressStyleInjection(); - AphroditeNoImportant.StyleSheetTestUtils.suppressStyleInjection(); - return process.nextTick(resolve); - }); -}); - -global.afterEach(() => { - return new Promise(resolve => { - Aphrodite.StyleSheetTestUtils.clearBufferAndResumeStyleInjection(); - AphroditeNoImportant.StyleSheetTestUtils.clearBufferAndResumeStyleInjection(); - return process.nextTick(resolve); - }); -}); - -global.percySnapshot = percySnapshot; - -// Register Vue plugins and components -Vue.use(VueRouter); -Vue.use(VueCompositionAPI); -Vue.use(KThemePlugin); -Vue.use(VueIntl); - -Vue.config.silent = true; -Vue.config.devtools = false; -Vue.config.productionTip = false; - -// Object.defineProperty(window, 'scrollTo', { value: () => {}, writable: true }); - -// Shows better NodeJS unhandled promise rejection errors -process.on('unhandledRejection', (reason, p) => { - /* eslint-disable no-console */ - console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); - console.log(reason.stack); -}); - -// Copied from https://github.com/kentor/flush-promises/blob/f33ac564190c784019f1f689dd544187f4b77eb2/index.js -global.flushPromises = function flushPromises() { - return new Promise(function(resolve) { - setImmediate(resolve); - }); -}; diff --git a/jest.conf/testUtils.js b/jest.conf/testUtils.js index c74afdc5d..81a23645e 100644 --- a/jest.conf/testUtils.js +++ b/jest.conf/testUtils.js @@ -10,7 +10,7 @@ export const resizeWindow = (width, height = 768) => { }); }; -export function takeScreenshot() { +export function canTakeScreenshot() { const percyToken = process.env.PERCY_TOKEN; const runVisualTests = process.env.TEST_TYPE === 'visual'; if (runVisualTests && !percyToken) { diff --git a/jest.conf/visual.index.js b/jest.conf/visual.index.js index f7fb5baf2..d982a5cff 100644 --- a/jest.conf/visual.index.js +++ b/jest.conf/visual.index.js @@ -1,7 +1,5 @@ const path = require('node:path'); -process.env.JEST_PUPPETEER_CONFIG = require.resolve('../jest-puppeteer.config.js'); - const moduleNameMapper = { '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga|css)$': path.resolve( __dirname, @@ -27,6 +25,6 @@ module.exports = { experimentalCSSCompile: true, }, }, - setupFilesAfterEnv: [path.resolve(__dirname, './setup.visual')], + setupFilesAfterEnv: [path.resolve(__dirname, './visual.setup')], verbose: true, }; diff --git a/jest.conf/visual.setup.js b/jest.conf/visual.setup.js new file mode 100644 index 000000000..8a83c5377 --- /dev/null +++ b/jest.conf/visual.setup.js @@ -0,0 +1,20 @@ +// Set the test type to visual + +import './setup'; +import { percySnapshot } from '@percy/puppeteer'; + +process.env.TEST_TYPE = 'visual'; + +// if (typeof window !== 'undefined') { +// global.matchMedia = +// global.matchMedia || +// function() { +// return { +// matches: false, +// addListener: function() {}, +// removeListener: function() {}, +// }; +// }; +// } + +global.percySnapshot = percySnapshot; diff --git a/lib/KImg/__tests__/KImg.spec.js b/lib/KImg/__tests__/KImg.spec.js index aa8c18bef..1c2e96452 100644 --- a/lib/KImg/__tests__/KImg.spec.js +++ b/lib/KImg/__tests__/KImg.spec.js @@ -1,14 +1,14 @@ import { shallowMount } from '@vue/test-utils'; import percySnapshot from '@percy/puppeteer'; import KImg from '../'; -import { takeScreenshot } from '../../../jest.conf/testUtils'; +import { canTakeScreenshot } from '../../../jest.conf/testUtils'; function makeWrapper(opts) { return shallowMount(KImg, opts); } describe('KImg', () => { - if (process.env.TEST_TYPE !== 'visual') { + if (!canTakeScreenshot()) { it(`renders without any errors when a valid 'src' and 'altText' are provided`, () => { const error = jest.fn(); const wrapper = makeWrapper({ @@ -92,11 +92,10 @@ describe('KImg', () => { expect(error.mock.calls[0][0]).toBeInstanceOf(Event); expect(error.mock.calls[0][0]).toEqual(e); }); - } - if (takeScreenshot()) { + } else { describe('KImg Visual Tests', () => { it('renders correctly (mock test)', async () => { - await global.page.goto('http://localhost:4000/', { waitUntil: 'networkidle2' }); + await page.goto('http://localhost:4000/', { waitUntil: 'networkidle2' }); await percySnapshot(page, 'HomePage'); }); }); diff --git a/package.json b/package.json index 2d05b87f8..22a096c66 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "_lint-watch-fix": "yarn lint -w -m", "test": "yarn test:unit && yarn test:visual", "test:unit": "jest --config=jest.conf/index.js", - "test:visual": "JEST_PUPPETEER_CONFIG=./jest-puppeteer.config.js node start-server-and-test.js", + "test:visual": "JEST_PUPPETEER_CONFIG=./jest-puppeteer.config.js node startVisualTests.js", "_api-watch": "chokidar \"**/lib/**\" -c \"node utils/extractApi.js\"" }, "files": [ @@ -38,11 +38,11 @@ "jest-puppeteer": "^10.0.1", "lodash": "4.17.21", "popper.js": "1.16.1", + "ps-tree": "^1.2.0", "puppeteer": "^22.11.0", "purecss": "2.2.0", "tippy.js": "4.2.1", "vue-intl": "3.1.0", - "wait-on": "^7.2.0", "xstate": "4.38.3" }, "peerDependencies": {}, diff --git a/start-server-and-test.js b/startVisualTests.js similarity index 55% rename from start-server-and-test.js rename to startVisualTests.js index c26ce6ee7..ab6fa3b1e 100644 --- a/start-server-and-test.js +++ b/startVisualTests.js @@ -1,10 +1,12 @@ const { spawn } = require('child_process'); +const net = require('net'); const fetch = require('node-fetch'); +const psTree = require('ps-tree'); /* eslint-disable no-console */ -const serverUrl = 'http://localhost:4000'; -const serverTimeout = 360000; // 6 minutes +const SERVER_URL = 'http://localhost:4000'; +const SERVER_TIMEOUT = 360000; const waitForServer = async (url, timeout = 30000) => { const start = Date.now(); @@ -22,21 +24,33 @@ const waitForServer = async (url, timeout = 30000) => { throw new Error('Server did not start within the timeout period'); }; -const killPortProcess = async port => { - try { - const fkill = await import('fkill'); - await fkill(`:${port}`, { force: true }); - console.log( - `Another process detected on port: ${port}. The process will be killed automatically.` - ); - } catch (error) { - console.log(`Starting devserver on port: ${port}`); - } +const checkPortInUse = port => { + return new Promise((resolve, reject) => { + const server = net.createServer(); + server.once('error', err => { + if (err.code === 'EADDRINUSE') { + reject(new Error(`Port ${port} is already in use.`)); + } else { + reject(err); + } + }); + + server.once('listening', () => { + server.close(); + resolve(); + }); + + server.listen(port); + }); }; const startServer = () => { return new Promise((resolve, reject) => { - const server = spawn('yarn', ['dev-only']); + const server = spawn('yarn', ['dev-only'], { shell: true }); + + server.on('error', err => { + reject(new Error(`Failed to start server: ${err.message}`)); + }); server.on('close', code => { console.log(`Server process exited with code ${code}`); @@ -45,13 +59,13 @@ const startServer = () => { } }); - waitForServer(serverUrl, serverTimeout) + waitForServer(SERVER_URL, SERVER_TIMEOUT) .then(() => { console.log('Server is up and running'); resolve(server); }) .catch(error => { - server.kill(); + server.kill('SIGINT'); reject(error); }); }); @@ -86,15 +100,39 @@ const runTests = () => { }); }; +const stopServer = server => { + return new Promise((resolve, reject) => { + psTree(server.pid, (err, children) => { + if (err) { + return reject(err); + } + [server.pid, ...children.map(p => p.PID)].forEach(pid => { + try { + process.kill(pid, 'SIGINT'); + } catch (e) { + if (e.code !== 'ESRCH') { + reject(e); + } + } + }); + resolve(); + }); + }); +}; + const start = async () => { + let server; try { - await killPortProcess(4000); - const server = await startServer(); + await checkPortInUse(4000); + server = await startServer(); const testExitCode = await runTests(); - server.kill(); + await stopServer(server); process.exit(testExitCode); } catch (error) { console.error(error); + if (server) { + await stopServer(server); + } process.exit(1); } }; diff --git a/yarn.lock b/yarn.lock index 20087f51b..b985dfc84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5764,7 +5764,7 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== -duplexer@^0.1.2: +duplexer@^0.1.2, duplexer@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== @@ -6329,6 +6329,19 @@ etag@^1.8.1, etag@~1.8.1: resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +event-stream@=3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + integrity sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g== + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + eventemitter3@^4.0.0: version "4.0.7" resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" @@ -6910,6 +6923,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + integrity sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g== + 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" @@ -9644,6 +9662,11 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + integrity sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g== + map-values@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz" @@ -10940,6 +10963,13 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A== + dependencies: + through "~2.3" + pbkdf2@^3.0.3, pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" @@ -12154,6 +12184,13 @@ ps-list@^8.0.0, ps-list@^8.1.1: resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-8.1.1.tgz#9ff1952b26a9a07fcc05270407e60544237ae581" integrity sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ== +ps-tree@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" + integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA== + dependencies: + event-stream "=3.3.4" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" @@ -13567,6 +13604,13 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + integrity sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA== + 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" @@ -13672,6 +13716,13 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + integrity sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw== + dependencies: + duplexer "~0.1.1" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz" @@ -14311,7 +14362,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= From a538bf2c69c5c092f386bc9dc238a2c8c504cfc6 Mon Sep 17 00:00:00 2001 From: Kshitij Thareja Date: Sun, 30 Jun 2024 17:07:35 +0530 Subject: [PATCH 4/8] Add component rendering mechanism for visual testing --- docs/pages/testing-playground.vue | 42 ++++++ jest.conf/visual.setup.js | 15 +- .../__tests__/KButton.spec.js | 140 ++++++++++++------ startVisualTests.js | 2 +- 4 files changed, 135 insertions(+), 64 deletions(-) create mode 100644 docs/pages/testing-playground.vue diff --git a/docs/pages/testing-playground.vue b/docs/pages/testing-playground.vue new file mode 100644 index 000000000..d496ba7f9 --- /dev/null +++ b/docs/pages/testing-playground.vue @@ -0,0 +1,42 @@ + + + + diff --git a/jest.conf/visual.setup.js b/jest.conf/visual.setup.js index 8a83c5377..0e983657c 100644 --- a/jest.conf/visual.setup.js +++ b/jest.conf/visual.setup.js @@ -1,20 +1,7 @@ -// Set the test type to visual - import './setup'; import { percySnapshot } from '@percy/puppeteer'; +// Set the test type to visual process.env.TEST_TYPE = 'visual'; -// if (typeof window !== 'undefined') { -// global.matchMedia = -// global.matchMedia || -// function() { -// return { -// matches: false, -// addListener: function() {}, -// removeListener: function() {}, -// }; -// }; -// } - global.percySnapshot = percySnapshot; diff --git a/lib/buttons-and-links/__tests__/KButton.spec.js b/lib/buttons-and-links/__tests__/KButton.spec.js index 46cdb7f17..ca1fa251a 100644 --- a/lib/buttons-and-links/__tests__/KButton.spec.js +++ b/lib/buttons-and-links/__tests__/KButton.spec.js @@ -1,67 +1,109 @@ import { shallowMount } from '@vue/test-utils'; +import percySnapshot from '@percy/puppeteer'; import KButton from '../KButton.vue'; +import { canTakeScreenshot } from '../../../jest.conf/testUtils'; describe('KButton', () => { - describe('icon related props', () => { - it('should render an icon before the text with the icon string passed to the `icon` prop', () => { - const wrapper = shallowMount(KButton, { - propsData: { - icon: 'add', - }, + if (!canTakeScreenshot()) { + describe('icon related props', () => { + it('should render an icon before the text with the icon string passed to the `icon` prop', () => { + const wrapper = shallowMount(KButton, { + propsData: { + icon: 'add', + }, + }); + expect(wrapper.find('[data-test="iconBefore"]').exists()).toBe(true); }); - expect(wrapper.find('[data-test="iconBefore"]').exists()).toBe(true); - }); - it('should render an icon after the text with the icon string pased to the `iconAfter` prop', () => { - const wrapper = shallowMount(KButton, { - propsData: { - iconAfter: 'video', - }, + it('should render an icon after the text with the icon string pased to the `iconAfter` prop', () => { + const wrapper = shallowMount(KButton, { + propsData: { + iconAfter: 'video', + }, + }); + expect(wrapper.find('[data-test="iconAfter"]').exists()).toBe(true); }); - expect(wrapper.find('[data-test="iconAfter"]').exists()).toBe(true); - }); - it('should render a dropdown icon when hasDropdown is true', () => { - const wrapper = shallowMount(KButton, { - propsData: { - hasDropdown: true, - }, + it('should render a dropdown icon when hasDropdown is true', () => { + const wrapper = shallowMount(KButton, { + propsData: { + hasDropdown: true, + }, + }); + expect(wrapper.find('[data-test="dropdownIcon"]').exists()).toBe(true); }); - expect(wrapper.find('[data-test="dropdownIcon"]').exists()).toBe(true); }); - }); - describe('text prop and slots', () => { - it('should render the text prop if nothing is in the default slot', () => { - const wrapper = shallowMount(KButton, { - propsData: { - text: 'test', - }, + describe('text prop and slots', () => { + it('should render the text prop if nothing is in the default slot', () => { + const wrapper = shallowMount(KButton, { + propsData: { + text: 'test', + }, + }); + expect(wrapper.text()).toContain('test'); + }); + + it('should render the slot when the slot has content', () => { + const wrapper = shallowMount(KButton, { + propsData: { + text: 'test', + }, + slots: { + default: 'slot', + }, + }); + expect(wrapper.text()).toContain('slot'); + expect(wrapper.text()).toContain('test'); }); - expect(wrapper.text()).toContain('test'); }); - it('should render the slot when the slot has content', () => { - const wrapper = shallowMount(KButton, { - propsData: { - text: 'test', - }, - slots: { - default: 'slot', - }, + describe('event handling', () => { + it('should emit a click event when clicked', () => { + const wrapper = shallowMount(KButton, { + propsData: { + text: 'test', + }, + }); + wrapper.trigger('click'); + expect(wrapper.emitted().click).toBeTruthy(); }); - expect(wrapper.text()).toContain('slot'); - expect(wrapper.text()).toContain('test'); }); - }); + } else { + describe('KButton Visual Tests', () => { + beforeAll(async () => { + await page.goto('http://localhost:4000/testing-playground', { waitUntil: 'networkidle2' }); + }); + + async function renderComponent(component, props) { + await page.evaluate( + ({ component, props }) => { + window.postMessage( + { + type: 'RENDER_COMPONENT', + component: component, + props: props, + }, + '*' + ); + }, + { component, props } + ); + await page.waitForSelector('#testing-playground'); + + const isComponentRendered = await page.evaluate(() => { + const testing_playground = document.querySelector('#testing-playground'); + return testing_playground && testing_playground.children.length > 0; + }); + + if (!isComponentRendered) { + // eslint-disable-next-line no-console + console.error('Component did not render in the testing playground'); + } + } - describe('event handling', () => { - it('should emit a click event when clicked', () => { - const wrapper = shallowMount(KButton, { - propsData: { - text: 'test', - }, + it('renders correctly with default props', async () => { + await renderComponent('KButton', { text: 'Test Button' }); + await percySnapshot(page, 'KButton - Default'); }); - wrapper.trigger('click'); - expect(wrapper.emitted().click).toBeTruthy(); }); - }); + } }); diff --git a/startVisualTests.js b/startVisualTests.js index ab6fa3b1e..2f0c0ff32 100644 --- a/startVisualTests.js +++ b/startVisualTests.js @@ -84,7 +84,7 @@ const runTests = () => { '--config', 'jest.conf/visual.index.js', '-i', - './lib/KImg/__tests__/KImg.spec.js', + './lib/buttons-and-links/__tests__/KButton.spec.js', ], { stdio: 'inherit' } ); From 1ffca8eb792ac99df51401d2aec2687bd94a00fc Mon Sep 17 00:00:00 2001 From: Kshitij Thareja Date: Sun, 30 Jun 2024 17:26:59 +0530 Subject: [PATCH 5/8] Remove unused packages --- package.json | 1 - yarn.lock | 144 +-------------------------------------------------- 2 files changed, 1 insertion(+), 144 deletions(-) diff --git a/package.json b/package.json index 22a096c66..a3c0623b0 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "autosize": "3.0.21", "css-element-queries": "1.2.0", "date-fns": "1.30.1", - "fkill": "^9.0.0", "frame-throttle": "3.0.0", "fuzzysearch": "1.0.3", "jest-puppeteer": "^10.0.1", diff --git a/yarn.lock b/yarn.lock index b985dfc84..def7ac347 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2927,14 +2927,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -aggregate-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" - integrity sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw== - dependencies: - clean-stack "^5.2.0" - indent-string "^5.0.0" - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" @@ -4350,13 +4342,6 @@ clean-stack@^2.0.0: resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -clean-stack@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" - integrity sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ== - dependencies: - escape-string-regexp "5.0.0" - cli-boxes@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" @@ -6048,11 +6033,6 @@ escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" - integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== - escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" @@ -6380,36 +6360,6 @@ execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^3.0.1" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execa@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" - integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" - strip-final-newline "^3.0.0" - exit@^0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" @@ -6804,18 +6754,6 @@ find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -fkill@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fkill/-/fkill-9.0.0.tgz#9ee08e55e3e67ac9f14e1bea66115cfe5bb5cc51" - integrity sha512-MdYSsbdCaIRjzo5edthZtWmEZVMfr1qrtYZUHIdO3swCE+CoZA8S5l0s4jDsYlTa9ZiXv0pTgpzE7s4N8NeUOA== - dependencies: - aggregate-error "^5.0.0" - execa "^8.0.1" - pid-port "^1.0.0" - process-exists "^5.0.0" - ps-list "^8.1.1" - taskkill "^5.0.0" - flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" @@ -7114,16 +7052,11 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-stream@^6.0.0, get-stream@^6.0.1: +get-stream@^6.0.0: version "6.0.1" resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-stream@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" - integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== - get-symbol-description@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" @@ -7795,16 +7728,6 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== - -human-signals@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" - integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -7933,11 +7856,6 @@ indent-string@^4.0.0: resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indent-string@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" - integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" @@ -8401,11 +8319,6 @@ is-stream@^2.0.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" @@ -9883,11 +9796,6 @@ mimic-fn@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -10410,13 +10318,6 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" -npm-run-path@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" - integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== - dependencies: - path-key "^4.0.0" - npmlog@^6.0.0: version "6.0.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" @@ -10607,13 +10508,6 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - open-iconic@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/open-iconic/-/open-iconic-1.1.1.tgz" @@ -10931,11 +10825,6 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -10996,13 +10885,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pid-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pid-port/-/pid-port-1.0.0.tgz#b99a4d53dfeeae8b4e123d02c77e268de0413225" - integrity sha512-LSNBeKChRPA4Xlrs6+zV588G1hSrFvANtPV5rt/5MPfSPK3V9XPWxx1d29svsrOjngT9ifLisXWCLS7DvO9ZhQ== - dependencies: - execa "^8.0.1" - pidtree@^0.3.0: version "0.3.1" resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz" @@ -12078,13 +11960,6 @@ prismjs@^1.27.0: resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -process-exists@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/process-exists/-/process-exists-5.0.0.tgz#0b6dcd3d19e85e1f72c633f56d38e498196e2855" - integrity sha512-6QPRh5fyHD8MaXr4GYML8K/YY0Sq5dKHGIOrAKS3cYpHQdmygFCcijIu1dVoNKAZ0TWAMoeh8KDK9dF8auBkJA== - dependencies: - ps-list "^8.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -12179,11 +12054,6 @@ prr@~1.0.1: resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= -ps-list@^8.0.0, ps-list@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/ps-list/-/ps-list-8.1.1.tgz#9ff1952b26a9a07fcc05270407e60544237ae581" - integrity sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ== - ps-tree@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd" @@ -13890,11 +13760,6 @@ strip-final-newline@^2.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" @@ -14248,13 +14113,6 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -taskkill@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/taskkill/-/taskkill-5.0.0.tgz#57b449a3fa8a441f5e9a0336c55230894049bdba" - integrity sha512-+HRtZ40Vc+6YfCDWCeAsixwxJgMbPY4HHuTgzPYH3JXvqHWUlsCfy+ylXlAKhFNcuLp4xVeWeFBUhDk+7KYUvQ== - dependencies: - execa "^6.1.0" - temp@^0.8.3: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" From d9e1d14477a170db4604cffed076f40a4afaad32 Mon Sep 17 00:00:00 2001 From: Kshitij Thareja Date: Tue, 2 Jul 2024 22:20:40 +0530 Subject: [PATCH 6/8] Add JSDoc for testing playground and modify server script --- .gitignore | 3 - docs/pages/testing-playground.vue | 27 ++++++- lib/KImg/__tests__/KImg.spec.js | 126 ++++++++++++------------------ package.json | 10 +-- startVisualTests.js | 15 +++- 5 files changed, 95 insertions(+), 86 deletions(-) diff --git a/.gitignore b/.gitignore index e9dcb9f63..6cda9f046 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,3 @@ kolibri-design-system.iml # env .envrc .python-version - -# local -myenv diff --git a/docs/pages/testing-playground.vue b/docs/pages/testing-playground.vue index d496ba7f9..cb06c9f80 100644 --- a/docs/pages/testing-playground.vue +++ b/docs/pages/testing-playground.vue @@ -15,21 +15,46 @@