diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 96c0933f8a..778d99ad4a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -30,6 +30,7 @@ jobs: - ':nbrowser-^[M-N]:' - ':nbrowser-^[O-R]:' - ':nbrowser-^[^A-R]:' + - ':projects:' include: - tests: ':lint:python:client:common:smoke:' node-version: 22.x @@ -84,7 +85,7 @@ jobs: run: yarn run build - name: Install Google Chrome and chromedriver - if: contains(matrix.tests, ':nbrowser-') || contains(matrix.tests, ':smoke:') || contains(matrix.tests, ':stubs:') + if: contains(matrix.tests, ':nbrowser-') || contains(matrix.tests, ':smoke:') || contains(matrix.tests, ':stubs:') || contains(matrix.tests, ':projects:') run: buildtools/install_chrome_for_tests.sh -y - name: Run smoke test @@ -195,6 +196,16 @@ jobs: GVISOR_EXTRA_DIRS: /opt TESTDIR: ${{ runner.temp }}/test-logs + - name: Run projects tests + if: contains(matrix.tests, ':projects:') + run: | + mkdir -p $MOCHA_WEBDRIVER_LOGDIR + yarn run test:projects + env: + MOCHA_WEBDRIVER_LOGDIR: ${{ runner.temp }}/test-logs/webdriver + TESTDIR: ${{ runner.temp }}/test-logs + MOCHA_WEBDRIVER_HEADLESS: 1 + - name: Prepare for saving artifact if: failure() run: | diff --git a/package.json b/package.json index 19e59a0f17..6b511ca246 100644 --- a/package.json +++ b/package.json @@ -118,8 +118,8 @@ "ts-node": "10.9.2", "typescript": "4.7.4", "webpack": "5.97.1", - "webpack-cli": "4.10.0", - "webpack-dev-server": "5.2.1", + "webpack-cli": "6.0.1", + "webpack-dev-server": "5.2.2", "why-is-node-running": "2.2.2" }, "dependencies": { diff --git a/test/fixtures/projects/webpack-test-server.ts b/test/fixtures/projects/webpack-test-server.ts index 37642fd389..1a9abedd77 100644 --- a/test/fixtures/projects/webpack-test-server.ts +++ b/test/fixtures/projects/webpack-test-server.ts @@ -21,6 +21,7 @@ import {exitPromise} from 'app/server/lib/serverUtils'; import {ChildProcess, spawn} from 'child_process'; import {driver, IMochaContext, IMochaServer} from 'mocha-webdriver'; import fetch from 'node-fetch'; +import stripAnsi from "strip-ansi"; import * as path from 'path'; const configPath = process.env.PROJECTS_WEBPACK_CONFIG || path.resolve(__dirname, 'webpack.config.js'); @@ -50,14 +51,20 @@ export class WebpackServer implements IMochaServer { // Wait for a build status to show up on stdout, to know when webpack is finished. this._webpackComplete = new Promise((resolve, reject) => { - this._server.stdout!.on('data', (data) => { - // Note that data might not in general arrive at line boundaries, but in this case, it works. - const text = data.toString('utf8'); - if (/compiled with.*errors/i.test(text)) { reject(new Error('Webpack failed')); } - if (/compiled successfully/i.test(text)) { resolve(true); } + let buffer = ""; + this._server.stdout!.on("data", (data) => { + buffer += data.toString("utf8"); + const clean = stripAnsi(buffer); + if (/compiled.*with.*errors/i.test(clean)) { + reject(new Error("Webpack failed")); + } + if (/compiled.*successfully/i.test(clean)) { + resolve(true); + } }); }); + const config = require(configPath); const port = config.devServer.port; this._serverUrl = `http://localhost:${port}`; diff --git a/test/projects/ColorSelect.ts b/test/projects/ColorSelect.ts index eaad7a03f8..4dcfc1da80 100644 --- a/test/projects/ColorSelect.ts +++ b/test/projects/ColorSelect.ts @@ -358,6 +358,8 @@ describe("ColorSelect", function() { // click the hex value await driver.findWait('.test-text-hex', 100).click(); + await waitForSelection('.test-text-hex'); + // start typing '#' await driver.sendKeys('#'); @@ -376,6 +378,8 @@ describe("ColorSelect", function() { // click the hex value await driver.find('.test-text-hex').click(); + await waitForSelection('.test-text-hex'); + // type in #FF00FF and press enter await driver.sendKeys(pink, Key.ENTER); @@ -399,6 +403,9 @@ describe("ColorSelect", function() { // click the hex value await driver.find('.test-text-hex').click(); + // Wait for focus + await waitForSelection('.test-text-hex'); + // type in #0000FF await driver.sendKeys(red); @@ -432,6 +439,7 @@ describe("ColorSelect", function() { // click the hex value await driver.find('.test-text-hex').click(); + await waitForSelection('.test-text-hex'); // start typing '#FF' await driver.sendKeys('#FF'); @@ -439,7 +447,7 @@ describe("ColorSelect", function() { // check the hex value changed assert.equal(await driver.find('.test-text-hex').value(), '#FF'); - // click button to update. We cannot send ctrl+U here, becauses it does cause picker to close + // click button to update. We cannot send ctrl+U here, because it does cause picker to close // here. await driver.executeScript('triggerUpdate()'); @@ -488,3 +496,21 @@ async function clickUnderline() { async function clickStrikethrough() { await driver.find('.test-font-option-FontStrikethrough').click(); } + +/** + * Waits until all text in the given input element is selected and the element has focus. + * @param inputSelector Selector for the input element to check selection on. + */ +async function waitForSelection(inputSelector: string) { + await gu.waitToPass(async () => { + assert.isTrue(await driver.find(inputSelector).hasFocus()); + const allSelected = await driver.executeScript(() => { + const innerSelector = arguments[0]; + const el = document.querySelector(innerSelector) as HTMLInputElement; + const sel = { start: el.selectionStart, end: el.selectionEnd }; + const textLen = el.value.length; + return sel.start === 0 && sel.end === textLen; + }, inputSelector); + assert.isTrue(allSelected, 'Expected all text to be selected in the text input'); + }); +} diff --git a/test/projects/ColumnFilterMenu2.ts b/test/projects/ColumnFilterMenu2.ts index 5fcea94edb..874fa54636 100644 --- a/test/projects/ColumnFilterMenu2.ts +++ b/test/projects/ColumnFilterMenu2.ts @@ -173,6 +173,7 @@ describe('ColumnFilterMenu2', function() { await driver.sendKeys('A'); // click 'Apple' + await driver.findWait('.test-filter-menu-list label', 100); await driver.findContent('.test-filter-menu-list label', /Apple/).click(); // check Apple is not included @@ -193,6 +194,7 @@ describe('ColumnFilterMenu2', function() { // enter 'A' await driver.sendKeys('A'); + await driver.findWait('.test-filter-menu-summary label', 100); // check 'Other Non-Matching' is checked assert.equal( await driver.findContent('.test-filter-menu-summary label', /Other Non-Matching/).find('input').isSelected(), diff --git a/test/projects/DateRangeFilter.ts b/test/projects/DateRangeFilter.ts index 3fc24cc98d..c05d10eb07 100644 --- a/test/projects/DateRangeFilter.ts +++ b/test/projects/DateRangeFilter.ts @@ -288,37 +288,51 @@ describe('DateRangeFilter', function() { await fu.findBound('max').click(); assert.equal(await fu.isOptionsVisible(), true); await driver.sendKeys(Key.ESCAPE); + await gu.waitForMenuToClose(); assert.equal(await fu.isOptionsVisible(), false); }); it('should show relative dates options when value changes', async function() { await fu.findBound('min').click(); + await gu.findOpenMenu(); await driver.sendKeys(Key.ESCAPE); + await gu.waitForMenuToClose(); assert.equal(await fu.isOptionsVisible(), false); await fu.pickDateInCurrentMonth('18'); + await gu.findOpenMenu(); assert.equal(await fu.isOptionsVisible(), true); + await driver.sendKeys(Key.ESCAPE); + await gu.waitForMenuToClose(); }); it('should show relative dates when selected bound changes', async function() { await fu.findBound('min').click(); + await gu.findOpenMenu(); await driver.sendKeys(Key.ESCAPE); + await gu.waitForMenuToClose(); assert.equal(await fu.isOptionsVisible(), false); await driver.sendKeys(Key.TAB); + await gu.findOpenMenu(); assert.equal(await fu.isOptionsVisible(), true); }); it('should toggle relative dates on click', async function() { await fu.findBound('min').click(); + await gu.findOpenMenu(); assert.equal(await fu.isOptionsVisible(), true); await fu.findBound('min').click(); + await gu.waitForMenuToClose(); assert.equal(await fu.isOptionsVisible(), false); }); it('should show relative dates options when pressing Enter while the options are closed', async function() { await fu.findBound('min').click(); + await gu.findOpenMenu(); await driver.sendKeys(Key.ESCAPE); // Escape to close + await gu.waitForMenuToClose(); assert.equal(await fu.isOptionsVisible(), false); await driver.sendKeys(Key.ENTER); // Enter to reopen + await gu.findOpenMenu(); assert.equal(await fu.isOptionsVisible(), true); assert.equal(await fu.getSelected(), 'min'); }); @@ -331,6 +345,7 @@ describe('DateRangeFilter', function() { it('should have working keyboard navigation after picking date from calendar', async function() { await fu.findBound('min').click(); + await gu.findOpenMenu(); assert.deepEqual(await fu.getSelectedOption(), []); await fu.pickDateInCurrentMonth('18'); assert.deepEqual(await fu.getSelectedOption(), ['2022-09-18']); @@ -392,6 +407,8 @@ describe('DateRangeFilter', function() { // click Today await driver.findContent('.test-filter-menu-presets-links button', 'Today').click(); + await gu.findOpenMenu(); + // check min bounds shows 'today' assert.equal(await fu.getBoundText('min'), 'Today'); @@ -400,6 +417,7 @@ describe('DateRangeFilter', function() { // click Last week await driver.findContent('.test-filter-menu-presets-links button', 'More').click(); + await gu.findOpenMenu(); await driver.findContent('.grist-floating-menu li', 'Last Week').click(); // check min bounds shows '1st day of last week' diff --git a/test/projects/PagesComponent.ts b/test/projects/PagesComponent.ts index c3b5a2f658..4093104114 100644 --- a/test/projects/PagesComponent.ts +++ b/test/projects/PagesComponent.ts @@ -11,7 +11,7 @@ describe('PagesComponent', function() { }); function findPage(name: RegExp) { - return driver.findContent('.test-treeview-label', name); + return driver.findContentWait('.test-treeview-label', name, 100); } async function beginRenaming(name: RegExp) { @@ -28,7 +28,9 @@ describe('PagesComponent', function() { await beginRenaming(/Interactions/); // click on the right part of the text input - await driver.find('.test-docpage-editor').mouseMove({x: 100}).click(); + await driver.find('.test-docpage-editor').click(); + + await driver.sendKeys(Key.END); // move to the end // enter 'Renamed' await driver.sendKeys('Renamed', Key.ENTER); diff --git a/test/projects/UserManager.ts b/test/projects/UserManager.ts index d275f998d6..0472411f2a 100644 --- a/test/projects/UserManager.ts +++ b/test/projects/UserManager.ts @@ -1,8 +1,11 @@ import {assert, driver, Key, WebElement} from 'mocha-webdriver'; import {server, setupTestSuite} from 'test/projects/testUtils'; +import * as gu from 'test/nbrowser/gristUtils'; + describe('UserManager', () => { setupTestSuite(); + gu.bigScreen(); before(async function() { this.timeout(60000); // Set a longer default timeout. @@ -34,12 +37,14 @@ describe('UserManager', () => { } it('should render all emails and roles initially', async function() { - assert.deepEqual(await getRenderedMembers(), [ - ["foo@example.com", "Owner"], - ["bar@example.com", "Editor"], - ["team@example.com", "Viewer"], - ["guest@example.com", "Viewer"], - ]); + await gu.waitToPass(async () => { + assert.deepEqual(await getRenderedMembers(), [ + ["foo@example.com", "Owner"], + ["bar@example.com", "Editor"], + ["team@example.com", "Viewer"], + ["guest@example.com", "Viewer"], + ]); + }, 5000); assert.deepEqual(JSON.parse(await driver.find('.test-result').getText()), {}); }); @@ -65,10 +70,11 @@ describe('UserManager', () => { await driver.find('.test-um-member-new input').sendKeys('bob@bob.tail', Key.ENTER); await driver.find('.test-um-member-new input').sendKeys('alice@a.com', Key.ENTER); await driver.find('.test-um-member-new input').sendKeys('eve@a.com', Key.ENTER); + await driver.findContent('.test-um-member', /eve@a\.com/).find('.test-um-member-role').doClick(); - await driver.findContent('.test-um-role-option', /Editor/).doClick(); + await driver.findContentWait('.test-um-role-option', /Editor/, 100).doClick(); await driver.findContent('.test-um-member', /bob@bob\.tail/).find('.test-um-member-role').doClick(); - await driver.findContent('.test-um-role-option', /Editor/).doClick(); + await driver.findContentWait('.test-um-role-option', /Editor/, 100).doClick(); assert.deepEqual(await getRenderedMembers(), [ ["foo@example.com", "Owner"], @@ -130,9 +136,9 @@ describe('UserManager', () => { await driver.find('.test-um-member-new input').sendKeys('alice@bobtail.com', Key.ENTER); await driver.findContent('.test-um-member', /foo@example\.com/).find('.test-um-member-delete').doClick(); await driver.findContent('.test-um-member', /bar@example\.com/).find('.test-um-member-role').doClick(); - await driver.findContent('.test-um-role-option', /Owner/).doClick(); + await driver.findContentWait('.test-um-role-option', /Owner/, 100).doClick(); await driver.findContent('.test-um-member', /alice@bobtail\.com/).find('.test-um-member-role').doClick(); - await driver.findContent('.test-um-role-option', /Owner/).doClick(); + await driver.findContentWait('.test-um-role-option', /Owner/, 100).doClick(); assert.deepEqual(await getRenderedMembers(), [ ["foo@example.com", null], diff --git a/test/projects/contextMenu.ts b/test/projects/contextMenu.ts index 35e8df886c..85873610bf 100644 --- a/test/projects/contextMenu.ts +++ b/test/projects/contextMenu.ts @@ -58,7 +58,7 @@ describe('contextMenu', function() { await contextMenu(); // check action worked - await driver.findContent('.grist-floating-menu li', 'Reset').click(); + await driver.findContentWait('.grist-floating-menu li', 'Reset', 100).click(); assert.deepEqual( await driver.findAll('.test-logs', e => e.getText()), [] @@ -74,7 +74,7 @@ describe('contextMenu', function() { await driver.sendKeys(Key.ESCAPE); // check menu is closed - assert.equal(await driver.find('.grist-floating-menu').isPresent(), false); + await gu.waitForMenuToClose(); }); it('should support arrow navigation', async function() { diff --git a/test/projects/modals.ts b/test/projects/modals.ts index 48f3f00602..527cc26211 100644 --- a/test/projects/modals.ts +++ b/test/projects/modals.ts @@ -10,15 +10,17 @@ describe('modals', function() { }); async function checkClosed() { + await driver.sleep(50); // Give time for the closing animation to finish. assert.equal(await driver.find('.test-modal-dialog').isPresent(), false); } + async function checkOpen() { - assert.equal(await driver.find('.test-modal-dialog').isDisplayed(), true); + assert.equal(await driver.findWait('.test-modal-dialog', 100).isPresent(), true); } it('should close on click-away, OK, Cancel, Escape, Enter', async function() { // Modal is initially reported as "Cancelled" and isn't present. - assert.match(await driver.find('.testui-confirm-modal-text').getText(), /Cancelled/); + assert.match(await driver.findWait('.testui-confirm-modal-text', 100).getText(), /Cancelled/); await checkClosed(); // Click on Cancel closes. diff --git a/yarn.lock b/yarn.lock index c545ab99b0..7092af02fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -333,10 +333,10 @@ resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== +"@discoveryjs/json-ext@^0.6.1": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" + integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== "@emoji-mart/data@1.2.1": version "1.2.1" @@ -687,7 +687,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -1107,9 +1107,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/events@*": version "3.0.0" @@ -1247,12 +1247,12 @@ resolved "https://registry.npmjs.org/@types/jsesc/-/jsesc-3.0.1.tgz" integrity sha512-F2g93pJlhV0RlW9uSUAM/hIxywlwlZcuRB/nZ82GaMPaO8mdexYbJ8Qt3UGbUS1M19YFQykEetrWW004M+vPCg== -"@types/json-schema@*", "@types/json-schema@^7.0.8": +"@types/json-schema@*": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -1738,22 +1738,20 @@ "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== +"@webpack-cli/configtest@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" + integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" +"@webpack-cli/info@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" + integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== +"@webpack-cli/serve@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" + integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== "@xmldom/xmldom@^0.8.5", "@xmldom/xmldom@^0.8.6", "@xmldom/xmldom@^0.8.8": version "0.8.10" @@ -1894,15 +1892,15 @@ acorn@^8.0.4, acorn@^8.8.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== -acorn@^8.11.0, acorn@^8.14.0, acorn@^8.4.1: +acorn@^8.11.0, acorn@^8.4.1: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -acorn@^8.8.2: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.14.0, acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -1949,7 +1947,7 @@ ajv-formats@^2.1.1: ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv-keywords@^5.1.0: @@ -3090,12 +3088,17 @@ commander@9.3.0: resolved "https://registry.npmjs.org/commander/-/commander-9.3.0.tgz" integrity sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw== +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + commander@^2.11.0, commander@^2.12.2, commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^7.0.0, commander@^7.2.0: +commander@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -3983,9 +3986,9 @@ engine.io@6.6.2: ws "~8.17.1" enhanced-resolve@^5.17.1: - version "5.18.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz#91eb1db193896b9801251eeff1c6980278b1e404" - integrity sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ== + version "5.18.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" + integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4010,10 +4013,10 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +envinfo@^7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== eol@^0.9.1: version "0.9.1" @@ -5274,7 +5277,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -http-proxy-middleware@^2.0.7: +http-proxy-middleware@^2.0.7, http-proxy-middleware@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== @@ -5499,10 +5502,10 @@ insert-module-globals@^7.0.0: undeclared-identifiers "^1.1.2" xtend "^4.0.0" -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== ioredis@^5.4.1: version "5.4.1" @@ -5566,6 +5569,13 @@ is-callable@^1.1.3, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" @@ -5573,13 +5583,6 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" -is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-docker@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" @@ -7796,12 +7799,12 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: - resolve "^1.9.0" + resolve "^1.20.0" redis-commands@^1.7.0: version "1.7.0" @@ -7919,12 +7922,12 @@ resolve@^1.1.3, resolve@^1.1.4: is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.20.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -8037,7 +8040,7 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -schema-utils@^3.1.1, schema-utils@^3.2.0: +schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== @@ -8056,6 +8059,16 @@ schema-utils@^4.0.0, schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" + integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + scimmy-routers@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/scimmy-routers/-/scimmy-routers-1.3.2.tgz#5eebed217613df7c385b324fa2d883fc108738c4" @@ -8132,7 +8145,7 @@ send@0.19.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: +serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -8810,23 +8823,23 @@ teex@^1.0.1: streamx "^2.12.5" terser-webpack-plugin@^5.3.10: - version "5.3.10" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" - integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: - "@jridgewell/trace-mapping" "^0.3.20" + "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.26.0" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" -terser@^5.26.0: - version "5.30.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.3.tgz#f1bb68ded42408c316b548e3ec2526d7dd03f4d2" - integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== +terser@^5.31.1: + version "5.44.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" + integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" + acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" @@ -9479,23 +9492,24 @@ webidl-conversions@^7.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== -webpack-cli@4.10.0: - version "4.10.0" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== +webpack-cli@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" + integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" + "@discoveryjs/json-ext" "^0.6.1" + "@webpack-cli/configtest" "^3.0.1" + "@webpack-cli/info" "^3.0.1" + "@webpack-cli/serve" "^3.0.1" colorette "^2.0.14" - commander "^7.0.0" + commander "^12.1.0" cross-spawn "^7.0.3" + envinfo "^7.14.0" fastest-levenshtein "^1.0.12" import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^6.0.1" webpack-dev-middleware@^7.4.2: version "7.4.2" @@ -9509,7 +9523,7 @@ webpack-dev-middleware@^7.4.2: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@*, webpack-dev-server@5.2.1: +webpack-dev-server@*: version "5.2.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.1.tgz#049072d6e19cbda8cf600b9e364e6662d61218ba" integrity sha512-ml/0HIj9NLpVKOMq+SuBPLHcmbG+TGIjXRHsYfZwocUBIqEvws8NnS/V9AFQ5FKP+tgn5adwVwRrTEpGL33QFQ== @@ -9543,13 +9557,48 @@ webpack-dev-server@*, webpack-dev-server@5.2.1: webpack-dev-middleware "^7.4.2" ws "^8.18.0" -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== +webpack-dev-server@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz#96a143d50c58fef0c79107e61df911728d7ceb39" + integrity sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.21" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" + ansi-html-community "^0.0.8" + bonjour-service "^1.2.1" + chokidar "^3.6.0" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + express "^4.21.2" + graceful-fs "^4.2.6" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.6.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^2.4.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" + +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== dependencies: clone-deep "^4.0.1" - wildcard "^2.0.0" + flat "^5.0.2" + wildcard "^2.0.1" webpack-sources@^1.4.3: version "1.4.3" @@ -9560,9 +9609,9 @@ webpack-sources@^1.4.3: source-map "~0.6.1" webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + version "3.3.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" + integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== webpack@5.97.1: version "5.97.1" @@ -9695,10 +9744,10 @@ wide-align@^1.1.2, wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== +wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== winston@2.4.5: version "2.4.5"