From c908b9b1fcf48337a1fa2e932e0b65ac84e9b078 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Sat, 10 Aug 2024 23:00:53 +0200 Subject: [PATCH 01/19] test --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 119 ++++++++++++++++++ .../cypress/support/page-objects/Login.ts | 14 +++ e2e-tests/package.json | 2 +- e2e-tests/yarn.lock | 70 +++++------ elk-ror/conf/es/readonlyrest.yml | 21 ++++ elk-ror/conf/kbn/kibana.yml | 5 +- 6 files changed, 189 insertions(+), 42 deletions(-) create mode 100644 e2e-tests/cypress/e2e/Report-generation.cy.ts diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts new file mode 100644 index 0000000..620e0ab --- /dev/null +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -0,0 +1,119 @@ +import { Login } from '../support/page-objects/Login'; + +describe('Report Generation', () => { + before(() => { + // 1. Logowanie jako "kibana:kibana" + // Login.signOut() + Cypress.env("login", "kibana"); + Cypress.env("password", "kibana"); + Login.signIn(); + + // 2. Check if "invoices" index exists and create if it doesn't + cy.request({ + method: 'GET', + url: 'http://localhost:19200/_cat/indices/invoices?v', + failOnStatusCode: false, + }).then((response) => { + if (response.status === 404) { + cy.request({ + method: 'PUT', + url: 'http://localhost:19200/invoices', + headers: { + 'Content-Type': 'application/json', + }, + body: { + settings: { + number_of_shards: 1, + number_of_replicas: 1, + }, + }, + }); + } + }); + + // 3. Generate example data for invoices + const bulkBody = [ + { index: { _index: 'invoices' } }, + { id: 1, number: 'INV001', date: '2024-08-01', amount: 123.45, currency: 'USD' }, + { index: { _index: 'invoices' } }, + { id: 2, number: 'INV002', date: '2024-08-02', amount: 67.89, currency: 'EUR' } + ]; + + // Convert to newline-delimited string + const bulkBodyString = bulkBody.map(line => JSON.stringify(line)).join('\n') + '\n'; + + cy.request({ + method: 'POST', + url: 'http://localhost:19200/invoices/_bulk', + headers: { + 'Content-Type': 'application/json' + }, + body: bulkBodyString + }).then(response => { + expect(response.status).to.eq(200); // Adjust this according to your expectations + }); + + }); + + it('should generate example invoice data and create reports', () => { + // Log in as "user2:dev" + // Login.signOut(); + Cypress.env("login", "user2"); + Cypress.env("password", "dev"); + Login.signIn(); + + // Create invoices data view + cy.visit('http://localhost:5601/s/default/app/management/kibana/dataViews'); + cy.get('button[data-test-subj="createDataViewButton"]').click(); + cy.get('input[data-test-subj="createIndexPatternNameInput"]').type('invoices'); + cy.get('button[data-test-subj="createIndexPatternCreateButton"]').click(); + + // Go to Discover and generate 10 CSV reports + cy.visit('http://localhost:5601/app/discover'); + cy.get('select[data-test-subj="indexPattern"]').select('invoices'); + for (let i = 0; i < 10; i++) { + cy.get('button[data-test-subj="docTableDownloadButton"]').click(); + cy.get('button[data-test-subj="generateCsvButton"]').click(); + } + + // Go to Reports and check the status of all reports + cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); + cy.get('div[data-test-subj="reportingTable"]').within(() => { + cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('have.text', 'Done'); + }); + + // Log out and log in as "user3:dev" + cy.get('button[data-test-subj="userMenuButton"]').click(); + cy.get('button[data-test-subj="logoutButton"]').click(); + Cypress.env("login", "user3"); + Cypress.env("password", "dev"); + Login.signIn(); + + // Verify user3 cannot see user2's reports + cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); + cy.get('div[data-test-subj="reportingTable"]').within(() => { + cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('not.exist'); + }); + }); + + after(() => { + // Ensure proper sign out + Cypress.env("login", "kibana"); + Cypress.env("password", "kibana"); + Login.signIn(); + + // Make the request to delete the invoices index + cy.request({ + method: 'DELETE', + url: 'http://localhost:19200/invoices', + headers: { + 'Content-Type': 'application/json', + }, + failOnStatusCode: false, + }).then(response => { + if (response.status === 403) { + cy.log('Access Forbidden: Check ReadonlyREST permissions'); + } + }); + }); +}); diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 8b1b46b..69d4519 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -19,6 +19,7 @@ export class Login { static fillLoginPage() { cy.get('#form-username', { timeout: 30000 }).should('be.visible'); cy.get('#form-username').type(Cypress.env().login); + cy.get('#form-password').click({ force: true }); cy.get('#form-password').type(Cypress.env().password); cy.get('#form-submit').click({ force: true }); } @@ -27,4 +28,17 @@ export class Login { cy.log('has license changed message'); cy.contains(/The licensing edition has been changed./i); } + static signOut() { + cy.get('[data-test-subj="userMenuButton"]', { timeout: 500 }) // Element wskazujący na zalogowanie + .then($userMenu => { + // Sprawdź, czy element istnieje (czyli czy użytkownik jest zalogowany) + if ($userMenu.length > 0) { + // Kliknij przycisk wylogowania + cy.contains('button', 'Log out').click({ force: true }); + cy.log("User Sign out"); + } else { + cy.log("User wasn't sign in"); + } + }); + } } diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 4ca32c6..63eb783 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -12,7 +12,7 @@ "license": "Beshu Limited, All rights reserved", "dependencies": { "@testing-library/cypress": "^10.0.1", - "cypress": "12.17.4", + "cypress": "^13.13.1", "semver": "7.5.2" }, "devDependencies": { diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index 715ac35..4a4416f 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -30,10 +30,10 @@ dependencies: regenerator-runtime "^0.13.4" -"@cypress/request@2.88.12": - version "2.88.12" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz" - integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -48,7 +48,7 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.10.4" safe-buffer "^5.1.2" tough-cookie "^4.1.3" tunnel-agent "^0.6.0" @@ -176,11 +176,6 @@ resolved "https://registry.npmjs.org/@types/node/-/node-16.4.4.tgz" integrity sha512-BH/jX0HjzElFCQdAwaEMwuGBQwm6ViDZ00X6LKdnRRmGWOzkWugEH4+7a0BwfHQ8DfPPCSd/mdsm3Nu8FKFu0w== -"@types/node@^16.18.39": - version "16.18.50" - resolved "https://registry.npmjs.org/@types/node/-/node-16.18.50.tgz" - integrity sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw== - "@types/node@^20.14.10": version "20.14.10" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" @@ -560,9 +555,9 @@ buffer-crc32@~0.2.3: resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer@^5.6.0: +buffer@^5.7.1: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -632,10 +627,10 @@ check-more-types@^2.24.0: resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-stack@^2.0.0: version "2.2.0" @@ -736,20 +731,19 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cypress@12.17.4: - version "12.17.4" - resolved "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz" - integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== +cypress@^13.13.1: + version "13.13.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.13.1.tgz#860c1142a6e58ea412a764f0ce6ad07567721129" + integrity sha512-8F9UjL5MDUdgC/S5hr8CGLHbS5gGht5UOV184qc2pFny43fnkoaKxlzH/U6//zmGu/xRTaKimNfjknLT8+UDFg== dependencies: - "@cypress/request" "2.88.12" + "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" - "@types/node" "^16.18.39" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -767,7 +761,7 @@ cypress@12.17.4: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -781,7 +775,7 @@ cypress@12.17.4: request-progress "^3.0.0" semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.1" + tmp "~0.2.3" untildify "^4.0.0" yauzl "^2.10.0" @@ -1766,12 +1760,12 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - ci-info "^3.1.1" + ci-info "^3.2.0" is-core-module@^2.13.0, is-core-module@^2.13.1: version "2.14.0" @@ -2423,9 +2417,9 @@ punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.10.3: +qs@6.10.4: version "6.10.4" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== dependencies: side-channel "^1.0.4" @@ -2508,7 +2502,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -2791,12 +2785,10 @@ through@^2.3.8: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +tmp@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-regex-range@^5.0.1: version "5.0.1" diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index beb88ba..fd19ce7 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -29,6 +29,18 @@ readonlyrest: auth_key: kibana:kibana verbosity: error + - name: Allow DELETE on Invoices + indices: ["invoices"] + actions: ["indices:data/write/delete"] + groups: [ admins_group ] + verbosity: error + + - name: Allow bulk requests + methods: ["POST"] + uri: "/invoices/_bulk" + groups: [ admins_group ] + verbosity: info + - name: PERSONAL_GRP groups: [ Personal ] <<: *common-rules @@ -70,6 +82,10 @@ readonlyrest: auth_key: user1:dev <<: *all-groups + - username: kibana + auth_key: kibana:kibana + groups: [ admins_group ] + ror_kbn: - name: kbn1 signature_key: "9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf" @@ -91,3 +107,8 @@ readonlyrest: authentication_endpoint: "http://localhost:1000/auth" success_status_code: 200 cache_ttl: 60s + +http.cors.enabled: true +http.cors.allow-origin: "*" +http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE" +http.cors.allow-headers: "kbn-version, Origin, X-Requested-With, Content-Type, Accept, Authorization" \ No newline at end of file diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index 2faec52..2a09336 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -15,10 +15,11 @@ elasticsearch.requestTimeout: 30000 csp.strict: false csp.warnLegacyBrowsers: false -#elasticsearch.hosts: [ "http://localhost:9201", "http://localhost:9202" ] # USE FAKENODE CLUSTER SIMULATOR -elasticsearch.hosts: [ "${ES_API_URL}" ] +elasticsearch.hosts: [ "http://localhost:9200", "http://localhost:9201", "http://localhost:9202", "${ES_API_URL}" ] # USE FAKENODE CLUSTER SIMULATOR +#elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana +elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] xpack.encryptedSavedObjects.encryptionKey: "19+230i1902i310293213i109312i31209302193219039120i3j23h31h3h213h123!" #xpack.reporting.index: '.reporting-test-index' telemetry.enabled: false From 6833d963ab7024660924d0fb7c3dc13fe474384f Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Wed, 14 Aug 2024 23:28:02 +0200 Subject: [PATCH 02/19] Added Report-generation test --- e2e-tests/cypress.config.ts | 3 +- e2e-tests/cypress/e2e/Report-generation.cy.ts | 192 +++++++++--------- e2e-tests/cypress/support/commands.ts | 33 ++- e2e-tests/cypress/support/e2e.ts | 1 + .../cypress/support/page-objects/DevTools.ts | 14 +- .../cypress/support/page-objects/Discover.ts | 101 +++++++-- .../cypress/support/page-objects/Login.ts | 28 ++- .../page-objects/management/DataViews.ts | 99 +++++++++ .../page-objects/management/Reports.ts | 118 +++++++++++ elk-ror/conf/es/readonlyrest.yml | 27 +-- elk-ror/conf/kbn/kibana.yml | 4 +- 11 files changed, 457 insertions(+), 163 deletions(-) create mode 100644 e2e-tests/cypress/support/page-objects/management/DataViews.ts create mode 100644 e2e-tests/cypress/support/page-objects/management/Reports.ts diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts index 9e75ece..3f888e9 100644 --- a/e2e-tests/cypress.config.ts +++ b/e2e-tests/cypress.config.ts @@ -31,6 +31,7 @@ export default defineConfig({ }, baseUrl: 'http://localhost:5601', videosFolder: '../results/videos', - screenshotsFolder: '../results/screenshots' + screenshotsFolder: '../results/screenshots', + downloadsFolder: './cypress/downloads/', } }); diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 620e0ab..2499dc0 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -1,119 +1,109 @@ -import { Login } from '../support/page-objects/Login'; +// report-generation.spec.ts +import { Login } from "../support/page-objects/Login"; +import { DataViews } from "../support/page-objects/management/DataViews"; +import { Discover } from "../support/page-objects/Discover"; +import { Reports } from "../support/page-objects/management/Reports"; +import { DevTools } from "../support/page-objects/DevTools"; + +describe('Report Generation (ROR_INTR_001)', () => { + const indexPatternName: string = 'invoices'; + const searchName: string = `${ indexPatternName } search`; + -describe('Report Generation', () => { before(() => { - // 1. Logowanie jako "kibana:kibana" - // Login.signOut() - Cypress.env("login", "kibana"); - Cypress.env("password", "kibana"); - Login.signIn(); - - // 2. Check if "invoices" index exists and create if it doesn't - cy.request({ - method: 'GET', - url: 'http://localhost:19200/_cat/indices/invoices?v', - failOnStatusCode: false, - }).then((response) => { - if (response.status === 404) { - cy.request({ - method: 'PUT', - url: 'http://localhost:19200/invoices', - headers: { - 'Content-Type': 'application/json', - }, - body: { - settings: { - number_of_shards: 1, - number_of_replicas: 1, - }, - }, - }); - } - }); - - // 3. Generate example data for invoices - const bulkBody = [ - { index: { _index: 'invoices' } }, - { id: 1, number: 'INV001', date: '2024-08-01', amount: 123.45, currency: 'USD' }, - { index: { _index: 'invoices' } }, - { id: 2, number: 'INV002', date: '2024-08-02', amount: 67.89, currency: 'EUR' } - ]; - - // Convert to newline-delimited string - const bulkBodyString = bulkBody.map(line => JSON.stringify(line)).join('\n') + '\n'; - - cy.request({ - method: 'POST', - url: 'http://localhost:19200/invoices/_bulk', - headers: { - 'Content-Type': 'application/json' - }, - body: bulkBodyString - }).then(response => { - expect(response.status).to.eq(200); // Adjust this according to your expectations - }); + // Log in as "kibana:kibana" (adjust credentials if needed) + Login.setLogin('kibana:kibana'); + Login.initialization(); + + DevTools.openDevTools(); + // Attempt to bulk index sample data + DevTools.sendRequest( + 'PUT invoices/_bulk\n' + + '{"create":{ }}\n' + + '{"id": 1,"number": "INV001","date": "2024-08-01","amount": 123.45,"currency": "USD"}\n' + + '{"create":{ }}\n' + + '{"id": 2,"number": "INV002","date": "2024-08-02","amount": 67.89,"currency": "EUR"}' + ) + DevTools.verifyIf200Status(); + + // Check if the "invoices" index exists after the bulk operation + DevTools.sendRequest(`GET ${ indexPatternName }`); + DevTools.verifyIf200Status(); + Login.signOut(); }); - it('should generate example invoice data and create reports', () => { + beforeEach(() => { // Log in as "user2:dev" - // Login.signOut(); - Cypress.env("login", "user2"); - Cypress.env("password", "dev"); - Login.signIn(); + Login.setLogin('user2:dev'); + Login.initialization(); + + DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + Reports.deleteAllReports(searchName) + + + Login.signOut(); + }) + + it('should generate and verify reports for user2, and user3 should not see them', () => { + // Log in as "user2:dev" + Login.setLogin('user2:dev'); + Login.initialization(); // Create invoices data view - cy.visit('http://localhost:5601/s/default/app/management/kibana/dataViews'); - cy.get('button[data-test-subj="createDataViewButton"]').click(); - cy.get('input[data-test-subj="createIndexPatternNameInput"]').type('invoices'); - cy.get('button[data-test-subj="createIndexPatternCreateButton"]').click(); + DataViews.createDataView(indexPatternName); // Go to Discover and generate 10 CSV reports - cy.visit('http://localhost:5601/app/discover'); - cy.get('select[data-test-subj="indexPattern"]').select('invoices'); + Discover.navigateTo(); + + Discover.selectDataView(indexPatternName); + Discover.saveReport(searchName); + // Discover.selectDataView(indexPatternName); for (let i = 0; i < 10; i++) { - cy.get('button[data-test-subj="docTableDownloadButton"]').click(); - cy.get('button[data-test-subj="generateCsvButton"]').click(); + Discover.generateCsvReport(); } - // Go to Reports and check the status of all reports - cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); - cy.get('div[data-test-subj="reportingTable"]').within(() => { - cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('have.text', 'Done'); - }); - - // Log out and log in as "user3:dev" - cy.get('button[data-test-subj="userMenuButton"]').click(); - cy.get('button[data-test-subj="logoutButton"]').click(); - Cypress.env("login", "user3"); - Cypress.env("password", "dev"); - Login.signIn(); - - // Verify user3 cannot see user2's reports - cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); - cy.get('div[data-test-subj="reportingTable"]').within(() => { - cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('not.exist'); - }); + // Go to Reports and wait for all reports to be 'Done' + Reports.navigateTo(); + Reports.waitForAllReportsToBeDone(searchName); + + // Log out + Login.signOut(); + + // Log in as "user3:dev" + Login.setLogin('user3:dev'); + Login.initialization(); + + // Go to Reports and verify there are no reports + Reports.navigateTo(); + Reports.verifyNoReports(); + + Login.signOut(); }); + afterEach(() => { + // Log in as "user2:dev" + Login.setLogin('user2:dev'); + Login.initialization(); + + DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + Reports.deleteAllReports(searchName) + + + Login.signOut(); + }) + after(() => { - // Ensure proper sign out - Cypress.env("login", "kibana"); - Cypress.env("password", "kibana"); - Login.signIn(); - - // Make the request to delete the invoices index - cy.request({ - method: 'DELETE', - url: 'http://localhost:19200/invoices', - headers: { - 'Content-Type': 'application/json', - }, - failOnStatusCode: false, - }).then(response => { - if (response.status === 403) { - cy.log('Access Forbidden: Check ReadonlyREST permissions'); - } - }); + // Log in as "kibana:kibana" + Login.setLogin('kibana:kibana'); + Login.initialization(); + + // Delete the "invoices" index + DevTools.openDevTools(); + + DevTools.sendRequest(`DELETE ${ indexPatternName }`); + DevTools.verifyIf200Status(); + + Login.signOut(); }); }); diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index 54b4cc3..22c32b5 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -1,12 +1,16 @@ import '@testing-library/cypress/add-commands'; import { isJsonString } from './helpers'; -Cypress.Commands.add('post', ({ url, user = `${Cypress.env().login}:${Cypress.env().password}`, payload }, ...args) => { +Cypress.Commands.add('post', ({ + url, + user = `${ Cypress.env().login }:${ Cypress.env().password }`, + payload + }, ...args) => { const escapedAndStringifyPayload = JSON.stringify(JSON.stringify(payload)); return cy .exec( - `curl -v -k -H "Content-Type: application/json" -H "kbn-xsrf: true" -d ${escapedAndStringifyPayload} -X POST ${url} --user ${user}` + `curl -v -k -H "Content-Type: application/json" -H "kbn-xsrf: true" -d ${ escapedAndStringifyPayload } -X POST ${ url } --user ${ user }` ) .then(result => { console.log(url, result); @@ -16,8 +20,8 @@ Cypress.Commands.add('post', ({ url, user = `${Cypress.env().login}:${Cypress.en Cypress.Commands.add( 'import', - ({ url, filename, user = `${Cypress.env().login}:${Cypress.env().password}` }, ...args) => - cy.exec(`curl -v -k -H "kbn-xsrf: true" --form file=@${filename} -X POST "${url}" --user ${user}`).then(result => { + ({url, filename, user = `${ Cypress.env().login }:${ Cypress.env().password }`}, ...args) => + cy.exec(`curl -v -k -H "kbn-xsrf: true" --form file=@${ filename } -X POST "${ url }" --user ${ user }`).then(result => { console.log(url, result); return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) @@ -25,8 +29,8 @@ Cypress.Commands.add( Cypress.Commands.add( 'getRequest', - ({ url, user = `${Cypress.env().login}:${Cypress.env().password}`, header }, ...args) => - cy.exec(`curl -v -k "${url}" --user ${user} ${header ? `-H "${header}"` : ''}`).then(result => { + ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`, header}, ...args) => + cy.exec(`curl -v -k "${ url }" --user ${ user } ${ header ? `-H "${ header }"` : '' }`).then(result => { console.log(url, result); return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) @@ -34,15 +38,28 @@ Cypress.Commands.add( Cypress.Commands.add( 'deleteRequest', - ({ url, header, user = `${Cypress.env().login}:${Cypress.env().password}` }, ...args) => + ({url, header, user = `${ Cypress.env().login }:${ Cypress.env().password }`}, ...args) => cy - .exec(`curl -H "kbn-xsrf: true" -v -k -X DELETE "${url}" --user ${user} ${header ? `-H "${header}"` : ''}`) + .exec(`curl -H "kbn-xsrf: true" -v -k -X DELETE "${ url }" --user ${ user } ${ header ? `-H "${ header }"` : '' }`) .then(result => { console.log(url, result); return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) ); +Cypress.Commands.add('verifyDownload', (fileName: string, options) => { + const downloadsFolder = Cypress.config().downloadsFolder; + const downloadTimeout = options.timeout || 60000; // Default timeout of 60 seconds + + // Poll for the downloaded file + cy.log(`Waiting for download: ${ fileName }`); + return cy.readFile(`${ downloadsFolder }/${ fileName }`, {timeout: downloadTimeout}) + .then(fileContent => { + cy.log(`Downloaded file: ${ fileName }`); + return Cypress.Promise.resolve(`${ downloadsFolder }/${ fileName }`); + }); +}); + Cypress.on('uncaught:exception', (err, runnable) => { /** * Don't fail test when these specific errors from kibana platform diff --git a/e2e-tests/cypress/support/e2e.ts b/e2e-tests/cypress/support/e2e.ts index 7dd26ad..e1ab22a 100644 --- a/e2e-tests/cypress/support/e2e.ts +++ b/e2e-tests/cypress/support/e2e.ts @@ -28,6 +28,7 @@ declare global { import({ url, user, filename }: { url: string; user?: string; filename: string }): Chainable; getRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; deleteRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; + verifyDownload({ fileName, options }: { fileName: string; options:? Cypress.ChainableMethods }): Chainable; } } } diff --git a/e2e-tests/cypress/support/page-objects/DevTools.ts b/e2e-tests/cypress/support/page-objects/DevTools.ts index f619b34..1fd1a78 100644 --- a/e2e-tests/cypress/support/page-objects/DevTools.ts +++ b/e2e-tests/cypress/support/page-objects/DevTools.ts @@ -7,9 +7,9 @@ export class DevTools { cy.log('Open Dev tools'); KibanaNavigation.openKibanaNavigation(); cy.contains('Dev Tools').click(); - cy.findByRole('button', { name: /Dismiss/ }); + cy.findByRole('button', {name: /Dismiss/}); cy.findByRole('dialog') - .findByRole('button', { name: /Dismiss/ }) + .findByRole('button', {name: /Dismiss/}) .click(); } @@ -18,15 +18,15 @@ export class DevTools { if (semver.lte(getKibanaVersion(), '7.9.0')) { // Select editor, delete, write cy.get('#ConAppEditor').click(); - cy.get('#ConAppInputTextarea').clear({ force: true }); + cy.get('#ConAppInputTextarea').clear({force: true}); cy.get('#ConAppInputTextarea').type(text); // Click play - cy.get('.ace_scroller:nth-child(4) > .ace_content').click({ force: true }); - cy.get('.conApp__editorActionButton path').click({ force: true }); + cy.get('.ace_scroller:nth-child(4) > .ace_content').click({force: true}); + cy.get('.conApp__editorActionButton path').click({force: true}); } else { - cy.get('[data-test-subj=console-textarea]').clear({ force: true }); - cy.get('[data-test-subj=console-textarea]').type(text, { force: true }); + cy.get('[data-test-subj=console-textarea]').clear({force: true}); + cy.get('[data-test-subj=console-textarea]').type(text, {force: true, parseSpecialCharSequences: false}); cy.get('[data-test-subj=sendRequestButton]').click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index c4b7105..7bf99b4 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -9,7 +9,7 @@ export class Discover { if (semver.lt(getKibanaVersion(), '8.8.0')) { KibanaNavigation.openKibanaNavigation(); - cy.contains('Discover').click({ force: true }); + cy.contains('Discover').click({force: true}); } cy.contains(indexPatternName).should('be.visible'); @@ -17,12 +17,15 @@ export class Discover { static saveReport(reportName: string) { cy.log('saveReport'); - KibanaNavigation.openKibanaNavigation(); - cy.contains('Discover').click(); cy.get('[data-test-subj=discoverSaveButton]').click(); cy.get('[data-test-subj=savedObjectTitle]').type(reportName); - cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({ force: true }); - cy.contains('was saved', { timeout: 10000 }).should('exist'); + cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({force: true}); + + cy.contains('saved', {timeout: 10000, matchCase: false}).should('exist'); + + cy.get('[data-test-subj="toastCloseButton"]').click({force: true}); + cy.contains('saved', {timeout: 10000, matchCase: false}).should('not.exist'); + cy.findByRole('navigation', { name: /breadcrumb/i @@ -34,8 +37,8 @@ export class Discover { cy.get('[data-test-subj=shareTopNavButton]').click(); cy.get('[data-test-subj=sharePanel-CSVReports]').click(); cy.get('[data-test-subj=generateReportButton]').click(); - cy.contains('Queued report for search', { timeout: 10000 }).should('exist'); - cy.contains('Queued report for search', { timeout: 10000 }).should('not.exist'); + cy.contains('Queued report for search', {timeout: 10000}).should('exist'); + cy.contains('Queued report for search', {timeout: 10000}).should('not.exist'); /** * TODO: For now csv download crash cypress electron browser (it's probably works in case of other browsers). @@ -83,6 +86,76 @@ export class Discover { } return openDataPageForKibanaBefore7_18_1(); }; + + static navigateTo() { + cy.log('navigateTo'); + KibanaNavigation.openKibanaNavigation(); + cy.contains('Discover').click({force: true}); + cy.wait(1000); + } + + static selectDataView(dataViewName: string) { + cy.log('selectDataView'); + + // For Kibana 8.0.0 and above, we need to interact with the popover + if (semver.gte(getKibanaVersion(), '8.0.0')) { + cy.get('[data-test-subj="discover-dataView-switch-link"]').click(); // Open the popover + + // Search for the data view within the popover + cy.get('.euiPopover__panel [role="combobox"] input') // Assuming this is the search input within the popover + .type(dataViewName); + + // Wait for the options to filter and then select the desired data view + cy.wait(500); // Adjust if needed + cy.get(`.euiPopover__panel li:contains("${ dataViewName }")`) + .click({force: true}); + } else { + // For older Kibana versions, use the previous logic + cy.get('[data-test-subj="indexPattern-switch-link"]').click(); + cy.contains(dataViewName).click({force: true}); + } + } + + static generateCsvReport() { + cy.log('generateCsvReport'); + + // Click the share button to open the sharing options + cy.get('[data-test-subj=shareTopNavButton]').click(); + + // Click the "CSV Reports" option + cy.get('[data-test-subj=sharePanel-CSVReports]').click(); + + // Click the "Generate report" button + cy.get('[data-test-subj=generateReportButton]').click(); + + // Wait for the "Queued report for search" message to appear + cy.contains('Queued report for search', {timeout: 50000}).should('exist'); + + // Close the "Queued report for search" toast + cy.get('[data-test-subj="toastCloseButton"]').click(); + + // Wait for the "Queued report for search" message to disappear + cy.contains('Queued report for search', {timeout: 50000}).should('not.exist'); + var triger: string; + if (semver.lte(getKibanaVersion(), '8.8.0')) { + triger = 'Created report for'; + } else { + triger = 'CSV created for'; + } + // Attempt to find the "Created report for" message within the timeout + cy.contains(triger, {timeout: 50000}) + .then($message => { + if ($message.length !== 0) { + // Close the "Created report for" toast + cy.get('[data-test-subj="toastCloseButton"]').click(); + + // Wait for the "Created report for" message to disappear + cy.contains(triger, {timeout: 50000}).should('not.exist'); + } else { // If the message is not found + throw new Error(`Report generation failed: "${ triger }" message not found within timeout.`); + } + }); + } } const createKibanaIndexPattern = (indexPatternName: string) => { @@ -91,7 +164,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.get('[data-test-subj=createIndexPatternNameInput]').type(indexPatternName); cy.contains('Next step').click(); cy.get('[data-test-subj=createIndexPatternTimeFieldSelect]').select('@timestamp'); - cy.get('[data-test-subj=createIndexPatternButton]').click({ force: true }); + cy.get('[data-test-subj=createIndexPatternButton]').click({force: true}); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); cy.wait('@indexPattern'); }; @@ -101,8 +174,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.get('[data-test-subj=createIndexPatternNameInput]').type(indexPatternName); cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); - cy.contains('@timestamp').click({ force: true }); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.contains('@timestamp').click({force: true}); + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); cy.wait('@indexPattern'); }; @@ -114,7 +187,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { '[data-test-subj=createDataViewButton]' // >= 8.4.x ]; cy.get(createDataViewPossibleSelectors.join(',')) - .contains(/create.*data.*view/i, { matchCase: false }) + .contains(/create.*data.*view/i, {matchCase: false}) .click(); cy.get( [ @@ -126,8 +199,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { }); cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); - cy.contains('@timestamp').click({ force: true }); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.contains('@timestamp').click({force: true}); + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); if (semver.gte(getKibanaVersion(), '8.9.0')) { cy.intercept('/s/default/api/kibana/management/saved_objects/**').as('indexPattern'); @@ -138,6 +211,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.wait('@indexPattern'); }; + if (semver.gte(getKibanaVersion(), '8.0.0')) { return createIdentityForKibanaForAndAbove8_0_0(); } @@ -147,4 +221,5 @@ const createKibanaIndexPattern = (indexPatternName: string) => { } return createIdentityForKibanaBefore7_15_1(); + }; diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 69d4519..9680730 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -28,17 +28,23 @@ export class Login { cy.log('has license changed message'); cy.contains(/The licensing edition has been changed./i); } + static signOut() { - cy.get('[data-test-subj="userMenuButton"]', { timeout: 500 }) // Element wskazujący na zalogowanie - .then($userMenu => { - // Sprawdź, czy element istnieje (czyli czy użytkownik jest zalogowany) - if ($userMenu.length > 0) { - // Kliknij przycisk wylogowania - cy.contains('button', 'Log out').click({ force: true }); - cy.log("User Sign out"); - } else { - cy.log("User wasn't sign in"); - } - }); + cy.get('#rorMenuPopover', {timeout: 1000}).click() + // cy.get('[data-test-subj="userMenuButton"]', {timeout: 1000}).click() + .then($userMenu => { + if ($userMenu.length > 0) { + cy.contains('button', 'Log out').click({force: true}); + cy.log("User Sign out"); + } else { + cy.log("User wasn't sign in"); + } + }); + } + + static setLogin(user: string) { + let loginData = user.split(":"); + Cypress.env("login", loginData[0]); + Cypress.env("password", loginData[1]); } } diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts new file mode 100644 index 0000000..2d201f7 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -0,0 +1,99 @@ +import * as semver from 'semver'; +import { getKibanaVersion } from '../../helpers'; +import { Discover } from "../Discover"; +import { KibanaNavigation } from "../KibanaNavigation"; + + +export class DataViews { + static deleteSavedObjectsIfExist(objectsNames: string[]) { + cy.log('deleteSavedObjectsIfExist'); + KibanaNavigation.openKibanaNavigation(); + cy.contains('Stack Management').click(); + cy.contains('Saved Objects').click(); + + for (const objectName of objectsNames) { + + // Delete "invoices" index pattern if it exists + cy.get('[data-test-subj="savedObjectSearchBar"]').type(objectName + "{enter}"); + cy.get('body').then($body => { + // Find the table row containing *exactly* "invoices" in the title + const $invoicesIndexPatternRow = $body.find(`[data-test-subj="savedObjectsTableRowTitle"] a`) + .filter((index, el) => Cypress.$(el).text().trim() === objectName) + .closest('tr').first(); // Get the parent row of the link + + if ($invoicesIndexPatternRow.length > 0) { + cy.wrap($invoicesIndexPatternRow) + .find('[type="checkbox"]') + .click(); + cy.contains('Delete').click(); + cy.get('[data-test-subj="confirmModalConfirmButton"]').click(); + cy.log(`Deleted index pattern: ${ objectName }`); + } + }); + + // Clear the search bar + cy.get('[data-test-subj="savedObjectSearchBar"]').clear(); + } + } + + static createDataView(dataViewName: string) { + cy.log('createDataView'); + Discover.openDataViewPage(); + + const createDataViewForKibanaBefore8_0_0 = () => { + cy.get('[data-test-subj="createIndexPatternButtonFlyout"]').click(); + cy.get('[data-test-subj="createIndexPatternNameInput"]').type(`${ dataViewName }{del}`); + cy.get('[data-test-subj="timestampField"]') // Find the timestamp field combobox + .find('[data-test-subj="comboBoxToggleListButton"]') // Find the button to open the dropdown + .click(); // Click the button to open the dropdown + + // Wait for the dropdown to appear + cy.wait(500); + + // Find and click the "I don't want to use the time filter" option + cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---`); + cy.get('[data-test-subj="saveIndexPatternButton"]').click(); + }; + + const createDataViewForKibanaForAndAbove8_0_0 = () => { + const createDataViewPossibleSelectors = [ + '[data-test-subj=createDataViewButtonFlyout]', // >= 8.2.x + '[data-test-subj=createDataViewButton]' // >= 8.4.x + ]; + + // Click the "Create data view" button, handling different selectors based on Kibana version + cy.get(createDataViewPossibleSelectors.join(',')) + .contains(/create.*data.*view/i, {matchCase: false}) + .click(); + + // Type the data view name into the appropriate input field, handling changes in 8.4.0+ + cy.get( + [ + '[data-test-subj=createIndexPatternNameInput]', // regular index pattern field + '[data-test-subj=createIndexPatternTitleInput]' // Added title field in 8.4.0 + ].join(',') + ).then(els => { + [...els].forEach(el => cy.wrap(el).type(`${ dataViewName }{del}`)); + }); + // cy.get('[data-test-subj="comboBoxSearchInput"]').click(); + // cy.wait(50000); + // cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---{enter}`); + + // Save the data view + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); + }; + + if (semver.gte(getKibanaVersion(), '8.0.0')) { + createDataViewForKibanaForAndAbove8_0_0(); + } else { + createDataViewForKibanaBefore8_0_0(); + } + + // Wait for the data view to be created and verify it's visible + cy.contains('saved', {timeout: 10000, matchCase: false}).should('exist'); + + cy.get('[data-test-subj="toastCloseButton"]').click(); + cy.contains('saved', {timeout: 10000}).should('not.exist'); + cy.findByRole('navigation', {name: /breadcrumb/i}).findByText(dataViewName); + } +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts new file mode 100644 index 0000000..c24fd83 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -0,0 +1,118 @@ +import { KibanaNavigation } from '../KibanaNavigation'; +import semver from "semver/preload"; +import { getKibanaVersion } from "../../helpers"; + +export class Reports { + static navigateTo() { + cy.log('navigateTo'); + + // Check if we are already on the Stack Management page + cy.url().then(url => { + if (!url.includes('/app/management')) { + // If not, open Kibana navigation and click on Stack Management + KibanaNavigation.openKibanaNavigation(); + cy.contains('Stack Management').click(); + } + + // Now, click on Reporting (whether we were already on Stack Management or not) + cy.contains('Reporting').click(); + }); + } + + static waitForAllReportsToBeDone(reportTitle: string = 'Untitled discover search') { + cy.log('waitForAllReportsToBeDone'); + + cy.get('tr[data-test-subj="reportJobRow"]') + .each($reportItem => { + cy.wrap($reportItem) + .find('[data-test-subj="reportingListItemObjectTitle"]') + .should('contain.text', reportTitle); + + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 60000}) + .should('be.visible'); + + // Click the download button + if (semver.lte(getKibanaVersion(), '8.8.0')) { + cy.wrap($reportItem) + .find('[data-test-subj="reportJobActions"] button') + .first() + .click(); + } else { + cy.wrap($reportItem) + .find('[data-test-subj="reportDownloadLink"]') + .first() + .click(); + } + + // Assert that a file is downloaded + cy.verifyDownload(`${ reportTitle }.csv`, {timeout: 10000}) // Adjust timeout if needed + .then(filePath => { + // Read the downloaded file content and assert it's not empty + cy.readFile(filePath) + .should('not.be.empty') + .then(fileContent => { + const rows = fileContent.split('\n'); + expect(rows.length).to.be.greaterThan(1); + }); + }); + }) + .then($matchingReports => { + expect($matchingReports).to.have.length(10); + }); + } + + + static verifyNoReports() { + cy.log('verifyNoReports'); + + // Assert that there are no report rows present + cy.get('tr[data-test-subj="reportJobRow"]').should('not.exist'); + } + + static deleteAllReports(reportTitle: string = 'Untitled discover search') { + cy.log('deleteAllReports'); + + // 1. Navigate to the Reporting page + Reports.navigateTo(); + + // 2. Check if there are any reports and if "Select All" is enabled + cy.wait(500); + cy.get('body').then($body => { + const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; + const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled + + if (hasReports) { + if (selectAllEnabled) { + // If "Select All" is enabled, delete all reports directly + cy.log('Deleting all reports using "Select All"'); + + // Select all reports + cy.get('[data-test-subj="checkboxSelectAll"]').check({force: true}); + + // Click the "Delete" button + cy.get('[data-test-subj="deleteReportButton"]').click({force: true}); + + // Confirm the deletion in the modal + cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); + + } else { + // If "Select All" is not enabled, delete reports page by page as before + cy.log('Deleting reports page by page'); + + let totalPages = 1; + cy.get('.euiPagination__list li:not(.euiPaginationButton-isPlaceholder)').then($pageButtons => { + totalPages = $pageButtons.length; + }); + + for (let currentPage = 1; currentPage <= totalPages; currentPage++) { + // ... (rest of the page-by-page deletion logic remains the same) ... + } + } + } else { + cy.log('No reports found - nothing to delete'); + } + }); + } +} \ No newline at end of file diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index fd19ce7..6175755 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -29,18 +29,6 @@ readonlyrest: auth_key: kibana:kibana verbosity: error - - name: Allow DELETE on Invoices - indices: ["invoices"] - actions: ["indices:data/write/delete"] - groups: [ admins_group ] - verbosity: error - - - name: Allow bulk requests - methods: ["POST"] - uri: "/invoices/_bulk" - groups: [ admins_group ] - verbosity: info - - name: PERSONAL_GRP groups: [ Personal ] <<: *common-rules @@ -82,9 +70,13 @@ readonlyrest: auth_key: user1:dev <<: *all-groups - - username: kibana - auth_key: kibana:kibana - groups: [ admins_group ] + - username: user2 + auth_key: user2:dev + <<: *all-groups + + - username: user3 + auth_key: user3:dev + <<: *all-groups ror_kbn: - name: kbn1 @@ -107,8 +99,3 @@ readonlyrest: authentication_endpoint: "http://localhost:1000/auth" success_status_code: 200 cache_ttl: 60s - -http.cors.enabled: true -http.cors.allow-origin: "*" -http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE" -http.cors.allow-headers: "kbn-version, Origin, X-Requested-With, Content-Type, Accept, Authorization" \ No newline at end of file diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index 2a09336..37e03dc 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -15,8 +15,8 @@ elasticsearch.requestTimeout: 30000 csp.strict: false csp.warnLegacyBrowsers: false -elasticsearch.hosts: [ "http://localhost:9200", "http://localhost:9201", "http://localhost:9202", "${ES_API_URL}" ] # USE FAKENODE CLUSTER SIMULATOR -#elasticsearch.hosts: [ "${ES_API_URL}" ] +#elasticsearch.hosts: [ "http://localhost:9201", "http://localhost:9202" ] # USE FAKENODE CLUSTER SIMULATOR +elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] From 5af8958253e008cfab945c6fcc84ac30483bbebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Go=C5=82=C4=99biowski?= <65414380+lodyczekoladowe@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:57:02 +0200 Subject: [PATCH 03/19] Update e2e-tests/cypress/e2e/Report-generation.cy.ts --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 2499dc0..ebb5202 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -5,7 +5,7 @@ import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; import { DevTools } from "../support/page-objects/DevTools"; -describe('Report Generation (ROR_INTR_001)', () => { +describe('Report Generation', () => { const indexPatternName: string = 'invoices'; const searchName: string = `${ indexPatternName } search`; From bbe787a90eb6003bc0d6373e5447681fdbf4f4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Go=C5=82=C4=99biowski?= <65414380+lodyczekoladowe@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:02:41 +0200 Subject: [PATCH 04/19] Update elk-ror/conf/kbn/kibana.yml --- elk-ror/conf/kbn/kibana.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index f44f53a..8f7b6aa 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -19,7 +19,6 @@ csp.warnLegacyBrowsers: false elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana -elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] xpack.encryptedSavedObjects.encryptionKey: "19+230i1902i310293213i109312i31209302193219039120i3j23h31h3h213h123!" xpack.reporting.encryptionKey: "321421321211231241232132132132132" #xpack.reporting.index: '.reporting-test-index' From 5a1f6b2f039dbd1819536ec26b964ad64fd9eb52 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Fri, 16 Aug 2024 22:29:09 +0200 Subject: [PATCH 05/19] Part of the requested changes --- e2e-tests/cypress.config.ts | 3 +- e2e-tests/cypress/e2e/Report-generation.cy.ts | 99 +++++++++---------- e2e-tests/cypress/e2e/Sanity-check.cy.ts | 4 +- e2e-tests/cypress/support/commands.ts | 78 ++++++++++----- e2e-tests/cypress/support/e2e.ts | 4 +- .../cypress/support/page-objects/Discover.ts | 16 +-- .../cypress/support/page-objects/Login.ts | 1 - .../page-objects/management/DataViews.ts | 3 - .../page-objects/management/Reports.ts | 2 +- elk-ror/conf/es/readonlyrest.yml | 8 -- 10 files changed, 116 insertions(+), 102 deletions(-) diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts index 3f888e9..eac3f7c 100644 --- a/e2e-tests/cypress.config.ts +++ b/e2e-tests/cypress.config.ts @@ -6,7 +6,8 @@ export default defineConfig({ password: 'dev', kibanaVersion: 'NOT_SET_YET', elasticsearchUrl: 'http://localhost:19200', - enterpriseActivationKey: 'PROVIDE_YOUR_ACTIVATION_KEY' + enterpriseActivationKey: 'PROVIDE_YOUR_ACTIVATION_KEY', + readFileTimeout: 60000, }, video: true, screenshotOnRunFailure: true, diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index ebb5202..056fb68 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -1,44 +1,57 @@ -// report-generation.spec.ts import { Login } from "../support/page-objects/Login"; import { DataViews } from "../support/page-objects/management/DataViews"; import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; -import { DevTools } from "../support/page-objects/DevTools"; describe('Report Generation', () => { - const indexPatternName: string = 'invoices'; - const searchName: string = `${ indexPatternName } search`; + const indexName: string = 'invoices'; + const searchName: string = `${ indexName } search`; before(() => { - // Log in as "kibana:kibana" (adjust credentials if needed) - Login.setLogin('kibana:kibana'); - Login.initialization(); - - DevTools.openDevTools(); - // Attempt to bulk index sample data - DevTools.sendRequest( - 'PUT invoices/_bulk\n' + - '{"create":{ }}\n' + - '{"id": 1,"number": "INV001","date": "2024-08-01","amount": 123.45,"currency": "USD"}\n' + - '{"create":{ }}\n' + - '{"id": 2,"number": "INV002","date": "2024-08-02","amount": 67.89,"currency": "EUR"}' - ) - DevTools.verifyIf200Status(); - - // Check if the "invoices" index exists after the bulk operation - DevTools.sendRequest(`GET ${ indexPatternName }`); - DevTools.verifyIf200Status(); - Login.signOut(); + cy.put({ + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + payload: [ + {create: {}}, + {id: 1, number: "INV001", date: "2024-08-01", amount: "123.45", currency: "USD"}, + {create: {}}, + {id: 2, number: "INV002", date: "2024-08-02", amount: "67.89", currency: "EUR"}, + {create: {}}, + {id: 3, number: "INV003", date: "2024-08-03", amount: "456.78", currency: "GBP"}, + {create: {}}, + {id: 4, number: "INV004", date: "2024-08-04", amount: "90.12", currency: "JPY"}, + {create: {}}, + {id: 5, number: "INV005", date: "2024-08-05", amount: "345.67", currency: "CAD"}, + {create: {}}, + {id: 6, number: "INV006", date: "2024-08-06", amount: "89.01", currency: "AUD"}, + {create: {}}, + {id: 7, number: "INV007", date: "2024-08-07", amount: "234.56", currency: "CHF"}, + {create: {}}, + {id: 8, number: "INV008", date: "2024-08-08", amount: "78.90", currency: "SEK"}, + {create: {}}, + {id: 9, number: "INV009", date: "2024-08-09", amount: "135.79", currency: "NZD"}, + {create: {}}, + {id: 10, number: "INV010", date: "2024-08-10", amount: "246.80", currency: "DKK"}, + {create: {}}, + {id: 11, number: "INV011", date: "2024-08-11", amount: "357.91", currency: "NOK"}, + {create: {}}, + {id: 12, number: "INV012", date: "2024-08-12", amount: "468.02", currency: "ZAR"}, + {create: {}}, + {id: 13, number: "INV013", date: "2024-08-13", amount: "579.13", currency: "BRL"}, + {create: {}}, + {id: 14, number: "INV014", date: "2024-08-14", amount: "680.24", currency: "INR"}, + {create: {}}, + {id: 15, number: "INV015", date: "2024-08-15", amount: "791.35", currency: "RUB"} + ] + }); }); beforeEach(() => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) @@ -46,35 +59,28 @@ describe('Report Generation', () => { }) it('should generate and verify reports for user2, and user3 should not see them', () => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - // Create invoices data view - DataViews.createDataView(indexPatternName); + DataViews.createDataView(indexName); - // Go to Discover and generate 10 CSV reports Discover.navigateTo(); - Discover.selectDataView(indexPatternName); - Discover.saveReport(searchName); - // Discover.selectDataView(indexPatternName); + Discover.selectDataView(indexName); + Discover.saveSearch(searchName); for (let i = 0; i < 10; i++) { - Discover.generateCsvReport(); + Discover.generateCsvReport(50000); } - // Go to Reports and wait for all reports to be 'Done' + // Go to Reports and check if all reports are not empty Reports.navigateTo(); - Reports.waitForAllReportsToBeDone(searchName); + Reports.checkAllReports(searchName); - // Log out Login.signOut(); - // Log in as "user3:dev" Login.setLogin('user3:dev'); Login.initialization(); - // Go to Reports and verify there are no reports Reports.navigateTo(); Reports.verifyNoReports(); @@ -82,11 +88,10 @@ describe('Report Generation', () => { }); afterEach(() => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) @@ -94,16 +99,8 @@ describe('Report Generation', () => { }) after(() => { - // Log in as "kibana:kibana" - Login.setLogin('kibana:kibana'); - Login.initialization(); - - // Delete the "invoices" index - DevTools.openDevTools(); - - DevTools.sendRequest(`DELETE ${ indexPatternName }`); - DevTools.verifyIf200Status(); - - Login.signOut(); + cy.delete({ + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + }) }); }); diff --git a/e2e-tests/cypress/e2e/Sanity-check.cy.ts b/e2e-tests/cypress/e2e/Sanity-check.cy.ts index 6f6b0f3..7811d91 100644 --- a/e2e-tests/cypress/e2e/Sanity-check.cy.ts +++ b/e2e-tests/cypress/e2e/Sanity-check.cy.ts @@ -76,7 +76,7 @@ describe('sanity check', () => { Discover.createIndexPattern('r'); cy.log('Create a CSV report'); - Discover.saveReport('admin_search'); + Discover.saveSearch('admin_search'); Discover.exportToCsv(); Reporting.verifySavedReport('admin_search', 'kibanaNavigation', 1); @@ -98,7 +98,7 @@ describe('sanity check', () => { Discover.createIndexPattern('re'); cy.log('Create CSV report for the second tenancy'); - Discover.saveReport('infosec_search'); + Discover.saveSearch('infosec_search'); Discover.exportToCsv(); Reporting.verifySavedReport('infosec_search', 'rorMenu', 1); } diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index 22c32b5..2a964a9 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -1,22 +1,35 @@ import '@testing-library/cypress/add-commands'; import { isJsonString } from './helpers'; -Cypress.Commands.add('post', ({ - url, - user = `${ Cypress.env().login }:${ Cypress.env().password }`, - payload - }, ...args) => { - const escapedAndStringifyPayload = JSON.stringify(JSON.stringify(payload)); +Cypress.Commands.add( + 'post', + ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`, payload}, ...args) => { + const escapedAndStringifyPayload = JSON.stringify(JSON.stringify(payload)); - return cy - .exec( - `curl -v -k -H "Content-Type: application/json" -H "kbn-xsrf: true" -d ${ escapedAndStringifyPayload } -X POST ${ url } --user ${ user }` - ) - .then(result => { - console.log(url, result); - return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; - }); -}); + return cy + .exec( + `curl -v -k -H "Content-Type: application/json" -H "kbn-xsrf: true" -d ${ escapedAndStringifyPayload } -X POST ${ url } --user ${ user }` + ) + .then(result => { + console.log(url, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + }); + }); + +Cypress.Commands.add( + 'put', + ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`, payload}, ...args) => { + const escapedAndStringifyPayload = JSON.stringify(payload); + + return cy + .exec( + `curl -H "Content-Type: application/json" -d '${ escapedAndStringifyPayload }' -XPUT "${ url }" -u ${ user }` + ) + .then(result => { + console.log(url, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + }); + }); Cypress.Commands.add( 'import', @@ -47,18 +60,31 @@ Cypress.Commands.add( }) ); -Cypress.Commands.add('verifyDownload', (fileName: string, options) => { - const downloadsFolder = Cypress.config().downloadsFolder; - const downloadTimeout = options.timeout || 60000; // Default timeout of 60 seconds +Cypress.Commands.add( + 'delete', + ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`}, ...args) => + cy + .exec(`curl -H "Content-Type: application/json" -X DELETE "${ url }" -u ${ user }`) + .then(result => { + console.log(url, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + }) +); - // Poll for the downloaded file - cy.log(`Waiting for download: ${ fileName }`); - return cy.readFile(`${ downloadsFolder }/${ fileName }`, {timeout: downloadTimeout}) - .then(fileContent => { - cy.log(`Downloaded file: ${ fileName }`); - return Cypress.Promise.resolve(`${ downloadsFolder }/${ fileName }`); - }); -}); +Cypress.Commands.add( + 'verifyDownload', + (fileName, options = {}) => { // Provide a default empty object for options + const downloadsFolder = Cypress.config('downloadsFolder'); + const downloadTimeout = options.timeout || Cypress.env().readFileTimeout; + + // Poll for the downloaded file + cy.log(`Waiting for download: ${ fileName }`); + return cy.readFile(`${ downloadsFolder }/${ fileName }`, {timeout: downloadTimeout}) + .then(fileContent => { + cy.log(`Downloaded file: ${ fileName }`); + return Cypress.Promise.resolve(`${ downloadsFolder }/${ fileName }`); + }); + }); Cypress.on('uncaught:exception', (err, runnable) => { /** diff --git a/e2e-tests/cypress/support/e2e.ts b/e2e-tests/cypress/support/e2e.ts index e1ab22a..d1aefa5 100644 --- a/e2e-tests/cypress/support/e2e.ts +++ b/e2e-tests/cypress/support/e2e.ts @@ -25,10 +25,12 @@ declare global { namespace Cypress { export interface Chainable { post({ url, user, payload }: { url: string; user?: string; payload: unknown }): Chainable; + put({ url, user, payload }: { url: string; user?: string; payload: unknown }): Chainable; import({ url, user, filename }: { url: string; user?: string; filename: string }): Chainable; getRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; deleteRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; - verifyDownload({ fileName, options }: { fileName: string; options:? Cypress.ChainableMethods }): Chainable; + delete({ url, user}: { url: string; user?: string}): Chainable; + verifyDownload( fileName: string, options?: any): Chainable; } } } diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 7bf99b4..325f420 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -15,10 +15,10 @@ export class Discover { cy.contains(indexPatternName).should('be.visible'); } - static saveReport(reportName: string) { + static saveSearch(searchName: string) { cy.log('saveReport'); cy.get('[data-test-subj=discoverSaveButton]').click(); - cy.get('[data-test-subj=savedObjectTitle]').type(reportName); + cy.get('[data-test-subj=savedObjectTitle]').type(searchName); cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({force: true}); cy.contains('saved', {timeout: 10000, matchCase: false}).should('exist'); @@ -29,7 +29,7 @@ export class Discover { cy.findByRole('navigation', { name: /breadcrumb/i - }).findByText(reportName); + }).findByText(searchName); } static exportToCsv() { @@ -116,7 +116,7 @@ export class Discover { } } - static generateCsvReport() { + static generateCsvReport(timeout: number = 50000) { cy.log('generateCsvReport'); // Click the share button to open the sharing options @@ -129,13 +129,13 @@ export class Discover { cy.get('[data-test-subj=generateReportButton]').click(); // Wait for the "Queued report for search" message to appear - cy.contains('Queued report for search', {timeout: 50000}).should('exist'); + cy.contains('Queued report for search', {timeout: timeout}).should('exist'); // Close the "Queued report for search" toast cy.get('[data-test-subj="toastCloseButton"]').click(); // Wait for the "Queued report for search" message to disappear - cy.contains('Queued report for search', {timeout: 50000}).should('not.exist'); + cy.contains('Queued report for search', {timeout: timeout}).should('not.exist'); var triger: string; if (semver.lte(getKibanaVersion(), '8.8.0')) { triger = 'Created report for'; @@ -143,14 +143,14 @@ export class Discover { triger = 'CSV created for'; } // Attempt to find the "Created report for" message within the timeout - cy.contains(triger, {timeout: 50000}) + cy.contains(triger, {timeout: timeout}) .then($message => { if ($message.length !== 0) { // Close the "Created report for" toast cy.get('[data-test-subj="toastCloseButton"]').click(); // Wait for the "Created report for" message to disappear - cy.contains(triger, {timeout: 50000}).should('not.exist'); + cy.contains(triger, {timeout: timeout}).should('not.exist'); } else { // If the message is not found throw new Error(`Report generation failed: "${ triger }" message not found within timeout.`); } diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 9680730..6ca265b 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -31,7 +31,6 @@ export class Login { static signOut() { cy.get('#rorMenuPopover', {timeout: 1000}).click() - // cy.get('[data-test-subj="userMenuButton"]', {timeout: 1000}).click() .then($userMenu => { if ($userMenu.length > 0) { cy.contains('button', 'Log out').click({force: true}); diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts index 2d201f7..bdc8512 100644 --- a/e2e-tests/cypress/support/page-objects/management/DataViews.ts +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -75,9 +75,6 @@ export class DataViews { ).then(els => { [...els].forEach(el => cy.wrap(el).type(`${ dataViewName }{del}`)); }); - // cy.get('[data-test-subj="comboBoxSearchInput"]').click(); - // cy.wait(50000); - // cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---{enter}`); // Save the data view cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index c24fd83..d6d5f58 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -19,7 +19,7 @@ export class Reports { }); } - static waitForAllReportsToBeDone(reportTitle: string = 'Untitled discover search') { + static checkAllReports(reportTitle: string = 'Untitled discover search') { cy.log('waitForAllReportsToBeDone'); cy.get('tr[data-test-subj="reportJobRow"]') diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index 9cae2d3..0d80cc8 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -84,14 +84,6 @@ readonlyrest: auth_key: user1:dev <<: *all-groups - - username: user2 - auth_key: user2:dev - <<: *all-groups - - - username: user3 - auth_key: user3:dev - <<: *all-groups - ror_kbn: - name: kbn1 signature_key: "9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf" From e21ef59164c76cbeb7383c2941d7127b4653401e Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Thu, 29 Aug 2024 15:30:16 +0200 Subject: [PATCH 06/19] All of requested changes. Waiting for pull request --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 4 +++- e2e-tests/cypress/support/commands.ts | 6 ++++-- .../support/page-objects/management/Reports.ts | 15 +-------------- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 056fb68..a389005 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -11,6 +11,7 @@ describe('Report Generation', () => { before(() => { // Attempt to bulk index sample data cy.put({ + user: 'kibana:kibana', url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, payload: [ {create: {}}, @@ -100,7 +101,8 @@ describe('Report Generation', () => { after(() => { cy.delete({ - url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + user: 'kibana:kibana', + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }`, }) }); }); diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index 2a964a9..bade5fc 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -19,11 +19,13 @@ Cypress.Commands.add( Cypress.Commands.add( 'put', ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`, payload}, ...args) => { - const escapedAndStringifyPayload = JSON.stringify(payload); + const formattedPayload = payload.map(item => JSON.stringify(item)).join('\n') + '\n'; + + console.log(`curl -H "Content-Type: application/json" -d '${ formattedPayload }' -XPUT "${ url }" -u ${ user }`); return cy .exec( - `curl -H "Content-Type: application/json" -d '${ escapedAndStringifyPayload }' -XPUT "${ url }" -u ${ user }` + `curl -H "Content-Type: application/json" -d '${ formattedPayload }' -XPUT "${ url }" -u ${ user }` ) .then(result => { console.log(url, result); diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index d6d5f58..2267239 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -78,7 +78,7 @@ export class Reports { Reports.navigateTo(); // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(500); + cy.wait(1000); cy.get('body').then($body => { const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled @@ -96,19 +96,6 @@ export class Reports { // Confirm the deletion in the modal cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); - - } else { - // If "Select All" is not enabled, delete reports page by page as before - cy.log('Deleting reports page by page'); - - let totalPages = 1; - cy.get('.euiPagination__list li:not(.euiPaginationButton-isPlaceholder)').then($pageButtons => { - totalPages = $pageButtons.length; - }); - - for (let currentPage = 1; currentPage <= totalPages; currentPage++) { - // ... (rest of the page-by-page deletion logic remains the same) ... - } } } else { cy.log('No reports found - nothing to delete'); From 4a01358f8236e66fbed4b012ed4bb3548b1cee82 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Thu, 5 Sep 2024 00:34:34 +0200 Subject: [PATCH 07/19] Self-generate invoices data, checking report generation process.. --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 46 +---- e2e-tests/cypress/support/commands.ts | 23 +-- .../cypress/support/page-objects/Discover.ts | 46 ++--- .../cypress/support/page-objects/Login.ts | 5 +- .../cypress/support/page-objects/invoices.ts | 173 ++++++++++++++++++ .../page-objects/management/DataViews.ts | 1 + .../page-objects/management/Reports.ts | 51 ++---- elk-ror/docker-compose.yml | 12 +- 8 files changed, 232 insertions(+), 125 deletions(-) create mode 100644 e2e-tests/cypress/support/page-objects/invoices.ts diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index a389005..52763be 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -2,50 +2,14 @@ import { Login } from "../support/page-objects/Login"; import { DataViews } from "../support/page-objects/management/DataViews"; import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; +import { dataPut } from "../support/page-objects/invoices"; describe('Report Generation', () => { const indexName: string = 'invoices'; const searchName: string = `${ indexName } search`; - before(() => { - // Attempt to bulk index sample data - cy.put({ - user: 'kibana:kibana', - url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, - payload: [ - {create: {}}, - {id: 1, number: "INV001", date: "2024-08-01", amount: "123.45", currency: "USD"}, - {create: {}}, - {id: 2, number: "INV002", date: "2024-08-02", amount: "67.89", currency: "EUR"}, - {create: {}}, - {id: 3, number: "INV003", date: "2024-08-03", amount: "456.78", currency: "GBP"}, - {create: {}}, - {id: 4, number: "INV004", date: "2024-08-04", amount: "90.12", currency: "JPY"}, - {create: {}}, - {id: 5, number: "INV005", date: "2024-08-05", amount: "345.67", currency: "CAD"}, - {create: {}}, - {id: 6, number: "INV006", date: "2024-08-06", amount: "89.01", currency: "AUD"}, - {create: {}}, - {id: 7, number: "INV007", date: "2024-08-07", amount: "234.56", currency: "CHF"}, - {create: {}}, - {id: 8, number: "INV008", date: "2024-08-08", amount: "78.90", currency: "SEK"}, - {create: {}}, - {id: 9, number: "INV009", date: "2024-08-09", amount: "135.79", currency: "NZD"}, - {create: {}}, - {id: 10, number: "INV010", date: "2024-08-10", amount: "246.80", currency: "DKK"}, - {create: {}}, - {id: 11, number: "INV011", date: "2024-08-11", amount: "357.91", currency: "NOK"}, - {create: {}}, - {id: 12, number: "INV012", date: "2024-08-12", amount: "468.02", currency: "ZAR"}, - {create: {}}, - {id: 13, number: "INV013", date: "2024-08-13", amount: "579.13", currency: "BRL"}, - {create: {}}, - {id: 14, number: "INV014", date: "2024-08-14", amount: "680.24", currency: "INR"}, - {create: {}}, - {id: 15, number: "INV015", date: "2024-08-15", amount: "791.35", currency: "RUB"} - ] - }); + dataPut(100000, indexName); }); beforeEach(() => { @@ -55,7 +19,6 @@ describe('Report Generation', () => { DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) - Login.signOut(); }) @@ -70,7 +33,7 @@ describe('Report Generation', () => { Discover.selectDataView(indexName); Discover.saveSearch(searchName); for (let i = 0; i < 10; i++) { - Discover.generateCsvReport(50000); + Discover.generateCsvReport(); } // Go to Reports and check if all reports are not empty @@ -95,7 +58,6 @@ describe('Report Generation', () => { DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) - Login.signOut(); }) @@ -105,4 +67,4 @@ describe('Report Generation', () => { url: `${ Cypress.env().elasticsearchUrl }/${ indexName }`, }) }); -}); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index bade5fc..3a48660 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -19,19 +19,20 @@ Cypress.Commands.add( Cypress.Commands.add( 'put', ({url, user = `${ Cypress.env().login }:${ Cypress.env().password }`, payload}, ...args) => { - const formattedPayload = payload.map(item => JSON.stringify(item)).join('\n') + '\n'; + let curlCommand = `curl -H "Content-Type: application/json" -XPUT "${ url }" -u ${ user }`; - console.log(`curl -H "Content-Type: application/json" -d '${ formattedPayload }' -XPUT "${ url }" -u ${ user }`); + if (Array.isArray(payload) && payload.length > 0) { + const formattedPayload = payload.map(item => JSON.stringify(item)).join('\n') + '\n'; + curlCommand += ` -d '${ formattedPayload }'`; + } - return cy - .exec( - `curl -H "Content-Type: application/json" -d '${ formattedPayload }' -XPUT "${ url }" -u ${ user }` - ) - .then(result => { - console.log(url, result); - return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; - }); - }); + // no log for the cy.exec command, it's too long + return cy.exec(curlCommand, {log: false}).then(result => { + console.log(url, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + }); + } +); Cypress.Commands.add( 'import', diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 325f420..4cce372 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -116,45 +116,25 @@ export class Discover { } } - static generateCsvReport(timeout: number = 50000) { + static generateCsvReport() { cy.log('generateCsvReport'); - // Click the share button to open the sharing options - cy.get('[data-test-subj=shareTopNavButton]').click(); + cy.wait(1500); - // Click the "CSV Reports" option - cy.get('[data-test-subj=sharePanel-CSVReports]').click(); - - // Click the "Generate report" button - cy.get('[data-test-subj=generateReportButton]').click(); + // Click the share button to open the sharing options if it is not opened - // Wait for the "Queued report for search" message to appear - cy.contains('Queued report for search', {timeout: timeout}).should('exist'); + cy.get("body").then($body => { + const $shareContextMenu = $body.find('[data-test-subj="shareContextMenu"]') + if ($shareContextMenu.length == 0) { + cy.get('[data-test-subj="shareTopNavButton"]').click(); + } + }) - // Close the "Queued report for search" toast - cy.get('[data-test-subj="toastCloseButton"]').click(); + // Click the "CSV Reports" option + cy.get('[data-test-subj="sharePanel-CSVReports"]').click(); - // Wait for the "Queued report for search" message to disappear - cy.contains('Queued report for search', {timeout: timeout}).should('not.exist'); - var triger: string; - if (semver.lte(getKibanaVersion(), '8.8.0')) { - triger = 'Created report for'; - } else { - triger = 'CSV created for'; - } - // Attempt to find the "Created report for" message within the timeout - cy.contains(triger, {timeout: timeout}) - .then($message => { - if ($message.length !== 0) { - // Close the "Created report for" toast - cy.get('[data-test-subj="toastCloseButton"]').click(); - - // Wait for the "Created report for" message to disappear - cy.contains(triger, {timeout: timeout}).should('not.exist'); - } else { // If the message is not found - throw new Error(`Report generation failed: "${ triger }" message not found within timeout.`); - } - }); + // Click the "Generate report" button + cy.get('[data-test-subj="generateReportButton"]').click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 6ca265b..d331b81 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -7,6 +7,7 @@ export class Login { localStorage.setItem('home:welcome:show', 'false'); }); cy.visit(Cypress.config().baseUrl); + cy.wait(1000); Login.signIn(); Loader.loading(); } @@ -17,7 +18,7 @@ export class Login { } static fillLoginPage() { - cy.get('#form-username', { timeout: 30000 }).should('be.visible'); + cy.get('#form-username', { timeout: 60000 }).should('be.visible'); cy.get('#form-username').type(Cypress.env().login); cy.get('#form-password').click({ force: true }); cy.get('#form-password').type(Cypress.env().password); @@ -30,6 +31,8 @@ export class Login { } static signOut() { + cy.visit(Cypress.config().baseUrl); + Loader.loading(); cy.get('#rorMenuPopover', {timeout: 1000}).click() .then($userMenu => { if ($userMenu.length > 0) { diff --git a/e2e-tests/cypress/support/page-objects/invoices.ts b/e2e-tests/cypress/support/page-objects/invoices.ts new file mode 100644 index 0000000..6eef4e7 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/invoices.ts @@ -0,0 +1,173 @@ +// invoices.ts + +function generateInvoice(id: number): object { + const month = Math.floor((id - 1) / 31) + 1; // Distribute dates across months + const day = ((id - 1) % 31) + 1; // Ensure day is within 1-31 range + + // Ensure month and day are within valid ranges + const validMonth = month > 12 ? 12 : month; + const validDay = day > 28 ? 28 : day; // Simplified to avoid invalid dates + + return { + id: id, + number: `INV${ id.toString().padStart(3, '0') }`, + date: `2024-${ validMonth.toString().padStart(2, '0') }-${ validDay.toString().padStart(2, '0') }`, + amount: (Math.random() * 1000).toFixed(2), + currency: ['USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'SEK', 'NZD', 'DKK', 'NOK', 'ZAR', 'BRL', 'INR', 'RUB', 'CNY', 'MXN', 'KRW', 'TRY', 'IDR', 'ARS', 'THB', 'PLN', 'PHP', 'CZK', 'HUF', 'MYR', 'ILS', 'SAR', 'AED', 'COP', 'CLP', 'EGP', 'VND', 'UAH', 'KES', 'NGN', 'PKR'][Math.floor(Math.random() * 37)], + customerName: `Customer ${ id }`, + customerEmail: `customer${ id }example.com`, + status: ['Paid', 'Unpaid', 'Pending'][Math.floor(Math.random() * 3)], + description: `Invoice for service ${ id }`, + address: `${ id } Main St, City, Country`, + phoneNumber: `1-555-${ id.toString().padStart(4, '0') }`, + taxId: `${ id.toString().padStart(3, '0') }-45-6789`, + paymentMethod: ['Credit Card', 'Bank Transfer', 'PayPal', 'Cash'][Math.floor(Math.random() * 4)], + notes: ['Paid in full', 'Awaiting payment', 'Pending approval'][Math.floor(Math.random() * 3)] + }; +} + +function generateInvoices(count: number): object[] { + const invoices = []; + for (let i = 1; i <= count; i++) { + invoices.push({create: {}}); + invoices.push(generateInvoice(i)); + } + return invoices; +} + +function chunkArray(array: any[], chunkSize: number): any[][] { + const chunks = []; + for (let i = 0; i < array.length; i += chunkSize) { + chunks.push(array.slice(i, i + chunkSize)); + } + return chunks; +} + +function handleBulkResponse(response: string | undefined): void { + if (response === undefined) { + console.error('Response is undefined'); + return; + } + + try { + const parsedResponse = JSON.parse(response); + const items = parsedResponse.items; + + items.forEach((item: any) => { + const createResult = item.create; + if (createResult.status === 201) { + console.log(`Invoice ${ createResult._id } created successfully.`); + } else { + console.error(`Failed to create invoice ${ createResult._id }: ${ createResult.error.reason }`); + } + }); + } catch (error) { + console.error('Failed to parse response:', error); + } +} + +function calculateSizeInBytes(object: any): number { + return Buffer.byteLength(JSON.stringify(object), 'utf8'); +} + +function checkBulkSizeLimit(invoices: object[], chunkSize: number): void { + const chunks = chunkArray(invoices, chunkSize); + const maxSizeInBytes = 100 * 1024 * 1024; // 100 MB + + chunks.forEach((chunk, index) => { + const chunkSizeInBytes = calculateSizeInBytes(chunk); + if (chunkSizeInBytes > maxSizeInBytes) { + console.error(`Chunk ${ index + 1 } exceeds the 100 MB limit with size: ${ chunkSizeInBytes } bytes`); + } else { + console.log(`Chunk ${ index + 1 } is within the limit with size: ${ chunkSizeInBytes } bytes`); + } + }); +} + +function checkIndexExists(indexName: string): Cypress.Chainable { + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + return cy.getRequest({ + url: `${ elasticsearchUrl }/${ indexName }`, + user: 'kibana:kibana' + }).then(response => { + return response.status !== 404; + }); +} + +function createIndex(indexName: string): Cypress.Chainable { + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + return cy.put({ + url: `${ elasticsearchUrl }/${ indexName }`, + user: 'kibana:kibana', + payload: {} + }).then((response: any) => { + handleIndexCreationResponse(response); + }); +} + +export async function dataPut(count: number, indexName: string, chunkSize: number = 300): Promise { + chunkSize = chunkSize * 2; + if (typeof cy.put !== 'function') { + throw new Error('cy.put is not defined'); + } + + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + if (!elasticsearchUrl) { + throw new Error('Cypress.env().elasticsearchUrl is not defined'); + } + + const invoices = generateInvoices(count); + checkBulkSizeLimit(invoices, chunkSize); // Check size limit + const chunks = chunkArray(invoices, chunkSize); + + const processChunk = async (chunk: any[], index: number) => { + return cy.put({ + user: 'kibana:kibana', + url: `${elasticsearchUrl}/${indexName}/_bulk`, + payload: chunk // Pass the chunk array directly + }).then((response: any) => { + handleBulkResponse(response.stdout); + if ((index + 1) % 100 === 0) { + cy.log(`Chunk ${index + 1} processed successfully.`); + } + }); + }; + + const processChunksInBatches = async (chunks: any[][], batchSize: number) => { + const threads = 50; + for (let i = 0; i < chunks.length; i += batchSize * threads) { + const batch = chunks.slice(i, i + batchSize * threads); + await Promise.all(batch.map((chunk, index) => processChunk(chunk, i + index))); + } + }; + + const indexExists = await checkIndexExists(indexName); + cy.log(`Index ${indexName} exists: ${indexExists}`); + if (!indexExists) { + await createIndex(indexName); + } + + const startTime = Date.now(); + await processChunksInBatches(chunks, 100); + const endTime = Date.now(); + const duration = endTime - startTime; + cy.log(`All requests completed in ${duration} seconds.`); +} + +function handleIndexCreationResponse(response: any): void { + if (!response || !response.stdout) { + console.error('Response or response.stdout is undefined'); + return; + } + + try { + const parsedResponse = JSON.parse(response.stdout); + if (parsedResponse.acknowledged) { + console.log('Index creation acknowledged.'); + } else { + console.error('Index creation not acknowledged.'); + } + } catch (error) { + console.error('Failed to parse response:', error); + } +} diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts index bdc8512..da47df0 100644 --- a/e2e-tests/cypress/support/page-objects/management/DataViews.ts +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -15,6 +15,7 @@ export class DataViews { // Delete "invoices" index pattern if it exists cy.get('[data-test-subj="savedObjectSearchBar"]').type(objectName + "{enter}"); + cy.wait(1000); cy.get('body').then($body => { // Find the table row containing *exactly* "invoices" in the title const $invoicesIndexPatternRow = $body.find(`[data-test-subj="savedObjectsTableRowTitle"] a`) diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index 2267239..ef5b9ef 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -1,6 +1,4 @@ import { KibanaNavigation } from '../KibanaNavigation'; -import semver from "semver/preload"; -import { getKibanaVersion } from "../../helpers"; export class Reports { static navigateTo() { @@ -15,7 +13,7 @@ export class Reports { } // Now, click on Reporting (whether we were already on Stack Management or not) - cy.contains('Reporting').click(); + cy.contains('Reporting').click({timeout: 10000}); }); } @@ -23,47 +21,28 @@ export class Reports { cy.log('waitForAllReportsToBeDone'); cy.get('tr[data-test-subj="reportJobRow"]') - .each($reportItem => { - cy.wrap($reportItem) - .find('[data-test-subj="reportingListItemObjectTitle"]') - .should('contain.text', reportTitle); - - cy.wrap($reportItem) - .find('[data-test-subj="reportJobStatus"]') - .contains(/Done|Completed/, {timeout: 60000}) - .should('be.visible'); - - // Click the download button - if (semver.lte(getKibanaVersion(), '8.8.0')) { - cy.wrap($reportItem) - .find('[data-test-subj="reportJobActions"] button') - .first() - .click(); - } else { + .then($reportItems => { + // Convert the jQuery object to an array and reverse it + const reversedReportItems = Cypress.$($reportItems.get().reverse()); + + // Iterate over the reversed array + cy.wrap(reversedReportItems).each($reportItem => { cy.wrap($reportItem) - .find('[data-test-subj="reportDownloadLink"]') - .first() - .click(); - } + .find('[data-test-subj="reportingListItemObjectTitle"]') + .should('contain.text', reportTitle); - // Assert that a file is downloaded - cy.verifyDownload(`${ reportTitle }.csv`, {timeout: 10000}) // Adjust timeout if needed - .then(filePath => { - // Read the downloaded file content and assert it's not empty - cy.readFile(filePath) - .should('not.be.empty') - .then(fileContent => { - const rows = fileContent.split('\n'); - expect(rows.length).to.be.greaterThan(1); - }); + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 60000}) + .should('be.visible').then($status => { }); + }); }) .then($matchingReports => { expect($matchingReports).to.have.length(10); }); } - static verifyNoReports() { cy.log('verifyNoReports'); @@ -78,7 +57,7 @@ export class Reports { Reports.navigateTo(); // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(1000); + cy.wait(5000); cy.get('body').then($body => { const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled diff --git a/elk-ror/docker-compose.yml b/elk-ror/docker-compose.yml index 67d63dd..44ca912 100644 --- a/elk-ror/docker-compose.yml +++ b/elk-ror/docker-compose.yml @@ -30,6 +30,11 @@ services: memlock: soft: -1 hard: -1 + deploy: + resources: + limits: + memory: 1G + cpus: '0.5' kbn-ror: build: @@ -45,6 +50,10 @@ services: deploy: mode: replicated replicas: 3 + resources: + limits: + memory: 1G + cpus: '0.5' environment: ELASTIC_USER_PASSWORD: elastic ES_API_URL: http://es-ror:9200 @@ -70,10 +79,9 @@ services: condition: service_healthy ports: - "5601:80" - # todo: healthcheck networks: - es-ror-network networks: es-ror-network: - driver: bridge + driver: bridge \ No newline at end of file From b8ad596a73b0b70a792beb3dd3277164d38d5b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Ko=C5=82odziejczyk?= Date: Wed, 11 Sep 2024 20:02:12 +0200 Subject: [PATCH 08/19] Pipeline fix and logging improvement (#6) --- .github/workflows/trigger-e2e-tests.yml | 26 ++++++------------------- e2e-tests/cypress.config.ts | 2 +- e2e-tests/package.json | 2 +- elk-ror/docker-compose.yml | 7 ++++++- elk-ror/images/kbn/Dockerfile | 15 ++++++++++++-- elk-ror/print-logs.sh | 8 ++++++++ run-8x.sh | 2 +- run.sh | 5 +++++ 8 files changed, 41 insertions(+), 26 deletions(-) create mode 100755 elk-ror/print-logs.sh diff --git a/.github/workflows/trigger-e2e-tests.yml b/.github/workflows/trigger-e2e-tests.yml index bf22ea6..4b0f169 100644 --- a/.github/workflows/trigger-e2e-tests.yml +++ b/.github/workflows/trigger-e2e-tests.yml @@ -4,26 +4,11 @@ on: workflow_dispatch: schedule: - cron: '0 0 * * *' -# pull_request: -# types: [opened, synchronize, reopened] - -# jobs: -# check-internal: -# runs-on: ubuntu-latest -# outputs: -# is_member: ${{ steps.org_member_check.outputs.member }} -# steps: -# - name: Is PR creator an organization member? -# id: org_member_check -# uses: JamesSingleton/is-organization-member@1.0.0 -# with: -# organization: beshu-tech -# username: ${{ github.actor }} -# token: ${{ secrets.GITHUB_TOKEN }} + pull_request: + types: [opened, synchronize, reopened] +jobs: e2e-tests: - # needs: check-internal - # if: needs.check-internal.outputs.is_member == 'true' || github.event.label.name == 'run-tests' runs-on: ubuntu-latest strategy: matrix: @@ -34,8 +19,9 @@ on: - name: Run tests run: ./run-${{ matrix.version }}.sh env: - ROR_ACTIVATION_KEY: ${{ secrets.ROR_KBN_LICENSE }} - - name: S3 Upload Videos & logs + ROR_ACTIVATION_KEY: ${{ secrets.ROR_KBN_LICENSE }} + - name: S3 Upload Videos & show logs + if: failure() env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts index 9e75ece..196b1df 100644 --- a/e2e-tests/cypress.config.ts +++ b/e2e-tests/cypress.config.ts @@ -4,7 +4,7 @@ export default defineConfig({ env: { login: 'admin', password: 'dev', - kibanaVersion: 'NOT_SET_YET', + kibanaVersion: 'KIBANA_VERSION_NOT_SET_YET', elasticsearchUrl: 'http://localhost:19200', enterpriseActivationKey: 'PROVIDE_YOUR_ACTIVATION_KEY' }, diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 4ca32c6..9885d69 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -7,7 +7,7 @@ "lint": "eslint .", "lint:fix": "yarn lint -- --fix", "open": "./node_modules/.bin/cypress open", - "run": "./node_modules/.bin/cypress run" + "run": "ELECTRON_ENABLE_LOGGING=1 ./node_modules/.bin/cypress run" }, "license": "Beshu Limited, All rights reserved", "dependencies": { diff --git a/elk-ror/docker-compose.yml b/elk-ror/docker-compose.yml index 67d63dd..e36568e 100644 --- a/elk-ror/docker-compose.yml +++ b/elk-ror/docker-compose.yml @@ -70,7 +70,12 @@ services: condition: service_healthy ports: - "5601:80" - # todo: healthcheck + healthcheck: + test: [ "CMD", "curl", "--fail", "http://localhost:80/api/status" ] + interval: 10s + timeout: 10s + retries: 30 + start_period: 60s networks: - es-ror-network diff --git a/elk-ror/images/kbn/Dockerfile b/elk-ror/images/kbn/Dockerfile index ba837e3..54c7120 100644 --- a/elk-ror/images/kbn/Dockerfile +++ b/elk-ror/images/kbn/Dockerfile @@ -13,8 +13,19 @@ RUN /usr/share/kibana/bin/kibana-plugin install file:///tmp/ror.zip USER root -RUN /usr/share/kibana/node/bin/node plugins/readonlyrestkbn/ror-tools.js patch && \ - chown -R kibana:kibana /usr/share/kibana/config +RUN \ + NODE_PATH="" && \ + if [ -x "/usr/share/kibana/node/bin/node" ]; then \ + NODE_PATH="/usr/share/kibana/node/bin/node"; \ + elif [ -x "/usr/share/kibana/node/glibc-217/bin/node" ]; then \ + NODE_PATH="/usr/share/kibana/node/glibc-217/bin/node"; \ + else \ + echo "Cannot find the Node binary! Please report the problem!"; \ + exit 1; \ + fi && \ + INVOKE_ROR_TOOLS="$NODE_PATH /usr/share/kibana/plugins/readonlyrestkbn/ror-tools.js" && \ + $INVOKE_ROR_TOOLS patch && \ + chown -R kibana:kibana /usr/share/kibana/config USER kibana diff --git a/elk-ror/print-logs.sh b/elk-ror/print-logs.sh new file mode 100755 index 0000000..8d08a55 --- /dev/null +++ b/elk-ror/print-logs.sh @@ -0,0 +1,8 @@ +#!/bin/bash -e + +cd "$(dirname "$0")" + +echo "Logs from docker compose:" +echo "-----------------------------------------------------------------------" +cat elk-ror.log +echo "-----------------------------------------------------------------------" \ No newline at end of file diff --git a/run-8x.sh b/run-8x.sh index 1c261a4..ffc92a3 100755 --- a/run-8x.sh +++ b/run-8x.sh @@ -1,3 +1,3 @@ #!/bin/bash -e -./run.sh "8.15.0" \ No newline at end of file +./run.sh "8.14.3" \ No newline at end of file diff --git a/run.sh b/run.sh index ddf3f39..efd249b 100755 --- a/run.sh +++ b/run.sh @@ -7,10 +7,15 @@ fi ELK_VERSION="$1" +handle_error() { + ./elk-ror/print-logs.sh +} + cleanup() { ./elk-ror/stop-and-clean.sh } +trap handle_error ERR trap cleanup EXIT echo -e " From 0b75e9a46b2d9315c7d9a058c994aba9e4711659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Ko=C5=82odziejczyk?= Date: Wed, 18 Sep 2024 22:29:35 +0200 Subject: [PATCH 09/19] Sync 8.15.0 changes (#9) --- e2e-tests/cypress.config.ts | 3 +- e2e-tests/cypress/e2e/Activation-keys.cy.ts | 6 +- .../cypress/e2e/Direct-kibana-request.cy.ts | 85 +++-- .../e2e/Kibana-content-overwrite.cy.ts | 43 +++ .../e2e/Sanity-check-ro-kibana-access.cy.ts | 7 +- ...Sanity-check-ro_strict-kibana-access.cy.ts | 7 +- e2e-tests/cypress/e2e/Sanity-check.cy.ts | 72 +--- e2e-tests/cypress/e2e/Saved-objects.cy.ts | 12 +- .../cypress/fixtures/defaultSettings.json | 2 +- .../cypress/fixtures/reportingSettings.json | 2 +- e2e-tests/cypress/fixtures/roSettings.json | 2 +- .../cypress/fixtures/roStrictSettings.json | 2 +- e2e-tests/cypress/fixtures/testSettings.json | 2 +- e2e-tests/cypress/plugins/index.js | 2 +- e2e-tests/cypress/support/commands.ts | 125 +++++-- e2e-tests/cypress/support/e2e.ts | 16 +- .../support/helpers/EsApiAdvancedClient.ts | 20 ++ .../cypress/support/helpers/EsApiClient.ts | 50 +++ .../support/helpers/KbnApiAdvancedClient.ts | 27 ++ .../cypress/support/helpers/KbnApiClient.ts | 70 ++++ .../cypress/support/helpers/SampleData.ts | 19 ++ e2e-tests/cypress/support/helpers/index.ts | 2 + .../page-objects/DirectKibanaRequest.ts | 69 ---- .../cypress/support/page-objects/Discover.ts | 13 +- .../cypress/support/page-objects/Editor.ts | 8 +- .../support/page-objects/Impersonate.ts | 13 +- .../cypress/support/page-objects/Loader.ts | 2 +- .../cypress/support/page-objects/Reporting.ts | 14 +- .../cypress/support/page-objects/RorMenu.ts | 1 + .../cypress/support/page-objects/Settings.ts | 7 +- .../support/page-objects/StackManagement.ts | 28 ++ e2e-tests/package.json | 2 +- e2e-tests/yarn.lock | 320 +++++++++--------- elk-ror/conf/es/readonlyrest.yml | 11 +- elk-ror/docker-compose.yml | 16 +- run-7x.sh | 2 +- run-8x.sh | 2 +- 37 files changed, 666 insertions(+), 418 deletions(-) create mode 100644 e2e-tests/cypress/e2e/Kibana-content-overwrite.cy.ts create mode 100644 e2e-tests/cypress/support/helpers/EsApiAdvancedClient.ts create mode 100644 e2e-tests/cypress/support/helpers/EsApiClient.ts create mode 100644 e2e-tests/cypress/support/helpers/KbnApiAdvancedClient.ts create mode 100644 e2e-tests/cypress/support/helpers/KbnApiClient.ts create mode 100644 e2e-tests/cypress/support/helpers/SampleData.ts delete mode 100644 e2e-tests/cypress/support/page-objects/DirectKibanaRequest.ts diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts index 196b1df..9ada94f 100644 --- a/e2e-tests/cypress.config.ts +++ b/e2e-tests/cypress.config.ts @@ -6,7 +6,8 @@ export default defineConfig({ password: 'dev', kibanaVersion: 'KIBANA_VERSION_NOT_SET_YET', elasticsearchUrl: 'http://localhost:19200', - enterpriseActivationKey: 'PROVIDE_YOUR_ACTIVATION_KEY' + enterpriseActivationKey: 'PROVIDE_YOUR_ACTIVATION_KEY', + kibanaUserCredentials: "kibana:kibana" }, video: true, screenshotOnRunFailure: true, diff --git a/e2e-tests/cypress/e2e/Activation-keys.cy.ts b/e2e-tests/cypress/e2e/Activation-keys.cy.ts index 8de3567..a1904cb 100644 --- a/e2e-tests/cypress/e2e/Activation-keys.cy.ts +++ b/e2e-tests/cypress/e2e/Activation-keys.cy.ts @@ -1,5 +1,6 @@ import { Login } from '../support/page-objects/Login'; import { ActivationKeys } from '../support/page-objects/ActivationKeys'; +import { userCredentials } from '../support/helpers'; // TODO: describe.skip('Activation key', () => { @@ -9,8 +10,9 @@ describe.skip('Activation key', () => { }); afterEach(() => { - cy.post({ - url: `"${Cypress.config().baseUrl}/api/ror/license?overwrite=true"`, + cy.kbnPost({ + endpoint: "api/ror/license?overwrite=true", + credentials: userCredentials, payload: { license: `${Cypress.env().enterpriseActivationKey}` } }); }); diff --git a/e2e-tests/cypress/e2e/Direct-kibana-request.cy.ts b/e2e-tests/cypress/e2e/Direct-kibana-request.cy.ts index 563e545..3a97a2c 100644 --- a/e2e-tests/cypress/e2e/Direct-kibana-request.cy.ts +++ b/e2e-tests/cypress/e2e/Direct-kibana-request.cy.ts @@ -1,15 +1,15 @@ import * as semver from 'semver'; -import { DataViews, DirectKibanaRequest, GetObject } from '../support/page-objects/DirectKibanaRequest'; -import { getKibanaVersion } from '../support/helpers'; +import { getKibanaVersion, userCredentials } from '../support/helpers'; +import { kbnApiAdvancedClient } from '../support/helpers/KbnApiAdvancedClient'; describe('Direct kibana request', () => { const user = 'user1:dev'; afterEach(() => { const clearDirectKibanaRequestState = () => { - DirectKibanaRequest.deleteSavedObjects(user); + kbnApiAdvancedClient.deleteSavedObjects(user); if (semver.gte(getKibanaVersion(), '8.0.0')) { - DirectKibanaRequest.deleteDataViews(user); + kbnApiAdvancedClient.deleteDataViews(user); } }; @@ -18,70 +18,63 @@ describe('Direct kibana request', () => { it('should check direct kibana request', () => { const verifySavedObjects = () => { - DirectKibanaRequest.deleteSavedObjects(user); + kbnApiAdvancedClient.deleteSavedObjects(user); cy.log('Import saved objects for user1'); - cy.import({ - url: `${Cypress.config().baseUrl}/api/saved_objects/_import?overwrite=true`, - filename: 'cypress/fixtures/file.ndjson', - user + cy.kbnImport({ + endpoint: "api/saved_objects/_import?overwrite=true", + credentials: user, + filename: 'cypress/fixtures/file.ndjson' }); cy.log('Get imported saved objects for user1 Administrators group'); - cy.getRequest({ - url: DirectKibanaRequest.getObjectsUrl(), - user - }).then((result: GetObject) => { + kbnApiAdvancedClient.getSavedObjects(user).then(result => { expect(result.saved_objects[0].id).equal('my-pattern'); expect(result.saved_objects[1].id).equal('my-dashboard'); - }); + }) cy.log('Get imported saved objects for admin Administrators group'); - cy.getRequest({ - url: DirectKibanaRequest.getObjectsUrl() - }).then((result: GetObject) => { - expect(result.saved_objects[0].id).equal('my-pattern'); - expect(result.saved_objects[1].id).equal('my-dashboard'); - expect(result.saved_objects).to.have.length(2); - }); + kbnApiAdvancedClient + .getSavedObjects(userCredentials) + .then(result => { + expect(result.saved_objects[0].id).equal('my-pattern'); + expect(result.saved_objects[1].id).equal('my-dashboard'); + expect(result.saved_objects).to.have.length(2); + }); cy.log('Get imported saved objects for user1 infosec group'); - cy.getRequest({ - url: DirectKibanaRequest.getObjectsUrl(), - user, - header: 'x-ror-current-group: infosec_group' - }).then((result: GetObject) => { - const actual = result.saved_objects.some( - saved_object => saved_object.id === 'my-pattern' || saved_object.id === 'my-dashboard' - ); - // eslint-disable-next-line no-unused-expressions - expect(actual).to.be.false; - }); + kbnApiAdvancedClient.getSavedObjects(user, "infosec_group") + .then(result => { + const actual = result.saved_objects.some( + saved_object => saved_object.id === 'my-pattern' || saved_object.id === 'my-dashboard' + ); + // eslint-disable-next-line no-unused-expressions + expect(actual).to.be.false; + }); }; const verifyDataViews = () => { - DirectKibanaRequest.deleteDataViews(user); + kbnApiAdvancedClient.deleteDataViews(user); cy.log('Create data_views for user1 Administrators group'); - cy.post({ - url: `${Cypress.config().baseUrl}/api/data_views/data_view`, - payload: { + kbnApiAdvancedClient.createDataView( + { data_view: { id: 'logstash', title: 'logstash-*', name: 'My Logstash Data View' } - } - }); + }, + user + ); cy.log('get all data_views for user1 infosec group'); - cy.getRequest({ - url: `${Cypress.config().baseUrl}/api/data_views`, - header: 'x-ror-current-group: infosec_group' - }).then((result: DataViews) => { - const actual = result.data_view.some(saved_object => saved_object.id === 'logstash'); - // eslint-disable-next-line no-unused-expressions - expect(actual).to.be.false; - }); + kbnApiAdvancedClient + .getDataViews(userCredentials, "infosec_group") + .then(result => { + const actual = result.data_view.some(saved_object => saved_object.id === 'logstash'); + // eslint-disable-next-line no-unused-expressions + expect(actual).to.be.false; + }); }; verifySavedObjects(); diff --git a/e2e-tests/cypress/e2e/Kibana-content-overwrite.cy.ts b/e2e-tests/cypress/e2e/Kibana-content-overwrite.cy.ts new file mode 100644 index 0000000..4a0f683 --- /dev/null +++ b/e2e-tests/cypress/e2e/Kibana-content-overwrite.cy.ts @@ -0,0 +1,43 @@ +import * as semver from 'semver'; +import { Login } from '../support/page-objects/Login'; +import { StackManagement } from '../support/page-objects/StackManagement'; +import { KibanaNavigation } from '../support/page-objects/KibanaNavigation'; +import { getKibanaVersion } from '../support/helpers'; + +describe('Kibana-content-overwrite', () => { + beforeEach(() => { + Login.initialization(); + }); + + it('should overwrite Kibana alerting content', () => { + const isAlertingOverwritePageVisible = () => { + if (semver.gte(getKibanaVersion(), '8.6.0')) { + cy.contains( + 'Kibana alerting does not work with ReadonlyREST, but we are working on an even better alerting and reporting solution.' + ).should('be.visible'); + } else { + cy.contains( + 'Kibana alerting does not work with ReadonlyREST, but we are working on an even better alerting and reporting solution.' + ).should('not.exist'); + } + }; + + if (semver.gte(getKibanaVersion(), '8.6.0')) { + if (semver.gte(getKibanaVersion(), '8.14.0')) { + StackManagement.openAlertsPage(); + isAlertingOverwritePageVisible(); + KibanaNavigation.openHomepage(); + } + StackManagement.openRulesPage(); + isAlertingOverwritePageVisible(); + + KibanaNavigation.openHomepage(); + + StackManagement.openConnectorsPage(); + isAlertingOverwritePageVisible(); + } else { + StackManagement.openRulesAndConnectorsPage(); + isAlertingOverwritePageVisible(); + } + }); +}); diff --git a/e2e-tests/cypress/e2e/Sanity-check-ro-kibana-access.cy.ts b/e2e-tests/cypress/e2e/Sanity-check-ro-kibana-access.cy.ts index 5916924..267de7f 100644 --- a/e2e-tests/cypress/e2e/Sanity-check-ro-kibana-access.cy.ts +++ b/e2e-tests/cypress/e2e/Sanity-check-ro-kibana-access.cy.ts @@ -3,6 +3,8 @@ import { RoAndRoStrictKibanaAccessAssertions } from '../support/page-objects/RoA import roSettings from '../fixtures/roSettings.json'; import { Settings } from '../support/page-objects/Settings'; import defaultSettings from '../fixtures/defaultSettings.json'; +import { kbnApiClient, KbnApiClient } from '../support/helpers/KbnApiClient'; +import { userCredentials } from '../support/helpers'; describe('sanity check ro kibana access', () => { beforeEach(() => { @@ -11,10 +13,7 @@ describe('sanity check ro kibana access', () => { afterEach(() => { Settings.setSettingsData(defaultSettings); - cy.deleteRequest({ - url: `${Cypress.config().baseUrl}/api/sample_data/ecommerce`, - header: 'x-ror-current-group: template_group' - }); + kbnApiClient.deleteSampleData("ecommerce", userCredentials, "template_group"); }); it('should verify that everything works', () => { diff --git a/e2e-tests/cypress/e2e/Sanity-check-ro_strict-kibana-access.cy.ts b/e2e-tests/cypress/e2e/Sanity-check-ro_strict-kibana-access.cy.ts index 6ec2e0c..5885142 100644 --- a/e2e-tests/cypress/e2e/Sanity-check-ro_strict-kibana-access.cy.ts +++ b/e2e-tests/cypress/e2e/Sanity-check-ro_strict-kibana-access.cy.ts @@ -3,6 +3,8 @@ import { RoAndRoStrictKibanaAccessAssertions } from '../support/page-objects/RoA import roStrictSettings from '../fixtures/roStrictSettings.json'; import { Settings } from '../support/page-objects/Settings'; import defaultSettings from '../fixtures/defaultSettings.json'; +import { kbnApiClient, KbnApiClient } from '../support/helpers/KbnApiClient'; +import { userCredentials } from '../support/helpers'; describe('sanity check ro_strict kibana access', () => { beforeEach(() => { @@ -11,10 +13,7 @@ describe('sanity check ro_strict kibana access', () => { afterEach(() => { Settings.setSettingsData(defaultSettings); - cy.deleteRequest({ - url: `${Cypress.config().baseUrl}/api/sample_data/ecommerce`, - header: 'x-ror-current-group: template_group' - }); + kbnApiClient.deleteSampleData("ecommerce", userCredentials, "template_group"); }); it('should verify that everything works', () => { diff --git a/e2e-tests/cypress/e2e/Sanity-check.cy.ts b/e2e-tests/cypress/e2e/Sanity-check.cy.ts index 6f6b0f3..2a8d879 100644 --- a/e2e-tests/cypress/e2e/Sanity-check.cy.ts +++ b/e2e-tests/cypress/e2e/Sanity-check.cy.ts @@ -6,74 +6,28 @@ import { Reporting } from '../support/page-objects/Reporting'; import { KibanaNavigation } from '../support/page-objects/KibanaNavigation'; import { getKibanaVersion } from '../support/helpers'; import { Loader } from '../support/page-objects/Loader'; -import { DirectKibanaRequest, GetIndices, GetObject, GetReport } from '../support/page-objects/DirectKibanaRequest'; +import { esApiAdvancedClient } from '../support/helpers/EsApiAdvancedClient'; +import { kbnApiAdvancedClient } from '../support/helpers/KbnApiAdvancedClient'; +import { SampleData } from '../support/helpers/SampleData'; describe('sanity check', () => { beforeEach(() => { + SampleData.createSampleData("sample_index", 1) Login.initialization(); }); afterEach(() => { - const clearSanityCheckState = () => { - cy.getRequest({ url: DirectKibanaRequest.getObjectsUrl() }).then((result: GetObject) => { - result.saved_objects.map(savedObject => - cy.deleteRequest({ url: DirectKibanaRequest.deleteObjectUrl(savedObject.type, savedObject.id) }) - ); - }); - - cy.getRequest({ url: DirectKibanaRequest.getObjectsUrl(), header: 'x-ror-current-group: infosec_group' }).then( - (result: GetObject) => { - result.saved_objects.map(savedObject => - cy.deleteRequest({ - url: DirectKibanaRequest.deleteObjectUrl(savedObject.type, savedObject.id), - header: 'x-ror-current-group: infosec_group' - }) - ); - } - ); - - cy.getRequest({ url: DirectKibanaRequest.getIndices, user: 'kibana:kibana' }).then((result: GetIndices[]) => { - const reportingIndex = result.find(index => index.index.startsWith('.reporting')); - - cy.getRequest({ url: DirectKibanaRequest.getReportUrl(reportingIndex.index) }).then((result: GetReport) => { - result.hits.hits.map(report => - cy.deleteRequest({ - url: DirectKibanaRequest.deleteReportUrl(reportingIndex.index, report._id), - user: 'kibana:kibana' - }) - ); - }); - }); - - cy.getRequest({ - url: DirectKibanaRequest.getIndices, - user: 'kibana:kibana', - header: 'x-ror-current-group: infosec_group' - }).then((result: GetIndices[]) => { - const reportingIndex = result.find(index => index.index.startsWith('.reporting')); - - cy.getRequest({ - url: DirectKibanaRequest.getReportUrl(reportingIndex.index), - header: 'x-ror-current-group: infosec_group' - }).then((result: GetReport) => { - result.hits.hits.map(report => - cy.deleteRequest({ - url: DirectKibanaRequest.deleteReportUrl(reportingIndex.index, report._id), - header: 'x-ror-current-group: infosec_group', - user: 'kibana:kibana' - }) - ); - }); - }); - }; - - clearSanityCheckState(); + esApiAdvancedClient.deleteIndex("sample_index"); + kbnApiAdvancedClient.deleteSavedObjects("admin:dev"); + kbnApiAdvancedClient.deleteSavedObjects("admin:dev", "infosec_group") + esApiAdvancedClient.pruneAllReportingIndices(); }); it('should verify that everything works', () => { cy.log('Initialize Administrator tenancy'); + Discover.openDataViewPage(); - Discover.createIndexPattern('r'); + Discover.createIndexPattern('s'); cy.log('Create a CSV report'); Discover.saveReport('admin_search'); @@ -86,16 +40,16 @@ describe('sanity check', () => { if (semver.gte(getKibanaVersion(), '8.8.0')) { Reporting.noReportsCreatedCheck('rorMenu'); RorMenu.openDataViewsPage(); - Discover.createIndexPattern('re'); + Discover.createIndexPattern('sa'); } else if (semver.gte(getKibanaVersion(), '8.1.0')) { Reporting.noReportsCreatedCheck('rorMenu'); RorMenu.openDataViewsPage(); Discover.openDataViewPage(); - Discover.createIndexPattern('re'); + Discover.createIndexPattern('sa'); } else { Reporting.noReportsCreatedCheck('rorMenu'); Discover.openDataViewPage(); - Discover.createIndexPattern('re'); + Discover.createIndexPattern('sa'); cy.log('Create CSV report for the second tenancy'); Discover.saveReport('infosec_search'); diff --git a/e2e-tests/cypress/e2e/Saved-objects.cy.ts b/e2e-tests/cypress/e2e/Saved-objects.cy.ts index 70377c6..2a098f0 100644 --- a/e2e-tests/cypress/e2e/Saved-objects.cy.ts +++ b/e2e-tests/cypress/e2e/Saved-objects.cy.ts @@ -1,8 +1,8 @@ import * as semver from 'semver'; import { Login } from '../support/page-objects/Login'; import { StackManagement } from '../support/page-objects/StackManagement'; -import { DirectKibanaRequest, GetObject } from '../support/page-objects/DirectKibanaRequest'; import { getKibanaVersion } from '../support/helpers'; +import { kbnApiAdvancedClient } from '../support/helpers/KbnApiAdvancedClient'; describe('Saved objects', () => { beforeEach(() => { @@ -11,15 +11,7 @@ describe('Saved objects', () => { }); afterEach(() => { - const clearSavedObjects = () => { - cy.getRequest({ url: DirectKibanaRequest.getObjectsUrl() }).then((result: GetObject) => { - result.saved_objects.map(savedObject => - cy.deleteRequest({ url: DirectKibanaRequest.deleteObjectUrl(savedObject.type, savedObject.id) }) - ); - }); - }; - - clearSavedObjects(); + kbnApiAdvancedClient.deleteSavedObjects("admin:dev"); }); it('should display saved objects list', () => { diff --git a/e2e-tests/cypress/fixtures/defaultSettings.json b/e2e-tests/cypress/fixtures/defaultSettings.json index 534e79e..8128f51 100644 --- a/e2e-tests/cypress/fixtures/defaultSettings.json +++ b/e2e-tests/cypress/fixtures/defaultSettings.json @@ -1,3 +1,3 @@ { - "settings": "helpers:\n cr: &common-rules\n verbosity: error\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest-audit-'-yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ Personal ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec_group\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" + "settings": "helpers:\n cr: &common-rules\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest_audit_'yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ Personal ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec_group\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" } diff --git a/e2e-tests/cypress/fixtures/reportingSettings.json b/e2e-tests/cypress/fixtures/reportingSettings.json index dd62a9f..80d9032 100644 --- a/e2e-tests/cypress/fixtures/reportingSettings.json +++ b/e2e-tests/cypress/fixtures/reportingSettings.json @@ -1,3 +1,3 @@ { - "settings": "helpers:\n cr: &common-rules\n verbosity: error\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'xxx.reporting-'YYYY-MM\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" + "settings": "helpers:\n cr: &common-rules\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'xxx.reporting-'YYYY-MM\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" } diff --git a/e2e-tests/cypress/fixtures/roSettings.json b/e2e-tests/cypress/fixtures/roSettings.json index 9ac6acb..20e5716 100644 --- a/e2e-tests/cypress/fixtures/roSettings.json +++ b/e2e-tests/cypress/fixtures/roSettings.json @@ -1,3 +1,3 @@ { - "settings": "helpers:\n cr: &common-rules\n verbosity: error\n kibana_access: ro\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest-audit-'-yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" + "settings": "helpers:\n cr: &common-rules\n kibana_access: ro\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest_audit_'yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" } diff --git a/e2e-tests/cypress/fixtures/roStrictSettings.json b/e2e-tests/cypress/fixtures/roStrictSettings.json index 9ac6acb..1049a08 100644 --- a/e2e-tests/cypress/fixtures/roStrictSettings.json +++ b/e2e-tests/cypress/fixtures/roStrictSettings.json @@ -1,3 +1,3 @@ { - "settings": "helpers:\n cr: &common-rules\n verbosity: error\n kibana_access: ro\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest-audit-'-yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" + "settings": "helpers:\n cr: &common-rules\n kibana_access: ro\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: \".kibana_@{acl:current_group}\"\n\n ag: &all-groups\n groups:\n - id: admins_group\n name: administrators\n - id: infosec_group\n name: infosec\n - id: template_group\n name: template\n\n\nreadonlyrest:\n response_if_req_forbidden: Forbidden by ReadonlyREST ES plugin\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'readonlyrest_audit'-yyyy-MM-dd\"\n serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer\n\n access_control_rules:\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n <<: *common-rules\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n <<: *common-rules\n kibana_access: admin\n\n # - name: infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: infosec\n groups: [ infosec_group ]\n <<: *common-rules\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n\n - name: Template Tenancy\n groups: [ template_group ]\n <<: *common-rules\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n <<: *all-groups\n\n - username: user1\n auth_key: user1:dev\n <<: *all-groups\n\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n" } diff --git a/e2e-tests/cypress/fixtures/testSettings.json b/e2e-tests/cypress/fixtures/testSettings.json index 0be6a93..a341ea8 100644 --- a/e2e-tests/cypress/fixtures/testSettings.json +++ b/e2e-tests/cypress/fixtures/testSettings.json @@ -1,4 +1,4 @@ { - "settings": "readonlyrest:\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'roraudit.reporting'-yyyy-MM\"\n access_control_rules:\n - name: \"::Tweets1::\"\n methods: [GET, POST]\n indices: [\"twitter\", \".kibana\"]\n proxy_auth:\n proxy_auth_config: \"proxy1\"\n users: [\"kibana\"]\n groups_provider_authorization:\n user_groups_provider: \"ACME2 External Authentication Service\"\n groups: [\"group3\"]\n\n - name: \"::Facebook2 posts::\"\n methods: [GET, POST]\n indices: [\"facebook\", \".kibana\"]\n proxy_auth:\n proxy_auth_config: \"proxy1\"\n users: [\"kibana\"]\n groups_provider_authorization:\n user_groups_provider: \"ACME2 External Authentication Service\"\n groups: [\"group1\"]\n cache_ttl_in_sec: 60\n\n - name: \"::Tweets::\"\n methods: [GET, POST]\n indices: [\"twitter\", \".kibana\"]\n external_authentication: \"ACME1 External Authorization Service\"\n\n - name: Accept requests to index2 from users with valid LDAP credentials, belonging to LDAP group 'team2'\n ldap_authentication: LDAP 1\n ldap_authorization:\n name: \"LDAP 1\"\n groups: [\"group3\"]\n\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: '.kibana_@{user}'\n verbosity: error\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n kibana_access: admin\n kibana_hide_apps: [ \"Security\", \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: '.kibana_admins'\n verbosity: error\n\n # - name: Infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: INFOSEC_GRP\n groups: [ infosec_group ]\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n kibana_index: .kibana_infosec\n verbosity: error\n\n - name: Template Tenancy\n groups: [ template_group ]\n verbosity: error\n kibana_access: admin\n kibana_index: \".kibana_template\"\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: infosec_group\n name: Infosec\n - id: Template\n name: Template\n\n - username: user1\n auth_key: user1:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: personal_group\n name: Personal\n - id: infosec_group\n name: Infosec\n\n - username: new_user\n auth_key: new_user:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: personal_group\n name: Personal\n - id: infosec_group\n name: Infosec\n\n - username: 'wildcard_user#*'\n groups:\n - g1: group1\n ldap_auth:\n name: \"LDAP 1\"\n groups: [\"group1\"]\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n ldaps:\n\n - name: LDAP 1\n host: \"ldap1.example.com\"\n port: 389\n ssl_enabled: false\n ssl_trust_all_certs: true\n ignore_ldap_connectivity_problems: true\n bind_dn: \"cn=admin,dc=example,dc=com\"\n bind_password: \"password\"\n search_user_base_DN: \"ou=People,dc=example,dc=com\"\n user_id_attribute: \"uid\"\n search_groups_base_DN: \"ou=Groups,dc=example,dc=com\"\n unique_member_attribute: \"uniqueMember\"\n connection_pool_size: 10\n connection_timeout: 10s\n request_timeout: 10s\n cache_ttl: 60s\n group_search_filter: \"(objectClass=group)(cn=application*)\"\n group_name_attribute: \"cn\"\n circuit_breaker:\n max_retries: 2\n reset_duration: 5s\n external_authentication_service_configs:\n - name: \"ACME1 External Authorization Service\"\n authentication_endpoint: \"http://external-website1:8080/auth1\"\n success_status_code: 200\n cache_ttl_in_sec: 60\n validate: false # SSL certificate validation (default to true)\n\n proxy_auth_configs:\n\n - name: \"proxy1\"\n user_id_header: \"X-Auth-Token\" # default X-Forwarded-User\n\n user_groups_providers:\n - name: ACME2 External Authentication Service\n groups_endpoint: \"http://localhost:8080/groups\"\n auth_token_name: \"token\"\n auth_token_passed_as: QUERY_PARAM # HEADER OR QUERY_PARAM\n response_groups_json_path: \"$..groups[?(@.id)].id\" # see: https://github.com/json-path/JsonPath\n cache_ttl_in_sec: 60\n http_connection_settings:\n connection_timeout_in_sec: 5 # default 2\n socket_timeout_in_sec: 3 # default 5\n connection_request_timeout_in_sec: 3 # default 5\n connection_pool_size: 10 # default 30\n", + "settings": "readonlyrest:\n prompt_for_basic_auth: false\n audit:\n enabled: true\n outputs:\n - type: index\n index_template: \"'roraudit.reporting'-yyyy-MM\"\n access_control_rules:\n - name: \"::Tweets1::\"\n methods: [GET, POST]\n indices: [\"twitter\", \".kibana\"]\n proxy_auth:\n proxy_auth_config: \"proxy1\"\n users: [\"kibana\"]\n groups_provider_authorization:\n user_groups_provider: \"ACME2 External Authentication Service\"\n groups: [\"group3\"]\n\n - name: \"::Facebook2 posts::\"\n methods: [GET, POST]\n indices: [\"facebook\", \".kibana\"]\n proxy_auth:\n proxy_auth_config: \"proxy1\"\n users: [\"kibana\"]\n groups_provider_authorization:\n user_groups_provider: \"ACME2 External Authentication Service\"\n groups: [\"group1\"]\n cache_ttl_in_sec: 60\n\n - name: \"::Tweets::\"\n methods: [GET, POST]\n indices: [\"twitter\", \".kibana\"]\n external_authentication: \"ACME1 External Authorization Service\"\n\n - name: Accept requests to index2 from users with valid LDAP credentials, belonging to LDAP group 'team2'\n ldap_authentication: LDAP 1\n ldap_authorization:\n name: \"LDAP 1\"\n groups: [\"group3\"]\n\n - name: KIBANA_SERVER\n auth_key: kibana:kibana\n verbosity: error\n\n - name: PERSONAL_GRP\n groups: [ personal_group ]\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: '.kibana_@{user}'\n\n - name: ADMIN_GRP\n groups: [ admins_group ]\n kibana_access: admin\n kibana_hide_apps: [ \"Security\", \"Enterprise Search|Overview\", \"Observability\" ]\n kibana_index: '.kibana_admins'\n\n # - name: Infosec4search\n # groups: [ infosec_group ]\n # indices: [\"readonlyrest_audit*\"]\n # #filter: '{\"bool\": { \"must_not\": { \"match\": { \"type\": \"xxxx\" }}}}'\n # kibana_index: .kibana_infosec\n # verbosity: error\n\n - name: INFOSEC_GRP\n groups: [ infosec_group ]\n kibana_access: rw\n kibana_hide_apps: [ \"Enterprise Search|Overview\", \"Observability\", \"Management\" ]\n kibana_index: .kibana_infosec\n\n - name: Template Tenancy\n groups: [ template_group ]\n kibana_access: admin\n kibana_index: \".kibana_template\"\n\n - name: \"ReadonlyREST Enterprise instance #1\"\n kibana_index: \".kibana_external_auth\"\n ror_kbn_auth:\n name: \"kbn1\"\n\n # USERS TO GROUPS ############\n users:\n - username: admin\n auth_key: admin:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: infosec_group\n name: Infosec\n - id: Template\n name: Template\n\n - username: user1\n auth_key: user1:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: personal_group\n name: Personal\n - id: infosec_group\n name: Infosec\n\n - username: new_user\n auth_key: new_user:dev\n groups:\n - id: admins_group\n name: Administrators\n - id: personal_group\n name: Personal\n - id: infosec_group\n name: Infosec\n\n - username: 'wildcard_user#*'\n groups:\n - g1: group1\n ldap_auth:\n name: \"LDAP 1\"\n groups: [\"group1\"]\n ror_kbn:\n - name: kbn1\n signature_key: \"9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf\"\n\n impersonation:\n - impersonator: admin\n users: [\"*\"]\n auth_key: admin:dev\n ldaps:\n\n - name: LDAP 1\n host: \"ldap1.example.com\"\n port: 389\n ssl_enabled: false\n ssl_trust_all_certs: true\n ignore_ldap_connectivity_problems: true\n bind_dn: \"cn=admin,dc=example,dc=com\"\n bind_password: \"password\"\n search_user_base_DN: \"ou=People,dc=example,dc=com\"\n user_id_attribute: \"uid\"\n search_groups_base_DN: \"ou=Groups,dc=example,dc=com\"\n unique_member_attribute: \"uniqueMember\"\n connection_pool_size: 10\n connection_timeout: 10s\n request_timeout: 10s\n cache_ttl: 60s\n group_search_filter: \"(objectClass=group)(cn=application*)\"\n group_name_attribute: \"cn\"\n circuit_breaker:\n max_retries: 2\n reset_duration: 5s\n external_authentication_service_configs:\n - name: \"ACME1 External Authorization Service\"\n authentication_endpoint: \"http://external-website1:8080/auth1\"\n success_status_code: 200\n cache_ttl_in_sec: 60\n validate: false # SSL certificate validation (default to true)\n\n proxy_auth_configs:\n\n - name: \"proxy1\"\n user_id_header: \"X-Auth-Token\" # default X-Forwarded-User\n\n user_groups_providers:\n - name: ACME2 External Authentication Service\n groups_endpoint: \"http://localhost:8080/groups\"\n auth_token_name: \"token\"\n auth_token_passed_as: QUERY_PARAM # HEADER OR QUERY_PARAM\n response_groups_json_path: \"$..groups[?(@.id)].id\" # see: https://github.com/json-path/JsonPath\n cache_ttl_in_sec: 60\n http_connection_settings:\n connection_timeout_in_sec: 5 # default 2\n socket_timeout_in_sec: 3 # default 5\n connection_request_timeout_in_sec: 3 # default 5\n connection_pool_size: 10 # default 30\n", "ttl": "30 minutes" } diff --git a/e2e-tests/cypress/plugins/index.js b/e2e-tests/cypress/plugins/index.js index 8229063..59b2bab 100644 --- a/e2e-tests/cypress/plugins/index.js +++ b/e2e-tests/cypress/plugins/index.js @@ -19,4 +19,4 @@ module.exports = (on, config) => { // `on` is used to hook into various events Cypress emits // `config` is the resolved Cypress config -}; +} diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index 54b4cc3..b6e4837 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -1,46 +1,120 @@ import '@testing-library/cypress/add-commands'; import { isJsonString } from './helpers'; -Cypress.Commands.add('post', ({ url, user = `${Cypress.env().login}:${Cypress.env().password}`, payload }, ...args) => { - const escapedAndStringifyPayload = JSON.stringify(JSON.stringify(payload)); - - return cy - .exec( - `curl -v -k -H "Content-Type: application/json" -H "kbn-xsrf: true" -d ${escapedAndStringifyPayload} -X POST ${url} --user ${user}` - ) - .then(result => { - console.log(url, result); - return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; - }); +Cypress.Commands.add('kbnPost', ({ endpoint, credentials, payload, currentGroupHeader }, ...args) => { + const payloadCurlPart = `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + cy.kbnRequest({ + method: "POST", + endpoint: endpoint, + credentials: credentials, + options: currentGroupHeader ? `${payloadCurlPart} -H "x-ror-current-group: ${currentGroupHeader}"` : payloadCurlPart + }) }); +Cypress.Commands.add('esPost', ({ endpoint, credentials, payload }, ...args) => + cy.esRequest({ + method: "POST", + endpoint: endpoint, + credentials: credentials, + options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + }) +); + +Cypress.Commands.add('kbnPut', ({ endpoint, credentials, payload }, ...args) => + cy.kbnRequest({ + method: "PUT", + endpoint: endpoint, + credentials: credentials, + options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + }) +); + +Cypress.Commands.add('esPut', ({ endpoint, credentials, payload }, ...args) => + cy.esRequest({ + method: "PUT", + endpoint: endpoint, + credentials: credentials, + options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + }) +); + +Cypress.Commands.add( + 'kbnImport', + ({ endpoint, credentials, filename }, ...args) => + cy.kbnRequest({ + method: "POST", + endpoint: endpoint, + credentials: credentials, + options: `--form file=@${filename}` + }) +); + Cypress.Commands.add( - 'import', - ({ url, filename, user = `${Cypress.env().login}:${Cypress.env().password}` }, ...args) => - cy.exec(`curl -v -k -H "kbn-xsrf: true" --form file=@${filename} -X POST "${url}" --user ${user}`).then(result => { - console.log(url, result); - return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + 'kbnGet', + ({ endpoint, credentials, currentGroupHeader }, ...args) => + cy.kbnRequest({ + method: "GET", + endpoint: endpoint, + credentials: credentials, + options: currentGroupHeader ? `-H "x-ror-current-group: ${currentGroupHeader}"` : undefined + }) +) + +Cypress.Commands.add( + 'esGet', + ({ endpoint, credentials }, ...args) => + cy.esRequest({ + method: "GET", + endpoint: endpoint, + credentials: credentials }) ); Cypress.Commands.add( - 'getRequest', - ({ url, user = `${Cypress.env().login}:${Cypress.env().password}`, header }, ...args) => - cy.exec(`curl -v -k "${url}" --user ${user} ${header ? `-H "${header}"` : ''}`).then(result => { - console.log(url, result); - return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + 'kbnDelete', + ({ endpoint, credentials, currentGroupHeader }, ...args) => + cy.kbnRequest({ + method: "DELETE", + endpoint: endpoint, + credentials: credentials, + options: currentGroupHeader ? `-H "x-ror-current-group: ${currentGroupHeader}"` : undefined }) ); Cypress.Commands.add( - 'deleteRequest', - ({ url, header, user = `${Cypress.env().login}:${Cypress.env().password}` }, ...args) => + 'esDelete', + ({ endpoint, credentials }, ...args) => + cy.esRequest({ + method: "DELETE", + endpoint: endpoint, + credentials: credentials + }) +); + +Cypress.Commands.add( + 'kbnRequest', + ({ method, endpoint, credentials, options}) => { + const url = `${Cypress.config().baseUrl}/${endpoint}` cy - .exec(`curl -H "kbn-xsrf: true" -v -k -X DELETE "${url}" --user ${user} ${header ? `-H "${header}"` : ''}`) + .exec(`curl -H "kbn-xsrf: true" -v -k -X ${method} "${url}" --user ${credentials} ${options || ""}`) .then(result => { console.log(url, result); return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) + } +); + +Cypress.Commands.add( + 'esRequest', + ({ method, endpoint, credentials, options }) => { + const url = `${Cypress.env().elasticsearchUrl}/${endpoint}` + cy + .exec(`curl -H "kbn-xsrf: true" -v -k -X ${method} "${url}" --user ${credentials} ${options || ""}`) + .then(result => { + console.log(url, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; + }) + } ); Cypress.on('uncaught:exception', (err, runnable) => { @@ -53,7 +127,8 @@ Cypress.on('uncaught:exception', (err, runnable) => { err.message.includes('Unexpected token') || // Sometimes kibana js file chunks are not available, app works as expected but throw unhandled errors which fail the tests err.message.includes('ScopedHistory instance has fell out of navigation scope for basePath') || err.message.includes("Cannot read properties of undefined (reading 'includes')") || // kibana 8.7.0 throws this error - err.message.includes('Markdown content is required in [readOnly] mode') // kibana 8.13.0 throws this error on sample data canvas open + err.message.includes('Markdown content is required in [readOnly] mode') || // kibana 8.13.0 throws this error on sample data canvas open + err.message.includes('e.toSorted is not a function') // kibana 8.15.0 throws this error on report generation ) { return false; } diff --git a/e2e-tests/cypress/support/e2e.ts b/e2e-tests/cypress/support/e2e.ts index 7dd26ad..e149882 100644 --- a/e2e-tests/cypress/support/e2e.ts +++ b/e2e-tests/cypress/support/e2e.ts @@ -24,10 +24,18 @@ declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace Cypress { export interface Chainable { - post({ url, user, payload }: { url: string; user?: string; payload: unknown }): Chainable; - import({ url, user, filename }: { url: string; user?: string; filename: string }): Chainable; - getRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; - deleteRequest({ url, user, header }: { url: string; user?: string; header?: string }): Chainable; + kbnRequest({ method, endpoint, credentials, options }: { method: string, endpoint: string, credentials: string, options?: string }): Chainable; + kbnGet({ endpoint, credentials, currentGroupHeader }: { endpoint: string, credentials: string, currentGroupHeader?: string }): Chainable; + kbnPost({ endpoint, credentials, payload, currentGroupHeader }: { endpoint: string, credentials: string, payload?: unknown, currentGroupHeader?: string }): Chainable; + kbnPut({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; + kbnImport({endpoint, credentials, filename}: {endpoint: string, credentials: string, filename: string}): Chainable; + kbnDelete({ endpoint, credentials, currentGroupHeader }: { endpoint: string, credentials: string, currentGroupHeader?: string }): Chainable; + + esRequest({ method, endpoint, credentials, options }: { method: string, endpoint: string, credentials: string, options?: string }): Chainable; + esGet({ endpoint, credentials }: { endpoint: string, credentials: string }): Chainable; + esPost({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; + esPut({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; + esDelete({ endpoint, credentials }: { endpoint: string, credentials: string }): Chainable; } } } diff --git a/e2e-tests/cypress/support/helpers/EsApiAdvancedClient.ts b/e2e-tests/cypress/support/helpers/EsApiAdvancedClient.ts new file mode 100644 index 0000000..8d34f42 --- /dev/null +++ b/e2e-tests/cypress/support/helpers/EsApiAdvancedClient.ts @@ -0,0 +1,20 @@ +import { EsApiClient } from './EsApiClient'; + +export class EsApiAdvancedClient extends EsApiClient { + + public pruneAllReportingIndices(): void { + cy.log('Pruning all reporting indices...'); + this.indices().then(result => { + result + .filter(index => index.index.startsWith('.reporting')) + .forEach(reportingIndex => { + this.deleteIndexDocsByQuery(reportingIndex.index); + this.refreshIndex(reportingIndex.index); + }); + }); + cy.log('Pruning all reporting indices - DONE!'); + } + +} + +export const esApiAdvancedClient = new EsApiAdvancedClient(); diff --git a/e2e-tests/cypress/support/helpers/EsApiClient.ts b/e2e-tests/cypress/support/helpers/EsApiClient.ts new file mode 100644 index 0000000..9c82642 --- /dev/null +++ b/e2e-tests/cypress/support/helpers/EsApiClient.ts @@ -0,0 +1,50 @@ +export class EsApiClient { + + public deleteIndexDocsByQuery(index: string): void { + cy.esPost({ + endpoint: `${index}/_delete_by_query`, + credentials: Cypress.env().kibanaUserCredentials, + payload: { + query: { + match_all: {} + } + } + }) + } + + public refreshIndex(index: string): void { + cy.esPost({ + endpoint: `${index}/_refresh`, + credentials: Cypress.env().kibanaUserCredentials, + }) + } + + public deleteIndex(index: string): void { + cy.esDelete({ + endpoint: index, + credentials: Cypress.env().kibanaUserCredentials + }) + } + + public addDocument(index: string, id: string, doc: unknown): void { + cy.esPost({ + endpoint: `${index}/_doc/${id}`, + credentials: Cypress.env().kibanaUserCredentials, + payload: doc + }) + } + + public indices(): Cypress.Chainable { + return cy + .esGet({ + endpoint: "_cat/indices?format=json", + credentials: Cypress.env().kibanaUserCredentials + }) + } +} + +export const esApiClient = new EsApiClient(); + +export interface GetIndices { + index: string; +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/helpers/KbnApiAdvancedClient.ts b/e2e-tests/cypress/support/helpers/KbnApiAdvancedClient.ts new file mode 100644 index 0000000..435eff3 --- /dev/null +++ b/e2e-tests/cypress/support/helpers/KbnApiAdvancedClient.ts @@ -0,0 +1,27 @@ +import { KbnApiClient } from './KbnApiClient'; + +export class KbnApiAdvancedClient extends KbnApiClient { + + public deleteSavedObjects(credentials: string, group?: string): void { + cy.log(`Get all saved objects for the ${credentials}`); + this.getSavedObjects(credentials, group).then(result => { + result.saved_objects.map(savedObject => { + cy.log(`Remove ${savedObject.id} saved object for ${credentials}`); + this.deleteSavedObject(savedObject, credentials, group); + }); + }); + }; + + public deleteDataViews(credentials: string) { + cy.log(`get all data_views for the ${credentials}`); + this.getDataViews(credentials).then(result => { + result.data_view.forEach(dataView => { + cy.log(`Remove ${dataView.id} saved object for ${credentials}`); + this.deleteDataView(dataView.id, credentials); + }); + }); + }; + +} + +export const kbnApiAdvancedClient = new KbnApiAdvancedClient(); diff --git a/e2e-tests/cypress/support/helpers/KbnApiClient.ts b/e2e-tests/cypress/support/helpers/KbnApiClient.ts new file mode 100644 index 0000000..e50d26a --- /dev/null +++ b/e2e-tests/cypress/support/helpers/KbnApiClient.ts @@ -0,0 +1,70 @@ +export class KbnApiClient { + + public getDataViews(credentials: string, group?: string): Cypress.Chainable { + return cy.kbnGet({ + endpoint: "api/data_views", + credentials: credentials, + currentGroupHeader: group + }); + } + + public createDataView(dataView: unknown, credentials: string, group?: string): void { + cy.kbnPost({ + endpoint: "api/data_views/data_view", + credentials: credentials, + currentGroupHeader: group, + payload: dataView + }); + } + + public deleteDataView(dataViewId: string, credentials: string, group?: string): void { + cy.kbnDelete({ + endpoint: `api/data_views/data_view/${dataViewId}`, + credentials: credentials, + currentGroupHeader: group + }); + } + + public getSavedObjects(credentials: string, group?: string): Cypress.Chainable { + return cy.kbnGet({ + endpoint: "api/saved_objects/_find?type=index-pattern&type=search&type=visualization&type=dashboard&type=config", + credentials: credentials, + currentGroupHeader: group + }); + } + + public deleteSavedObject(savedObject: SavedObject, credentials: string, group?: string): void { + cy.kbnDelete({ + endpoint: `api/saved_objects/${savedObject.type}/${savedObject.id}`, + credentials: credentials, + currentGroupHeader: group + }); + } + + public deleteSampleData(sampleDatasetName: string, credentials: string, group?: string): void { + cy.kbnDelete({ + endpoint: `api/sample_data/${sampleDatasetName}`, + credentials: credentials, + currentGroupHeader: group + }); + } +} + +export const kbnApiClient = new KbnApiClient(); + +interface DataView { + id: string; +} + +export interface DataViews { + data_view: DataView[]; +} + +interface SavedObject { + type: string; + id: string; +} + +export interface GetObject { + saved_objects: SavedObject[]; +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/helpers/SampleData.ts b/e2e-tests/cypress/support/helpers/SampleData.ts new file mode 100644 index 0000000..5122ea4 --- /dev/null +++ b/e2e-tests/cypress/support/helpers/SampleData.ts @@ -0,0 +1,19 @@ +import { esApiClient } from "./EsApiClient" + +export class SampleData { + + static createSampleData = (index: string, docsCount: number) => { + for (let i = 1; i <= docsCount; i++) { + esApiClient.addDocument( + index, + i.toString(), + { + name: 'Jane Smith', + age: 25, + occupation: 'Designer', + '@timestamp': new Date().toISOString() + } + ); + } + } +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/helpers/index.ts b/e2e-tests/cypress/support/helpers/index.ts index b25f35d..3f905ac 100644 --- a/e2e-tests/cypress/support/helpers/index.ts +++ b/e2e-tests/cypress/support/helpers/index.ts @@ -16,3 +16,5 @@ export function isJsonString(str) { } return true; } + +export const userCredentials = `${Cypress.env().login}:${Cypress.env().password}` \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/DirectKibanaRequest.ts b/e2e-tests/cypress/support/page-objects/DirectKibanaRequest.ts deleted file mode 100644 index 3648725..0000000 --- a/e2e-tests/cypress/support/page-objects/DirectKibanaRequest.ts +++ /dev/null @@ -1,69 +0,0 @@ -interface SavedObject { - type: string; - id: string; -} - -interface DataView { - id: string; -} - -export interface GetObject { - saved_objects: SavedObject[]; -} - -export interface GetReport { - hits: { - hits: { _id: string }[]; - }; -} - -export interface GetIndices { - index: string; -} - -export interface DataViews { - data_view: DataView[]; -} - -export class DirectKibanaRequest { - public static getObjectsUrl = (type = '&type=visualization&type=dashboard&type=config') => - `${Cypress.config().baseUrl}/api/saved_objects/_find?type=index-pattern&type=search&${type}`; - - public static deleteObjectUrl = (type, id) => `${Cypress.config().baseUrl}/api/saved_objects/${type}/${id}`; - - public static getIndices = `${Cypress.env().elasticsearchUrl}/_cat/indices?format=json`; - - public static getReportUrl = (reportingIndex: string) => - `${Cypress.env().elasticsearchUrl}/${reportingIndex}/_search`; - - public static deleteReportUrl = (reportingIndex: string, id: string) => - `${Cypress.env().elasticsearchUrl}/${reportingIndex}/_doc/${id}?refresh=wait_for`; - - public static deleteDataView = id => `${Cypress.config().baseUrl}/api/data_views/data_view/${id}`; - - static deleteSavedObjects = (user: string) => { - cy.log(`Get all saved objects for the ${user}`); - cy.getRequest({ url: DirectKibanaRequest.getObjectsUrl(), user }).then((result: GetObject) => { - result.saved_objects.map(savedObject => { - cy.log(`Remove ${savedObject.id} saved object for user1`); - return cy.deleteRequest({ - url: DirectKibanaRequest.deleteObjectUrl(savedObject.type, savedObject.id), - user - }); - }); - }); - }; - - static deleteDataViews = (user: string) => { - cy.log(`get all data_views for the ${user}`); - cy.getRequest({ url: `${Cypress.config().baseUrl}/api/data_views` }).then((result: DataViews) => { - result.data_view.map(dataView => { - cy.log(`Remove ${dataView.id} saved object for user1`); - return cy.deleteRequest({ - url: DirectKibanaRequest.deleteDataView(dataView.id), - user - }); - }); - }); - }; -} diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index c4b7105..6b206bb 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -32,7 +32,11 @@ export class Discover { static exportToCsv() { cy.log('exportToCsv'); cy.get('[data-test-subj=shareTopNavButton]').click(); - cy.get('[data-test-subj=sharePanel-CSVReports]').click(); + if (semver.gte(getKibanaVersion(), '8.15.0')) { + cy.get('[data-test-subj=export]').click(); + } else { + cy.get('[data-test-subj=sharePanel-CSVReports]').click(); + } cy.get('[data-test-subj=generateReportButton]').click(); cy.contains('Queued report for search', { timeout: 10000 }).should('exist'); cy.contains('Queued report for search', { timeout: 10000 }).should('not.exist'); @@ -91,8 +95,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.get('[data-test-subj=createIndexPatternNameInput]').type(indexPatternName); cy.contains('Next step').click(); cy.get('[data-test-subj=createIndexPatternTimeFieldSelect]').select('@timestamp'); - cy.get('[data-test-subj=createIndexPatternButton]').click({ force: true }); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); + cy.get('[data-test-subj=createIndexPatternButton]').click({ force: true }); cy.wait('@indexPattern'); }; @@ -102,8 +106,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); cy.contains('@timestamp').click({ force: true }); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); + cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); cy.wait('@indexPattern'); }; @@ -127,7 +131,6 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); cy.contains('@timestamp').click({ force: true }); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); if (semver.gte(getKibanaVersion(), '8.9.0')) { cy.intercept('/s/default/api/kibana/management/saved_objects/**').as('indexPattern'); @@ -135,6 +138,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.intercept('/s/default/api/saved_objects/**').as('indexPattern'); } + cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.wait('@indexPattern'); }; diff --git a/e2e-tests/cypress/support/page-objects/Editor.ts b/e2e-tests/cypress/support/page-objects/Editor.ts index c55345a..94519d5 100644 --- a/e2e-tests/cypress/support/page-objects/Editor.ts +++ b/e2e-tests/cypress/support/page-objects/Editor.ts @@ -6,8 +6,7 @@ export class Editor { const selectAllKeys = Cypress.platform === 'darwin' ? '{cmd}a' : '{ctrl}a'; SecuritySettings.getIframeBody() .findByRole('code') - .find('textarea') - .eq(0) + .find('textarea').eq(0) .focus() .type(`${selectAllKeys}{backspace}`, { force: true }) .type(config, { force: true }); @@ -22,11 +21,10 @@ export class Editor { cy.get('@iframeBody') .findByRole('code') - .find('textarea') - .eq(0) + .find('textarea').eq(0) .focus() .type(closeSearchBoxIfExist, { force: true }) - .type(findKeys, { force: true }); + .type(findKeys, { force: true }) SecuritySettings.getIframeBody() .findByRole('button', { name: /toggle replace/i }) diff --git a/e2e-tests/cypress/support/page-objects/Impersonate.ts b/e2e-tests/cypress/support/page-objects/Impersonate.ts index ed2d6ea..eb0ec3f 100644 --- a/e2e-tests/cypress/support/page-objects/Impersonate.ts +++ b/e2e-tests/cypress/support/page-objects/Impersonate.ts @@ -3,6 +3,7 @@ import { SecuritySettings } from './SecuritySettings'; import { Loader } from './Loader'; import testSettings from '../../fixtures/testSettings.json'; import authMocks from '../../fixtures/authMocks.json'; +import { userCredentials } from '../helpers'; export class Impersonate { static open() { @@ -180,7 +181,15 @@ export class Impersonate { static setTestSettingsData() { cy.log('Initialize Test ACL data'); - cy.post({ url: `${Cypress.env().elasticsearchUrl}/_readonlyrest/admin/config/test`, payload: testSettings }); - cy.post({ url: `${Cypress.env().elasticsearchUrl}/_readonlyrest/admin/config/test/authmock`, payload: authMocks }); + cy.esPost({ + endpoint: "_readonlyrest/admin/config/test", + credentials: userCredentials, + payload: testSettings + }); + cy.esPost({ + endpoint: "_readonlyrest/admin/config/test/authmock", + credentials: userCredentials, + payload: authMocks + }); } } diff --git a/e2e-tests/cypress/support/page-objects/Loader.ts b/e2e-tests/cypress/support/page-objects/Loader.ts index 741a800..fe542ce 100644 --- a/e2e-tests/cypress/support/page-objects/Loader.ts +++ b/e2e-tests/cypress/support/page-objects/Loader.ts @@ -14,6 +14,6 @@ export class Loader { cy.log('loading finish'); cy.contains('Loading Elastic', { timeout: 80000 }).should('not.exist'); cy.url().should('include', `${Cypress.config().baseUrl}${spacePrefix}${finishUrl}`); - cy.get('[data-test-subj=globalLoadingIndicator-hidden]').should('be.visible'); + cy.get('[data-test-subj=globalLoadingIndicator-hidden]').should('be.visible') } } diff --git a/e2e-tests/cypress/support/page-objects/Reporting.ts b/e2e-tests/cypress/support/page-objects/Reporting.ts index 5aad3b3..77f63af 100644 --- a/e2e-tests/cypress/support/page-objects/Reporting.ts +++ b/e2e-tests/cypress/support/page-objects/Reporting.ts @@ -14,14 +14,22 @@ export class Reporting { cy.log('verifySavedReport'); this.openReportingPage(openBy); cy.contains(reportName).should('be.visible'); - cy.get('[data-test-subj=reportJobListing]').get('.euiTableRow').should('have.length', reportsCount); + cy.get('[data-test-subj=reportJobListing]') + .get('.euiTableRow') + .should('have.length', reportsCount); } static verifyIfReportingPageAfterRefresh() { cy.log('Verify if reporting page open after refresh'); - cy.url().should('include', `${Cypress.config().baseUrl}/s/default/app/management/insightsAndAlerting/reporting`); + cy.url().should( + 'include', + `${Cypress.config().baseUrl}/s/default/app/management/insightsAndAlerting/reporting` + ); cy.reload(); - cy.url().should('include', `${Cypress.config().baseUrl}/s/default/app/management/insightsAndAlerting/reporting`); + cy.url().should( + 'include', + `${Cypress.config().baseUrl}/s/default/app/management/insightsAndAlerting/reporting` + ); } private static openReportingPage(openBy: OpenBy) { if (openBy === 'rorMenu') { diff --git a/e2e-tests/cypress/support/page-objects/RorMenu.ts b/e2e-tests/cypress/support/page-objects/RorMenu.ts index da94ee2..df42736 100644 --- a/e2e-tests/cypress/support/page-objects/RorMenu.ts +++ b/e2e-tests/cypress/support/page-objects/RorMenu.ts @@ -1,6 +1,7 @@ import { Loader } from './Loader'; export class RorMenu { + static openRorMenu() { cy.get('#rorMenuPopover').click(); } diff --git a/e2e-tests/cypress/support/page-objects/Settings.ts b/e2e-tests/cypress/support/page-objects/Settings.ts index 8c14986..f358c72 100644 --- a/e2e-tests/cypress/support/page-objects/Settings.ts +++ b/e2e-tests/cypress/support/page-objects/Settings.ts @@ -1,3 +1,4 @@ +import { userCredentials } from '../helpers'; import { RorMenu } from './RorMenu'; import { SecuritySettings } from './SecuritySettings'; @@ -86,6 +87,10 @@ export class Settings { static setSettingsData(settings: Record) { cy.log('Set settings data'); - cy.post({ url: `${Cypress.env().elasticsearchUrl}/_readonlyrest/admin/config`, payload: settings }); + cy.esPost({ + endpoint: "_readonlyrest/admin/config", + credentials: userCredentials, + payload: settings + }); } } diff --git a/e2e-tests/cypress/support/page-objects/StackManagement.ts b/e2e-tests/cypress/support/page-objects/StackManagement.ts index d09ac5b..18aec53 100644 --- a/e2e-tests/cypress/support/page-objects/StackManagement.ts +++ b/e2e-tests/cypress/support/page-objects/StackManagement.ts @@ -12,4 +12,32 @@ export class StackManagement { KibanaNavigation.openPage('Stack Management'); cy.contains('Saved Objects').click(); } + + static openAlertsPage() { + cy.log('open alerts page'); + KibanaNavigation.openKibanaNavigation(); + KibanaNavigation.openPage('Stack Management'); + KibanaNavigation.openSubPage('Alerts'); + } + + static openRulesPage() { + cy.log('open rules page'); + KibanaNavigation.openKibanaNavigation(); + KibanaNavigation.openPage('Stack Management'); + KibanaNavigation.openSubPage('Rules'); + } + + static openConnectorsPage() { + cy.log('open connectors page'); + KibanaNavigation.openKibanaNavigation(); + KibanaNavigation.openPage('Stack Management'); + KibanaNavigation.openSubPage('Connectors'); + } + + static openRulesAndConnectorsPage() { + cy.log('open rules and connectors page'); + KibanaNavigation.openKibanaNavigation(); + KibanaNavigation.openPage('Stack Management'); + KibanaNavigation.openSubPage('Rules and Connectors'); + } } diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 9885d69..89e5aa7 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -12,7 +12,7 @@ "license": "Beshu Limited, All rights reserved", "dependencies": { "@testing-library/cypress": "^10.0.1", - "cypress": "12.17.4", + "cypress": "13.14.2", "semver": "7.5.2" }, "devDependencies": { diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index 715ac35..cd2937a 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -30,10 +30,10 @@ dependencies: regenerator-runtime "^0.13.4" -"@cypress/request@2.88.12": - version "2.88.12" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz" - integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== +"@cypress/request@^3.0.1": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.5.tgz#d893a6e68ce2636c085fcd8d7283c3186499ba63" + integrity sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -41,14 +41,14 @@ combined-stream "~1.0.6" extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.3.2" - http-signature "~1.3.6" + form-data "~4.0.0" + http-signature "~1.4.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.13.0" safe-buffer "^5.1.2" tough-cookie "^4.1.3" tunnel-agent "^0.6.0" @@ -134,9 +134,14 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@testing-library/cypress@^10.0.1": version "10.0.1" - resolved "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.1.tgz" + resolved "https://registry.yarnpkg.com/@testing-library/cypress/-/cypress-10.0.1.tgz#15abae0edb83237316ec6d07e152b71a50b38387" integrity sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw== dependencies: "@babel/runtime" "^7.14.6" @@ -144,7 +149,7 @@ "@testing-library/dom@^9.0.0": version "9.3.1" - resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz" + resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== dependencies: "@babel/code-frame" "^7.10.4" @@ -158,7 +163,7 @@ "@types/aria-query@^5.0.1": version "5.0.1" - resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== "@types/json-schema@^7.0.9": @@ -176,21 +181,16 @@ resolved "https://registry.npmjs.org/@types/node/-/node-16.4.4.tgz" integrity sha512-BH/jX0HjzElFCQdAwaEMwuGBQwm6ViDZ00X6LKdnRRmGWOzkWugEH4+7a0BwfHQ8DfPPCSd/mdsm3Nu8FKFu0w== -"@types/node@^16.18.39": - version "16.18.50" - resolved "https://registry.npmjs.org/@types/node/-/node-16.18.50.tgz" - integrity sha512-OiDU5xRgYTJ203v4cprTs0RwOCd5c5Zjv+K5P8KSqfiCsB1W3LcamTUMcnQarpq5kOYbhHfSOgIEJvdPyb5xyw== - "@types/node@^20.14.10": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + version "20.16.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" + integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/semver@^7.3.12", "@types/semver@^7.5.8": version "7.5.8" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/sinonjs__fake-timers@8.1.1": @@ -375,14 +375,14 @@ argparse@^2.0.1: aria-query@5.1.3: version "5.1.3" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: deep-equal "^2.0.5" array-buffer-byte-length@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== dependencies: call-bind "^1.0.2" @@ -396,7 +396,7 @@ array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-includes@^3.1.7: +array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -413,7 +413,7 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlastindex@^1.2.3: +array.prototype.findlastindex@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== @@ -493,7 +493,7 @@ at-least-node@^1.0.0: available-typed-arrays@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== available-typed-arrays@^1.0.7: @@ -515,7 +515,7 @@ aws4@^1.8.0: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: @@ -542,7 +542,7 @@ bluebird@^3.7.2: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -560,9 +560,9 @@ buffer-crc32@~0.2.3: resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -buffer@^5.6.0: +buffer@^5.7.1: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -632,10 +632,10 @@ check-more-types@^2.24.0: resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= -ci-info@^3.1.1: - version "3.2.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-stack@^2.0.0: version "2.2.0" @@ -700,7 +700,7 @@ colors@1.4.0: resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -709,7 +709,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: commander@^6.2.1: version "6.2.1" - resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== common-tags@^1.8.0: @@ -719,7 +719,7 @@ common-tags@^1.8.0: concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== core-util-is@1.0.2: @@ -736,20 +736,19 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cypress@12.17.4: - version "12.17.4" - resolved "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz" - integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== +cypress@13.14.2: + version "13.14.2" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.14.2.tgz#4237eb7b26de2baeaa1f01e585f965d88fca7f39" + integrity sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA== dependencies: - "@cypress/request" "2.88.12" + "@cypress/request" "^3.0.1" "@cypress/xvfb" "^1.2.4" - "@types/node" "^16.18.39" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -767,7 +766,7 @@ cypress@12.17.4: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -781,7 +780,7 @@ cypress@12.17.4: request-progress "^3.0.0" semver "^7.5.3" supports-color "^8.1.1" - tmp "~0.2.1" + tmp "~0.2.3" untildify "^4.0.0" yauzl "^2.10.0" @@ -839,22 +838,22 @@ debug@^4.1.1: ms "2.1.2" debug@^4.3.1, debug@^4.3.2: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" debug@^4.3.4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" deep-equal@^2.0.5: version "2.2.2" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== dependencies: array-buffer-byte-length "^1.0.0" @@ -883,7 +882,7 @@ deep-is@^0.1.3: define-data-property@^1.0.1: version "1.1.0" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== dependencies: get-intrinsic "^1.2.1" @@ -901,7 +900,7 @@ define-data-property@^1.1.4: define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -1032,7 +1031,7 @@ es-errors@^1.2.1, es-errors@^1.3.0: es-get-iterator@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" @@ -1101,33 +1100,34 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== +eslint-module-utils@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" + integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== dependencies: debug "^3.2.7" eslint-plugin-import@^2.26.0: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" @@ -1384,7 +1384,7 @@ flatted@^3.2.9: for-each@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" @@ -1394,13 +1394,13 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" fs-extra@^9.1.0: @@ -1440,12 +1440,12 @@ function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" @@ -1556,7 +1556,7 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" @@ -1573,7 +1573,7 @@ graphemer@^1.4.0: has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: @@ -1588,7 +1588,7 @@ has-flag@^4.0.0: has-property-descriptors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== dependencies: get-intrinsic "^1.1.1" @@ -1602,7 +1602,7 @@ has-property-descriptors@^1.0.2: has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-proto@^1.0.3: @@ -1643,14 +1643,14 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== +http-signature@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f" + integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== dependencies: assert-plus "^1.0.0" jsprim "^2.0.2" - sshpk "^1.14.1" + sshpk "^1.18.0" human-signals@^1.1.1: version "1.1.1" @@ -1663,9 +1663,9 @@ ieee754@^1.1.13: integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -1705,7 +1705,7 @@ ini@2.0.0: internal-slot@^1.0.4: version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== dependencies: get-intrinsic "^1.2.0" @@ -1731,7 +1731,7 @@ is-arguments@^1.1.1: is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== dependencies: call-bind "^1.0.2" @@ -1763,20 +1763,20 @@ is-boolean-object@^1.1.0: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz" - integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ== +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: - ci-info "^3.1.1" + ci-info "^3.2.0" -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== +is-core-module@^2.13.0, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" @@ -1821,7 +1821,7 @@ is-installed-globally@~0.4.0: is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== is-negative-zero@^2.0.3: @@ -1831,7 +1831,7 @@ is-negative-zero@^2.0.3: is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -1856,12 +1856,12 @@ is-regex@^1.1.4: is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== is-shared-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== dependencies: call-bind "^1.0.2" @@ -1894,7 +1894,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: is-typed-array@^1.1.10: version "1.1.10" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" @@ -1922,7 +1922,7 @@ is-unicode-supported@^0.1.0: is-weakmap@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== is-weakref@^1.0.2: @@ -1934,12 +1934,12 @@ is-weakref@^1.0.2: is-weakset@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== isarray@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: @@ -2102,7 +2102,7 @@ lru-cache@^6.0.0: lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== merge-stream@^2.0.0: @@ -2116,9 +2116,9 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" @@ -2142,14 +2142,14 @@ mimic-fn@^2.1.0: minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== ms@2.1.2: @@ -2157,7 +2157,7 @@ ms@2.1.2: resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -2186,7 +2186,7 @@ object-inspect@^1.13.1: object-inspect@^1.9.0: version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== object-is@^1.1.5: @@ -2204,7 +2204,7 @@ object-keys@^1.1.1: object.assign@^4.1.4: version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: call-bind "^1.0.2" @@ -2222,7 +2222,7 @@ object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -2232,7 +2232,7 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.1: +object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -2241,7 +2241,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.values@^1.1.7: +object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -2392,7 +2392,7 @@ pretty-format@^27.0.2: process@^0.11.10: version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= proxy-from-env@1.0.0: @@ -2402,7 +2402,7 @@ proxy-from-env@1.0.0: psl@^1.1.33: version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: @@ -2423,12 +2423,12 @@ punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@~6.10.3: - version "6.10.4" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" - integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: - side-channel "^1.0.4" + side-channel "^1.0.6" querystringify@^2.1.1: version "2.2.0" @@ -2452,7 +2452,7 @@ regenerator-runtime@^0.13.4: regexp.prototype.flags@^1.5.0: version "1.5.1" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" @@ -2508,7 +2508,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -2560,7 +2560,7 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: semver@7.5.2: version "7.5.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== dependencies: lru-cache "^6.0.0" @@ -2571,13 +2571,13 @@ semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.7: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== semver@^7.5.3: version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -2596,7 +2596,7 @@ set-function-length@^1.2.1: set-function-name@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== dependencies: define-data-property "^1.0.1" @@ -2634,6 +2634,16 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" + signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" @@ -2662,10 +2672,10 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -sshpk@^1.14.1: - version "1.16.1" - resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== +sshpk@^1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2679,7 +2689,7 @@ sshpk@^1.14.1: stop-iteration-iterator@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== dependencies: internal-slot "^1.0.4" @@ -2791,12 +2801,10 @@ through@^2.3.8: resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" +tmp@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-regex-range@^5.0.1: version "5.0.1" @@ -2807,7 +2815,7 @@ to-regex-range@^5.0.1: tough-cookie@^4.1.3: version "4.1.3" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" @@ -2912,7 +2920,7 @@ typed-array-length@^1.0.6: typescript@4.8.4: version "4.8.4" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== unbox-primitive@^1.0.2: @@ -2925,14 +2933,14 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: @@ -2987,7 +2995,7 @@ which-boxed-primitive@^1.0.2: which-collection@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== dependencies: is-map "^2.0.1" @@ -3008,7 +3016,7 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15: which-typed-array@^1.1.9: version "1.1.9" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index 0d80cc8..1b8ed94 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -1,6 +1,5 @@ helpers: cr: &common-rules - verbosity: error kibana_access: rw kibana_hide_apps: [ "Enterprise Search|Overview", "Observability" ] kibana_index: ".kibana_@{acl:current_group}" @@ -21,8 +20,7 @@ readonlyrest: enabled: true outputs: - type: index - serializer: tech.beshu.ror.requestcontext.QueryAuditLogSerializer - index_template: "'readonlyrest_audit-'-yyyy-MM-dd" + index_template: "'readonlyrest_audit_'yyyy-MM-dd" access_control_rules: - name: KIBANA_SERVER @@ -39,13 +37,6 @@ readonlyrest: <<: *common-rules kibana_access: admin -# - name: infosec4search -# groups: [ infosec_group ] -# indices: ["readonlyrest_audit*"] -# #filter: '{"bool": { "must_not": { "match": { "type": "xxxx" }}}}' -# kibana_index: .kibana_infosec -# verbosity: error - - name: infosec groups: [ infosec_group ] <<: *common-rules diff --git a/elk-ror/docker-compose.yml b/elk-ror/docker-compose.yml index e36568e..28e5e1c 100644 --- a/elk-ror/docker-compose.yml +++ b/elk-ror/docker-compose.yml @@ -11,13 +11,18 @@ services: - "19200:9200" - "19300:9300" - "5000:5000" + deploy: + resources: + limits: + memory: 2G # ES heap will get 1GB environment: + - ES_VERSION=$ES_VERSION - cluster.name=ror-es-cluster - node.name=es-ror-single - discovery.type=single-node - bootstrap.memory_lock=true - - "ES_JAVA_OPTS=-Xms512m -Xmx512m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5000" - - ES_VERSION=$ES_VERSION + # for a sake of debugging and profiling + - "ES_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5000 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=9010 -Djava.rmi.server.hostname=127.0.0.1" healthcheck: test: [ "CMD", "curl", "-fk", "-u", "kibana:kibana", "http://localhost:9200/_cluster/health" ] interval: 10s @@ -30,6 +35,8 @@ services: memlock: soft: -1 hard: -1 + volumes: + - /tmp/visualvm:/tmp/visualvm kbn-ror: build: @@ -45,6 +52,9 @@ services: deploy: mode: replicated replicas: 3 + resources: + limits: + memory: 756G environment: ELASTIC_USER_PASSWORD: elastic ES_API_URL: http://es-ror:9200 @@ -59,7 +69,7 @@ services: ulimits: memlock: soft: -1 - hard: -1 + hard: -1 kbn-proxy: build: diff --git a/run-7x.sh b/run-7x.sh index c1ea8c9..ea14c1d 100755 --- a/run-7x.sh +++ b/run-7x.sh @@ -1,3 +1,3 @@ #!/bin/bash -e -./run.sh "7.17.23" \ No newline at end of file +./run.sh "7.17.24" \ No newline at end of file diff --git a/run-8x.sh b/run-8x.sh index ffc92a3..305c69f 100755 --- a/run-8x.sh +++ b/run-8x.sh @@ -1,3 +1,3 @@ #!/bin/bash -e -./run.sh "8.14.3" \ No newline at end of file +./run.sh "8.15.1" \ No newline at end of file From 879820b5ff4df04048992ed220b4e57475cc3267 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Sat, 21 Sep 2024 20:24:20 +0200 Subject: [PATCH 10/19] Async rapport generating update --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 15 +++- .../cypress/support/page-objects/Discover.ts | 6 +- .../cypress/support/page-objects/Login.ts | 28 ++++---- .../cypress/support/page-objects/invoices.ts | 13 ++-- .../page-objects/management/Reports.ts | 69 +++++++------------ 5 files changed, 62 insertions(+), 69 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 52763be..7611f5c 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -8,8 +8,10 @@ describe('Report Generation', () => { const indexName: string = 'invoices'; const searchName: string = `${ indexName } search`; + before(() => { - dataPut(100000, indexName); + dataPut(500000, indexName); + }); beforeEach(() => { @@ -32,6 +34,7 @@ describe('Report Generation', () => { Discover.selectDataView(indexName); Discover.saveSearch(searchName); + for (let i = 0; i < 10; i++) { Discover.generateCsvReport(); } @@ -40,6 +43,16 @@ describe('Report Generation', () => { Reports.navigateTo(); Reports.checkAllReports(searchName); + for (let i = 0; i < 10; i++) { + cy.log('Checking for toast'); + cy.get('body').then($body => { + if ($body.find('[data-test-subj="toastCloseButton"]').length > 0) { + cy.get('[aria-label="Dismiss toast"]').last().click({force: true}); + } + }); + cy.wait(100); + } + Login.signOut(); Login.setLogin('user3:dev'); diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 4cce372..fa2a13e 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -119,7 +119,6 @@ export class Discover { static generateCsvReport() { cy.log('generateCsvReport'); - cy.wait(1500); // Click the share button to open the sharing options if it is not opened @@ -135,6 +134,11 @@ export class Discover { // Click the "Generate report" button cy.get('[data-test-subj="generateReportButton"]').click(); + + cy.contains('Queued report for search', {timeout: 60000}).should('be.visible'); + + // close the toast with the message + cy.get('[data-test-subj="toastCloseButton"]').first().click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index d331b81..4653d84 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -6,14 +6,13 @@ export class Login { sessionStorage.setItem('ror:ignoreKeyExpirationInfo', 'true'); localStorage.setItem('home:welcome:show', 'false'); }); - cy.visit(Cypress.config().baseUrl); - cy.wait(1000); + cy.visit(Cypress.config().baseUrl, { timeout: 60000 }); Login.signIn(); Loader.loading(); } static signIn() { - cy.visit(Cypress.config().baseUrl); + cy.visit(Cypress.config().baseUrl, { timeout: 60000 }); Login.fillLoginPage(); } @@ -31,17 +30,18 @@ export class Login { } static signOut() { - cy.visit(Cypress.config().baseUrl); - Loader.loading(); - cy.get('#rorMenuPopover', {timeout: 1000}).click() - .then($userMenu => { - if ($userMenu.length > 0) { - cy.contains('button', 'Log out').click({force: true}); - cy.log("User Sign out"); - } else { - cy.log("User wasn't sign in"); - } - }); + cy.visit(`${Cypress.config().baseUrl}/logout`, { timeout: 60000 }); + // cy.get('[data-test-subj="logo"]').click( {force: true, timeout: 20000} ); + // cy.wait(10000); + // cy.get('#rorMenuPopover', {timeout: 1000}).click() + // .then($userMenu => { + // if ($userMenu.length > 0) { + // cy.contains('button', 'Log out').click({force: true}); + // cy.log("User Sign out"); + // } else { + // cy.log("User wasn't sign in"); + // } + // }); } static setLogin(user: string) { diff --git a/e2e-tests/cypress/support/page-objects/invoices.ts b/e2e-tests/cypress/support/page-objects/invoices.ts index 6eef4e7..a4ee650 100644 --- a/e2e-tests/cypress/support/page-objects/invoices.ts +++ b/e2e-tests/cypress/support/page-objects/invoices.ts @@ -56,9 +56,9 @@ function handleBulkResponse(response: string | undefined): void { items.forEach((item: any) => { const createResult = item.create; if (createResult.status === 201) { - console.log(`Invoice ${ createResult._id } created successfully.`); + console.log(`Invoice ${createResult._id} created successfully.`); } else { - console.error(`Failed to create invoice ${ createResult._id }: ${ createResult.error.reason }`); + console.error(`Failed to create invoice ${createResult._id}: ${createResult.error.reason}`); } }); } catch (error) { @@ -140,17 +140,16 @@ export async function dataPut(count: number, indexName: string, chunkSize: numbe await Promise.all(batch.map((chunk, index) => processChunk(chunk, i + index))); } }; - - const indexExists = await checkIndexExists(indexName); + const [indexExists] = await Promise.all([checkIndexExists(indexName)]); cy.log(`Index ${indexName} exists: ${indexExists}`); if (!indexExists) { await createIndex(indexName); } const startTime = Date.now(); - await processChunksInBatches(chunks, 100); + await processChunksInBatches(chunks, 500); const endTime = Date.now(); - const duration = endTime - startTime; + const duration = (endTime - startTime) / 1000; // Convert to seconds cy.log(`All requests completed in ${duration} seconds.`); } @@ -170,4 +169,4 @@ function handleIndexCreationResponse(response: any): void { } catch (error) { console.error('Failed to parse response:', error); } -} +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index ef5b9ef..8f5cae1 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -13,72 +13,49 @@ export class Reports { } // Now, click on Reporting (whether we were already on Stack Management or not) - cy.contains('Reporting').click({timeout: 10000}); + cy.contains('Reporting').click(); }); } static checkAllReports(reportTitle: string = 'Untitled discover search') { cy.log('waitForAllReportsToBeDone'); - cy.get('tr[data-test-subj="reportJobRow"]') - .then($reportItems => { - // Convert the jQuery object to an array and reverse it - const reversedReportItems = Cypress.$($reportItems.get().reverse()); - - // Iterate over the reversed array - cy.wrap(reversedReportItems).each($reportItem => { - cy.wrap($reportItem) - .find('[data-test-subj="reportingListItemObjectTitle"]') - .should('contain.text', reportTitle); - - cy.wrap($reportItem) - .find('[data-test-subj="reportJobStatus"]') - .contains(/Done|Completed/, {timeout: 60000}) - .should('be.visible').then($status => { - }); - }); + cy.get('tr[data-test-subj="reportJobRow"]', {timeout: 10000}) + .each($reportItem => { + Reports.checkReportItem($reportItem, reportTitle); }) .then($matchingReports => { expect($matchingReports).to.have.length(10); }); } + static checkReportItem($reportItem: JQuery, reportTitle: string) { + cy.wrap($reportItem) + .find('[data-test-subj="reportingListItemObjectTitle"]', {timeout: 10000}) + .should('contain.text', reportTitle); + + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 240000}) + .should('be.visible'); + } + + static verifyNoReports() { cy.log('verifyNoReports'); // Assert that there are no report rows present - cy.get('tr[data-test-subj="reportJobRow"]').should('not.exist'); + cy.get('[data-test-subj="reportingListItemObjectTitle"]', {timeout: 10000}).should('not.exist'); } static deleteAllReports(reportTitle: string = 'Untitled discover search') { cy.log('deleteAllReports'); - // 1. Navigate to the Reporting page - Reports.navigateTo(); - - // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(5000); - cy.get('body').then($body => { - const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; - const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled - - if (hasReports) { - if (selectAllEnabled) { - // If "Select All" is enabled, delete all reports directly - cy.log('Deleting all reports using "Select All"'); - - // Select all reports - cy.get('[data-test-subj="checkboxSelectAll"]').check({force: true}); - - // Click the "Delete" button - cy.get('[data-test-subj="deleteReportButton"]').click({force: true}); - - // Confirm the deletion in the modal - cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); - } - } else { - cy.log('No reports found - nothing to delete'); - } - }); + // Use curl command to remove the reporting index + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + cy.exec(`curl -X DELETE "${ elasticsearchUrl }/reporting" -u kibana:kibana`) + .then(response => { + cy.log('All reports deleted'); + }); } } \ No newline at end of file From c2e51a0a1b4d1023e4c7ed4d93f28cdbb6803464 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Sat, 10 Aug 2024 23:00:53 +0200 Subject: [PATCH 11/19] Fork sync --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 119 ++++++++++++++++++ .../cypress/support/page-objects/Login.ts | 14 +++ e2e-tests/yarn.lock | 18 +-- elk-ror/conf/es/readonlyrest.yml | 21 ++++ elk-ror/conf/kbn/kibana.yml | 5 +- 5 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 e2e-tests/cypress/e2e/Report-generation.cy.ts diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts new file mode 100644 index 0000000..620e0ab --- /dev/null +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -0,0 +1,119 @@ +import { Login } from '../support/page-objects/Login'; + +describe('Report Generation', () => { + before(() => { + // 1. Logowanie jako "kibana:kibana" + // Login.signOut() + Cypress.env("login", "kibana"); + Cypress.env("password", "kibana"); + Login.signIn(); + + // 2. Check if "invoices" index exists and create if it doesn't + cy.request({ + method: 'GET', + url: 'http://localhost:19200/_cat/indices/invoices?v', + failOnStatusCode: false, + }).then((response) => { + if (response.status === 404) { + cy.request({ + method: 'PUT', + url: 'http://localhost:19200/invoices', + headers: { + 'Content-Type': 'application/json', + }, + body: { + settings: { + number_of_shards: 1, + number_of_replicas: 1, + }, + }, + }); + } + }); + + // 3. Generate example data for invoices + const bulkBody = [ + { index: { _index: 'invoices' } }, + { id: 1, number: 'INV001', date: '2024-08-01', amount: 123.45, currency: 'USD' }, + { index: { _index: 'invoices' } }, + { id: 2, number: 'INV002', date: '2024-08-02', amount: 67.89, currency: 'EUR' } + ]; + + // Convert to newline-delimited string + const bulkBodyString = bulkBody.map(line => JSON.stringify(line)).join('\n') + '\n'; + + cy.request({ + method: 'POST', + url: 'http://localhost:19200/invoices/_bulk', + headers: { + 'Content-Type': 'application/json' + }, + body: bulkBodyString + }).then(response => { + expect(response.status).to.eq(200); // Adjust this according to your expectations + }); + + }); + + it('should generate example invoice data and create reports', () => { + // Log in as "user2:dev" + // Login.signOut(); + Cypress.env("login", "user2"); + Cypress.env("password", "dev"); + Login.signIn(); + + // Create invoices data view + cy.visit('http://localhost:5601/s/default/app/management/kibana/dataViews'); + cy.get('button[data-test-subj="createDataViewButton"]').click(); + cy.get('input[data-test-subj="createIndexPatternNameInput"]').type('invoices'); + cy.get('button[data-test-subj="createIndexPatternCreateButton"]').click(); + + // Go to Discover and generate 10 CSV reports + cy.visit('http://localhost:5601/app/discover'); + cy.get('select[data-test-subj="indexPattern"]').select('invoices'); + for (let i = 0; i < 10; i++) { + cy.get('button[data-test-subj="docTableDownloadButton"]').click(); + cy.get('button[data-test-subj="generateCsvButton"]').click(); + } + + // Go to Reports and check the status of all reports + cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); + cy.get('div[data-test-subj="reportingTable"]').within(() => { + cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('have.text', 'Done'); + }); + + // Log out and log in as "user3:dev" + cy.get('button[data-test-subj="userMenuButton"]').click(); + cy.get('button[data-test-subj="logoutButton"]').click(); + Cypress.env("login", "user3"); + Cypress.env("password", "dev"); + Login.signIn(); + + // Verify user3 cannot see user2's reports + cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); + cy.get('div[data-test-subj="reportingTable"]').within(() => { + cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('not.exist'); + }); + }); + + after(() => { + // Ensure proper sign out + Cypress.env("login", "kibana"); + Cypress.env("password", "kibana"); + Login.signIn(); + + // Make the request to delete the invoices index + cy.request({ + method: 'DELETE', + url: 'http://localhost:19200/invoices', + headers: { + 'Content-Type': 'application/json', + }, + failOnStatusCode: false, + }).then(response => { + if (response.status === 403) { + cy.log('Access Forbidden: Check ReadonlyREST permissions'); + } + }); + }); +}); diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 8b1b46b..69d4519 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -19,6 +19,7 @@ export class Login { static fillLoginPage() { cy.get('#form-username', { timeout: 30000 }).should('be.visible'); cy.get('#form-username').type(Cypress.env().login); + cy.get('#form-password').click({ force: true }); cy.get('#form-password').type(Cypress.env().password); cy.get('#form-submit').click({ force: true }); } @@ -27,4 +28,17 @@ export class Login { cy.log('has license changed message'); cy.contains(/The licensing edition has been changed./i); } + static signOut() { + cy.get('[data-test-subj="userMenuButton"]', { timeout: 500 }) // Element wskazujący na zalogowanie + .then($userMenu => { + // Sprawdź, czy element istnieje (czyli czy użytkownik jest zalogowany) + if ($userMenu.length > 0) { + // Kliknij przycisk wylogowania + cy.contains('button', 'Log out').click({ force: true }); + cy.log("User Sign out"); + } else { + cy.log("User wasn't sign in"); + } + }); + } } diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index cd2937a..1df3dac 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -736,12 +736,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cypress@13.14.2: - version "13.14.2" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.14.2.tgz#4237eb7b26de2baeaa1f01e585f965d88fca7f39" - integrity sha512-lsiQrN17vHMB2fnvxIrKLAjOr9bPwsNbPZNrWf99s4u+DVmCY6U+w7O3GGG9FvP4EUVYaDu+guWeNLiUzBrqvA== +cypress@12.17.4: + version "12.17.4" + resolved "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz" + integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== dependencies: - "@cypress/request" "^3.0.1" + "@cypress/request" "2.88.12" "@cypress/xvfb" "^1.2.4" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" @@ -2423,10 +2423,10 @@ punycode@^2.1.1: resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +qs@~6.10.3: + version "6.10.4" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== dependencies: side-channel "^1.0.6" diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index 1b8ed94..a430641 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -27,6 +27,18 @@ readonlyrest: auth_key: kibana:kibana verbosity: error + - name: Allow DELETE on Invoices + indices: ["invoices"] + actions: ["indices:data/write/delete"] + groups: [ admins_group ] + verbosity: error + + - name: Allow bulk requests + methods: ["POST"] + uri: "/invoices/_bulk" + groups: [ admins_group ] + verbosity: info + - name: PERSONAL_GRP groups: [ Personal ] <<: *common-rules @@ -75,6 +87,10 @@ readonlyrest: auth_key: user1:dev <<: *all-groups + - username: kibana + auth_key: kibana:kibana + groups: [ admins_group ] + ror_kbn: - name: kbn1 signature_key: "9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf" @@ -96,3 +112,8 @@ readonlyrest: authentication_endpoint: "http://localhost:1000/auth" success_status_code: 200 cache_ttl: 60s + +http.cors.enabled: true +http.cors.allow-origin: "*" +http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE" +http.cors.allow-headers: "kbn-version, Origin, X-Requested-With, Content-Type, Accept, Authorization" \ No newline at end of file diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index 8f7b6aa..7b770a6 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -15,10 +15,11 @@ elasticsearch.requestTimeout: 30000 csp.strict: false csp.warnLegacyBrowsers: false -#elasticsearch.hosts: [ "http://localhost:9201", "http://localhost:9202" ] # USE FAKENODE CLUSTER SIMULATOR -elasticsearch.hosts: [ "${ES_API_URL}" ] +elasticsearch.hosts: [ "http://localhost:9200", "http://localhost:9201", "http://localhost:9202", "${ES_API_URL}" ] # USE FAKENODE CLUSTER SIMULATOR +#elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana +elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] xpack.encryptedSavedObjects.encryptionKey: "19+230i1902i310293213i109312i31209302193219039120i3j23h31h3h213h123!" xpack.reporting.encryptionKey: "321421321211231241232132132132132" #xpack.reporting.index: '.reporting-test-index' From 7a24af66f780bcca82d7b3a2c7b6b5929853223e Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Wed, 14 Aug 2024 23:28:02 +0200 Subject: [PATCH 12/19] Added Report-generation test --- e2e-tests/cypress.config.ts | 3 +- e2e-tests/cypress/e2e/Report-generation.cy.ts | 192 +++++++++--------- e2e-tests/cypress/support/commands.ts | 10 +- .../cypress/support/page-objects/DevTools.ts | 14 +- .../cypress/support/page-objects/Discover.ts | 71 +++++++ .../cypress/support/page-objects/Login.ts | 28 ++- .../page-objects/management/DataViews.ts | 99 +++++++++ .../page-objects/management/Reports.ts | 118 +++++++++++ elk-ror/conf/es/readonlyrest.yml | 27 +-- elk-ror/conf/kbn/kibana.yml | 4 +- 10 files changed, 419 insertions(+), 147 deletions(-) create mode 100644 e2e-tests/cypress/support/page-objects/management/DataViews.ts create mode 100644 e2e-tests/cypress/support/page-objects/management/Reports.ts diff --git a/e2e-tests/cypress.config.ts b/e2e-tests/cypress.config.ts index 9ada94f..ea66e7a 100644 --- a/e2e-tests/cypress.config.ts +++ b/e2e-tests/cypress.config.ts @@ -32,6 +32,7 @@ export default defineConfig({ }, baseUrl: 'http://localhost:5601', videosFolder: '../results/videos', - screenshotsFolder: '../results/screenshots' + screenshotsFolder: '../results/screenshots', + downloadsFolder: './cypress/downloads/', } }); diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 620e0ab..2499dc0 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -1,119 +1,109 @@ -import { Login } from '../support/page-objects/Login'; +// report-generation.spec.ts +import { Login } from "../support/page-objects/Login"; +import { DataViews } from "../support/page-objects/management/DataViews"; +import { Discover } from "../support/page-objects/Discover"; +import { Reports } from "../support/page-objects/management/Reports"; +import { DevTools } from "../support/page-objects/DevTools"; + +describe('Report Generation (ROR_INTR_001)', () => { + const indexPatternName: string = 'invoices'; + const searchName: string = `${ indexPatternName } search`; + -describe('Report Generation', () => { before(() => { - // 1. Logowanie jako "kibana:kibana" - // Login.signOut() - Cypress.env("login", "kibana"); - Cypress.env("password", "kibana"); - Login.signIn(); - - // 2. Check if "invoices" index exists and create if it doesn't - cy.request({ - method: 'GET', - url: 'http://localhost:19200/_cat/indices/invoices?v', - failOnStatusCode: false, - }).then((response) => { - if (response.status === 404) { - cy.request({ - method: 'PUT', - url: 'http://localhost:19200/invoices', - headers: { - 'Content-Type': 'application/json', - }, - body: { - settings: { - number_of_shards: 1, - number_of_replicas: 1, - }, - }, - }); - } - }); - - // 3. Generate example data for invoices - const bulkBody = [ - { index: { _index: 'invoices' } }, - { id: 1, number: 'INV001', date: '2024-08-01', amount: 123.45, currency: 'USD' }, - { index: { _index: 'invoices' } }, - { id: 2, number: 'INV002', date: '2024-08-02', amount: 67.89, currency: 'EUR' } - ]; - - // Convert to newline-delimited string - const bulkBodyString = bulkBody.map(line => JSON.stringify(line)).join('\n') + '\n'; - - cy.request({ - method: 'POST', - url: 'http://localhost:19200/invoices/_bulk', - headers: { - 'Content-Type': 'application/json' - }, - body: bulkBodyString - }).then(response => { - expect(response.status).to.eq(200); // Adjust this according to your expectations - }); + // Log in as "kibana:kibana" (adjust credentials if needed) + Login.setLogin('kibana:kibana'); + Login.initialization(); + + DevTools.openDevTools(); + // Attempt to bulk index sample data + DevTools.sendRequest( + 'PUT invoices/_bulk\n' + + '{"create":{ }}\n' + + '{"id": 1,"number": "INV001","date": "2024-08-01","amount": 123.45,"currency": "USD"}\n' + + '{"create":{ }}\n' + + '{"id": 2,"number": "INV002","date": "2024-08-02","amount": 67.89,"currency": "EUR"}' + ) + DevTools.verifyIf200Status(); + + // Check if the "invoices" index exists after the bulk operation + DevTools.sendRequest(`GET ${ indexPatternName }`); + DevTools.verifyIf200Status(); + Login.signOut(); }); - it('should generate example invoice data and create reports', () => { + beforeEach(() => { // Log in as "user2:dev" - // Login.signOut(); - Cypress.env("login", "user2"); - Cypress.env("password", "dev"); - Login.signIn(); + Login.setLogin('user2:dev'); + Login.initialization(); + + DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + Reports.deleteAllReports(searchName) + + + Login.signOut(); + }) + + it('should generate and verify reports for user2, and user3 should not see them', () => { + // Log in as "user2:dev" + Login.setLogin('user2:dev'); + Login.initialization(); // Create invoices data view - cy.visit('http://localhost:5601/s/default/app/management/kibana/dataViews'); - cy.get('button[data-test-subj="createDataViewButton"]').click(); - cy.get('input[data-test-subj="createIndexPatternNameInput"]').type('invoices'); - cy.get('button[data-test-subj="createIndexPatternCreateButton"]').click(); + DataViews.createDataView(indexPatternName); // Go to Discover and generate 10 CSV reports - cy.visit('http://localhost:5601/app/discover'); - cy.get('select[data-test-subj="indexPattern"]').select('invoices'); + Discover.navigateTo(); + + Discover.selectDataView(indexPatternName); + Discover.saveReport(searchName); + // Discover.selectDataView(indexPatternName); for (let i = 0; i < 10; i++) { - cy.get('button[data-test-subj="docTableDownloadButton"]').click(); - cy.get('button[data-test-subj="generateCsvButton"]').click(); + Discover.generateCsvReport(); } - // Go to Reports and check the status of all reports - cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); - cy.get('div[data-test-subj="reportingTable"]').within(() => { - cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('have.text', 'Done'); - }); - - // Log out and log in as "user3:dev" - cy.get('button[data-test-subj="userMenuButton"]').click(); - cy.get('button[data-test-subj="logoutButton"]').click(); - Cypress.env("login", "user3"); - Cypress.env("password", "dev"); - Login.signIn(); - - // Verify user3 cannot see user2's reports - cy.visit('http://localhost:5601/s/default/app/management/insightsAndAlerting/reporting'); - cy.get('div[data-test-subj="reportingTable"]').within(() => { - cy.get('span[data-test-subj="reportingTableStatusColumn"]').should('not.exist'); - }); + // Go to Reports and wait for all reports to be 'Done' + Reports.navigateTo(); + Reports.waitForAllReportsToBeDone(searchName); + + // Log out + Login.signOut(); + + // Log in as "user3:dev" + Login.setLogin('user3:dev'); + Login.initialization(); + + // Go to Reports and verify there are no reports + Reports.navigateTo(); + Reports.verifyNoReports(); + + Login.signOut(); }); + afterEach(() => { + // Log in as "user2:dev" + Login.setLogin('user2:dev'); + Login.initialization(); + + DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + Reports.deleteAllReports(searchName) + + + Login.signOut(); + }) + after(() => { - // Ensure proper sign out - Cypress.env("login", "kibana"); - Cypress.env("password", "kibana"); - Login.signIn(); - - // Make the request to delete the invoices index - cy.request({ - method: 'DELETE', - url: 'http://localhost:19200/invoices', - headers: { - 'Content-Type': 'application/json', - }, - failOnStatusCode: false, - }).then(response => { - if (response.status === 403) { - cy.log('Access Forbidden: Check ReadonlyREST permissions'); - } - }); + // Log in as "kibana:kibana" + Login.setLogin('kibana:kibana'); + Login.initialization(); + + // Delete the "invoices" index + DevTools.openDevTools(); + + DevTools.sendRequest(`DELETE ${ indexPatternName }`); + DevTools.verifyIf200Status(); + + Login.signOut(); }); }); diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index b6e4837..8a235f8 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -11,7 +11,7 @@ Cypress.Commands.add('kbnPost', ({ endpoint, credentials, payload, currentGroupH }) }); -Cypress.Commands.add('esPost', ({ endpoint, credentials, payload }, ...args) => +Cypress.Commands.add('esPost', ({ endpoint, credentials, payload }, ...args) => cy.esRequest({ method: "POST", endpoint: endpoint, @@ -20,7 +20,7 @@ Cypress.Commands.add('esPost', ({ endpoint, credentials, payload }, ...args) => }) ); -Cypress.Commands.add('kbnPut', ({ endpoint, credentials, payload }, ...args) => +Cypress.Commands.add('kbnPut', ({ endpoint, credentials, payload }, ...args) => cy.kbnRequest({ method: "PUT", endpoint: endpoint, @@ -29,7 +29,7 @@ Cypress.Commands.add('kbnPut', ({ endpoint, credentials, payload }, ...args) => }) ); -Cypress.Commands.add('esPut', ({ endpoint, credentials, payload }, ...args) => +Cypress.Commands.add('esPut', ({ endpoint, credentials, payload }, ...args) => cy.esRequest({ method: "PUT", endpoint: endpoint, @@ -51,7 +51,7 @@ Cypress.Commands.add( Cypress.Commands.add( 'kbnGet', - ({ endpoint, credentials, currentGroupHeader }, ...args) => + ({ endpoint, credentials, currentGroupHeader }, ...args) => cy.kbnRequest({ method: "GET", endpoint: endpoint, @@ -62,7 +62,7 @@ Cypress.Commands.add( Cypress.Commands.add( 'esGet', - ({ endpoint, credentials }, ...args) => + ({ endpoint, credentials }, ...args) => cy.esRequest({ method: "GET", endpoint: endpoint, diff --git a/e2e-tests/cypress/support/page-objects/DevTools.ts b/e2e-tests/cypress/support/page-objects/DevTools.ts index f619b34..1fd1a78 100644 --- a/e2e-tests/cypress/support/page-objects/DevTools.ts +++ b/e2e-tests/cypress/support/page-objects/DevTools.ts @@ -7,9 +7,9 @@ export class DevTools { cy.log('Open Dev tools'); KibanaNavigation.openKibanaNavigation(); cy.contains('Dev Tools').click(); - cy.findByRole('button', { name: /Dismiss/ }); + cy.findByRole('button', {name: /Dismiss/}); cy.findByRole('dialog') - .findByRole('button', { name: /Dismiss/ }) + .findByRole('button', {name: /Dismiss/}) .click(); } @@ -18,15 +18,15 @@ export class DevTools { if (semver.lte(getKibanaVersion(), '7.9.0')) { // Select editor, delete, write cy.get('#ConAppEditor').click(); - cy.get('#ConAppInputTextarea').clear({ force: true }); + cy.get('#ConAppInputTextarea').clear({force: true}); cy.get('#ConAppInputTextarea').type(text); // Click play - cy.get('.ace_scroller:nth-child(4) > .ace_content').click({ force: true }); - cy.get('.conApp__editorActionButton path').click({ force: true }); + cy.get('.ace_scroller:nth-child(4) > .ace_content').click({force: true}); + cy.get('.conApp__editorActionButton path').click({force: true}); } else { - cy.get('[data-test-subj=console-textarea]').clear({ force: true }); - cy.get('[data-test-subj=console-textarea]').type(text, { force: true }); + cy.get('[data-test-subj=console-textarea]').clear({force: true}); + cy.get('[data-test-subj=console-textarea]').type(text, {force: true, parseSpecialCharSequences: false}); cy.get('[data-test-subj=sendRequestButton]').click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 6b206bb..5382e91 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -87,6 +87,76 @@ export class Discover { } return openDataPageForKibanaBefore7_18_1(); }; + + static navigateTo() { + cy.log('navigateTo'); + KibanaNavigation.openKibanaNavigation(); + cy.contains('Discover').click({force: true}); + cy.wait(1000); + } + + static selectDataView(dataViewName: string) { + cy.log('selectDataView'); + + // For Kibana 8.0.0 and above, we need to interact with the popover + if (semver.gte(getKibanaVersion(), '8.0.0')) { + cy.get('[data-test-subj="discover-dataView-switch-link"]').click(); // Open the popover + + // Search for the data view within the popover + cy.get('.euiPopover__panel [role="combobox"] input') // Assuming this is the search input within the popover + .type(dataViewName); + + // Wait for the options to filter and then select the desired data view + cy.wait(500); // Adjust if needed + cy.get(`.euiPopover__panel li:contains("${ dataViewName }")`) + .click({force: true}); + } else { + // For older Kibana versions, use the previous logic + cy.get('[data-test-subj="indexPattern-switch-link"]').click(); + cy.contains(dataViewName).click({force: true}); + } + } + + static generateCsvReport() { + cy.log('generateCsvReport'); + + // Click the share button to open the sharing options + cy.get('[data-test-subj=shareTopNavButton]').click(); + + // Click the "CSV Reports" option + cy.get('[data-test-subj=sharePanel-CSVReports]').click(); + + // Click the "Generate report" button + cy.get('[data-test-subj=generateReportButton]').click(); + + // Wait for the "Queued report for search" message to appear + cy.contains('Queued report for search', {timeout: 50000}).should('exist'); + + // Close the "Queued report for search" toast + cy.get('[data-test-subj="toastCloseButton"]').click(); + + // Wait for the "Queued report for search" message to disappear + cy.contains('Queued report for search', {timeout: 50000}).should('not.exist'); + var triger: string; + if (semver.lte(getKibanaVersion(), '8.8.0')) { + triger = 'Created report for'; + } else { + triger = 'CSV created for'; + } + // Attempt to find the "Created report for" message within the timeout + cy.contains(triger, {timeout: 50000}) + .then($message => { + if ($message.length !== 0) { + // Close the "Created report for" toast + cy.get('[data-test-subj="toastCloseButton"]').click(); + + // Wait for the "Created report for" message to disappear + cy.contains(triger, {timeout: 50000}).should('not.exist'); + } else { // If the message is not found + throw new Error(`Report generation failed: "${ triger }" message not found within timeout.`); + } + }); + } } const createKibanaIndexPattern = (indexPatternName: string) => { @@ -131,6 +201,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); cy.contains('@timestamp').click({ force: true }); + cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); if (semver.gte(getKibanaVersion(), '8.9.0')) { cy.intercept('/s/default/api/kibana/management/saved_objects/**').as('indexPattern'); diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 69d4519..9680730 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -28,17 +28,23 @@ export class Login { cy.log('has license changed message'); cy.contains(/The licensing edition has been changed./i); } + static signOut() { - cy.get('[data-test-subj="userMenuButton"]', { timeout: 500 }) // Element wskazujący na zalogowanie - .then($userMenu => { - // Sprawdź, czy element istnieje (czyli czy użytkownik jest zalogowany) - if ($userMenu.length > 0) { - // Kliknij przycisk wylogowania - cy.contains('button', 'Log out').click({ force: true }); - cy.log("User Sign out"); - } else { - cy.log("User wasn't sign in"); - } - }); + cy.get('#rorMenuPopover', {timeout: 1000}).click() + // cy.get('[data-test-subj="userMenuButton"]', {timeout: 1000}).click() + .then($userMenu => { + if ($userMenu.length > 0) { + cy.contains('button', 'Log out').click({force: true}); + cy.log("User Sign out"); + } else { + cy.log("User wasn't sign in"); + } + }); + } + + static setLogin(user: string) { + let loginData = user.split(":"); + Cypress.env("login", loginData[0]); + Cypress.env("password", loginData[1]); } } diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts new file mode 100644 index 0000000..2d201f7 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -0,0 +1,99 @@ +import * as semver from 'semver'; +import { getKibanaVersion } from '../../helpers'; +import { Discover } from "../Discover"; +import { KibanaNavigation } from "../KibanaNavigation"; + + +export class DataViews { + static deleteSavedObjectsIfExist(objectsNames: string[]) { + cy.log('deleteSavedObjectsIfExist'); + KibanaNavigation.openKibanaNavigation(); + cy.contains('Stack Management').click(); + cy.contains('Saved Objects').click(); + + for (const objectName of objectsNames) { + + // Delete "invoices" index pattern if it exists + cy.get('[data-test-subj="savedObjectSearchBar"]').type(objectName + "{enter}"); + cy.get('body').then($body => { + // Find the table row containing *exactly* "invoices" in the title + const $invoicesIndexPatternRow = $body.find(`[data-test-subj="savedObjectsTableRowTitle"] a`) + .filter((index, el) => Cypress.$(el).text().trim() === objectName) + .closest('tr').first(); // Get the parent row of the link + + if ($invoicesIndexPatternRow.length > 0) { + cy.wrap($invoicesIndexPatternRow) + .find('[type="checkbox"]') + .click(); + cy.contains('Delete').click(); + cy.get('[data-test-subj="confirmModalConfirmButton"]').click(); + cy.log(`Deleted index pattern: ${ objectName }`); + } + }); + + // Clear the search bar + cy.get('[data-test-subj="savedObjectSearchBar"]').clear(); + } + } + + static createDataView(dataViewName: string) { + cy.log('createDataView'); + Discover.openDataViewPage(); + + const createDataViewForKibanaBefore8_0_0 = () => { + cy.get('[data-test-subj="createIndexPatternButtonFlyout"]').click(); + cy.get('[data-test-subj="createIndexPatternNameInput"]').type(`${ dataViewName }{del}`); + cy.get('[data-test-subj="timestampField"]') // Find the timestamp field combobox + .find('[data-test-subj="comboBoxToggleListButton"]') // Find the button to open the dropdown + .click(); // Click the button to open the dropdown + + // Wait for the dropdown to appear + cy.wait(500); + + // Find and click the "I don't want to use the time filter" option + cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---`); + cy.get('[data-test-subj="saveIndexPatternButton"]').click(); + }; + + const createDataViewForKibanaForAndAbove8_0_0 = () => { + const createDataViewPossibleSelectors = [ + '[data-test-subj=createDataViewButtonFlyout]', // >= 8.2.x + '[data-test-subj=createDataViewButton]' // >= 8.4.x + ]; + + // Click the "Create data view" button, handling different selectors based on Kibana version + cy.get(createDataViewPossibleSelectors.join(',')) + .contains(/create.*data.*view/i, {matchCase: false}) + .click(); + + // Type the data view name into the appropriate input field, handling changes in 8.4.0+ + cy.get( + [ + '[data-test-subj=createIndexPatternNameInput]', // regular index pattern field + '[data-test-subj=createIndexPatternTitleInput]' // Added title field in 8.4.0 + ].join(',') + ).then(els => { + [...els].forEach(el => cy.wrap(el).type(`${ dataViewName }{del}`)); + }); + // cy.get('[data-test-subj="comboBoxSearchInput"]').click(); + // cy.wait(50000); + // cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---{enter}`); + + // Save the data view + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); + }; + + if (semver.gte(getKibanaVersion(), '8.0.0')) { + createDataViewForKibanaForAndAbove8_0_0(); + } else { + createDataViewForKibanaBefore8_0_0(); + } + + // Wait for the data view to be created and verify it's visible + cy.contains('saved', {timeout: 10000, matchCase: false}).should('exist'); + + cy.get('[data-test-subj="toastCloseButton"]').click(); + cy.contains('saved', {timeout: 10000}).should('not.exist'); + cy.findByRole('navigation', {name: /breadcrumb/i}).findByText(dataViewName); + } +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts new file mode 100644 index 0000000..c24fd83 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -0,0 +1,118 @@ +import { KibanaNavigation } from '../KibanaNavigation'; +import semver from "semver/preload"; +import { getKibanaVersion } from "../../helpers"; + +export class Reports { + static navigateTo() { + cy.log('navigateTo'); + + // Check if we are already on the Stack Management page + cy.url().then(url => { + if (!url.includes('/app/management')) { + // If not, open Kibana navigation and click on Stack Management + KibanaNavigation.openKibanaNavigation(); + cy.contains('Stack Management').click(); + } + + // Now, click on Reporting (whether we were already on Stack Management or not) + cy.contains('Reporting').click(); + }); + } + + static waitForAllReportsToBeDone(reportTitle: string = 'Untitled discover search') { + cy.log('waitForAllReportsToBeDone'); + + cy.get('tr[data-test-subj="reportJobRow"]') + .each($reportItem => { + cy.wrap($reportItem) + .find('[data-test-subj="reportingListItemObjectTitle"]') + .should('contain.text', reportTitle); + + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 60000}) + .should('be.visible'); + + // Click the download button + if (semver.lte(getKibanaVersion(), '8.8.0')) { + cy.wrap($reportItem) + .find('[data-test-subj="reportJobActions"] button') + .first() + .click(); + } else { + cy.wrap($reportItem) + .find('[data-test-subj="reportDownloadLink"]') + .first() + .click(); + } + + // Assert that a file is downloaded + cy.verifyDownload(`${ reportTitle }.csv`, {timeout: 10000}) // Adjust timeout if needed + .then(filePath => { + // Read the downloaded file content and assert it's not empty + cy.readFile(filePath) + .should('not.be.empty') + .then(fileContent => { + const rows = fileContent.split('\n'); + expect(rows.length).to.be.greaterThan(1); + }); + }); + }) + .then($matchingReports => { + expect($matchingReports).to.have.length(10); + }); + } + + + static verifyNoReports() { + cy.log('verifyNoReports'); + + // Assert that there are no report rows present + cy.get('tr[data-test-subj="reportJobRow"]').should('not.exist'); + } + + static deleteAllReports(reportTitle: string = 'Untitled discover search') { + cy.log('deleteAllReports'); + + // 1. Navigate to the Reporting page + Reports.navigateTo(); + + // 2. Check if there are any reports and if "Select All" is enabled + cy.wait(500); + cy.get('body').then($body => { + const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; + const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled + + if (hasReports) { + if (selectAllEnabled) { + // If "Select All" is enabled, delete all reports directly + cy.log('Deleting all reports using "Select All"'); + + // Select all reports + cy.get('[data-test-subj="checkboxSelectAll"]').check({force: true}); + + // Click the "Delete" button + cy.get('[data-test-subj="deleteReportButton"]').click({force: true}); + + // Confirm the deletion in the modal + cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); + + } else { + // If "Select All" is not enabled, delete reports page by page as before + cy.log('Deleting reports page by page'); + + let totalPages = 1; + cy.get('.euiPagination__list li:not(.euiPaginationButton-isPlaceholder)').then($pageButtons => { + totalPages = $pageButtons.length; + }); + + for (let currentPage = 1; currentPage <= totalPages; currentPage++) { + // ... (rest of the page-by-page deletion logic remains the same) ... + } + } + } else { + cy.log('No reports found - nothing to delete'); + } + }); + } +} \ No newline at end of file diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index a430641..95f16d7 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -27,18 +27,6 @@ readonlyrest: auth_key: kibana:kibana verbosity: error - - name: Allow DELETE on Invoices - indices: ["invoices"] - actions: ["indices:data/write/delete"] - groups: [ admins_group ] - verbosity: error - - - name: Allow bulk requests - methods: ["POST"] - uri: "/invoices/_bulk" - groups: [ admins_group ] - verbosity: info - - name: PERSONAL_GRP groups: [ Personal ] <<: *common-rules @@ -87,9 +75,13 @@ readonlyrest: auth_key: user1:dev <<: *all-groups - - username: kibana - auth_key: kibana:kibana - groups: [ admins_group ] + - username: user2 + auth_key: user2:dev + <<: *all-groups + + - username: user3 + auth_key: user3:dev + <<: *all-groups ror_kbn: - name: kbn1 @@ -112,8 +104,3 @@ readonlyrest: authentication_endpoint: "http://localhost:1000/auth" success_status_code: 200 cache_ttl: 60s - -http.cors.enabled: true -http.cors.allow-origin: "*" -http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE" -http.cors.allow-headers: "kbn-version, Origin, X-Requested-With, Content-Type, Accept, Authorization" \ No newline at end of file diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index 7b770a6..f44f53a 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -15,8 +15,8 @@ elasticsearch.requestTimeout: 30000 csp.strict: false csp.warnLegacyBrowsers: false -elasticsearch.hosts: [ "http://localhost:9200", "http://localhost:9201", "http://localhost:9202", "${ES_API_URL}" ] # USE FAKENODE CLUSTER SIMULATOR -#elasticsearch.hosts: [ "${ES_API_URL}" ] +#elasticsearch.hosts: [ "http://localhost:9201", "http://localhost:9202" ] # USE FAKENODE CLUSTER SIMULATOR +elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] From a0319777d39fb5b101fd05d44da118c3c6b498c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Go=C5=82=C4=99biowski?= <65414380+lodyczekoladowe@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:57:02 +0200 Subject: [PATCH 13/19] Update e2e-tests/cypress/e2e/Report-generation.cy.ts --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 2499dc0..ebb5202 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -5,7 +5,7 @@ import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; import { DevTools } from "../support/page-objects/DevTools"; -describe('Report Generation (ROR_INTR_001)', () => { +describe('Report Generation', () => { const indexPatternName: string = 'invoices'; const searchName: string = `${ indexPatternName } search`; From d693e38714c8bc2a057613a09b0eb2d66fa9a9ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Go=C5=82=C4=99biowski?= <65414380+lodyczekoladowe@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:02:41 +0200 Subject: [PATCH 14/19] Update elk-ror/conf/kbn/kibana.yml --- elk-ror/conf/kbn/kibana.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/elk-ror/conf/kbn/kibana.yml b/elk-ror/conf/kbn/kibana.yml index f44f53a..8f7b6aa 100644 --- a/elk-ror/conf/kbn/kibana.yml +++ b/elk-ror/conf/kbn/kibana.yml @@ -19,7 +19,6 @@ csp.warnLegacyBrowsers: false elasticsearch.hosts: [ "${ES_API_URL}" ] elasticsearch.username: kibana elasticsearch.password: kibana -elasticsearch.requestHeadersWhitelist: [ authorization, kbn-xsrf, x-custom-header ] xpack.encryptedSavedObjects.encryptionKey: "19+230i1902i310293213i109312i31209302193219039120i3j23h31h3h213h123!" xpack.reporting.encryptionKey: "321421321211231241232132132132132" #xpack.reporting.index: '.reporting-test-index' From 0b1cb86a3499dad59b99e81d43b010ba7fbd5c16 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Fri, 16 Aug 2024 22:29:09 +0200 Subject: [PATCH 15/19] Part of the requested changes --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 99 +++++++++---------- e2e-tests/cypress/e2e/Sanity-check.cy.ts | 4 +- .../cypress/support/page-objects/Discover.ts | 6 +- .../cypress/support/page-objects/Login.ts | 1 - .../page-objects/management/DataViews.ts | 3 - .../page-objects/management/Reports.ts | 2 +- elk-ror/conf/es/readonlyrest.yml | 8 -- 7 files changed, 54 insertions(+), 69 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index ebb5202..056fb68 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -1,44 +1,57 @@ -// report-generation.spec.ts import { Login } from "../support/page-objects/Login"; import { DataViews } from "../support/page-objects/management/DataViews"; import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; -import { DevTools } from "../support/page-objects/DevTools"; describe('Report Generation', () => { - const indexPatternName: string = 'invoices'; - const searchName: string = `${ indexPatternName } search`; + const indexName: string = 'invoices'; + const searchName: string = `${ indexName } search`; before(() => { - // Log in as "kibana:kibana" (adjust credentials if needed) - Login.setLogin('kibana:kibana'); - Login.initialization(); - - DevTools.openDevTools(); - // Attempt to bulk index sample data - DevTools.sendRequest( - 'PUT invoices/_bulk\n' + - '{"create":{ }}\n' + - '{"id": 1,"number": "INV001","date": "2024-08-01","amount": 123.45,"currency": "USD"}\n' + - '{"create":{ }}\n' + - '{"id": 2,"number": "INV002","date": "2024-08-02","amount": 67.89,"currency": "EUR"}' - ) - DevTools.verifyIf200Status(); - - // Check if the "invoices" index exists after the bulk operation - DevTools.sendRequest(`GET ${ indexPatternName }`); - DevTools.verifyIf200Status(); - Login.signOut(); + cy.put({ + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + payload: [ + {create: {}}, + {id: 1, number: "INV001", date: "2024-08-01", amount: "123.45", currency: "USD"}, + {create: {}}, + {id: 2, number: "INV002", date: "2024-08-02", amount: "67.89", currency: "EUR"}, + {create: {}}, + {id: 3, number: "INV003", date: "2024-08-03", amount: "456.78", currency: "GBP"}, + {create: {}}, + {id: 4, number: "INV004", date: "2024-08-04", amount: "90.12", currency: "JPY"}, + {create: {}}, + {id: 5, number: "INV005", date: "2024-08-05", amount: "345.67", currency: "CAD"}, + {create: {}}, + {id: 6, number: "INV006", date: "2024-08-06", amount: "89.01", currency: "AUD"}, + {create: {}}, + {id: 7, number: "INV007", date: "2024-08-07", amount: "234.56", currency: "CHF"}, + {create: {}}, + {id: 8, number: "INV008", date: "2024-08-08", amount: "78.90", currency: "SEK"}, + {create: {}}, + {id: 9, number: "INV009", date: "2024-08-09", amount: "135.79", currency: "NZD"}, + {create: {}}, + {id: 10, number: "INV010", date: "2024-08-10", amount: "246.80", currency: "DKK"}, + {create: {}}, + {id: 11, number: "INV011", date: "2024-08-11", amount: "357.91", currency: "NOK"}, + {create: {}}, + {id: 12, number: "INV012", date: "2024-08-12", amount: "468.02", currency: "ZAR"}, + {create: {}}, + {id: 13, number: "INV013", date: "2024-08-13", amount: "579.13", currency: "BRL"}, + {create: {}}, + {id: 14, number: "INV014", date: "2024-08-14", amount: "680.24", currency: "INR"}, + {create: {}}, + {id: 15, number: "INV015", date: "2024-08-15", amount: "791.35", currency: "RUB"} + ] + }); }); beforeEach(() => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) @@ -46,35 +59,28 @@ describe('Report Generation', () => { }) it('should generate and verify reports for user2, and user3 should not see them', () => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - // Create invoices data view - DataViews.createDataView(indexPatternName); + DataViews.createDataView(indexName); - // Go to Discover and generate 10 CSV reports Discover.navigateTo(); - Discover.selectDataView(indexPatternName); - Discover.saveReport(searchName); - // Discover.selectDataView(indexPatternName); + Discover.selectDataView(indexName); + Discover.saveSearch(searchName); for (let i = 0; i < 10; i++) { - Discover.generateCsvReport(); + Discover.generateCsvReport(50000); } - // Go to Reports and wait for all reports to be 'Done' + // Go to Reports and check if all reports are not empty Reports.navigateTo(); - Reports.waitForAllReportsToBeDone(searchName); + Reports.checkAllReports(searchName); - // Log out Login.signOut(); - // Log in as "user3:dev" Login.setLogin('user3:dev'); Login.initialization(); - // Go to Reports and verify there are no reports Reports.navigateTo(); Reports.verifyNoReports(); @@ -82,11 +88,10 @@ describe('Report Generation', () => { }); afterEach(() => { - // Log in as "user2:dev" Login.setLogin('user2:dev'); Login.initialization(); - DataViews.deleteSavedObjectsIfExist([indexPatternName, searchName]); + DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) @@ -94,16 +99,8 @@ describe('Report Generation', () => { }) after(() => { - // Log in as "kibana:kibana" - Login.setLogin('kibana:kibana'); - Login.initialization(); - - // Delete the "invoices" index - DevTools.openDevTools(); - - DevTools.sendRequest(`DELETE ${ indexPatternName }`); - DevTools.verifyIf200Status(); - - Login.signOut(); + cy.delete({ + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + }) }); }); diff --git a/e2e-tests/cypress/e2e/Sanity-check.cy.ts b/e2e-tests/cypress/e2e/Sanity-check.cy.ts index 2a8d879..a5908d4 100644 --- a/e2e-tests/cypress/e2e/Sanity-check.cy.ts +++ b/e2e-tests/cypress/e2e/Sanity-check.cy.ts @@ -30,7 +30,7 @@ describe('sanity check', () => { Discover.createIndexPattern('s'); cy.log('Create a CSV report'); - Discover.saveReport('admin_search'); + Discover.saveSearch('admin_search'); Discover.exportToCsv(); Reporting.verifySavedReport('admin_search', 'kibanaNavigation', 1); @@ -52,7 +52,7 @@ describe('sanity check', () => { Discover.createIndexPattern('sa'); cy.log('Create CSV report for the second tenancy'); - Discover.saveReport('infosec_search'); + Discover.saveSearch('infosec_search'); Discover.exportToCsv(); Reporting.verifySavedReport('infosec_search', 'rorMenu', 1); } diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 5382e91..9deaf59 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -15,18 +15,18 @@ export class Discover { cy.contains(indexPatternName).should('be.visible'); } - static saveReport(reportName: string) { + static saveSearch(searchName: string) { cy.log('saveReport'); KibanaNavigation.openKibanaNavigation(); cy.contains('Discover').click(); cy.get('[data-test-subj=discoverSaveButton]').click(); - cy.get('[data-test-subj=savedObjectTitle]').type(reportName); + cy.get('[data-test-subj=savedObjectTitle]').type(searchName); cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({ force: true }); cy.contains('was saved', { timeout: 10000 }).should('exist'); cy.findByRole('navigation', { name: /breadcrumb/i - }).findByText(reportName); + }).findByText(searchName); } static exportToCsv() { diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 9680730..6ca265b 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -31,7 +31,6 @@ export class Login { static signOut() { cy.get('#rorMenuPopover', {timeout: 1000}).click() - // cy.get('[data-test-subj="userMenuButton"]', {timeout: 1000}).click() .then($userMenu => { if ($userMenu.length > 0) { cy.contains('button', 'Log out').click({force: true}); diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts index 2d201f7..bdc8512 100644 --- a/e2e-tests/cypress/support/page-objects/management/DataViews.ts +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -75,9 +75,6 @@ export class DataViews { ).then(els => { [...els].forEach(el => cy.wrap(el).type(`${ dataViewName }{del}`)); }); - // cy.get('[data-test-subj="comboBoxSearchInput"]').click(); - // cy.wait(50000); - // cy.get('[data-test-subj="comboBoxSearchInput"]').type(`--- I don't want to use the time filter ---{enter}`); // Save the data view cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index c24fd83..d6d5f58 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -19,7 +19,7 @@ export class Reports { }); } - static waitForAllReportsToBeDone(reportTitle: string = 'Untitled discover search') { + static checkAllReports(reportTitle: string = 'Untitled discover search') { cy.log('waitForAllReportsToBeDone'); cy.get('tr[data-test-subj="reportJobRow"]') diff --git a/elk-ror/conf/es/readonlyrest.yml b/elk-ror/conf/es/readonlyrest.yml index 95f16d7..1b8ed94 100644 --- a/elk-ror/conf/es/readonlyrest.yml +++ b/elk-ror/conf/es/readonlyrest.yml @@ -75,14 +75,6 @@ readonlyrest: auth_key: user1:dev <<: *all-groups - - username: user2 - auth_key: user2:dev - <<: *all-groups - - - username: user3 - auth_key: user3:dev - <<: *all-groups - ror_kbn: - name: kbn1 signature_key: "9yzBfnLaTYLfGPzyKW9es76RKYhUVgmuv6ZtehaScj5msGpBpa5FWpwk295uJYaaffTFnQC5tsknh2AguVDaTrqCLfM5zCTqdE4UGNL73h28Bg4dPrvTAFQyygQqv4xfgnevBED6VZYdfjXAQLc8J8ywaHQQSmprZqYCWGE6sM3vzNUEWWB3kmGrEKa4sGbXhmXZCvL6NDnEJhXPDJAzu9BMQxn8CzVLqrx6BxDgPYF8gZCxtyxMckXwCaYXrxAGbjkYH69F4wYhuAdHSWgRAQCuWwYmWCA6g39j4VPge5pv962XYvxwJpvn23Y5KvNZ5S5c6crdG4f4gTCXnU36x92fKMQzsQV9K4phcuNvMWkpqVB6xMA5aPzUeHcGytD93dG8D52P5BxsgaJJE6QqDrk3Y2vyLw9ZEbJhPRJxbuBKVCBtVx26Ldd46dq5eyyzmNEyQGLrjQ4qd978VtG8TNT5rkn4ETJQEju5HfCBbjm3urGLFVqxhGVawecT4YM9Rry4EqXWkRJGTFQWQRnweUFbKNbVTC9NxcXEp6K5rSPEy9trb5UYLYhhMJ9fWSBMuenGRjNSJxeurMRCaxPpNppBLFnp8qW5ezfHgCBpEjkSNNzP4uXMZFAXmdUfJ8XQdPTWuYfdHYc5TZWnzrdq9wcfFQRDpDB2zX5Myu96krDt9vA7wNKfYwkSczA6qUQV66jA8nV4Cs38cDAKVBXnxz22ddAVrPv8ajpu7hgBtULMURjvLt94Nc5FDKw79CTTQxffWEj9BJCDCpQnTufmT8xenywwVJvtj49yv2MP2mGECrVDRmcGUAYBKR8G6ZnFAYDVC9UhY46FGWDcyVX3HKwgtHeb45Ww7dsW8JdMnZYctaEU585GZmqTJp2LcAWRcQPH25JewnPX8pjzVpJNcy7avfA2bcU86bfASvQBDUCrhjgRmK2ECR6vzPwTsYKRgFrDqb62FeMdrKgJ9vKs435T5ACN7MNtdRXHQ4fj5pNpUMDW26Wd7tt9bkBTqEGf" From d2aa9ba1cf047ba81121e9874c388586d18f572a Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Thu, 29 Aug 2024 15:30:16 +0200 Subject: [PATCH 16/19] All of requested changes. Waiting for pull request --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 4 +++- .../support/page-objects/management/Reports.ts | 15 +-------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 056fb68..a389005 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -11,6 +11,7 @@ describe('Report Generation', () => { before(() => { // Attempt to bulk index sample data cy.put({ + user: 'kibana:kibana', url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, payload: [ {create: {}}, @@ -100,7 +101,8 @@ describe('Report Generation', () => { after(() => { cy.delete({ - url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, + user: 'kibana:kibana', + url: `${ Cypress.env().elasticsearchUrl }/${ indexName }`, }) }); }); diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index d6d5f58..2267239 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -78,7 +78,7 @@ export class Reports { Reports.navigateTo(); // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(500); + cy.wait(1000); cy.get('body').then($body => { const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled @@ -96,19 +96,6 @@ export class Reports { // Confirm the deletion in the modal cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); - - } else { - // If "Select All" is not enabled, delete reports page by page as before - cy.log('Deleting reports page by page'); - - let totalPages = 1; - cy.get('.euiPagination__list li:not(.euiPaginationButton-isPlaceholder)').then($pageButtons => { - totalPages = $pageButtons.length; - }); - - for (let currentPage = 1; currentPage <= totalPages; currentPage++) { - // ... (rest of the page-by-page deletion logic remains the same) ... - } } } else { cy.log('No reports found - nothing to delete'); From 0fe0e1064ea1c718eddb25dac92898fd175ef19c Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Thu, 5 Sep 2024 00:34:34 +0200 Subject: [PATCH 17/19] Self-generate invoices data, checking report generation process.. --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 46 +---- .../cypress/support/page-objects/Discover.ts | 53 ++---- .../cypress/support/page-objects/Login.ts | 5 +- .../cypress/support/page-objects/invoices.ts | 173 ++++++++++++++++++ .../page-objects/management/DataViews.ts | 1 + .../page-objects/management/Reports.ts | 51 ++---- elk-ror/docker-compose.yml | 4 +- 7 files changed, 218 insertions(+), 115 deletions(-) create mode 100644 e2e-tests/cypress/support/page-objects/invoices.ts diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index a389005..52763be 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -2,50 +2,14 @@ import { Login } from "../support/page-objects/Login"; import { DataViews } from "../support/page-objects/management/DataViews"; import { Discover } from "../support/page-objects/Discover"; import { Reports } from "../support/page-objects/management/Reports"; +import { dataPut } from "../support/page-objects/invoices"; describe('Report Generation', () => { const indexName: string = 'invoices'; const searchName: string = `${ indexName } search`; - before(() => { - // Attempt to bulk index sample data - cy.put({ - user: 'kibana:kibana', - url: `${ Cypress.env().elasticsearchUrl }/${ indexName }/_bulk`, - payload: [ - {create: {}}, - {id: 1, number: "INV001", date: "2024-08-01", amount: "123.45", currency: "USD"}, - {create: {}}, - {id: 2, number: "INV002", date: "2024-08-02", amount: "67.89", currency: "EUR"}, - {create: {}}, - {id: 3, number: "INV003", date: "2024-08-03", amount: "456.78", currency: "GBP"}, - {create: {}}, - {id: 4, number: "INV004", date: "2024-08-04", amount: "90.12", currency: "JPY"}, - {create: {}}, - {id: 5, number: "INV005", date: "2024-08-05", amount: "345.67", currency: "CAD"}, - {create: {}}, - {id: 6, number: "INV006", date: "2024-08-06", amount: "89.01", currency: "AUD"}, - {create: {}}, - {id: 7, number: "INV007", date: "2024-08-07", amount: "234.56", currency: "CHF"}, - {create: {}}, - {id: 8, number: "INV008", date: "2024-08-08", amount: "78.90", currency: "SEK"}, - {create: {}}, - {id: 9, number: "INV009", date: "2024-08-09", amount: "135.79", currency: "NZD"}, - {create: {}}, - {id: 10, number: "INV010", date: "2024-08-10", amount: "246.80", currency: "DKK"}, - {create: {}}, - {id: 11, number: "INV011", date: "2024-08-11", amount: "357.91", currency: "NOK"}, - {create: {}}, - {id: 12, number: "INV012", date: "2024-08-12", amount: "468.02", currency: "ZAR"}, - {create: {}}, - {id: 13, number: "INV013", date: "2024-08-13", amount: "579.13", currency: "BRL"}, - {create: {}}, - {id: 14, number: "INV014", date: "2024-08-14", amount: "680.24", currency: "INR"}, - {create: {}}, - {id: 15, number: "INV015", date: "2024-08-15", amount: "791.35", currency: "RUB"} - ] - }); + dataPut(100000, indexName); }); beforeEach(() => { @@ -55,7 +19,6 @@ describe('Report Generation', () => { DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) - Login.signOut(); }) @@ -70,7 +33,7 @@ describe('Report Generation', () => { Discover.selectDataView(indexName); Discover.saveSearch(searchName); for (let i = 0; i < 10; i++) { - Discover.generateCsvReport(50000); + Discover.generateCsvReport(); } // Go to Reports and check if all reports are not empty @@ -95,7 +58,6 @@ describe('Report Generation', () => { DataViews.deleteSavedObjectsIfExist([indexName, searchName]); Reports.deleteAllReports(searchName) - Login.signOut(); }) @@ -105,4 +67,4 @@ describe('Report Generation', () => { url: `${ Cypress.env().elasticsearchUrl }/${ indexName }`, }) }); -}); +}); \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 9deaf59..863839f 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -21,8 +21,13 @@ export class Discover { cy.contains('Discover').click(); cy.get('[data-test-subj=discoverSaveButton]').click(); cy.get('[data-test-subj=savedObjectTitle]').type(searchName); - cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({ force: true }); - cy.contains('was saved', { timeout: 10000 }).should('exist'); + cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({force: true}); + + cy.contains('saved', {timeout: 10000, matchCase: false}).should('exist'); + + cy.get('[data-test-subj="toastCloseButton"]').click({force: true}); + cy.contains('saved', {timeout: 10000, matchCase: false}).should('not.exist'); + cy.findByRole('navigation', { name: /breadcrumb/i @@ -120,42 +125,22 @@ export class Discover { static generateCsvReport() { cy.log('generateCsvReport'); - // Click the share button to open the sharing options - cy.get('[data-test-subj=shareTopNavButton]').click(); - - // Click the "CSV Reports" option - cy.get('[data-test-subj=sharePanel-CSVReports]').click(); + cy.wait(1500); - // Click the "Generate report" button - cy.get('[data-test-subj=generateReportButton]').click(); + // Click the share button to open the sharing options if it is not opened - // Wait for the "Queued report for search" message to appear - cy.contains('Queued report for search', {timeout: 50000}).should('exist'); + cy.get("body").then($body => { + const $shareContextMenu = $body.find('[data-test-subj="shareContextMenu"]') + if ($shareContextMenu.length == 0) { + cy.get('[data-test-subj="shareTopNavButton"]').click(); + } + }) - // Close the "Queued report for search" toast - cy.get('[data-test-subj="toastCloseButton"]').click(); + // Click the "CSV Reports" option + cy.get('[data-test-subj="sharePanel-CSVReports"]').click(); - // Wait for the "Queued report for search" message to disappear - cy.contains('Queued report for search', {timeout: 50000}).should('not.exist'); - var triger: string; - if (semver.lte(getKibanaVersion(), '8.8.0')) { - triger = 'Created report for'; - } else { - triger = 'CSV created for'; - } - // Attempt to find the "Created report for" message within the timeout - cy.contains(triger, {timeout: 50000}) - .then($message => { - if ($message.length !== 0) { - // Close the "Created report for" toast - cy.get('[data-test-subj="toastCloseButton"]').click(); - - // Wait for the "Created report for" message to disappear - cy.contains(triger, {timeout: 50000}).should('not.exist'); - } else { // If the message is not found - throw new Error(`Report generation failed: "${ triger }" message not found within timeout.`); - } - }); + // Click the "Generate report" button + cy.get('[data-test-subj="generateReportButton"]').click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index 6ca265b..d331b81 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -7,6 +7,7 @@ export class Login { localStorage.setItem('home:welcome:show', 'false'); }); cy.visit(Cypress.config().baseUrl); + cy.wait(1000); Login.signIn(); Loader.loading(); } @@ -17,7 +18,7 @@ export class Login { } static fillLoginPage() { - cy.get('#form-username', { timeout: 30000 }).should('be.visible'); + cy.get('#form-username', { timeout: 60000 }).should('be.visible'); cy.get('#form-username').type(Cypress.env().login); cy.get('#form-password').click({ force: true }); cy.get('#form-password').type(Cypress.env().password); @@ -30,6 +31,8 @@ export class Login { } static signOut() { + cy.visit(Cypress.config().baseUrl); + Loader.loading(); cy.get('#rorMenuPopover', {timeout: 1000}).click() .then($userMenu => { if ($userMenu.length > 0) { diff --git a/e2e-tests/cypress/support/page-objects/invoices.ts b/e2e-tests/cypress/support/page-objects/invoices.ts new file mode 100644 index 0000000..6eef4e7 --- /dev/null +++ b/e2e-tests/cypress/support/page-objects/invoices.ts @@ -0,0 +1,173 @@ +// invoices.ts + +function generateInvoice(id: number): object { + const month = Math.floor((id - 1) / 31) + 1; // Distribute dates across months + const day = ((id - 1) % 31) + 1; // Ensure day is within 1-31 range + + // Ensure month and day are within valid ranges + const validMonth = month > 12 ? 12 : month; + const validDay = day > 28 ? 28 : day; // Simplified to avoid invalid dates + + return { + id: id, + number: `INV${ id.toString().padStart(3, '0') }`, + date: `2024-${ validMonth.toString().padStart(2, '0') }-${ validDay.toString().padStart(2, '0') }`, + amount: (Math.random() * 1000).toFixed(2), + currency: ['USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'SEK', 'NZD', 'DKK', 'NOK', 'ZAR', 'BRL', 'INR', 'RUB', 'CNY', 'MXN', 'KRW', 'TRY', 'IDR', 'ARS', 'THB', 'PLN', 'PHP', 'CZK', 'HUF', 'MYR', 'ILS', 'SAR', 'AED', 'COP', 'CLP', 'EGP', 'VND', 'UAH', 'KES', 'NGN', 'PKR'][Math.floor(Math.random() * 37)], + customerName: `Customer ${ id }`, + customerEmail: `customer${ id }example.com`, + status: ['Paid', 'Unpaid', 'Pending'][Math.floor(Math.random() * 3)], + description: `Invoice for service ${ id }`, + address: `${ id } Main St, City, Country`, + phoneNumber: `1-555-${ id.toString().padStart(4, '0') }`, + taxId: `${ id.toString().padStart(3, '0') }-45-6789`, + paymentMethod: ['Credit Card', 'Bank Transfer', 'PayPal', 'Cash'][Math.floor(Math.random() * 4)], + notes: ['Paid in full', 'Awaiting payment', 'Pending approval'][Math.floor(Math.random() * 3)] + }; +} + +function generateInvoices(count: number): object[] { + const invoices = []; + for (let i = 1; i <= count; i++) { + invoices.push({create: {}}); + invoices.push(generateInvoice(i)); + } + return invoices; +} + +function chunkArray(array: any[], chunkSize: number): any[][] { + const chunks = []; + for (let i = 0; i < array.length; i += chunkSize) { + chunks.push(array.slice(i, i + chunkSize)); + } + return chunks; +} + +function handleBulkResponse(response: string | undefined): void { + if (response === undefined) { + console.error('Response is undefined'); + return; + } + + try { + const parsedResponse = JSON.parse(response); + const items = parsedResponse.items; + + items.forEach((item: any) => { + const createResult = item.create; + if (createResult.status === 201) { + console.log(`Invoice ${ createResult._id } created successfully.`); + } else { + console.error(`Failed to create invoice ${ createResult._id }: ${ createResult.error.reason }`); + } + }); + } catch (error) { + console.error('Failed to parse response:', error); + } +} + +function calculateSizeInBytes(object: any): number { + return Buffer.byteLength(JSON.stringify(object), 'utf8'); +} + +function checkBulkSizeLimit(invoices: object[], chunkSize: number): void { + const chunks = chunkArray(invoices, chunkSize); + const maxSizeInBytes = 100 * 1024 * 1024; // 100 MB + + chunks.forEach((chunk, index) => { + const chunkSizeInBytes = calculateSizeInBytes(chunk); + if (chunkSizeInBytes > maxSizeInBytes) { + console.error(`Chunk ${ index + 1 } exceeds the 100 MB limit with size: ${ chunkSizeInBytes } bytes`); + } else { + console.log(`Chunk ${ index + 1 } is within the limit with size: ${ chunkSizeInBytes } bytes`); + } + }); +} + +function checkIndexExists(indexName: string): Cypress.Chainable { + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + return cy.getRequest({ + url: `${ elasticsearchUrl }/${ indexName }`, + user: 'kibana:kibana' + }).then(response => { + return response.status !== 404; + }); +} + +function createIndex(indexName: string): Cypress.Chainable { + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + return cy.put({ + url: `${ elasticsearchUrl }/${ indexName }`, + user: 'kibana:kibana', + payload: {} + }).then((response: any) => { + handleIndexCreationResponse(response); + }); +} + +export async function dataPut(count: number, indexName: string, chunkSize: number = 300): Promise { + chunkSize = chunkSize * 2; + if (typeof cy.put !== 'function') { + throw new Error('cy.put is not defined'); + } + + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + if (!elasticsearchUrl) { + throw new Error('Cypress.env().elasticsearchUrl is not defined'); + } + + const invoices = generateInvoices(count); + checkBulkSizeLimit(invoices, chunkSize); // Check size limit + const chunks = chunkArray(invoices, chunkSize); + + const processChunk = async (chunk: any[], index: number) => { + return cy.put({ + user: 'kibana:kibana', + url: `${elasticsearchUrl}/${indexName}/_bulk`, + payload: chunk // Pass the chunk array directly + }).then((response: any) => { + handleBulkResponse(response.stdout); + if ((index + 1) % 100 === 0) { + cy.log(`Chunk ${index + 1} processed successfully.`); + } + }); + }; + + const processChunksInBatches = async (chunks: any[][], batchSize: number) => { + const threads = 50; + for (let i = 0; i < chunks.length; i += batchSize * threads) { + const batch = chunks.slice(i, i + batchSize * threads); + await Promise.all(batch.map((chunk, index) => processChunk(chunk, i + index))); + } + }; + + const indexExists = await checkIndexExists(indexName); + cy.log(`Index ${indexName} exists: ${indexExists}`); + if (!indexExists) { + await createIndex(indexName); + } + + const startTime = Date.now(); + await processChunksInBatches(chunks, 100); + const endTime = Date.now(); + const duration = endTime - startTime; + cy.log(`All requests completed in ${duration} seconds.`); +} + +function handleIndexCreationResponse(response: any): void { + if (!response || !response.stdout) { + console.error('Response or response.stdout is undefined'); + return; + } + + try { + const parsedResponse = JSON.parse(response.stdout); + if (parsedResponse.acknowledged) { + console.log('Index creation acknowledged.'); + } else { + console.error('Index creation not acknowledged.'); + } + } catch (error) { + console.error('Failed to parse response:', error); + } +} diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts index bdc8512..da47df0 100644 --- a/e2e-tests/cypress/support/page-objects/management/DataViews.ts +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -15,6 +15,7 @@ export class DataViews { // Delete "invoices" index pattern if it exists cy.get('[data-test-subj="savedObjectSearchBar"]').type(objectName + "{enter}"); + cy.wait(1000); cy.get('body').then($body => { // Find the table row containing *exactly* "invoices" in the title const $invoicesIndexPatternRow = $body.find(`[data-test-subj="savedObjectsTableRowTitle"] a`) diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index 2267239..ef5b9ef 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -1,6 +1,4 @@ import { KibanaNavigation } from '../KibanaNavigation'; -import semver from "semver/preload"; -import { getKibanaVersion } from "../../helpers"; export class Reports { static navigateTo() { @@ -15,7 +13,7 @@ export class Reports { } // Now, click on Reporting (whether we were already on Stack Management or not) - cy.contains('Reporting').click(); + cy.contains('Reporting').click({timeout: 10000}); }); } @@ -23,47 +21,28 @@ export class Reports { cy.log('waitForAllReportsToBeDone'); cy.get('tr[data-test-subj="reportJobRow"]') - .each($reportItem => { - cy.wrap($reportItem) - .find('[data-test-subj="reportingListItemObjectTitle"]') - .should('contain.text', reportTitle); - - cy.wrap($reportItem) - .find('[data-test-subj="reportJobStatus"]') - .contains(/Done|Completed/, {timeout: 60000}) - .should('be.visible'); - - // Click the download button - if (semver.lte(getKibanaVersion(), '8.8.0')) { - cy.wrap($reportItem) - .find('[data-test-subj="reportJobActions"] button') - .first() - .click(); - } else { + .then($reportItems => { + // Convert the jQuery object to an array and reverse it + const reversedReportItems = Cypress.$($reportItems.get().reverse()); + + // Iterate over the reversed array + cy.wrap(reversedReportItems).each($reportItem => { cy.wrap($reportItem) - .find('[data-test-subj="reportDownloadLink"]') - .first() - .click(); - } + .find('[data-test-subj="reportingListItemObjectTitle"]') + .should('contain.text', reportTitle); - // Assert that a file is downloaded - cy.verifyDownload(`${ reportTitle }.csv`, {timeout: 10000}) // Adjust timeout if needed - .then(filePath => { - // Read the downloaded file content and assert it's not empty - cy.readFile(filePath) - .should('not.be.empty') - .then(fileContent => { - const rows = fileContent.split('\n'); - expect(rows.length).to.be.greaterThan(1); - }); + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 60000}) + .should('be.visible').then($status => { }); + }); }) .then($matchingReports => { expect($matchingReports).to.have.length(10); }); } - static verifyNoReports() { cy.log('verifyNoReports'); @@ -78,7 +57,7 @@ export class Reports { Reports.navigateTo(); // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(1000); + cy.wait(5000); cy.get('body').then($body => { const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled diff --git a/elk-ror/docker-compose.yml b/elk-ror/docker-compose.yml index 28e5e1c..a363a25 100644 --- a/elk-ror/docker-compose.yml +++ b/elk-ror/docker-compose.yml @@ -69,7 +69,7 @@ services: ulimits: memlock: soft: -1 - hard: -1 + hard: -1 kbn-proxy: build: @@ -91,4 +91,4 @@ services: networks: es-ror-network: - driver: bridge + driver: bridge \ No newline at end of file From 927f01049728cc94b6e3be8d6b9a1f126a99f5e2 Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Sat, 21 Sep 2024 20:24:20 +0200 Subject: [PATCH 18/19] Async rapport generating update --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 15 +++- .../cypress/support/page-objects/Discover.ts | 6 +- .../cypress/support/page-objects/Login.ts | 28 ++++---- .../cypress/support/page-objects/invoices.ts | 13 ++-- .../page-objects/management/Reports.ts | 69 +++++++------------ 5 files changed, 62 insertions(+), 69 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 52763be..7611f5c 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -8,8 +8,10 @@ describe('Report Generation', () => { const indexName: string = 'invoices'; const searchName: string = `${ indexName } search`; + before(() => { - dataPut(100000, indexName); + dataPut(500000, indexName); + }); beforeEach(() => { @@ -32,6 +34,7 @@ describe('Report Generation', () => { Discover.selectDataView(indexName); Discover.saveSearch(searchName); + for (let i = 0; i < 10; i++) { Discover.generateCsvReport(); } @@ -40,6 +43,16 @@ describe('Report Generation', () => { Reports.navigateTo(); Reports.checkAllReports(searchName); + for (let i = 0; i < 10; i++) { + cy.log('Checking for toast'); + cy.get('body').then($body => { + if ($body.find('[data-test-subj="toastCloseButton"]').length > 0) { + cy.get('[aria-label="Dismiss toast"]').last().click({force: true}); + } + }); + cy.wait(100); + } + Login.signOut(); Login.setLogin('user3:dev'); diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index 863839f..b349416 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -125,7 +125,6 @@ export class Discover { static generateCsvReport() { cy.log('generateCsvReport'); - cy.wait(1500); // Click the share button to open the sharing options if it is not opened @@ -141,6 +140,11 @@ export class Discover { // Click the "Generate report" button cy.get('[data-test-subj="generateReportButton"]').click(); + + cy.contains('Queued report for search', {timeout: 60000}).should('be.visible'); + + // close the toast with the message + cy.get('[data-test-subj="toastCloseButton"]').first().click(); } } diff --git a/e2e-tests/cypress/support/page-objects/Login.ts b/e2e-tests/cypress/support/page-objects/Login.ts index d331b81..4653d84 100644 --- a/e2e-tests/cypress/support/page-objects/Login.ts +++ b/e2e-tests/cypress/support/page-objects/Login.ts @@ -6,14 +6,13 @@ export class Login { sessionStorage.setItem('ror:ignoreKeyExpirationInfo', 'true'); localStorage.setItem('home:welcome:show', 'false'); }); - cy.visit(Cypress.config().baseUrl); - cy.wait(1000); + cy.visit(Cypress.config().baseUrl, { timeout: 60000 }); Login.signIn(); Loader.loading(); } static signIn() { - cy.visit(Cypress.config().baseUrl); + cy.visit(Cypress.config().baseUrl, { timeout: 60000 }); Login.fillLoginPage(); } @@ -31,17 +30,18 @@ export class Login { } static signOut() { - cy.visit(Cypress.config().baseUrl); - Loader.loading(); - cy.get('#rorMenuPopover', {timeout: 1000}).click() - .then($userMenu => { - if ($userMenu.length > 0) { - cy.contains('button', 'Log out').click({force: true}); - cy.log("User Sign out"); - } else { - cy.log("User wasn't sign in"); - } - }); + cy.visit(`${Cypress.config().baseUrl}/logout`, { timeout: 60000 }); + // cy.get('[data-test-subj="logo"]').click( {force: true, timeout: 20000} ); + // cy.wait(10000); + // cy.get('#rorMenuPopover', {timeout: 1000}).click() + // .then($userMenu => { + // if ($userMenu.length > 0) { + // cy.contains('button', 'Log out').click({force: true}); + // cy.log("User Sign out"); + // } else { + // cy.log("User wasn't sign in"); + // } + // }); } static setLogin(user: string) { diff --git a/e2e-tests/cypress/support/page-objects/invoices.ts b/e2e-tests/cypress/support/page-objects/invoices.ts index 6eef4e7..a4ee650 100644 --- a/e2e-tests/cypress/support/page-objects/invoices.ts +++ b/e2e-tests/cypress/support/page-objects/invoices.ts @@ -56,9 +56,9 @@ function handleBulkResponse(response: string | undefined): void { items.forEach((item: any) => { const createResult = item.create; if (createResult.status === 201) { - console.log(`Invoice ${ createResult._id } created successfully.`); + console.log(`Invoice ${createResult._id} created successfully.`); } else { - console.error(`Failed to create invoice ${ createResult._id }: ${ createResult.error.reason }`); + console.error(`Failed to create invoice ${createResult._id}: ${createResult.error.reason}`); } }); } catch (error) { @@ -140,17 +140,16 @@ export async function dataPut(count: number, indexName: string, chunkSize: numbe await Promise.all(batch.map((chunk, index) => processChunk(chunk, i + index))); } }; - - const indexExists = await checkIndexExists(indexName); + const [indexExists] = await Promise.all([checkIndexExists(indexName)]); cy.log(`Index ${indexName} exists: ${indexExists}`); if (!indexExists) { await createIndex(indexName); } const startTime = Date.now(); - await processChunksInBatches(chunks, 100); + await processChunksInBatches(chunks, 500); const endTime = Date.now(); - const duration = endTime - startTime; + const duration = (endTime - startTime) / 1000; // Convert to seconds cy.log(`All requests completed in ${duration} seconds.`); } @@ -170,4 +169,4 @@ function handleIndexCreationResponse(response: any): void { } catch (error) { console.error('Failed to parse response:', error); } -} +} \ No newline at end of file diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index ef5b9ef..8f5cae1 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -13,72 +13,49 @@ export class Reports { } // Now, click on Reporting (whether we were already on Stack Management or not) - cy.contains('Reporting').click({timeout: 10000}); + cy.contains('Reporting').click(); }); } static checkAllReports(reportTitle: string = 'Untitled discover search') { cy.log('waitForAllReportsToBeDone'); - cy.get('tr[data-test-subj="reportJobRow"]') - .then($reportItems => { - // Convert the jQuery object to an array and reverse it - const reversedReportItems = Cypress.$($reportItems.get().reverse()); - - // Iterate over the reversed array - cy.wrap(reversedReportItems).each($reportItem => { - cy.wrap($reportItem) - .find('[data-test-subj="reportingListItemObjectTitle"]') - .should('contain.text', reportTitle); - - cy.wrap($reportItem) - .find('[data-test-subj="reportJobStatus"]') - .contains(/Done|Completed/, {timeout: 60000}) - .should('be.visible').then($status => { - }); - }); + cy.get('tr[data-test-subj="reportJobRow"]', {timeout: 10000}) + .each($reportItem => { + Reports.checkReportItem($reportItem, reportTitle); }) .then($matchingReports => { expect($matchingReports).to.have.length(10); }); } + static checkReportItem($reportItem: JQuery, reportTitle: string) { + cy.wrap($reportItem) + .find('[data-test-subj="reportingListItemObjectTitle"]', {timeout: 10000}) + .should('contain.text', reportTitle); + + cy.wrap($reportItem) + .find('[data-test-subj="reportJobStatus"]') + .contains(/Done|Completed/, {timeout: 240000}) + .should('be.visible'); + } + + static verifyNoReports() { cy.log('verifyNoReports'); // Assert that there are no report rows present - cy.get('tr[data-test-subj="reportJobRow"]').should('not.exist'); + cy.get('[data-test-subj="reportingListItemObjectTitle"]', {timeout: 10000}).should('not.exist'); } static deleteAllReports(reportTitle: string = 'Untitled discover search') { cy.log('deleteAllReports'); - // 1. Navigate to the Reporting page - Reports.navigateTo(); - - // 2. Check if there are any reports and if "Select All" is enabled - cy.wait(5000); - cy.get('body').then($body => { - const hasReports = $body.find('tr[data-test-subj="reportJobRow"]').length > 0; - const selectAllEnabled = $body.find('[data-test-subj="checkboxSelectAll"]').prop('checked') !== undefined; // Check if the checkbox exists and is enabled - - if (hasReports) { - if (selectAllEnabled) { - // If "Select All" is enabled, delete all reports directly - cy.log('Deleting all reports using "Select All"'); - - // Select all reports - cy.get('[data-test-subj="checkboxSelectAll"]').check({force: true}); - - // Click the "Delete" button - cy.get('[data-test-subj="deleteReportButton"]').click({force: true}); - - // Confirm the deletion in the modal - cy.get('[data-test-subj="confirmModalConfirmButton"]').click({force: true}); - } - } else { - cy.log('No reports found - nothing to delete'); - } - }); + // Use curl command to remove the reporting index + const elasticsearchUrl = Cypress.env('elasticsearchUrl'); + cy.exec(`curl -X DELETE "${ elasticsearchUrl }/reporting" -u kibana:kibana`) + .then(response => { + cy.log('All reports deleted'); + }); } } \ No newline at end of file From 49bfd44ce868fd0431486360bc82a795b372d20c Mon Sep 17 00:00:00 2001 From: lodyczekoladowe Date: Sun, 29 Sep 2024 23:21:45 +0200 Subject: [PATCH 19/19] Fixes for new version of es --- e2e-tests/cypress/e2e/Report-generation.cy.ts | 19 +- e2e-tests/cypress/support/commands.ts | 114 +- e2e-tests/cypress/support/e2e.ts | 22 +- .../cypress/support/page-objects/Discover.ts | 93 +- .../cypress/support/page-objects/invoices.ts | 59 +- .../page-objects/management/DataViews.ts | 2 + .../page-objects/management/Reports.ts | 3 +- e2e-tests/package.json | 2 +- e2e-tests/yarn.lock | 1243 +++++++---------- elk-ror/docker-compose.yml | 3 +- 10 files changed, 671 insertions(+), 889 deletions(-) diff --git a/e2e-tests/cypress/e2e/Report-generation.cy.ts b/e2e-tests/cypress/e2e/Report-generation.cy.ts index 7611f5c..11bc02c 100644 --- a/e2e-tests/cypress/e2e/Report-generation.cy.ts +++ b/e2e-tests/cypress/e2e/Report-generation.cy.ts @@ -10,8 +10,7 @@ describe('Report Generation', () => { before(() => { - dataPut(500000, indexName); - + dataPut(1000000, indexName, 600, 200); }); beforeEach(() => { @@ -43,16 +42,6 @@ describe('Report Generation', () => { Reports.navigateTo(); Reports.checkAllReports(searchName); - for (let i = 0; i < 10; i++) { - cy.log('Checking for toast'); - cy.get('body').then($body => { - if ($body.find('[data-test-subj="toastCloseButton"]').length > 0) { - cy.get('[aria-label="Dismiss toast"]').last().click({force: true}); - } - }); - cy.wait(100); - } - Login.signOut(); Login.setLogin('user3:dev'); @@ -75,9 +64,9 @@ describe('Report Generation', () => { }) after(() => { - cy.delete({ - user: 'kibana:kibana', - url: `${ Cypress.env().elasticsearchUrl }/${ indexName }`, + cy.esDelete({ + endpoint: indexName, + credentials: 'kibana:kibana', }) }); }); \ No newline at end of file diff --git a/e2e-tests/cypress/support/commands.ts b/e2e-tests/cypress/support/commands.ts index 8a235f8..62d0ea7 100644 --- a/e2e-tests/cypress/support/commands.ts +++ b/e2e-tests/cypress/support/commands.ts @@ -1,117 +1,161 @@ import '@testing-library/cypress/add-commands'; import { isJsonString } from './helpers'; -Cypress.Commands.add('kbnPost', ({ endpoint, credentials, payload, currentGroupHeader }, ...args) => { - const payloadCurlPart = `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` +Cypress.Commands.add('kbnPost', ({endpoint, credentials, payload, currentGroupHeader, printLogs = true}, ...args) => { + const payloadCurlPart = `-H "Content-Type: application/json" -d ${ JSON.stringify(JSON.stringify(payload || {})) }` cy.kbnRequest({ method: "POST", endpoint: endpoint, credentials: credentials, - options: currentGroupHeader ? `${payloadCurlPart} -H "x-ror-current-group: ${currentGroupHeader}"` : payloadCurlPart + options: currentGroupHeader ? `${ payloadCurlPart } -H "x-ror-current-group: ${ currentGroupHeader }"` : payloadCurlPart, + printLogs: printLogs + }).then(response => { + return response; }) }); -Cypress.Commands.add('esPost', ({ endpoint, credentials, payload }, ...args) => - cy.esRequest({ - method: "POST", - endpoint: endpoint, - credentials: credentials, - options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` - }) +Cypress.Commands.add('esPost', ({endpoint, credentials, payload = [], printLogs = true}, ...args) => { + const bulkPayload = payload.map(item => [ + {create: {}}, + item + ]).flat().map(item => JSON.stringify(item)).join('\n') + '\n'; + + cy.esRequest({ + method: "POST", + endpoint: endpoint, + credentials: credentials, + options: `-H "Content-Type: application/json" -d'\n${ bulkPayload }'`, + printLogs: printLogs + }).then(response => { + return response; + }) + } ); -Cypress.Commands.add('kbnPut', ({ endpoint, credentials, payload }, ...args) => +Cypress.Commands.add('kbnPut', ({endpoint, credentials, payload, printLogs = true}, ...args) => cy.kbnRequest({ method: "PUT", endpoint: endpoint, credentials: credentials, - options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + options: `-H "Content-Type: application/json" -d ${ JSON.stringify(JSON.stringify(payload || {})) }`, + printLogs: printLogs + }).then(response => { + return response; }) ); -Cypress.Commands.add('esPut', ({ endpoint, credentials, payload }, ...args) => +Cypress.Commands.add('esPut', ({endpoint, credentials, payload = [], printLogs = true}, ...args) => { + const bulkPayload = payload.map(item => JSON.stringify(JSON.stringify(item))).join('\n') + '\n'; // Join with newline + cy.esRequest({ method: "PUT", endpoint: endpoint, credentials: credentials, - options: `-H "Content-Type: application/json" -d ${JSON.stringify(JSON.stringify(payload || {}))}` + options: `-H "Content-Type: application/json" -d '\n${ bulkPayload }'`, + printLogs: printLogs + }).then(response => { + return response; }) -); +}); Cypress.Commands.add( 'kbnImport', - ({ endpoint, credentials, filename }, ...args) => + ({endpoint, credentials, filename, printLogs = true}, ...args) => cy.kbnRequest({ method: "POST", endpoint: endpoint, credentials: credentials, - options: `--form file=@${filename}` + options: `--form file=@${ filename }`, + printLogs: printLogs + }).then(response => { + return response; }) ); Cypress.Commands.add( 'kbnGet', - ({ endpoint, credentials, currentGroupHeader }, ...args) => + ({endpoint, credentials, currentGroupHeader, printLogs = true}, ...args) => cy.kbnRequest({ method: "GET", endpoint: endpoint, credentials: credentials, - options: currentGroupHeader ? `-H "x-ror-current-group: ${currentGroupHeader}"` : undefined + options: currentGroupHeader ? `-H "x-ror-current-group: ${ currentGroupHeader }"` : undefined, + printLogs: printLogs + }).then(response => { + return response; }) ) Cypress.Commands.add( 'esGet', - ({ endpoint, credentials }, ...args) => + ({endpoint, credentials, printLogs = true}, ...args) => cy.esRequest({ method: "GET", endpoint: endpoint, - credentials: credentials + credentials: credentials, + printLogs: printLogs + }).then(response => { + return response; }) ); Cypress.Commands.add( 'kbnDelete', - ({ endpoint, credentials, currentGroupHeader }, ...args) => + ({endpoint, credentials, currentGroupHeader, printLogs = true}, ...args) => cy.kbnRequest({ method: "DELETE", endpoint: endpoint, credentials: credentials, - options: currentGroupHeader ? `-H "x-ror-current-group: ${currentGroupHeader}"` : undefined + options: currentGroupHeader ? `-H "x-ror-current-group: ${ currentGroupHeader }"` : undefined, + printLogs: printLogs + }).then(response => { + return response; }) ); Cypress.Commands.add( 'esDelete', - ({ endpoint, credentials }, ...args) => + ({endpoint, credentials, printLogs = true}, ...args) => cy.esRequest({ method: "DELETE", endpoint: endpoint, - credentials: credentials + credentials: credentials, + printLogs: printLogs + }).then(response => { + return response; }) ); Cypress.Commands.add( 'kbnRequest', - ({ method, endpoint, credentials, options}) => { - const url = `${Cypress.config().baseUrl}/${endpoint}` - cy - .exec(`curl -H "kbn-xsrf: true" -v -k -X ${method} "${url}" --user ${credentials} ${options || ""}`) + ({method, endpoint, credentials, options, printLogs = true}) => { + const url = `${ Cypress.config().baseUrl }/${ endpoint }` + + return cy + .exec(`curl -H "kbn-xsrf: true" -v -k -X${ method } "${ url }" --user ${ credentials } ${ options || "" }`, {log: printLogs}) .then(result => { - console.log(url, result); + if (printLogs) { + console.log(url, result); + } return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) } ); + Cypress.Commands.add( 'esRequest', - ({ method, endpoint, credentials, options }) => { - const url = `${Cypress.env().elasticsearchUrl}/${endpoint}` - cy - .exec(`curl -H "kbn-xsrf: true" -v -k -X ${method} "${url}" --user ${credentials} ${options || ""}`) + ({method, endpoint, credentials, options, printLogs = true}) => { + const url = `${ Cypress.env().elasticsearchUrl }/${ endpoint }` + + const command = `curl -H "kbn-xsrf: true" -v -k -X${ method } "${ url }" --user ${ credentials } ${ options || "" }` + + return cy + .exec(command, {log: printLogs}) .then(result => { - console.log(url, result); + + console.log(url, command, result); + return isJsonString(result.stdout) ? JSON.parse(result.stdout) : result.stdout; }) } diff --git a/e2e-tests/cypress/support/e2e.ts b/e2e-tests/cypress/support/e2e.ts index e149882..ece8a7e 100644 --- a/e2e-tests/cypress/support/e2e.ts +++ b/e2e-tests/cypress/support/e2e.ts @@ -24,18 +24,18 @@ declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace Cypress { export interface Chainable { - kbnRequest({ method, endpoint, credentials, options }: { method: string, endpoint: string, credentials: string, options?: string }): Chainable; - kbnGet({ endpoint, credentials, currentGroupHeader }: { endpoint: string, credentials: string, currentGroupHeader?: string }): Chainable; - kbnPost({ endpoint, credentials, payload, currentGroupHeader }: { endpoint: string, credentials: string, payload?: unknown, currentGroupHeader?: string }): Chainable; - kbnPut({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; - kbnImport({endpoint, credentials, filename}: {endpoint: string, credentials: string, filename: string}): Chainable; - kbnDelete({ endpoint, credentials, currentGroupHeader }: { endpoint: string, credentials: string, currentGroupHeader?: string }): Chainable; + kbnRequest({ method, endpoint, credentials, options, printLogs }: { method: string, endpoint: string, credentials: string, options?: string, printLogs?: boolean }): Chainable; + kbnGet({ endpoint, credentials, currentGroupHeader, printLogs }: { endpoint: string, credentials: string, currentGroupHeader?: string, printLogs?: boolean }): Chainable; + kbnPost({ endpoint, credentials, payload, currentGroupHeader, printLogs }: { endpoint: string, credentials: string, payload?: unknown, currentGroupHeader?: string, printLogs?: boolean }): Chainable; + kbnPut({ endpoint, credentials, payload, printLogs }: { endpoint: string, credentials: string, payload?: unknown, printLogs?: boolean }): Chainable; + kbnImport({endpoint, credentials, filename, printLogs }: {endpoint: string, credentials: string, filename: string, printLogs?: boolean }): Chainable; + kbnDelete({ endpoint, credentials, currentGroupHeader, printLogs }: { endpoint: string, credentials: string, currentGroupHeader?: string, printLogs?: boolean }): Chainable; - esRequest({ method, endpoint, credentials, options }: { method: string, endpoint: string, credentials: string, options?: string }): Chainable; - esGet({ endpoint, credentials }: { endpoint: string, credentials: string }): Chainable; - esPost({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; - esPut({ endpoint, credentials, payload }: { endpoint: string, credentials: string, payload?: unknown }): Chainable; - esDelete({ endpoint, credentials }: { endpoint: string, credentials: string }): Chainable; + esRequest({ method, endpoint, credentials, options, printLogs }: { method: string, endpoint: string, credentials: string, options?: string, printLogs?: boolean }): Chainable; + esGet({ endpoint, credentials, printLogs }: { endpoint: string, credentials: string, printLogs?: boolean }): Chainable; + esPost({ endpoint, credentials, payload, printLogs }: { endpoint: string, credentials: string, payload?: object[], printLogs?: boolean }): Chainable; + esPut({ endpoint, credentials, payload, printLogs }: { endpoint: string, credentials: string, payload?: object[], printLogs?: boolean }): Chainable; + esDelete({ endpoint, credentials, printLogs }: { endpoint: string, credentials: string, printLogs?: boolean }): Chainable; } } } diff --git a/e2e-tests/cypress/support/page-objects/Discover.ts b/e2e-tests/cypress/support/page-objects/Discover.ts index b349416..c52f3ba 100644 --- a/e2e-tests/cypress/support/page-objects/Discover.ts +++ b/e2e-tests/cypress/support/page-objects/Discover.ts @@ -9,16 +9,29 @@ export class Discover { if (semver.lt(getKibanaVersion(), '8.8.0')) { KibanaNavigation.openKibanaNavigation(); - cy.contains('Discover').click({ force: true }); + cy.contains('Discover').click({force: true}); } cy.contains(indexPatternName).should('be.visible'); } + static closeAllToasts() { + cy.get("body").then($body => { + const $toasts = $body.find('[data-test-subj="toastCloseButton"]') + if ($toasts.length != 0) { + cy.get('[data-test-subj="toastCloseButton"]').each($el => { + cy.wrap($el).click({force: true}); + }); + } + }); + } + static saveSearch(searchName: string) { cy.log('saveReport'); - KibanaNavigation.openKibanaNavigation(); - cy.contains('Discover').click(); + if (!semver.gte(getKibanaVersion(), '8.8.0')) { + KibanaNavigation.openKibanaNavigation(); + cy.contains('Discover').click(); + } cy.get('[data-test-subj=discoverSaveButton]').click(); cy.get('[data-test-subj=savedObjectTitle]').type(searchName); cy.get('[data-test-subj=confirmSaveSavedObjectButton]').click({force: true}); @@ -43,8 +56,8 @@ export class Discover { cy.get('[data-test-subj=sharePanel-CSVReports]').click(); } cy.get('[data-test-subj=generateReportButton]').click(); - cy.contains('Queued report for search', { timeout: 10000 }).should('exist'); - cy.contains('Queued report for search', { timeout: 10000 }).should('not.exist'); + cy.contains('Queued report for search', {timeout: 10000}).should('exist'); + cy.contains('Queued report for search', {timeout: 10000}).should('not.exist'); /** * TODO: For now csv download crash cypress electron browser (it's probably works in case of other browsers). @@ -104,18 +117,7 @@ export class Discover { cy.log('selectDataView'); // For Kibana 8.0.0 and above, we need to interact with the popover - if (semver.gte(getKibanaVersion(), '8.0.0')) { - cy.get('[data-test-subj="discover-dataView-switch-link"]').click(); // Open the popover - - // Search for the data view within the popover - cy.get('.euiPopover__panel [role="combobox"] input') // Assuming this is the search input within the popover - .type(dataViewName); - - // Wait for the options to filter and then select the desired data view - cy.wait(500); // Adjust if needed - cy.get(`.euiPopover__panel li:contains("${ dataViewName }")`) - .click({force: true}); - } else { + if (!semver.gte(getKibanaVersion(), '8.0.0')) { // For older Kibana versions, use the previous logic cy.get('[data-test-subj="indexPattern-switch-link"]').click(); cy.contains(dataViewName).click({force: true}); @@ -124,27 +126,38 @@ export class Discover { static generateCsvReport() { cy.log('generateCsvReport'); - - + this.closeAllToasts(); // Click the share button to open the sharing options if it is not opened + if (semver.gte(getKibanaVersion(), '8.0.0')) { + cy.get("body").then($body => { + const $shareContextMenu = $body.find('[data-test-subj="shareContextModal"]') + if ($shareContextMenu.length == 0) { + cy.get('[data-test-subj="shareTopNavButton"]').click(); + } + }); - cy.get("body").then($body => { - const $shareContextMenu = $body.find('[data-test-subj="shareContextMenu"]') - if ($shareContextMenu.length == 0) { - cy.get('[data-test-subj="shareTopNavButton"]').click(); - } - }) - - // Click the "CSV Reports" option - cy.get('[data-test-subj="sharePanel-CSVReports"]').click(); - - // Click the "Generate report" button - cy.get('[data-test-subj="generateReportButton"]').click(); + cy.get('[data-test-subj="export"]').click(); - cy.contains('Queued report for search', {timeout: 60000}).should('be.visible'); + cy.get('[data-test-subj="generateReportButton"]').click(); + cy.contains('Queued report for search', {timeout: 60000}).should('be.visible'); + } else { + cy.get("body").then($body => { + const $shareContextMenu = $body.find('[data-test-subj="shareContextMenu"]') + if ($shareContextMenu.length == 0) { + cy.get('[data-test-subj="shareTopNavButton"]').click(); + } + }); + // Click the "CSV Reports" option + cy.get('[data-test-subj="sharePanel-CSVReports"]').click(); + // Click the "Generate report" button + cy.get('[data-test-subj="generateReportButton"]').click(); + + cy.contains('Queued report for search', {timeout: 60000}).should('be.visible'); + } // close the toast with the message - cy.get('[data-test-subj="toastCloseButton"]').first().click(); + this.closeAllToasts(); + } } @@ -155,7 +168,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.contains('Next step').click(); cy.get('[data-test-subj=createIndexPatternTimeFieldSelect]').select('@timestamp'); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); - cy.get('[data-test-subj=createIndexPatternButton]').click({ force: true }); + cy.get('[data-test-subj=createIndexPatternButton]').click({force: true}); cy.wait('@indexPattern'); }; @@ -164,9 +177,9 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.get('[data-test-subj=createIndexPatternNameInput]').type(indexPatternName); cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); - cy.contains('@timestamp').click({ force: true }); + cy.contains('@timestamp').click({force: true}); cy.intercept('/s/default/api/saved_objects/index-pattern').as('indexPattern'); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); cy.wait('@indexPattern'); }; @@ -177,7 +190,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { '[data-test-subj=createDataViewButton]' // >= 8.4.x ]; cy.get(createDataViewPossibleSelectors.join(',')) - .contains(/create.*data.*view/i, { matchCase: false }) + .contains(/create.*data.*view/i, {matchCase: false}) .click(); cy.get( [ @@ -189,8 +202,8 @@ const createKibanaIndexPattern = (indexPatternName: string) => { }); cy.contains('Select a timestamp field for use with the global time filter.'); cy.get('[data-test-subj=timestampField]').click(); - cy.contains('@timestamp').click({ force: true }); - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.contains('@timestamp').click({force: true}); + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); if (semver.gte(getKibanaVersion(), '8.9.0')) { cy.intercept('/s/default/api/kibana/management/saved_objects/**').as('indexPattern'); @@ -198,7 +211,7 @@ const createKibanaIndexPattern = (indexPatternName: string) => { cy.intercept('/s/default/api/saved_objects/**').as('indexPattern'); } - cy.get('[data-test-subj=saveIndexPatternButton]').click({ force: true }); + cy.get('[data-test-subj=saveIndexPatternButton]').click({force: true}); cy.wait('@indexPattern'); }; diff --git a/e2e-tests/cypress/support/page-objects/invoices.ts b/e2e-tests/cypress/support/page-objects/invoices.ts index a4ee650..82b6f0c 100644 --- a/e2e-tests/cypress/support/page-objects/invoices.ts +++ b/e2e-tests/cypress/support/page-objects/invoices.ts @@ -15,7 +15,7 @@ function generateInvoice(id: number): object { amount: (Math.random() * 1000).toFixed(2), currency: ['USD', 'EUR', 'GBP', 'JPY', 'CAD', 'AUD', 'CHF', 'SEK', 'NZD', 'DKK', 'NOK', 'ZAR', 'BRL', 'INR', 'RUB', 'CNY', 'MXN', 'KRW', 'TRY', 'IDR', 'ARS', 'THB', 'PLN', 'PHP', 'CZK', 'HUF', 'MYR', 'ILS', 'SAR', 'AED', 'COP', 'CLP', 'EGP', 'VND', 'UAH', 'KES', 'NGN', 'PKR'][Math.floor(Math.random() * 37)], customerName: `Customer ${ id }`, - customerEmail: `customer${ id }example.com`, + customerEmail: `customer${ id }@example.com`, status: ['Paid', 'Unpaid', 'Pending'][Math.floor(Math.random() * 3)], description: `Invoice for service ${ id }`, address: `${ id } Main St, City, Country`, @@ -27,7 +27,7 @@ function generateInvoice(id: number): object { } function generateInvoices(count: number): object[] { - const invoices = []; + const invoices: object[] = []; for (let i = 1; i <= count; i++) { invoices.push({create: {}}); invoices.push(generateInvoice(i)); @@ -50,8 +50,7 @@ function handleBulkResponse(response: string | undefined): void { } try { - const parsedResponse = JSON.parse(response); - const items = parsedResponse.items; + const items = response.items; items.forEach((item: any) => { const createResult = item.create; @@ -85,29 +84,35 @@ function checkBulkSizeLimit(invoices: object[], chunkSize: number): void { } function checkIndexExists(indexName: string): Cypress.Chainable { - const elasticsearchUrl = Cypress.env('elasticsearchUrl'); - return cy.getRequest({ - url: `${ elasticsearchUrl }/${ indexName }`, - user: 'kibana:kibana' - }).then(response => { + return cy.esGet({ + endpoint: indexName, + credentials: 'kibana:kibana' + + }).then((response: any) => { return response.status !== 404; }); } function createIndex(indexName: string): Cypress.Chainable { - const elasticsearchUrl = Cypress.env('elasticsearchUrl'); - return cy.put({ - url: `${ elasticsearchUrl }/${ indexName }`, - user: 'kibana:kibana', - payload: {} + return cy.esPut({ + endpoint: indexName, + credentials: 'kibana:kibana', + printLogs: true }).then((response: any) => { - handleIndexCreationResponse(response); + console.log('Response:', response); + if (response) { + if (response.error && response.error.type === 'resource_already_exists_exception') { + cy.log(`Index ${indexName} already exists.`); + } else { + handleIndexCreationResponse(response); + } + } }); } -export async function dataPut(count: number, indexName: string, chunkSize: number = 300): Promise { - chunkSize = chunkSize * 2; - if (typeof cy.put !== 'function') { +export async function dataPut(count: number, indexName: string, chunkSize: number, threads: number): Promise { + count = count / 2; + if (typeof cy.kbnPut !== 'function') { throw new Error('cy.put is not defined'); } @@ -121,12 +126,14 @@ export async function dataPut(count: number, indexName: string, chunkSize: numbe const chunks = chunkArray(invoices, chunkSize); const processChunk = async (chunk: any[], index: number) => { - return cy.put({ - user: 'kibana:kibana', - url: `${elasticsearchUrl}/${indexName}/_bulk`, - payload: chunk // Pass the chunk array directly + cy.esPost({ + endpoint: `${indexName}/_bulk`, + credentials: 'kibana:kibana', + payload: chunk, + printLogs: false }).then((response: any) => { - handleBulkResponse(response.stdout); + console.log('Response:', response); + handleBulkResponse(response); if ((index + 1) % 100 === 0) { cy.log(`Chunk ${index + 1} processed successfully.`); } @@ -134,7 +141,6 @@ export async function dataPut(count: number, indexName: string, chunkSize: numbe }; const processChunksInBatches = async (chunks: any[][], batchSize: number) => { - const threads = 50; for (let i = 0; i < chunks.length; i += batchSize * threads) { const batch = chunks.slice(i, i + batchSize * threads); await Promise.all(batch.map((chunk, index) => processChunk(chunk, i + index))); @@ -154,14 +160,13 @@ export async function dataPut(count: number, indexName: string, chunkSize: numbe } function handleIndexCreationResponse(response: any): void { - if (!response || !response.stdout) { + if (!response) { console.error('Response or response.stdout is undefined'); return; } try { - const parsedResponse = JSON.parse(response.stdout); - if (parsedResponse.acknowledged) { + if (response.acknowledged) { console.log('Index creation acknowledged.'); } else { console.error('Index creation not acknowledged.'); diff --git a/e2e-tests/cypress/support/page-objects/management/DataViews.ts b/e2e-tests/cypress/support/page-objects/management/DataViews.ts index da47df0..2eb9ef1 100644 --- a/e2e-tests/cypress/support/page-objects/management/DataViews.ts +++ b/e2e-tests/cypress/support/page-objects/management/DataViews.ts @@ -42,6 +42,8 @@ export class DataViews { Discover.openDataViewPage(); const createDataViewForKibanaBefore8_0_0 = () => { + cy.get('button[data-test-subj="closeFlyoutButton"]').click(); + cy.get('button[data-test-subj="createIndexPatternButton"]').click(); cy.get('[data-test-subj="createIndexPatternButtonFlyout"]').click(); cy.get('[data-test-subj="createIndexPatternNameInput"]').type(`${ dataViewName }{del}`); cy.get('[data-test-subj="timestampField"]') // Find the timestamp field combobox diff --git a/e2e-tests/cypress/support/page-objects/management/Reports.ts b/e2e-tests/cypress/support/page-objects/management/Reports.ts index 8f5cae1..3d43bc1 100644 --- a/e2e-tests/cypress/support/page-objects/management/Reports.ts +++ b/e2e-tests/cypress/support/page-objects/management/Reports.ts @@ -1,5 +1,5 @@ import { KibanaNavigation } from '../KibanaNavigation'; - +import { Discover } from '../Discover'; export class Reports { static navigateTo() { cy.log('navigateTo'); @@ -23,6 +23,7 @@ export class Reports { cy.get('tr[data-test-subj="reportJobRow"]', {timeout: 10000}) .each($reportItem => { Reports.checkReportItem($reportItem, reportTitle); + Discover.closeAllToasts(); }) .then($matchingReports => { expect($matchingReports).to.have.length(10); diff --git a/e2e-tests/package.json b/e2e-tests/package.json index 9885d69..300f683 100644 --- a/e2e-tests/package.json +++ b/e2e-tests/package.json @@ -12,7 +12,7 @@ "license": "Beshu Limited, All rights reserved", "dependencies": { "@testing-library/cypress": "^10.0.1", - "cypress": "12.17.4", + "cypress": "^13.15.0", "semver": "7.5.2" }, "devDependencies": { diff --git a/e2e-tests/yarn.lock b/e2e-tests/yarn.lock index 291ec69..4f7fa25 100644 --- a/e2e-tests/yarn.lock +++ b/e2e-tests/yarn.lock @@ -3,37 +3,44 @@ "@babel/code-frame@^7.10.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.6": - version "7.19.4" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.4.tgz" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== + version "7.25.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz" + integrity sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.14.0" -"@cypress/request@2.88.12": - version "2.88.12" - resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz" - integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@cypress/request@^3.0.4": + version "3.0.5" + resolved "https://registry.npmjs.org/@cypress/request/-/request-3.0.5.tgz" + integrity sha512-v+XHd9XmWbufxF1/bTaVm2yhbxY+TB4YtWRqF2zaXBlDNMkls34KiATz0AVDLavL3iB6bQk9/7n3oY1EoLSWGA== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -48,7 +55,7 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.13.0" safe-buffer "^5.1.2" tough-cookie "^4.1.3" tunnel-agent "^0.6.0" @@ -64,19 +71,19 @@ "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== + version "4.11.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -89,46 +96,46 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -136,61 +143,56 @@ "@rtsao/scc@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@testing-library/cypress@^10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@testing-library/cypress/-/cypress-10.0.1.tgz#15abae0edb83237316ec6d07e152b71a50b38387" - integrity sha512-e8uswjTZIBhaIXjzEcrQQ8nHRWHgZH7XBxKuIWxZ/T7FxfWhCR48nFhUX5nfPizjVOKSThEfOSv67jquc1ASkw== + version "10.0.2" + resolved "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.2.tgz" + integrity sha512-dKv95Bre5fDmNb9tOIuWedhGUryxGu1GWYWtXDqUsDPcr9Ekld0fiTb+pcBvSsFpYXAZSpmyEjhoXzLbhh06yQ== dependencies: "@babel/runtime" "^7.14.6" - "@testing-library/dom" "^9.0.0" + "@testing-library/dom" "^10.1.0" -"@testing-library/dom@^9.0.0": - version "9.3.1" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.1.tgz#8094f560e9389fb973fe957af41bf766937a9ee9" - integrity sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w== +"@testing-library/dom@^10.1.0": + version "10.4.0" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" + integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" - aria-query "5.1.3" + aria-query "5.3.0" chalk "^4.1.0" dom-accessibility-api "^0.5.9" lz-string "^1.5.0" pretty-format "^27.0.2" "@types/aria-query@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc" - integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + version "5.0.4" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" + integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@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" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/json5@^0.0.29": version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/node@*": - version "16.4.4" - resolved "https://registry.npmjs.org/@types/node/-/node-16.4.4.tgz" - integrity sha512-BH/jX0HjzElFCQdAwaEMwuGBQwm6ViDZ00X6LKdnRRmGWOzkWugEH4+7a0BwfHQ8DfPPCSd/mdsm3Nu8FKFu0w== - -"@types/node@^20.14.10": - version "20.16.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.16.5.tgz#d43c7f973b32ffdf9aa7bd4f80e1072310fd7a53" - integrity sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA== +"@types/node@*", "@types/node@^20.14.10": + version "20.16.10" + resolved "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz" + integrity sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA== dependencies: undici-types "~6.19.2" "@types/semver@^7.3.12", "@types/semver@^7.5.8": version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/sinonjs__fake-timers@8.1.1": @@ -199,20 +201,20 @@ integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + version "2.3.8" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== "@types/yauzl@^2.9.1": - version "2.9.2" - resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz" - integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== + version "2.10.3" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@^5.27.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -226,9 +228,9 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.27.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.27.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" @@ -238,7 +240,7 @@ "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" @@ -246,7 +248,7 @@ "@typescript-eslint/type-utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" @@ -256,12 +258,12 @@ "@typescript-eslint/types@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" @@ -274,7 +276,7 @@ "@typescript-eslint/utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -288,7 +290,7 @@ "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" @@ -296,17 +298,17 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.9.0: version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== aggregate-error@^3.0.0: @@ -319,7 +321,7 @@ aggregate-error@^3.0.0: ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -328,9 +330,9 @@ ajv@^6.12.4: uri-js "^4.2.2" ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + version "4.1.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" @@ -339,7 +341,7 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -370,27 +372,19 @@ arch@^2.2.0: argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +aria-query@5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + dequal "^2.0.3" array-buffer-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: call-bind "^1.0.5" @@ -398,7 +392,7 @@ array-buffer-byte-length@^1.0.1: array-includes@^3.1.8: version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: call-bind "^1.0.7" @@ -410,12 +404,12 @@ array-includes@^3.1.8: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.findlastindex@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz" integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: call-bind "^1.0.7" @@ -427,7 +421,7 @@ array.prototype.findlastindex@^1.2.5: array.prototype.flat@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -437,7 +431,7 @@ array.prototype.flat@^1.3.2: array.prototype.flatmap@^1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" @@ -447,7 +441,7 @@ array.prototype.flatmap@^1.3.2: arraybuffer.prototype.slice@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: array-buffer-byte-length "^1.0.1" @@ -460,16 +454,16 @@ arraybuffer.prototype.slice@^1.0.3: is-shared-array-buffer "^1.0.2" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== astral-regex@^2.0.0: version "2.0.0" @@ -477,28 +471,23 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.0: - version "3.2.3" - resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz" - integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" @@ -506,16 +495,16 @@ available-typed-arrays@^1.0.7: aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + version "1.13.2" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: @@ -526,7 +515,7 @@ base64-js@^1.3.1: bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" @@ -542,7 +531,7 @@ bluebird@^3.7.2: brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -550,7 +539,7 @@ brace-expansion@^1.1.7: braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" @@ -558,32 +547,24 @@ braces@^3.0.3: buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer@^5.7.1: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" ieee754 "^1.1.13" cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + version "2.4.0" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== -call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -594,15 +575,15 @@ call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caseless@~0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== -chalk@^2.0.0: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -611,30 +592,22 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - check-more-types@^2.24.0: version "2.24.0" resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" - integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= + integrity sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-stack@^2.0.0: @@ -650,13 +623,13 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-table3@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz" - integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== + version "0.6.5" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== dependencies: string-width "^4.2.0" optionalDependencies: - colors "1.4.0" + "@colors/colors" "1.5.0" cli-truncate@^2.1.0: version "2.1.0" @@ -680,25 +653,20 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== -colors@1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colorette@^2.0.16: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" @@ -709,23 +677,23 @@ combined-stream@^1.0.8, combined-stream@~1.0.6: commander@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== common-tags@^1.8.0: - version "1.8.0" - resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" @@ -736,12 +704,12 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -cypress@12.17.4: - version "12.17.4" - resolved "https://registry.npmjs.org/cypress/-/cypress-12.17.4.tgz" - integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== +"cypress@^12.0.0 || ^13.0.0", cypress@^13.15.0: + version "13.15.0" + resolved "https://registry.npmjs.org/cypress/-/cypress-13.15.0.tgz" + integrity sha512-53aO7PwOfi604qzOkCSzNlWquCynLlKE/rmmpSPcziRH6LNfaDUAklQT6WJIsD8ywxlIy+uVZsnTMCCQVd2kTw== dependencies: - "@cypress/request" "2.88.12" + "@cypress/request" "^3.0.4" "@cypress/xvfb" "^1.2.4" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" @@ -787,13 +755,13 @@ cypress@12.17.4: dashdash@^1.12.0: version "1.14.1" resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: call-bind "^1.0.6" @@ -802,7 +770,7 @@ data-view-buffer@^1.0.1: data-view-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: call-bind "^1.0.7" @@ -811,7 +779,7 @@ data-view-byte-length@^1.0.1: data-view-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== dependencies: call-bind "^1.0.6" @@ -819,88 +787,48 @@ data-view-byte-offset@^1.0.0: is-data-view "^1.0.1" dayjs@^1.10.4: - version "1.10.6" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz" - integrity sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw== + version "1.11.13" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@^3.1.0, debug@^3.2.7: +debug@^3.1.0: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.1.1: - version "4.3.2" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - ms "2.1.2" + ms "^2.1.1" -debug@^4.3.1, debug@^4.3.2: +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" -debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-equal@^2.0.5: - version "2.2.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" - integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.1" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-data-property@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" - integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -910,38 +838,43 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, de delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dom-accessibility-api@^0.5.9: - version "0.5.14" - resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz" - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" @@ -958,16 +891,17 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": + version "2.4.1" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" @@ -1019,41 +953,26 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: get-intrinsic "^1.2.4" @@ -1062,14 +981,14 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -1079,21 +998,21 @@ es-to-primitive@^1.2.1: escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-prettier@^8.5.0: version "8.10.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-import-resolver-node@^0.3.9: version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" @@ -1101,15 +1020,15 @@ eslint-import-resolver-node@^0.3.9: resolve "^1.22.4" eslint-module-utils@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz#b99b211ca4318243f09661fae088f373ad5243c4" - integrity sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ== + version "2.12.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" + integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== dependencies: debug "^3.2.7" eslint-plugin-import@^2.26.0: version "2.30.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz" integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: "@rtsao/scc" "^1.1.0" @@ -1133,14 +1052,14 @@ eslint-plugin-import@^2.26.0: eslint-plugin-prettier@^4.0.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -1148,7 +1067,7 @@ eslint-scope@^5.1.1: eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1156,19 +1075,19 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.16.0: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.16.0, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.57.1" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -1205,7 +1124,7 @@ eslint@^8.16.0: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1214,31 +1133,36 @@ espree@^9.6.0, espree@^9.6.1: esquery@^1.4.2: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter2@6.4.7: @@ -1284,29 +1208,24 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1317,17 +1236,17 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" @@ -1335,7 +1254,7 @@ fastq@^1.6.0: fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" @@ -1348,21 +1267,21 @@ figures@^3.2.0: file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1370,7 +1289,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1379,12 +1298,12 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" @@ -1392,11 +1311,11 @@ for-each@^0.3.3: forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@~4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -1416,21 +1335,16 @@ fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -1440,22 +1354,12 @@ function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -1473,7 +1377,7 @@ get-stream@^5.0.0, get-stream@^5.1.0: get-symbol-description@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: call-bind "^1.0.5" @@ -1490,53 +1394,53 @@ getos@^3.2.1: getpass@^0.1.1: version "0.1.7" resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@^7.1.3: - version "7.1.7" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + version "3.0.1" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" + integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== dependencies: ini "2.0.0" globals@^13.19.0: version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.3: version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -1544,7 +1448,7 @@ globalthis@^1.0.3: globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1556,24 +1460,24 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.6" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: @@ -1586,28 +1490,16 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-property-descriptors@^1.0.2: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-proto@^1.0.3: +has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: @@ -1615,37 +1507,23 @@ has-symbols@^1.0.2, has-symbols@^1.0.3: resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-tostringtag@^1.0.2: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" http-signature@~1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.4.0.tgz#dee5a9ba2bf49416abc544abd6d967f6a94c8c3f" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz" integrity sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg== dependencies: assert-plus "^1.0.0" @@ -1664,12 +1542,12 @@ ieee754@^1.1.13: ignore@^5.2.0: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1677,7 +1555,7 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: @@ -1688,7 +1566,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -1703,44 +1581,18 @@ ini@2.0.0: resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -internal-slot@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - internal-slot@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: es-errors "^1.3.0" hasown "^2.0.0" side-channel "^1.0.4" -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - is-array-buffer@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" @@ -1763,31 +1615,31 @@ is-boolean-object@^1.1.0: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" is-core-module@^2.13.0, is-core-module@^2.15.1: version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: +is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -1796,7 +1648,7 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: @@ -1806,7 +1658,7 @@ is-fullwidth-code-point@^3.0.0: is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -1819,26 +1671,21 @@ is-installed-globally@~0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" -is-map@^2.0.1, is-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.2, is-path-inside@^3.0.3: @@ -1854,21 +1701,9 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.1, is-set@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-shared-array-buffer@^1.0.3: +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" @@ -1892,20 +1727,9 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array@^1.1.13: version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" @@ -1913,44 +1737,34 @@ is-typed-array@^1.1.13: is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" -is-weakset@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" - integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== - isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isstream@~0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== js-tokens@^4.0.0: version "4.0.0" @@ -1959,7 +1773,7 @@ js-tokens@^4.0.0: js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" @@ -1967,16 +1781,16 @@ js-yaml@^4.1.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.4.0: @@ -1986,17 +1800,17 @@ json-schema@0.4.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" @@ -2022,7 +1836,7 @@ jsprim@^2.0.2: keyv@^4.5.3: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -2030,45 +1844,46 @@ keyv@^4.5.3: lazy-ass@^1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" - integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= + integrity sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw== levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" listr2@^3.8.3: - version "3.11.0" - resolved "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz" - integrity sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ== + version "3.14.0" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" + integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" - colorette "^1.2.2" + colorette "^2.0.16" log-update "^4.0.0" p-map "^4.0.0" - rxjs "^6.6.7" + rfdc "^1.3.0" + rxjs "^7.5.1" through "^2.3.8" wrap-ansi "^7.0.0" locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash@^4.17.21: version "4.17.21" @@ -2102,7 +1917,7 @@ lru-cache@^6.0.0: lz-string@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== merge-stream@^2.0.0: @@ -2112,51 +1927,46 @@ merge-stream@^2.0.0: merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.32" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.49.0" + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" @@ -2164,12 +1974,12 @@ ms@^2.1.1, ms@^2.1.3: natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== npm-run-path@^4.0.0: @@ -2181,40 +1991,17 @@ npm-run-path@^4.0.0: object-inspect@^1.13.1: version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz" integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -2224,7 +2011,7 @@ object.assign@^4.1.5: object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -2234,7 +2021,7 @@ object.fromentries@^2.0.8: object.groupby@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: call-bind "^1.0.7" @@ -2243,7 +2030,7 @@ object.groupby@^1.0.3: object.values@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: call-bind "^1.0.7" @@ -2253,7 +2040,7 @@ object.values@^1.2.0: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -2266,7 +2053,7 @@ onetime@^5.1.0: optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -2279,18 +2066,18 @@ optionator@^0.9.3: ospath@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" - integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= + integrity sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA== p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" @@ -2304,20 +2091,20 @@ p-map@^4.0.0: parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" @@ -2326,54 +2113,59 @@ path-key@^3.0.0, path-key@^3.1.0: path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pend@~1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" -prettier@^2.6.2: +prettier@^2.6.2, prettier@>=2.0.0: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-bytes@^5.6.0: @@ -2392,41 +2184,36 @@ pretty-format@^27.0.2: process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -qs@~6.10.3: - version "6.10.4" - resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" - integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== +qs@6.13.0: + version "6.13.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.6" @@ -2437,7 +2224,7 @@ querystringify@^2.1.1: queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== react-is@^17.0.1: @@ -2445,23 +2232,14 @@ react-is@^17.0.1: resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -regenerator-runtime@^0.13.4: - version "0.13.10" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== - -regexp.prototype.flags@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regexp.prototype.flags@^1.5.2: version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: call-bind "^1.0.6" @@ -2472,23 +2250,23 @@ regexp.prototype.flags@^1.5.2: request-progress@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" - integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + integrity sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg== dependencies: throttleit "^1.0.0" requires-port@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.22.4: version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -2505,9 +2283,14 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rfdc@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" @@ -2517,21 +2300,21 @@ rimraf@^3.0.2: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.7: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +rxjs@^7.5.1: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" safe-array-concat@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: call-bind "^1.0.7" @@ -2546,7 +2329,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.2: safe-regex-test@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: call-bind "^1.0.6" @@ -2558,33 +2341,26 @@ safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@7.5.2: +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@7.5.2: version "7.5.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz" integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== dependencies: lru-cache "^6.0.0" -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.7: +semver@^7.5.3: version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^7.5.3: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -2594,18 +2370,9 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - set-function-name@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -2625,18 +2392,9 @@ shebang-regex@^3.0.0: resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -side-channel@^1.0.6: +side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -2645,13 +2403,13 @@ side-channel@^1.0.6: object-inspect "^1.13.1" signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: @@ -2674,7 +2432,7 @@ slice-ansi@^4.0.0: sshpk@^1.18.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" @@ -2687,25 +2445,18 @@ sshpk@^1.18.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.trim@^1.2.9: version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: call-bind "^1.0.7" @@ -2715,7 +2466,7 @@ string.prototype.trim@^1.2.9: string.prototype.trimend@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: call-bind "^1.0.7" @@ -2724,30 +2475,23 @@ string.prototype.trimend@^1.0.8: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -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" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-final-newline@^2.0.0: @@ -2757,7 +2501,7 @@ strip-final-newline@^2.0.0: strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: @@ -2783,40 +2527,40 @@ supports-color@^8.1.1: supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + version "1.0.1" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@~0.2.3: version "0.2.3" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tough-cookie@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + version "4.1.4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -2825,7 +2569,7 @@ tough-cookie@^4.1.3: tsconfig-paths@^3.15.0: version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: "@types/json5" "^0.0.29" @@ -2833,14 +2577,19 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.1.0: + version "2.7.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -2848,25 +2597,25 @@ tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: @@ -2876,7 +2625,7 @@ type-fest@^0.21.3: typed-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: call-bind "^1.0.7" @@ -2885,7 +2634,7 @@ typed-array-buffer@^1.0.2: typed-array-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: call-bind "^1.0.7" @@ -2896,7 +2645,7 @@ typed-array-byte-length@^1.0.1: typed-array-byte-offset@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: available-typed-arrays "^1.0.7" @@ -2908,7 +2657,7 @@ typed-array-byte-offset@^1.0.2: typed-array-length@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" @@ -2918,14 +2667,14 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@4.8.4: +"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@4.8.4: version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -2935,18 +2684,18 @@ unbox-primitive@^1.0.2: undici-types@~6.19.2: version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== untildify@^4.0.0: version "4.0.0" @@ -2955,7 +2704,7 @@ untildify@^4.0.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -2976,7 +2725,7 @@ uuid@^8.3.2: verror@1.10.0: version "1.10.0" resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" @@ -2993,19 +2742,9 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -3014,18 +2753,6 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15: gopd "^1.0.1" has-tostringtag "^1.0.2" -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - which@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" @@ -3035,7 +2762,7 @@ which@^2.0.1: word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^6.2.0: @@ -3059,7 +2786,7 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yallist@^4.0.0: version "4.0.0" @@ -3069,12 +2796,12 @@ yallist@^4.0.0: yauzl@^2.10.0: version "2.10.0" resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/elk-ror/docker-compose.yml b/elk-ror/docker-compose.yml index a363a25..b7dad7a 100644 --- a/elk-ror/docker-compose.yml +++ b/elk-ror/docker-compose.yml @@ -11,6 +11,7 @@ services: - "19200:9200" - "19300:9300" - "5000:5000" + - "21853:21853" deploy: resources: limits: @@ -54,7 +55,7 @@ services: replicas: 3 resources: limits: - memory: 756G + memory: 756M environment: ELASTIC_USER_PASSWORD: elastic ES_API_URL: http://es-ror:9200