diff --git a/.github/workflows/cypress_workflow.yml b/.github/workflows/cypress_workflow.yml index c15edeac5e35..f30ceb81e304 100644 --- a/.github/workflows/cypress_workflow.yml +++ b/.github/workflows/cypress_workflow.yml @@ -77,11 +77,11 @@ jobs: - group: 9 config: standard test_location: ftr - # Query enhanced tests + # Dashboard tests with query enhanced - group: 10 config: query_enhanced - test_location: ftr - # Dashboard tests + test_location: source + # Dashboard tests with no query enhanced - group: 11 config: dashboard test_location: source diff --git a/changelogs/fragments/8986.yml b/changelogs/fragments/8986.yml new file mode 100644 index 000000000000..0844bcbccc00 --- /dev/null +++ b/changelogs/fragments/8986.yml @@ -0,0 +1,2 @@ +feat: +- Migrate query enhancement cypress tests to OSD repo ([#8986](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8986)) \ No newline at end of file diff --git a/cypress/fixtures/dashboard/opensearch_dashboards/data.json.txt b/cypress/fixtures/dashboard/opensearch_dashboards/data.json.txt new file mode 100644 index 000000000000..2cd7ad0d300a --- /dev/null +++ b/cypress/fixtures/dashboard/opensearch_dashboards/data.json.txt @@ -0,0 +1,23 @@ +{ + "type": "doc", + "value": { + "id": "3", + "index": "timestamp-nanos", + "source": { + "timestamp": "2019-01-01T12:10:30.123456789Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "id": "4", + "index": "timestamp-nanos", + "source": { + "timestamp": "2019-01-01T12:10:30.123498765Z" + }, + "type": "_doc" + } +} diff --git a/cypress/fixtures/dashboard/opensearch_dashboards/data_with_index_pattern.json.txt b/cypress/fixtures/dashboard/opensearch_dashboards/data_with_index_pattern.json.txt new file mode 100644 index 000000000000..b1284b91fb90 --- /dev/null +++ b/cypress/fixtures/dashboard/opensearch_dashboards/data_with_index_pattern.json.txt @@ -0,0 +1,65 @@ +{ + "type": "doc", + "value": { + "id": "index-pattern:timestamp-*", + "index": ".kibana", + "source": { + "index-pattern": { + "fields": "[{\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"count\":1,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"esTypes\":[\"_type\"],\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"timestamp\",\"type\":\"date\",\"esTypes\":[\"date\",\"date_nanos\"],\"count\":2,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "timeFieldName": "timestamp", + "title": "timestamp-*", + "fieldFormatMap": "{\"timestamp\":{\"id\":\"date_nanos\"}}" + }, + "type": "index-pattern" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "id": "2", + "index": "timestamp-millis", + "source": { + "timestamp": "2019-01-01T12:10:30.124Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "id": "1", + "index": "timestamp-millis", + "source": { + "timestamp": "2019-01-01T12:10:30.123Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "id": "3", + "index": "timestamp-nanos", + "source": { + "timestamp": "2019-01-01T12:10:30.123456789Z" + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "id": "4", + "index": "timestamp-nanos", + "source": { + "timestamp": "2019-01-02T12:10:30.123498765Z" + }, + "type": "_doc" + } +} diff --git a/cypress/fixtures/dashboard/opensearch_dashboards/mappings.json.txt b/cypress/fixtures/dashboard/opensearch_dashboards/mappings.json.txt new file mode 100644 index 000000000000..eaeaeee3713b --- /dev/null +++ b/cypress/fixtures/dashboard/opensearch_dashboards/mappings.json.txt @@ -0,0 +1,45 @@ +{ + "type": "index", + "value": { + "aliases": { + }, + "index": "timestamp-millis", + "mappings": { + "properties": { + "timestamp": { + "type": "date" + } + } + }, + "settings": { + "index": { + "number_of_replicas": "1", + "number_of_shards": "1", + "codec": "best_compression" + } + } + } +} + +{ + "type": "index", + "value": { + "aliases": { + }, + "index": "timestamp-nanos", + "mappings": { + "properties": { + "timestamp": { + "type": "date_nanos" + } + } + }, + "settings": { + "index": { + "number_of_replicas": "1", + "number_of_shards": "1", + "codec": "best_compression" + } + } + } +} diff --git a/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/dataset_selector_spec.js b/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/dataset_selector_spec.js new file mode 100644 index 000000000000..41b08eeb6b74 --- /dev/null +++ b/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/dataset_selector_spec.js @@ -0,0 +1,180 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +import { + MiscUtils, + TestFixtureHandler, +} from '@opensearch-dashboards-test/opensearch-dashboards-test-library'; +import { CURRENT_TENANT } from '../../../../../utils/commands'; +import { clusterName, clusterConnection } from '../../../../../utils/constants'; + +const miscUtils = new MiscUtils(cy); +const testFixtureHandler = new TestFixtureHandler(cy, Cypress.env('openSearchUrl')); + +const indexSet = ['logstash-2015.09.22', 'logstash-2015.09.21', 'logstash-2015.09.20']; + +describe('dataset navigator', { scrollBehavior: false }, () => { + before(() => { + CURRENT_TENANT.newTenant = 'global'; + cy.fleshTenantSettings(); + }); + + describe('empty state', () => { + it('no index pattern', function () { + // Go to the Discover page + miscUtils.visitPage( + `app/data-explorer/discover#/?_g=(filters:!(),time:(from:'2015-09-19T13:31:44.000Z',to:'2015-09-24T01:31:44.000Z'))` + ); + + cy.waitForLoaderNewHeader(); + cy.getElementByTestId('discoverNoIndexPatterns'); + }); + }); + + describe('select indices', () => { + before(() => { + testFixtureHandler.importJSONMapping( + 'cypress/fixtures/dashboard/opensearch_dashboards/query_enhancement/mappings.json.txt' + ); + + testFixtureHandler.importJSONDoc( + 'cypress/fixtures/dashboard/opensearch_dashboards/query_enhancement/data.json.txt' + ); + + // Since default cluster is removed, need to create a data source connection + miscUtils.visitPage('app/management/opensearch-dashboards/dataSources/create'); + cy.intercept('POST', '/api/saved_objects/data-source').as('createDataSourceRequest'); + cy.getElementByTestId(`datasource_card_opensearch`).click(); + cy.get('[name="dataSourceTitle"]').type(clusterName); + cy.get('[name="endpoint"]').type(clusterConnection); + cy.getElementByTestId('createDataSourceFormAuthTypeSelect').click(); + cy.get(`button[id="no_auth"]`).click(); + + cy.getElementByTestId('createDataSourceButton').click(); + cy.wait('@createDataSourceRequest').then((interception) => { + expect(interception.response.statusCode).to.equal(200); + }); + cy.location('pathname', { timeout: 6000 }).should( + 'include', + 'app/management/opensearch-dashboards/dataSources' + ); + + // Go to the Discover page + miscUtils.visitPage(`app/data-explorer/discover#/`); + + cy.waitForLoaderNewHeader(); + }); + + it('with SQL as default language', function () { + cy.getElementByTestId(`datasetSelectorButton`).click(); + cy.getElementByTestId(`datasetSelectorAdvancedButton`).click(); + cy.get(`[title="Indexes"]`).click(); + cy.get(`[title=${clusterName}]`).click(); + cy.get(`[title="timestamp-nanos"]`).click(); + cy.getElementByTestId('datasetSelectorNext').click(); + + cy.get(`[class="euiModalHeader__title"]`).should('contain', 'Step 2: Configure data'); + // should have two options: SQL and PPL + cy.getElementByTestId('advancedSelectorLanguageSelect') + .get('option') + .should('have.length', 2); + + //select SQL + cy.getElementByTestId('advancedSelectorLanguageSelect').select('OpenSearch SQL'); + cy.getElementByTestId('advancedSelectorConfirmButton').click(); + + cy.waitForLoaderNewHeader(); + + // SQL should already be selected + cy.getElementByTestId('queryEditorLanguageSelector').should('contain', 'OpenSearch SQL'); + cy.waitForLoaderNewHeader(); + + // SQL query should be executed and sending back result + cy.get(`[data-test-subj="queryResultCompleteMsg"]`).should('be.visible'); + + // Switch language to PPL + cy.setQueryLanguage('PPL'); + cy.waitForLoaderNewHeader(); + cy.get(`[data-test-subj="queryResultCompleteMsg"]`).should('be.visible'); + }); + + it('with PPL as default language', function () { + cy.getElementByTestId(`datasetSelectorButton`).click(); + cy.getElementByTestId(`datasetSelectorAdvancedButton`).click(); + cy.get(`[title="Indexes"]`).click(); + cy.get(`[title=${clusterName}]`).click(); + cy.get(`[title="timestamp-nanos"]`).click(); + cy.getElementByTestId('datasetSelectorNext').click(); + + cy.get(`[class="euiModalHeader__title"]`).should('contain', 'Step 2: Configure data'); + + //select PPL + cy.getElementByTestId('advancedSelectorLanguageSelect').select('PPL'); + + cy.getElementByTestId(`advancedSelectorTimeFieldSelect`).select('timestamp'); + cy.getElementByTestId('advancedSelectorConfirmButton').click(); + + cy.waitForLoaderNewHeader(); + + // PPL should already be selected + cy.getElementByTestId('queryEditorLanguageSelector').should('contain', 'PPL'); + + const fromTime = 'Sep 19, 2018 @ 00:00:00.000'; + const toTime = 'Sep 21, 2019 @ 00:00:00.000'; + cy.setTopNavDate(fromTime, toTime); + + cy.waitForLoaderNewHeader(); + + // Query should finish running with timestamp and finish time in the footer + cy.getElementByTestId('queryResultCompleteMsg').should('be.visible'); + cy.getElementByTestId('queryEditorFooterTimestamp').should('contain', 'timestamp'); + + // Switch language to SQL + cy.setQueryLanguage('OpenSearch SQL'); + + cy.waitForLoaderNewHeader(); + cy.getElementByTestId('queryResultCompleteMsg').should('be.visible'); + cy.getElementByTestId('queryEditorFooterTimestamp').should('contain', 'timestamp'); + }); + }); + + describe('index pattern', () => { + it('create index pattern and select it', function () { + // import logstash functional + testFixtureHandler.importJSONDocIfNeeded( + indexSet, + 'cypress/fixtures/dashboard/opensearch_dashboards/data_explorer/logstash/logstash.mappings.json.txt', + 'cypress/fixtures/dashboard/opensearch_dashboards/data_explorer/logstash/logstash.json.txt' + ); + testFixtureHandler.importJSONMapping( + 'cypress/fixtures/dashboard/opensearch_dashboards/data_explorer/discover/discover.mappings.json.txt' + ); + + testFixtureHandler.importJSONDoc( + 'cypress/fixtures/dashboard/opensearch_dashboards/data_explorer/discover/discover.json.txt' + ); + + // Go to the Discover page + miscUtils.visitPage( + `app/data-explorer/discover#/?_g=(filters:!(),time:(from:'2015-09-19T13:31:44.000Z',to:'2015-09-24T01:31:44.000Z'))` + ); + + cy.get(`[class~="datasetSelector__button"]`).click(); + cy.getElementByTestId(`datasetOption-logstash-*`).click(); + + cy.waitForLoaderNewHeader(); + cy.waitForSearch(); + cy.verifyHitCount('14,004'); + }); + }); + + after(() => { + cy.deleteIndex('timestamp-nanos'); + // delete the data source connection + miscUtils.visitPage('app/management/opensearch-dashboards/dataSources/'); + cy.get(`[class="euiTableRowCell"]`).contains(clusterName).click(); + cy.getElementByTestId('editDatasourceDeleteIcon').click(); + cy.getElementByTestId('confirmModalConfirmButton').click(); + }); +}); diff --git a/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/queries_spec.js b/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/queries_spec.js new file mode 100644 index 000000000000..b8c90e041ab8 --- /dev/null +++ b/cypress/integration/core_opensearch_dashboards/apps/query_enhancement/queries_spec.js @@ -0,0 +1,115 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +import { + MiscUtils, + TestFixtureHandler, +} from '@opensearch-dashboards-test/opensearch-dashboards-test-library'; +import { CURRENT_TENANT } from '../../../../../utils/commands'; + +const miscUtils = new MiscUtils(cy); +const testFixtureHandler = new TestFixtureHandler(cy, Cypress.env('openSearchUrl')); + +describe('query enhancement queries', { scrollBehavior: false }, () => { + before(() => { + CURRENT_TENANT.newTenant = 'global'; + cy.fleshTenantSettings(); + + testFixtureHandler.importJSONMapping( + 'cypress/fixtures/dashboard/opensearch_dashboards/query_enhancement/mappings.json.txt' + ); + + testFixtureHandler.importJSONDoc( + 'cypress/fixtures/dashboard/opensearch_dashboards/query_enhancement/data_with_index_pattern.json.txt' + ); + + // Go to the Discover page + miscUtils.visitPage(`app/data-explorer/discover#/`); + + cy.setAdvancedSetting({ + defaultIndex: 'timestamp-*', + }); + + // Go to the Discover page + miscUtils.visitPage( + `app/data-explorer/discover#/?_g=(filters:!(),time:(from:'2018-09-19T13:31:44.000Z',to:'2019-09-24T01:31:44.000Z'))` + ); + + cy.get(`[class~="datasetSelector__button"]`).click(); + cy.get(`[data-test-subj="datasetOption-timestamp-*"]`).click(); + + cy.waitForLoaderNewHeader(); + cy.waitForSearch(); + }); + + describe('send queries', () => { + it('with DQL', function () { + const query = `_id:1`; + cy.setSingleLineQueryEditor(query); + cy.waitForLoaderNewHeader(); + cy.waitForSearch(); + cy.verifyHitCount(1); + + //query should persist across refresh + cy.reload(); + cy.verifyHitCount(1); + }); + + it('with Lucene', function () { + cy.setQueryLanguage('Lucene'); + + const query = `_id:1`; + cy.setSingleLineQueryEditor(query); + cy.waitForLoaderNewHeader(); + cy.waitForSearch(); + cy.verifyHitCount(1); + + //query should persist across refresh + cy.reload(); + cy.verifyHitCount(1); + }); + + it('with SQL', function () { + cy.setQueryLanguage('OpenSearch SQL'); + + // default SQL query should be set + cy.waitForLoaderNewHeader(); + cy.getElementByTestId(`osdQueryEditor__multiLine`).contains( + `SELECT * FROM timestamp-* LIMIT 10` + ); + cy.getElementByTestId(`queryResultCompleteMsg`).should('be.visible'); + + //query should persist across refresh + cy.reload(); + cy.getElementByTestId(`queryResultCompleteMsg`).should('be.visible'); + + cy.getElementByTestId(`osdQueryEditor__multiLine`).type(`{backspace}`); + cy.getElementByTestId(`querySubmitButton`).click(); + cy.waitForSearch(); + cy.getElementByTestId(`queryResultCompleteMsg`).should('be.visible'); + }); + + it('with PPL', function () { + cy.setQueryLanguage('PPL'); + + // default PPL query should be set + cy.waitForLoaderNewHeader(); + cy.getElementByTestId(`osdQueryEditor__multiLine`).contains(`source = timestamp-*`); + cy.waitForSearch(); + cy.getElementByTestId(`queryResultCompleteMsg`).should('be.visible'); + cy.get('[class="euiText euiText--small"]').then((text) => cy.log(text)); + cy.verifyHitCount(4); + + //query should persist across refresh + cy.reload(); + cy.verifyHitCount(4); + }); + + after(() => { + cy.deleteIndex('timestamp-nanos'); + cy.deleteIndex('timestamp-milis'); + cy.deleteSavedObject('index-pattern', 'index-pattern:timestamp-*'); + }); + }); +}); diff --git a/cypress/utils/base_constants.js b/cypress/utils/base_constants.js new file mode 100644 index 000000000000..f8599128961a --- /dev/null +++ b/cypress/utils/base_constants.js @@ -0,0 +1,7 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const BASE_PATH = Cypress.config('baseUrl'); +export const BACKEND_BASE_PATH = Cypress.env('openSearchUrl'); diff --git a/cypress/utils/commands.js b/cypress/utils/commands.js index 56a1fd0cff0e..35d14f480173 100644 --- a/cypress/utils/commands.js +++ b/cypress/utils/commands.js @@ -2,6 +2,21 @@ * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { BASE_PATH } from './constants'; + +// This function does not delete all indices +Cypress.Commands.add('deleteAllIndices', () => { + cy.log('Deleting all indices'); + cy.request( + 'DELETE', + `${Cypress.env('openSearchUrl')}/index*,sample*,opensearch_dashboards*,test*,cypress*` + ); +}); // --- Typed commands -- @@ -13,3 +28,244 @@ Cypress.Commands.add('getElementsByTestIds', (testIds, options = {}) => { const selectors = [testIds].flat(Infinity).map((testId) => `[data-test-subj="${testId}"]`); return cy.get(selectors.join(','), options); }); + +Cypress.Commands.add('getElementByDataTestId', (testId) => { + return cy.get(`[data-testid="${testId}"]`); +}); + +Cypress.Commands.add('whenTestIdNotFound', (testIds, callbackFn, options = {}) => { + const selectors = [testIds].flat(Infinity).map((testId) => `[data-test-subj="${testId}"]`); + cy.get('body', options).then(($body) => { + if ($body.find(selectors.join(',')).length === 0) callbackFn(); + }); +}); + +Cypress.Commands.add('createIndex', (index, policyID = null, settings = {}) => { + cy.request('PUT', `${Cypress.env('openSearchUrl')}/${index}`, settings); + if (policyID != null) { + const body = { policy_id: policyID }; + + cy.request('POST', `${Cypress.env('openSearchUrl')}${IM_API.ADD_POLICY_BASE}/${index}`, body); + } +}); + +Cypress.Commands.add('deleteIndex', (indexName, options = {}) => { + cy.request({ + method: 'DELETE', + url: `${Cypress.env('openSearchUrl')}/${indexName}`, + failOnStatusCode: false, + ...options, + }); +}); + +Cypress.Commands.add('getIndices', (index = null, settings = {}) => { + cy.request({ + method: 'GET', + url: `${Cypress.env('openSearchUrl')}/_cat/indices/${index ? index : ''}`, + failOnStatusCode: false, + ...settings, + }); +}); + +// TODO: Impliment chunking +Cypress.Commands.add('bulkUploadDocs', (fixturePath, index) => { + const sendBulkAPIRequest = (ndjson) => { + const url = index + ? `${Cypress.env('openSearchUrl')}/${index}/_bulk` + : `${Cypress.env('openSearchUrl')}/_bulk`; + cy.log('bulkUploadDocs') + .request({ + method: 'POST', + url, + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + }, + body: ndjson, + }) + .then((response) => { + if (response.body.errors) { + console.error(response.body.items); + throw new Error('Bulk upload failed'); + } + }); + }; + + cy.fixture(fixturePath, 'utf8').then((ndjson) => { + sendBulkAPIRequest(ndjson); + }); + + cy.request({ + method: 'POST', + url: `${Cypress.env('openSearchUrl')}/_all/_refresh`, + }); +}); + +Cypress.Commands.add('importSavedObjects', (fixturePath, overwrite = true) => { + const sendImportRequest = (ndjson) => { + const url = `${Cypress.config().baseUrl}/api/saved_objects/_import?${ + overwrite ? `overwrite=true` : '' + }`; + + const formData = new FormData(); + formData.append('file', ndjson, 'savedObject.ndjson'); + + cy.log('importSavedObject') + .request({ + method: 'POST', + url, + headers: { + 'content-type': 'multipart/form-data', + 'osd-xsrf': true, + }, + body: formData, + }) + .then((response) => { + if (response.body.errors) { + console.error(response.body.items); + throw new Error('Import failed'); + } + }); + }; + + cy.fixture(fixturePath) + .then((file) => Cypress.Blob.binaryStringToBlob(file)) + .then((ndjson) => { + sendImportRequest(ndjson); + }); +}); + +Cypress.Commands.add('deleteSavedObject', (type, id, options = {}) => { + const url = `${Cypress.config().baseUrl}/api/saved_objects/${type}/${id}`; + + return cy.request({ + method: 'DELETE', + url, + headers: { + 'osd-xsrf': true, + }, + failOnStatusCode: false, + ...options, + }); +}); + +Cypress.Commands.add('deleteSavedObjectByType', (type, search) => { + const searchParams = new URLSearchParams({ + fields: 'id', + type, + }); + + if (search) { + searchParams.set('search', search); + } + + const url = `${ + Cypress.config().baseUrl + }/api/opensearch-dashboards/management/saved_objects/_find?${searchParams.toString()}`; + + return cy.request(url).then((response) => { + console.log('response', response); + response.body.saved_objects.map(({ type, id }) => { + cy.deleteSavedObject(type, id); + }); + }); +}); + +Cypress.Commands.add('createIndexPattern', (id, attributes, header = {}) => { + const url = `${Cypress.config().baseUrl}/api/saved_objects/index-pattern/${id}`; + + cy.request({ + method: 'POST', + url, + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + ...header, + }, + body: JSON.stringify({ + attributes, + references: [], + }), + }); +}); + +Cypress.Commands.add('createDashboard', (attributes = {}, headers = {}) => { + const url = `${Cypress.config().baseUrl}/api/saved_objects/dashboard`; + + cy.request({ + method: 'POST', + url, + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + ...headers, + }, + body: JSON.stringify({ + attributes, + }), + }); +}); + +Cypress.Commands.add('changeDefaultTenant', (attributes, header = {}) => { + const url = Cypress.env('openSearchUrl') + '/_plugins/_security/api/tenancy/config'; + + cy.request({ + method: 'PUT', + url, + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + ...header, + }, + body: JSON.stringify(attributes), + }); +}); + +Cypress.Commands.add('deleteIndexPattern', (id, options = {}) => + cy.deleteSavedObject('index-pattern', id, options) +); + +Cypress.Commands.add('setAdvancedSetting', (changes) => { + const url = `${Cypress.config().baseUrl}/api/opensearch-dashboards/settings`; + cy.log('setAdvancedSetting') + .request({ + method: 'POST', + url, + qs: Cypress.env('SECURITY_ENABLED') + ? { + security_tenant: CURRENT_TENANT.defaultTenant, + } + : {}, + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + }, + body: { changes }, + }) + .then((response) => { + if (response.body.errors) { + console.error(response.body.items); + throw new Error('Setting advanced setting failed'); + } + }); +}); + +// type: logs, ecommerce, flights +Cypress.Commands.add('loadSampleData', (type) => { + cy.request({ + method: 'POST', + headers: { 'osd-xsrf': 'opensearch-dashboards' }, + url: `${BASE_PATH}/api/sample_data/${type}`, + }); +}); + +Cypress.Commands.add('fleshTenantSettings', () => { + if (Cypress.env('SECURITY_ENABLED')) { + // Use xhr request is good enough to flesh tenant + cy.request({ + url: `${BASE_PATH}/app/home?security_tenant=${CURRENT_TENANT.defaultTenant}`, + method: 'GET', + failOnStatusCode: false, + }); + } +}); diff --git a/cypress/utils/constants.js b/cypress/utils/constants.js new file mode 100644 index 000000000000..856f0a4e9a38 --- /dev/null +++ b/cypress/utils/constants.js @@ -0,0 +1,7 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export * from './base_constants'; +export * from './dashboards/constants'; diff --git a/cypress/utils/dashboards/commands.js b/cypress/utils/dashboards/commands.js new file mode 100644 index 000000000000..87f3eec5a831 --- /dev/null +++ b/cypress/utils/dashboards/commands.js @@ -0,0 +1,123 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import './query_enhancement/commands'; + +Cypress.Commands.add('waitForLoader', () => { + const opts = { log: false }; + + Cypress.log({ + name: 'waitForPageLoad', + displayName: 'wait', + message: 'page load', + }); + cy.wait(Cypress.env('WAIT_FOR_LOADER_BUFFER_MS')); + cy.getElementByTestId('homeIcon', opts); // Update to `homeLoader` once useExpandedHeader is enabled +}); + +Cypress.Commands.add('setTopNavQuery', (value, submit = true) => { + const opts = { log: false }; + + Cypress.log({ + name: 'setTopNavQuery', + displayName: 'set query', + message: value, + }); + + cy.getElementByTestId('queryInput', opts).clear(opts).type(value, opts).blur(opts); + + if (submit) { + cy.updateTopNav(opts); + } +}); + +Cypress.Commands.add('clearTopNavQuery', (submit = true) => { + const opts = { log: false }; + + Cypress.log({ + name: 'clearTopNavQuery', + displayName: 'clear query', + message: 'clearing query field', + }); + + cy.getElementByTestId('queryInput', opts).clear(opts).blur(opts); + + if (submit) { + cy.updateTopNav(opts); + } +}); + +Cypress.Commands.add('setTopNavDate', (start, end, submit = true) => { + const opts = { log: false }; + + Cypress.log({ + name: 'setTopNavDate', + displayName: 'set date', + message: `Start: ${start} :: End: ${end}`, + }); + + /* Find any one of the two buttons that change/open the date picker: + * * if `superDatePickerShowDatesButton` is found, it will switch the mode to dates + * * in some versions of OUI, the switch will open the date selection dialog as well + * * if `superDatePickerstartDatePopoverButton` is found, it will open the date selection dialog + */ + cy.getElementsByTestIds( + ['superDatePickerstartDatePopoverButton', 'superDatePickerShowDatesButton'], + opts + ) + .should('be.visible') + .invoke('attr', 'data-test-subj') + .then((testId) => { + cy.getElementByTestId(testId, opts).should('be.visible').click(opts); + }); + + /* While we surely are in the date selection mode, we don't know if the date selection dialog + * is open or not. Looking for a tab and if it is missing, click on the dialog opener. + */ + cy.whenTestIdNotFound('superDatePickerAbsoluteTab', () => { + cy.getElementByTestId('superDatePickerstartDatePopoverButton', opts) + .should('be.visible') + .click(opts); + }); + + // Click absolute tab + cy.getElementByTestId('superDatePickerAbsoluteTab', opts).click(opts); + + // Type absolute start date + cy.getElementByTestId('superDatePickerAbsoluteDateInput', opts) + .click(opts) + .clear(opts) + .type(start, { + ...opts, + delay: 0, // add a delay here, cypress sometimes fails to type all the content into the input. + }); + + // Click end date + cy.getElementByTestId('superDatePickerendDatePopoverButton', opts).last(opts).click(opts); + + // Click absolute tab + cy.getElementByTestId('superDatePickerAbsoluteTab', opts).last(opts).click(opts); + + // Type absolute end date + cy.getElementByTestId('superDatePickerAbsoluteDateInput', opts) + .last(opts) + .click(opts) + .clear(opts) + .type(end, { + ...opts, + delay: 0, // add a delay here, cypress sometimes fails to type all the content into the input. + }); + + // Close popup + cy.getElementByTestId('superDatePickerendDatePopoverButton', opts).click(opts); + + if (submit) { + cy.updateTopNav(opts); + } +}); + +Cypress.Commands.add('updateTopNav', (options) => { + cy.getElementByTestId('querySubmitButton', options).click({ force: true }); +}); diff --git a/cypress/utils/dashboards/constants.js b/cypress/utils/dashboards/constants.js new file mode 100644 index 000000000000..b3f053a5e9c5 --- /dev/null +++ b/cypress/utils/dashboards/constants.js @@ -0,0 +1,17 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { BASE_PATH } from '../base_constants'; + +// STACK MANAGEMENT PATH +export const STACK_MANAGEMENT_PATH = BASE_PATH + '/app/management'; +export const SECURITY_PLUGIN_PATH = BASE_PATH + '/app/security-dashboards-plugin#/'; + +export const TENANTS_MANAGE_PATH = BASE_PATH + '/app/security-dashboards-plugin#/tenants'; + +export const INDEX_PATTERN_PATH = STACK_MANAGEMENT_PATH + '/opensearch-dashboards/indexPatterns'; +export const SAVED_OBJECTS_PATH = STACK_MANAGEMENT_PATH + '/opensearch-dashboards/objects'; + +export * from './query_enhancement/constants'; diff --git a/cypress/utils/dashboards/data_explorer/commands.js b/cypress/utils/dashboards/data_explorer/commands.js new file mode 100644 index 000000000000..1e73e91584e3 --- /dev/null +++ b/cypress/utils/dashboards/data_explorer/commands.js @@ -0,0 +1,164 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const toTestId = (str, replace = '-') => str.replace(/\s+/g, replace); + +Cypress.Commands.add('verifyTimeConfig', (start, end) => { + const opts = { log: false }; + + cy.getElementByTestId('superDatePickerstartDatePopoverButton', opts) + .should('be.visible') + .should('have.text', start); + + cy.getElementByTestId('superDatePickerendDatePopoverButton', opts) + .should('be.visible') + .should('have.text', end); +}); + +Cypress.Commands.add('saveSearch', (name) => { + cy.log('in func save search'); + const opts = { log: false }; + + cy.getElementByTestId('discoverSaveButton', opts).click(); + cy.getElementByTestId('savedObjectTitle').clear().type(name); + cy.getElementByTestId('confirmSaveSavedObjectButton').click({ force: true }); + + // Wait for page to load + cy.waitForLoader(); +}); + +Cypress.Commands.add('loadSaveSearch', (name) => { + const opts = { + log: false, + force: true, + }; + + cy.getElementByTestId('discoverOpenButton', opts).click(opts); + cy.getElementByTestId(`savedObjectTitle${toTestId(name)}`).click(); + + cy.waitForLoader(); +}); + +Cypress.Commands.add('verifyHitCount', (count) => { + cy.getElementByTestId('discoverQueryHits').should('be.visible').should('have.text', count); +}); + +Cypress.Commands.add('waitForSearch', () => { + Cypress.log({ + name: 'waitForSearch', + displayName: 'wait', + message: 'search load', + }); + + cy.getElementByTestId('docTable'); +}); + +Cypress.Commands.add('prepareTest', (fromTime, toTime, interval) => { + cy.setTopNavDate(fromTime, toTime); + cy.waitForLoader(); + // wait until the search has been finished + cy.waitForSearch(); + cy.get('select').select(`${interval}`); + cy.waitForLoader(); + cy.waitForSearch(); +}); + +Cypress.Commands.add('verifyMarkCount', (count) => { + cy.getElementByTestId('docTable').find('mark').should('have.length', count); +}); + +Cypress.Commands.add('submitFilterFromDropDown', (field, operator, value) => { + cy.getElementByTestId('addFilter').click(); + cy.getElementByTestId('filterFieldSuggestionList') + .should('be.visible') + .click() + .type(`${field}{downArrow}{enter}`) + .trigger('blur', { force: true }); + + cy.getElementByTestId('filterOperatorList') + .should('be.visible') + .click() + .type(`${operator}{downArrow}{enter}`) + .trigger('blur', { force: true }); + + if (value) { + cy.get('[data-test-subj^="filterParamsComboBox"]') + .should('be.visible') + .click() + .type(`${value}{downArrow}{enter}`) + .trigger('blur', { force: true }); + } + + cy.getElementByTestId('saveFilter').click({ force: true }); + cy.waitForLoader(); +}); + +Cypress.Commands.add('saveQuery', (name, description) => { + cy.whenTestIdNotFound('saved-query-management-popover', () => { + cy.getElementByTestId('saved-query-management-popover-button').click(); + }); + cy.getElementByTestId('saved-query-management-save-button').click(); + + cy.getElementByTestId('saveQueryFormTitle').type(name); + cy.getElementByTestId('saveQueryFormDescription').type(description); +}); + +Cypress.Commands.add('loadSaveQuery', (name) => { + cy.getElementByTestId('saved-query-management-popover-button').click({ + force: true, + }); + + cy.get(`[data-test-subj~="load-saved-query-${name}-button"]`).should('be.visible').click(); +}); + +Cypress.Commands.add('clearSaveQuery', () => { + cy.whenTestIdNotFound('saved-query-management-popover', () => { + cy.getElementByTestId('saved-query-management-popover-button').click(); + }); + //clear save queries + cy.getElementByTestId('saved-query-management-clear-button').click(); +}); + +Cypress.Commands.add('deleteSaveQuery', (name) => { + cy.getElementByTestId('saved-query-management-popover-button').click(); + + cy.get(`[data-test-subj~="delete-saved-query-${name}-button"]`).click({ + force: true, + }); + cy.getElementByTestId('confirmModalConfirmButton').click(); +}); + +Cypress.Commands.add('switchDiscoverTable', (name) => { + cy.getElementByTestId('discoverOptionsButton') + .then(($button) => { + cy.wrap($button).click({ force: true }); + + cy.getElementByTestId('discoverOptionsLegacySwitch').then(($switchButton) => { + if (name === 'new') { + cy.wrap($switchButton).click({ force: true }); + } + if (name === 'legacy') { + cy.wrap($switchButton).click({ force: true }); + } + cy.waitForLoader(); + }); + }) + .then(() => { + checkForElementVisibility(); + }); +}); + +function checkForElementVisibility() { + cy.getElementsByTestIds('queryInput') + .should('be.visible') + .then(($element) => { + if ($element.is(':visible')) { + return; + } else { + cy.wait(500); // Wait for half a second before checking again + checkForElementVisibility(); // Recursive call + } + }); +} diff --git a/cypress/utils/dashboards/data_explorer/constants.js b/cypress/utils/dashboards/data_explorer/constants.js new file mode 100644 index 000000000000..6bcf36e0514e --- /dev/null +++ b/cypress/utils/dashboards/data_explorer/constants.js @@ -0,0 +1,12 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ +export const DE_INDEX_DATA = ''; +export const DE_INDEX_ID = 'data-explorer'; +export const DE_INDEX_PATTERN = DE_INDEX_ID; + +export const DE_PATH_FIXTURE = 'dashboard/opensearch_dashboards/data_explorer/'; + +export const DE_DEFAULT_START_TIME = 'Sep 19, 2015 @ 06:31:44.000'; +export const DE_DEFAULT_END_TIME = 'Sep 23, 2015 @ 18:31:44.000'; diff --git a/cypress/utils/dashboards/data_explorer/index.d.ts b/cypress/utils/dashboards/data_explorer/index.d.ts new file mode 100644 index 000000000000..c3efc723ab1b --- /dev/null +++ b/cypress/utils/dashboards/data_explorer/index.d.ts @@ -0,0 +1,23 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +declare namespace Cypress { + interface Chainable { + getTimeConfig(start: string, end: string): Chainable; + saveSearch(name: string): Chainable; + loadSaveSearch(name: string): Chainable; + verifyHitCount(count: string): Chainable; + waitForSearch(): Chainable; + prepareTest(fromTime: string, toTime: string, interval: string): Chainable; + submitQuery(query: string): Chainable; + verifyMarkCount(count: string): Chainable; + submitFilterFromDropDown(field: string, operator: string, value: string): Chainable; + saveQuery(name: string, description: string): Chainable; + loadSaveQuery(name: string): Chainable; + clearSaveQuery(): Chainable; + deleteSaveQuery(name: string): Chainable; + switchDiscoverTable(name: string): Chainable; + } +} diff --git a/cypress/utils/dashboards/index.d.ts b/cypress/utils/dashboards/index.d.ts new file mode 100644 index 000000000000..9070264911fe --- /dev/null +++ b/cypress/utils/dashboards/index.d.ts @@ -0,0 +1,37 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +declare namespace Cypress { + interface Chainable { + /** + * Wait for Dashboards page to load + * @example + * cy.waitForLoader() + */ + waitForLoader(): Chainable; + + /** + * Set the top nav query value + * @example + * cy.setTopNavQuery('products.base_price > 40') + */ + setTopNavQuery(value: string): Chainable; + + /** + * Set the top nav date range. + * Date format: MMM D, YYYY @ HH:mm:ss.SSS + * @example + * cy.setTopNavDate('Oct 5, 2022 @ 00:57:06.429', 'Oct 6, 2022 @ 00:57:06.429') + */ + setTopNavDate(start: string, end: string): Chainable; + + /** + * Clicks the update button on the top nav. + * @example + * cy.updateTopNav() + */ + updateTopNav(): Chainable; + } +} diff --git a/cypress/utils/dashboards/query_enhancement/commands.js b/cypress/utils/dashboards/query_enhancement/commands.js new file mode 100644 index 000000000000..8f32fcfe3635 --- /dev/null +++ b/cypress/utils/dashboards/query_enhancement/commands.js @@ -0,0 +1,45 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +Cypress.Commands.add('waitForLoaderNewHeader', () => { + const opts = { log: false }; + + Cypress.log({ + name: 'waitForPageLoad', + displayName: 'wait', + message: 'page load', + }); + cy.wait(Cypress.env('WAIT_FOR_LOADER_BUFFER_MS')); + cy.getElementByTestId('recentItemsSectionButton', opts); +}); + +Cypress.Commands.add('setSingleLineQueryEditor', (value, submit = true) => { + const opts = { log: false }; + + Cypress.log({ + name: 'setSingleLineQueryEditor', + displayName: 'set query', + message: value, + }); + + cy.getElementByTestId('osdQueryEditor__singleLine', opts).type(value, opts); + + if (submit) { + cy.updateTopNav(opts); + } +}); + +Cypress.Commands.add('setQueryLanguage', (value) => { + Cypress.log({ + name: 'setQueryLanguage', + displayName: 'set language', + message: value, + }); + + cy.getElementByTestId(`queryEditorLanguageSelector`).click(); + cy.get(`[class~="languageSelector__menuItem"]`).contains(value).click({ + force: true, + }); +}); diff --git a/cypress/utils/dashboards/query_enhancement/constants.js b/cypress/utils/dashboards/query_enhancement/constants.js new file mode 100644 index 000000000000..62d6c0ffbbbb --- /dev/null +++ b/cypress/utils/dashboards/query_enhancement/constants.js @@ -0,0 +1,7 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const clusterName = 'test_cluster'; +export const clusterConnection = 'http://localhost:9200'; diff --git a/cypress/utils/helpers.js b/cypress/utils/helpers.js new file mode 100644 index 000000000000..9624e8b408a6 --- /dev/null +++ b/cypress/utils/helpers.js @@ -0,0 +1,31 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +export const apiRequest = (url, method = 'POST', body = undefined, qs = undefined) => + cy.request({ + method: method, + failOnStatusCode: false, + url: url, + headers: { + 'content-type': 'application/json', + 'osd-xsrf': true, + }, + body: body, + qs: qs, + }); + +export const devToolsRequest = (url, method = 'POST', body = undefined, qs = undefined) => + cy.request({ + method: 'POST', + form: false, + failOnStatusCode: false, + url: encodeURI(`api/console/proxy?path=${url}&method=${method}`), + headers: { + 'content-type': 'application/json;charset=UTF-8', + 'osd-xsrf': true, + }, + body: body, + qs: qs, + }); diff --git a/cypress/utils/index.d.ts b/cypress/utils/index.d.ts new file mode 100644 index 000000000000..3a3ea09da084 --- /dev/null +++ b/cypress/utils/index.d.ts @@ -0,0 +1,153 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +declare namespace Cypress { + interface Chainable { + /** + * Call a function when an element with a test id cannot be found + * @example + * cy.whenTestIdNotFound(['query', 'puery'], () => {...}) + */ + whenTestIdNotFound( + testIds: string | string[], + callbackFn: void, + options?: Partial + ): Chainable; + /** + * Get elements by their test ids + * @example + * cy.getElementsByTestIds(['query', 'puery']) + */ + getElementsByTestIds( + testIds: string | string[], + options?: Partial + ): Chainable; + /** + * Get an element by its test id + * @example + * cy.getElementByTestId('query') + */ + getElementByTestId( + testId: string, + options?: Partial + ): Chainable; + + /** + * Create an index + * @example + * cy.createIndex('indexID') + * cy.createIndex('indexID', 'policy') + */ + createIndex(index: string, policyID?: string, settings?: any): Chainable; + + /** + * Delete an index + * @example + * cy.deleteIndex('indexID') + */ + deleteIndex(index: string): Chainable; + + /** + * Bulk upload NDJSON fixture data + * @example + * cy.bulkUploadDocs('plugins/test/test_data.txt') + */ + bulkUploadDocs( + fixturePath: string, + index: string + // options?: Partial + ): Chainable; + + /** + * Import saved objects + * @example + * cy.importSavedObject('plugins/test/exported_data.ndjson') + */ + importSavedObjects(fixturePath: string, overwrite?: boolean): Chainable; + + /** + * Delete a saved object + * @example + * cy.deleteSavedObject('index-pattern', 'id') + */ + deleteSavedObject(type: string, id: string): Chainable; + + /** + * Delete all saved objects of a particular type + * Optionally, narrow down the results using search + * @example + * cy.deleteSavedObjectByType('index-pattern') + * cy.deleteSavedObjectByType('index-pattern', 'search string') + */ + deleteSavedObjectByType(type: string, search?: string): Chainable; + + /** + * Adds an index pattern + * @example + * cy.createIndexPattern('patterId', { title: 'patt*', timeFieldName: 'timestamp' }) + */ + createIndexPattern( + id: string, + attributes: { + title: string; + timeFieldName?: string; + [key: string]: any; + }, + header: string + ): Chainable; + + /** + * Adds a dashboard + * @example + * cy.createDashboard({ title: 'My dashboard'}) + */ + createDashboard( + attributes: { + title: string; + [key: string]: any; + }, + headers?: { + [key: string]: any; + } + ): Chainable; + + /** + * Changes the Default tenant for the domain. + * @example + * cy.changeDefaultTenant({multitenancy_enabled: true, private_tenant_enabled: true, default_tenant: tenantName, }); + */ + changeDefaultTenant( + attributes: { + multitenancy_enabled: boolean; + private_tenant_enabled: boolean; + default_tenant: string; + } + // header: string, + // default_tenant: string + ): Chainable; + + /** + * Delete an index pattern + * @example + * cy.createIndexPattern('patterId') + */ + deleteIndexPattern(id: string): Chainable; + + /** + * Set advanced setting values + * tip: setting the value to null set's it to its default value + * @example + * cy.setAdvancedSetting({ 'visualize:enableLabs' : true }) + */ + setAdvancedSetting(changes: { [key: string]: any }): Chainable; + + /** + * Performs drag and drop action + * @example + * cy.get('sourceSelector').drag('targetSelector') + */ + drag(targetSelector: string): Chainable; + } +} diff --git a/package.json b/package.json index 44315e13d5be..3ce59812c6c5 100644 --- a/package.json +++ b/package.json @@ -84,8 +84,9 @@ "spec_to_console": "scripts/use_node scripts/spec_to_console", "pkg-version": "scripts/use_node -e \"console.log(require('./package.json').version)\"", "release_note:generate": "scripts/use_node scripts/generate_release_note", - "cypress:run-without-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --headless --env SECURITY_ENABLED=false", - "cypress:run-with-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --headless --env SECURITY_ENABLED=true,openSearchUrl=https://localhost:9200,WAIT_FOR_LOADER_BUFFER_MS=500", + "cypress:run-without-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --env SECURITY_ENABLED=false", + "cypress:run-with-security": "env TZ=America/Los_Angeles NO_COLOR=1 cypress run --env SECURITY_ENABLED=true,openSearchUrl=https://localhost:9200,WAIT_FOR_LOADER_BUFFER_MS=500", + "osd:ciGroup10": "echo \"apps/query_enhancement/*.js\"", "osd:ciGroup11": "echo \"dashboard_sanity_test_spec.js\"", "generate:opensearchsqlantlr": "./node_modules/antlr4ng-cli/index.js -Dlanguage=TypeScript -o ./src/plugins/data/public/antlr/opensearch_sql/.generated -visitor -no-listener -Xexact-output-dir ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLLexer.g4 ./src/plugins/data/public/antlr/opensearch_sql/grammar/OpenSearchSQLParser.g4", "generate:opensearchpplantlr": "./node_modules/antlr4ng-cli/index.js -Dlanguage=TypeScript -o ./src/plugins/data/public/antlr/opensearch_ppl/.generated -visitor -no-listener -Xexact-output-dir ./src/plugins/data/public/antlr/opensearch_ppl/grammar/OpenSearchPPLLexer.g4 ./src/plugins/data/public/antlr/opensearch_ppl/grammar/OpenSearchPPLParser.g4" diff --git a/yarn.lock b/yarn.lock index 4f21c30e1e52..6db2a8df2c22 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2929,11 +2929,6 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@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== - "@tsd/typescript@~4.7.3": version "4.7.4" resolved "https://registry.yarnpkg.com/@tsd/typescript/-/typescript-4.7.4.tgz#f1e4e6c3099a174a0cb7aa51cf53f34f6494e528" @@ -4372,13 +4367,6 @@ agent-base@6: dependencies: debug "4" -agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" - agentkeepalive@^3.4.1, agentkeepalive@^4.2.1, agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" @@ -4827,13 +4815,6 @@ ast-types-flow@^0.0.7: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -ast-types@^0.13.4: - version "0.13.4" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" - integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== - dependencies: - tslib "^2.0.1" - astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" @@ -4955,7 +4936,7 @@ axios@^1.6.1: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.7.4: +axios@^1.6.5: version "1.7.8" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e" integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw== @@ -5151,11 +5132,6 @@ basic-auth@^2.0.1: dependencies: safe-buffer "5.1.2" -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-processor@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" @@ -5743,16 +5719,16 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -chromedriver@^131.0.1: - version "131.0.1" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-131.0.1.tgz#bfbf47f6c2ad7a65c154ff47d321bd8c33b52a77" - integrity sha512-LHRh+oaNU1WowJjAkWsviN8pTzQYJDbv/FvJyrQ7XhjKdIzVh/s3GV1iU7IjMTsxIQnBsTjx+9jWjzCWIXC7ug== +chromedriver@^121.0.1: + version "121.0.2" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-121.0.2.tgz#208909a61e9d510913107ea6faf34bcdd72cdced" + integrity sha512-58MUSCEE3oB3G3Y/Jo3URJ2Oa1VLHcVBufyYt7vNfGrABSJm7ienQLF9IQ8LPDlPVgLUXt2OBfggK3p2/SlEBg== dependencies: "@testim/chrome-version" "^1.1.4" - axios "^1.7.4" + axios "^1.6.5" compare-versions "^6.1.0" extract-zip "^2.0.1" - proxy-agent "^6.4.0" + https-proxy-agent "^5.0.1" proxy-from-env "^1.1.0" tcp-port-used "^1.0.2" @@ -6808,11 +6784,6 @@ dashify@^0.1.0: resolved "https://registry.yarnpkg.com/dashify/-/dashify-0.1.0.tgz#107daf9cca5e326e30a8b39ffa5048b6684922ea" integrity sha1-EH2vnMpeMm4wqLOf+lBItmhJIuo= -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@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -7011,15 +6982,6 @@ defined@^1.0.0: resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= -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-cli@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-3.0.1.tgz#2d27ff260204b5104cadeda86f78f180a4ebe89a" @@ -7861,17 +7823,6 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -escodegen@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - eslint-config-prettier@^6.11.0: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" @@ -8886,15 +8837,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^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@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -9050,16 +8992,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-uri@^6.0.1: - version "6.0.3" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" - integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== - dependencies: - basic-ftp "^5.0.2" - data-uri-to-buffer "^6.0.2" - debug "^4.3.4" - fs-extra "^11.2.0" - get-value@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8" @@ -9886,14 +9818,6 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" - integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== - dependencies: - agent-base "^7.1.0" - debug "^4.3.4" - http-signature@~1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" @@ -9916,7 +9840,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -9924,14 +9848,6 @@ https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== - dependencies: - agent-base "^7.0.2" - debug "4" - human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -10227,14 +10143,6 @@ ip-address@^6.3.0: lodash.repeat "4.1.0" sprintf-js "1.1.2" -ip-address@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" - integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== - dependencies: - jsbn "1.1.0" - sprintf-js "^1.1.3" - ip-cidr@^2.1.0: version "2.1.5" resolved "https://registry.yarnpkg.com/ip-cidr/-/ip-cidr-2.1.5.tgz#67fd02ee001d6ac0f253a1d577e4170a8f7d480b" @@ -12129,11 +12037,6 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" @@ -12841,11 +12744,6 @@ nested-error-stacks@^2.0.0, nested-error-stacks@^2.1.0: resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz#26c8a3cee6cc05fbcf1e333cd2fc3e003326c0b5" integrity sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw== -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== - newtype-ts@^0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/newtype-ts/-/newtype-ts-0.2.4.tgz#a02a8f160a3d179f871848d687a93de73a964a41" @@ -13460,28 +13358,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" - integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== - dependencies: - "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" - debug "^4.3.4" - get-uri "^6.0.1" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.5" - pac-resolver "^7.0.1" - socks-proxy-agent "^8.0.4" - -pac-resolver@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" - integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== - dependencies: - degenerator "^5.0.0" - netmask "^2.0.2" - package-hash@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" @@ -14082,20 +13958,6 @@ property-information@^5.0.0, property-information@^5.3.0: dependencies: xtend "^4.0.0" -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.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" @@ -15739,28 +15601,6 @@ slide@~1.1.3: resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" - integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== - dependencies: - agent-base "^7.1.1" - debug "^4.3.4" - socks "^2.8.3" - -socks@^2.8.3: - version "2.8.3" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" - integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== - dependencies: - ip-address "^9.0.5" - smart-buffer "^4.2.0" - sonic-boom@^1.0.2: version "1.4.1" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.4.1.tgz#d35d6a74076624f12e6f917ade7b9d75e918f53e" @@ -15973,11 +15813,6 @@ sprintf-js@1.1.2, sprintf-js@^1.1.1: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== -sprintf-js@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" - integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -16138,7 +15973,7 @@ string-similarity@^4.0.1: resolved "https://registry.yarnpkg.com/string-similarity/-/string-similarity-4.0.4.tgz#42d01ab0b34660ea8a018da8f56a3309bb8b2a5b" integrity sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ== -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -16173,15 +16008,6 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -16260,7 +16086,7 @@ stringify-entities@^3.0.1: character-entities-legacy "^1.0.0" xtend "^4.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16302,13 +16128,6 @@ strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -17084,11 +16903,6 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3 resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== -tslib@^2.0.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tslib@~2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" @@ -18457,7 +18271,7 @@ workerpool@^6.5.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -18483,15 +18297,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"