diff --git a/babel.config.js b/babel.config.js index eed66aad..086f8dd7 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - module.exports = { presets: ['@babel/preset-env'], plugins: ['istanbul'], diff --git a/cypress/e2e/dataTest.js b/cypress/e2e/dataTest.js index 9b1f32f6..2b623fdf 100644 --- a/cypress/e2e/dataTest.js +++ b/cypress/e2e/dataTest.js @@ -28,7 +28,7 @@ const emailExampleFile = 'email-templates.zip' const smsExampleFile = 'sms-templates.zip' const importEmailsFileHeaderText = 'Import email templates' const importSmsFileHeaderText = 'Import SMS templates' -const importEmailTemplatesErrorMessage = `Invalid ApiKey parameterInvalid ApiKey parameter` +const importEmailTemplatesErrorMessage = `Invalid ApiKey parameterInvalid APIKey identified. Invalid ApiKey parameter` const smsTemplatesIconName = 'SMS Templates' const smsTemplatesExportErrorMessage = 'Error getting SMS templates' const smsTemplatesExportErrorMessageDetail = 'Error getting SMS templatesThere was an error when getting the SMS templates or you do not have the required permissions to call it.' @@ -65,6 +65,16 @@ const prettifySingleNoJavascript = 'CloseThere is no Javascript on this Screen-S const prettifySingleSuccess = 'ClosePrettify Javascript has been successful.' const prettifySingleError = 'CloseError formatting Screen-Set ID' const prettifyMultipleScreensNoJavascript = 'CloseThere is no Javascript to Format on any Screen-Set.' +const importData = 'Import Data' +const importAccountsDescription = 'Import accounts and generate csv with schema and legal fields' +const importAccountDownloadButton = 'Download Template' +const importAccountsSubtitle = 'This will export the chosen fields to a CSV file. You can then import this file to create accounts.' +const versionControlIconName = 'Version Control' +const versionControlTitle = 'Version Control' +const owner = 'testOwner' +const gitToken = 'testGitToken' +const commitMessage = 'Test commit message' + const mockedPrettierGetScreenSetResponse = { callId: '5a4395b432794df383c2a35740ae90b0', errorCode: 0, @@ -1792,7 +1802,6 @@ const getRiskProvidersResponse = { config: { subscriberId: '', account: '', - password: '', environment: 0, integrationPoint: '', }, @@ -1826,6 +1835,249 @@ const setPoliciesMock = { registration: { requireCaptcha: true }, } +const mockedVersionControlGetResponse = [ + { + name: 'testApiKey', + commit: { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/commits/testSha', + }, + }, + { + name: 'main', + commit: { + sha: '8043e2042a3c1627d2f42fe30296dd8f117d60bf', + url: 'testurl.com/repos/testOwner/CDCVersionControl/commits/8043e2042a3c1627d2f42fe30296dd8f117d60bf', + }, + protected: false, + }, +] + +const mockedUserAuthentication = { + login: 'testOwner', + id: 48961605, + node_id: 'MDQ6VXNlcjQ4OTYxNjA1', + avatar_url: 'testurl.com/u/48961605?v=4', + gravatar_id: '', + url: 'testurl.com/users/testOwner', + html_url: 'testurl.com/testOwner', + followers_url: 'testurl.com/users/testOwner/followers', + following_url: 'testurl.com/users/testOwner/following{/other_user}', + gists_url: 'testurl.com/users/testOwner/gists{/gist_id}', + starred_url: 'testurl.com/users/testOwner/starred{/owner}{/repo}', + subscriptions_url: 'testurl.com/users/testOwner/subscriptions', + organizations_url: 'testurl.com/users/testOwner/orgs', + repos_url: 'testurl.com/users/testOwner/repos', + events_url: 'testurl.com/users/testOwner/events{/privacy}', + received_events_url: 'testurl.com/users/testOwner/received_events', + type: 'User', + user_view_type: 'private', + site_admin: false, + name: null, + company: null, + blog: '', + location: null, + email: null, + hireable: null, + bio: null, + twitter_username: null, + notification_email: null, + public_repos: 0, + public_gists: 0, + followers: 0, + following: 1, + created_at: '2019-03-26T17:24:45Z', + updated_at: '2025-01-25T16:23:53Z', + private_gists: 0, + total_private_repos: 2, + owned_private_repos: 2, + disk_usage: 1440, + collaborators: 0, + two_factor_authentication: true, + plan: { + name: 'free', + space: 976562499, + collaborators: 0, + private_repos: 10000, + }, +} +const createCommitResponse = { + sha: 'testSha', + node_id: 'C_kwDONOvK_toAKDRkZTc0NDAwNmJjMDFkZTA1ZmRkOTA2MmI2YWY3ZjRmMjVmYTdjNjY', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + html_url: 'testurl.com/testOwner/testRepo/commit/testSha', + author: { + name: 'testOwner', + email: '48961605+testOwner@users.noreply.github.com', + date: '2025-02-18T16:10:18Z', + }, + committer: { + name: 'testOwner', + email: '48961605+testOwner@users.noreply.github.com', + date: '2025-02-18T16:10:18Z', + }, + tree: { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/trees/testSha', + }, + message: 'Backup created', + parents: [ + { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + html_url: 'testurl.com/testOwner/testRepo/commit/testSha', + }, + ], + verification: { + verified: false, + reason: 'unsigned', + signature: null, + payload: null, + verified_at: null, + }, +} + +const mockedVersionControlGetCommitsResponse = { + sha: 'testSha', + node_id: 'C_kwDONOvK_toAKDgwNDNlMjA0MmEzYzE2MjdkMmY0MmZlMzAyOTZkZDhmMTE3ZDYwYmY', + commit: { + author: { + name: 'testOwner', + email: '48961605+testOwner@users.noreply.github.com', + date: '2024-11-13T12:41:21Z', + }, + committer: { + name: 'GitHub', + email: 'noreply@github.com', + date: '2024-11-13T12:41:21Z', + }, + message: 'Create test CDCRepo branch creation', + tree: { + sha: 'ef3a3e134ada6bb2538add324b307736b144dddc', + url: 'testurl.com/repos/testOwner/testRepo/git/trees/ef3a3e134ada6bb2538add324b307736b144dddc', + }, + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + comment_count: 0, + verification: { + verified: true, + reason: 'valid', + signature: + '-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJnNJ5xCRC1aQ7uu5UhlAAABegQAFnluB7G1RPSG/ZM5bo80iA8\nPrSJFVXLLTd1sgv8jH8gkDTr8wRu4ck5XnfgW/1Ou6fX9GFIPG1AiZ4u73qeBTvf\nNxrgV/Tg18wY6cd63GcPJlk10r1Om4CXafQlSPlsb90o0CQLfZwKI+/vIqD8ZEXt\nMqkQcEYvRZkvMBUfGMbVcC15fuslsC8ktxMTlPgb8bP5No0fc/ghlYB/Ja8Ry37n\n7/RDijajISW9oJzozJ+EFqa1Yy5VtsgLX2saI8x3Y1Y+jSdLn6uNjZshA8ceH6ru\nM+fxAHsBmAhsEnSDE76rhIzSapTJ0gB2u85XWX8bOOui++l7zId8m2WKyRIkzU5z\ntd2xpuE1HD019WET4tHb5XPMJxEPbxSDbMXD3LbStue7gEqN6RuzRiBdbhNd1XEA\nWJGzsQQpu3UYhOPFD3wC6nLvMw1WO8G3DyOFPkd8opJ1wYk0o4a5vADMoHsKlBGD\n2GiMA5Vup9oGkrlY+Df7WaJzS+smusmZ+U7HPM++pZ2NTJm1ff13WqryTu+AhABr\niDQu01pMGI/AecsDhj05dR9rTInt2aWNUEUsGIMk7ka/aq3NNmi2gHD5/G8J4BvR\n1tpVsVoQpnqDG7Xiqp6DGbrvg6OWqaeTqZRskSd/s5z4o5qod3Y5jwECNJAeGU40\n+ch7uwatHA9G4T6FipQd\n=hUCL\n-----END PGP SIGNATURE-----\n', + payload: + 'tree ef3a3e134ada6bb2538add324b307736b144dddc\nauthor testOwner <48961605+testOwner@users.noreply.github.com> 1731501681 +0000\ncommitter GitHub 1731501681 +0000\nCreate test CDCRepo branch creation', + verified_at: '2024-11-13T12:53:02Z', + }, + }, + committer: { + login: 'web-flow', + id: 19864447, + node_id: 'MDQ6VXNlcjE5ODY0NDQ3', + avatar_url: 'test.com/u/19864447?v=4', + gravatar_id: '', + url: 'testurl.com/users/web-flow', + html_url: 'https://github.com/web-flow', + followers_url: 'testurl.com/users/web-flow/followers', + following_url: 'testurl.com/users/web-flow/following{/other_user}', + gists_url: 'testurl.com/users/web-flow/gists{/gist_id}', + starred_url: 'testurl.com/users/web-flow/starred{/owner}{/repo}', + subscriptions_url: 'testurl.com/users/web-flow/subscriptions', + organizations_url: 'testurl.com/users/web-flow/orgs', + repos_url: 'testurl.com/users/web-flow/repos', + events_url: 'testurl.com/users/web-flow/events{/privacy}', + received_events_url: 'testurl.com/users/web-flow/received_events', + type: 'User', + user_view_type: 'public', + site_admin: false, + }, + parents: [], +} + +const mockFetchCommits = { + ref: 'refs/heads/testApiKey', + node_id: 'REF_abc123_bac', + url: 'testurl.com/repos/testOwner/testRepo/git/refs/heads/testApiKey', + object: { + sha: 'testsha', + type: 'commit', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/123abc123', + }, +} + +const mockGetBlob = { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/blobs/testSha', +} + +const mockTree = { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/trees/testSha', + tree: [ + { + path: 'testRepo', + mode: '100644', + type: 'blob', + sha: 'testSha', + size: 22, + url: 'testurl.com/repos/testOwner/testRepo/git/blobs/testSha', + }, + { + path: 'src', + mode: '040000', + type: 'tree', + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/trees/testSha', + }, + ], + truncated: false, +} + +const mockCommits = { + sha: 'testSha', + node_id: 'id_test', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + html_url: 'test.com/testOwner/testRepo/commit/testSha', + author: { + name: 'testOwner', + email: '48961605+testOwner@users.noreply.github.com', + date: '2025-02-18T11:33:22Z', + }, + committer: { + name: 'testOwner', + email: '48961605+testOwner@users.noreply.github.com', + date: '2025-02-18T11:33:22Z', + }, + tree: { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/trees/testSha', + }, + message: 'Backup created', + parents: [ + { + sha: 'testSha', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + html_url: 'test.com/testOwner/testRepo/commit/testSha', + }, + ], + verification: { + verified: false, + reason: 'unsigned', + signature: null, + payload: null, + verified_at: null, + }, +} + +const mockGetRef = { + ref: 'refs/heads/testApiKey', + node_id: 'testId', + url: 'testurl.com/repos/testOwner/testRepo/git/refs/heads/testApiKey', + object: { + sha: 'testSha', + type: 'commit', + url: 'testurl.com/repos/testOwner/testRepo/git/commits/testSha', + }, +} + const setRiskProvidersMock = { callId: 'ea4861dc2cab4c01ab265ffe3eab6c71', errorCode: 0, @@ -1836,7 +2088,6 @@ const setRiskProvidersMock = { config: { subscriberId: '', account: '', - password: '', environment: 0, integrationPoint: '', }, @@ -1960,4 +2211,22 @@ export { setCaptchaConfigMock, setPoliciesMock, setRiskProvidersMock, + importData, + importAccountsDescription, + importAccountDownloadButton, + importAccountsSubtitle, + versionControlIconName, + versionControlTitle, + gitToken, + commitMessage, + mockedVersionControlGetResponse, + mockedVersionControlGetCommitsResponse, + owner, + mockFetchCommits, + mockGetBlob, + mockTree, + mockCommits, + mockGetRef, + mockedUserAuthentication, + createCommitResponse, } diff --git a/cypress/e2e/e2eFullTesting.cy.js b/cypress/e2e/e2eFullTesting.cy.js index 7798b8ec..54d2e824 100644 --- a/cypress/e2e/e2eFullTesting.cy.js +++ b/cypress/e2e/e2eFullTesting.cy.js @@ -51,6 +51,8 @@ describe('All features full Test Suite', () => { validateChanges(dataTest.childOfBaseDomainName, true) navigateToChosenSite(dataTest.baseDomainName) deleteSiteCreated() + + cy.run('versionControl.cy.js') }) function createSiteAndCopyConfig(pareSiteDomain, childSiteDomain) { diff --git a/cypress/e2e/importAccounts.cy.js b/cypress/e2e/importAccounts.cy.js new file mode 100644 index 00000000..05aaaaaa --- /dev/null +++ b/cypress/e2e/importAccounts.cy.js @@ -0,0 +1,68 @@ +import * as utils from './utils' +import * as dataTest from './dataTest' + +describe('Import Account - Configuration Tree test suite', () => { + context('Configuration Tree ', () => { + beforeEach(() => { + utils.mockConfigurationTreeFullAccount() + utils.startUp('Import Data') + utils.getImportAccountsInformation() + }) + afterEach(() => { + cy.clearAllCookies() + cy.clearAllLocalStorage() + cy.clearAllSessionStorage() + }) + it('Should export data schema successfully from a full account', () => { + cy.get('#importAccountsCard').get('ui5-tree').should('have.length', 20) + cy.get('[data-cy ="importDataSaveButton"]').should('not.be.disabled') + cy.get('#data').click().should('have.prop', 'checked') + cy.get('#importDataSaveButton').click() + }) + it('Should export data schema successfully from a lite account', () => { + cy.get('#importDataSelectAccount').click() + cy.get('ui5-static-area-item').shadow().find('ui5-responsive-popover').find('ui5-li').contains('Lite Account').click() + cy.get('#importDataSelectAccount').shadow().find('.ui5-select-label-root').should('have.text', 'Lite Account') + cy.get('#importAccountsCard').get('ui5-tree').should('have.length', 6) + cy.get('[data-cy ="importDataSaveButton"]').should('not.be.disabled') + cy.get('#data').click().should('have.prop', 'checked') + cy.get('#importDataSaveButton').click() + }) + it('Should check if isSubscribe checkbox is readOnly', () => { + cy.get(':nth-child(4) > [level="1"]').shadow().find('.ui5-li-tree-toggle-box').click() + cy.get(':nth-child(4) > [level="1"] > :nth-child(2)').shadow().find('li').find('.ui5-li-tree-toggle-box').find('ui5-icon').click() + cy.get('#importAccountsCard').find('[id="subscriptions.newsletter.commercial.tags"]').click() + cy.get('#importAccountsCard').find('[id="subscriptions.newsletter.commercial.isSubscribed"]').should('have.prop', 'checked') + }) + it('Should check if isConsentGranted checkbox is readOnly', () => { + cy.get(':nth-child(7) > [level="1"]').shadow().find('.ui5-li-tree-toggle-box').click() + cy.get(':nth-child(7) > [level="1"] > :nth-child(2)').shadow().find('li').find('.ui5-li-tree-toggle-box').find('ui5-icon').click() + cy.get('[expanded=""] > [level="3"]').shadow().find('.ui5-li-tree-toggle-box').find('ui5-icon').click() + cy.get('#importAccountsCard').find('[id="preferences.terms.sap.actionTimestamp"]').click() + cy.get('#importAccountsCard').find('[id="preferences.terms.sap.isConsentGranted"]').should('have.prop', 'checked') + }) + it('Should check if status checkbox is readOnly', () => { + cy.get(':nth-child(8) > [level="1"]').shadow().find('.ui5-li-tree-toggle-box').click() + cy.get(':nth-child(8) > [level="1"] > :nth-child(4)').shadow().find('li').find('.ui5-li-tree-toggle-box').find('ui5-icon').click() + cy.get('#importAccountsCard').find('[id="communications.C_mobileApp.optIn.acceptanceLocation"]').click() + cy.get('#importAccountsCard').find('[id="communications.C_mobileApp.status"]').should('have.prop', 'checked') + }) + }) + context.only('Configuration Tree - Search Tree ', () => { + beforeEach(() => { + utils.mockConfigurationTreeFullAccount() + utils.startUp('Import Data') + utils.getImportAccountsInformation() + }) + afterEach(() => { + cy.clearAllCookies() + cy.clearAllLocalStorage() + cy.clearAllSessionStorage() + }) + it('Should write on the search input and check the amount of checkboxes', () => { + cy.get('#importAccountsCard').get('ui5-tree').should('have.length', 20) + cy.get('#schemaInput').shadow().find('input').type('data.loyalty.rewardPoints') + cy.get('#importAccountsCard').get('ui5-tree-item-custom').should('have.length', 3) + }) + }) +}) diff --git a/cypress/e2e/siteDeployerTests.cy.js b/cypress/e2e/siteDeployerTests.cy.js index d4e7a9a6..01767ea6 100644 --- a/cypress/e2e/siteDeployerTests.cy.js +++ b/cypress/e2e/siteDeployerTests.cy.js @@ -30,14 +30,12 @@ describe('Site Deployer Test Suite', () => { utils.getSiteStructure(1) cy.get('[data-cy ="cdctools-siteStructure"]').shadow().find('.ui5-select-label-root').should('have.text', dataTest.dropdownOption) utils.getDataCenters('US') - cy.get('ui5-table-row').should('have.length', '0') utils.getCreateButton().should('not.be.disabled') utils.getCreateButton().click() cy.get('ui5-table-row').should('have.length', '6') cy.get('[data-cy ="baseDomainInput"]').eq(0).should('have.value', `dev.us.parent.${dataTest.baseDomain}`) utils.getSaveButton().should('not.be.disabled') utils.getCancelButton().click() - cy.get('ui5-table-row').should('have.length', '0') }) it('Should add a single Parent Site Manually with error message', () => { @@ -85,7 +83,6 @@ describe('Site Deployer Test Suite', () => { utils.getSaveButton().should('not.be.disabled') utils.getIcon(0) cy.get('ui5-responsive-popover').find('[data-component-name = "ActionSheetMobileContent"] ').find('[accessible-name="Delete Item 2 of 2"]').click() - cy.get('ui5-table-row').should('have.length', 0) }) it('Should show Manual Removal Popup', () => { diff --git a/cypress/e2e/utils.js b/cypress/e2e/utils.js index 3255769f..ae08b1e2 100644 --- a/cypress/e2e/utils.js +++ b/cypress/e2e/utils.js @@ -6,6 +6,9 @@ /* eslint-disable no-undef */ import { expectedGetRbaPolicyResponseOk, expectedGetRiskAssessmentResponseOk, expectedGetUnknownLocationNotificationResponseOk } from '../../src/services/copyConfig/rba/dataTest' +import { expectedCommunicationResponse } from '../../src/services/importAccounts/communicationImport/dataTest' +import { mockPreferencesResponse } from '../../src/services/importAccounts/preferencesImport/dataTest' +import { expectedSchemaResponse } from '../../src/services/importAccounts/schemaImport/schemaDatatest' import { dummyApiKey, mockedCreateDataflowResponse, @@ -46,6 +49,10 @@ import { setCaptchaConfigMock, setPoliciesMock, setRiskProvidersMock, + importData, + importAccountsDescription, + importAccountDownloadButton, + importAccountsSubtitle, } from './dataTest' export function startUp(pageName) { @@ -58,6 +65,12 @@ export function startUp(pageName) { cy.contains(pageName).realClick() cy.reload() } +export function getImportAccountsInformation() { + cy.get('#importAccountsTitle').should('contain.text', importData) + cy.get('#importAccountsHeaderText').should('contain.text', importAccountsDescription) + cy.get('ui5-card-header').eq(3).shadow().find('.ui5-card-header-first-line').should('contain.text', importAccountDownloadButton) + cy.get('ui5-card-header').eq(3).shadow().find('.ui5-card-header-subtitle').should('contain.text', importAccountsSubtitle) +} export function clearCredentials() { resizeObserverLoopErrRe() @@ -188,6 +201,12 @@ export function mockGetConfigurationRequests() { cy.intercept('POST', 'accounts.getPolicies', { body: mockedGetPolicyResponse }).as('accounts.getPolicies') cy.intercept('POST', 'admin.riskProviders.getConfig', { body: getRiskProvidersResponse }).as('riskProviders.getConfig') } +export function mockConfigurationTreeFullAccount() { + cy.intercept('POST', 'accounts.getSchema', { body: expectedSchemaResponse }).as('getSchema') + cy.intercept('POST', 'accounts.getConsentsStatements', { body: mockPreferencesResponse }).as('getPreferences') + cy.intercept('POST', 'accounts.communications.settings.search', { body: expectedCommunicationResponse }).as('getCommunication') + cy.intercept('POST', 'admin.getSiteConfig', { body: siteConfigResponse }).as('getSiteConfig') +} export function mockSetConfigurationRequests() { mockResponse(mockedSetSchemaResponse, 'POST', 'accounts.setSchema') @@ -280,7 +299,7 @@ export function writeParentSiteTable(baseDomain, siteDescription, dataCenterOpti cy.get('[data-cy ="descriptionInput"]').shadow().find('[class = "ui5-input-inner"]').type(siteDescription).should('have.value', siteDescription) cy.wait(1000) cy.get('[data-cy ="dataCenterSelect"]').click() - cy.get('ui5-static-area-item').shadow().find('.ui5-select-popover').eq(1).find('ui5-li').eq(dataCenterOption).realClick() + cy.get('ui5-static-area-item').shadow().find('ui5-responsive-popover').eq(5).find('ui5-li').eq(dataCenterOption).realClick() cy.wait(500) } diff --git a/cypress/e2e/versionControl.cy.js b/cypress/e2e/versionControl.cy.js new file mode 100644 index 00000000..9b8f3574 --- /dev/null +++ b/cypress/e2e/versionControl.cy.js @@ -0,0 +1,89 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +/* eslint-disable no-undef */ + +import * as dataTest from './dataTest' +import * as utils from './utils' + +describe('Version Control Test Suite', () => { + const protocol = 'https://' + const host = 'api.github.com' + const url = `${protocol}${host}` + beforeEach(() => { + utils.startUp(dataTest.versionControlIconName) + }) + + it('should display the version control page', () => { + utils.mockGetConfigurationRequests() + cy.intercept('GET', `${url}/repos/testOwner/testRepo/branches`, { body: dataTest.mockedVersionControlGetResponse }).as('getBranches') + cy.intercept('GET', `${url}/repos/testOwner/testRepo/branches/main`, { body: dataTest.mockedVersionControlGetResponse }) + cy.intercept('GET', `${url}/repos/testOwner/testRepo/commits?sha=testSha&per_page=100&page=1`, { + body: dataTest.mockedVersionControlGetCommitsResponse, + }).as('getCommits') + cy.intercept('GET', `${url}/user`, { + body: { callId: 'ea4861dc2cab4c01ab265ffe3eab6c71', errorCode: 0, apiVersion: 2, statusCode: 200, statusReason: 'OK', login: 'testOwner' }, + }) + cy.intercept('GET', `${url}/repos/testOwner/testRepo/git/ref/heads%2Fundefined`, { + body: dataTest.mockFetchCommits, + }) + cy.intercept('POST', `${url}/repos/testOwner/testRepo/git/blobs`, { + body: dataTest.mockGetBlob, + }) + cy.intercept('POST', `${url}/repos/testOwner/testRepo/git/trees`, { + body: dataTest.mockTree, + }) + cy.intercept('POST', `${url}/repos/testOwner/testRepo/git/commits`, { + body: dataTest.mockCommits, + }) + cy.intercept('PATCH', `${url}/repos/testOwner/testRepo/git/refs/heads%2Fundefined`, { + body: dataTest.mockGetRef, + }) + cy.intercept('GET', `${url}/repos/testOwner/testRepo/git/ref/heads%2Fundefined`, { + body: dataTest.mockGetRef, + }) + cy.intercept('POST', `${url}/repos/testOwner/testRepo/git/refs`, { + body: dataTest.mockGetRef, + }) + cy.intercept('OPTIONS', `${url}/repos/testOwner/testRepo/git/refs/heads%2Fundefined`, {}) + cy.get('#versionControlTitle').should('have.text', 'Version Control') + cy.get('#ownerInput').should('be.visible').shadow().find('input').type('testOwner') + cy.get('#gitTokenInput').should('be.visible').shadow().find('input').type('testToken') + cy.get('[data-cy="repoInput"]').should('be.visible').shadow().find('input').type('testRepo{enter}') + cy.get('#backupButton').should('be.not.disabled') + cy.get('#backupButton').click() + cy.get('#backupDialog').find('#header').should('contain.text', 'Backup Information') + cy.get('#backupDialog').find('li').should('have.length', '16') + cy.get('#backupDialog').find('ui5-textarea').shadow().find('textArea').should('be.visible').type('test commit message') + }) + + it('should display credentials input fields', () => { + cy.get('#ownerInput').should('be.visible') + cy.get('#gitTokenInput').should('be.visible') + cy.get('[data-cy="repoInput"]').should('be.visible') + }) + + it('should display credentials error when the credentials are not correct', () => { + cy.get('#ownerInput').should('be.visible').shadow().find('input').type('testOwner') + cy.get('#gitTokenInput').should('be.visible').shadow().find('input').type('testToken') + cy.get('#warningCredentials').should('contain.text', 'Please insert the correct configurations.') + }) + + it('should enable the backup button when credentials are provided', () => { + cy.intercept('GET', `${url}/user`, { + body: dataTest.mockedUserAuthentication, + }) + cy.intercept('GET', `${url}/repos/testOwner/testRepo/branches`, { body: dataTest.mockedVersionControlGetResponse }) + cy.intercept('GET', `${url}/repos/testOwner/testRepo/commits?sha=testSha`, { + body: dataTest.mockedVersionControlGetCommitsResponse, + }) + + cy.get('#ownerInput').should('be.visible').shadow().find('input').type('testOwner') + cy.get('#gitTokenInput').should('be.visible').shadow().find('input').type('testToken') + cy.get('[data-cy="repoInput"]').should('be.visible').shadow().find('input').type('testRepo{enter}') + cy.get('[data-cy="backupButton"]').should('not.be.disabled') + cy.get('#versionControlCommitBar').should('contain.text', 'There are no commits for this API key') + }) +}) diff --git a/package-lock.json b/package-lock.json index 1da80b8a..2a65c594 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "sap-customer-data-cloud-toolkit", "version": "1.9.0", "dependencies": { + "@octokit/rest": "^21.0.2", "@reduxjs/toolkit": "^1.8.6", "@sap_oss/automated-usage-tracking-tool": "^1.0.0", "@testing-library/jest-dom": "^5.16.5", @@ -22,6 +23,7 @@ "crypto-js": "^4.2.0", "fast-xml-parser": "^4.2.5", "i18next": "^23.0.0", + "js-base64": "^3.7.7", "jszip": "^3.10.1", "lodash": "^4.17.21", "os": "^0.1.2", @@ -39,11 +41,15 @@ "devDependencies": { "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/preset-env": "^7.26.0", + "@babel/preset-react": "^7.25.9", "@bahmutov/cypress-code-coverage": "^2.0.0", "@cypress/browserify-preprocessor": "^3.0.2", "@cypress/code-coverage": "^3.10.0", "@cypress/instrument-cra": "^1.4.0", "@cypress/xvfb": "^1.2.4", + "babel-jest": "^29.7.0", "babel-plugin-istanbul": "^6.1.1", "babel-plugin-transform-class-properties": "^6.24.1", "concurrently": "^8.0.0", @@ -114,11 +120,12 @@ } }, "node_modules/@babel/code-frame": { - "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==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -126,9 +133,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -192,54 +199,55 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", - "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -248,19 +256,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -271,13 +277,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", "semver": "^6.3.1" }, "engines": { @@ -303,80 +309,41 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -386,35 +353,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -424,14 +391,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -441,79 +408,66 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -532,25 +486,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "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.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -559,13 +502,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -575,12 +533,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -590,14 +548,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", - "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -607,13 +565,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -800,21 +758,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz", @@ -830,30 +773,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", @@ -870,12 +789,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -885,12 +804,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -924,12 +843,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1072,12 +991,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", - "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1087,15 +1006,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1105,14 +1023,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1122,12 +1040,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", - "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1137,12 +1055,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1152,13 +1070,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1168,14 +1086,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", - "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1185,18 +1102,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1207,13 +1122,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", - "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/template": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1223,12 +1138,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1238,13 +1153,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", - "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1254,12 +1169,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", - "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1268,14 +1183,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", - "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1285,13 +1215,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", - "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1301,13 +1231,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", - "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1333,13 +1262,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", - "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1349,14 +1278,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1366,13 +1295,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", - "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1382,12 +1310,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1397,13 +1325,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", - "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1413,12 +1340,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", - "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1428,13 +1355,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", - "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1444,14 +1371,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-simple-access": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1461,15 +1388,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1479,13 +1406,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", - "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1495,13 +1422,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", - "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1511,12 +1438,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", - "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1526,13 +1453,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", - "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1542,13 +1468,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", - "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1558,15 +1483,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", - "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.7" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1576,13 +1500,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", - "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1592,13 +1516,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", - "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1608,14 +1531,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1625,12 +1547,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", - "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1640,13 +1562,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1656,15 +1578,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", - "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1674,12 +1595,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", - "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1704,12 +1625,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", - "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1719,16 +1640,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", - "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1738,12 +1659,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", - "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.24.7" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1753,13 +1674,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", - "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1769,12 +1690,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", - "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1784,13 +1705,29 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", - "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1820,12 +1757,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", - "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1835,13 +1772,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", - "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1851,12 +1788,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", - "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1866,12 +1803,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", - "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1881,12 +1818,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1914,12 +1851,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", - "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1929,13 +1866,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", - "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1945,13 +1882,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", - "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1961,13 +1898,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1977,91 +1914,79 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2098,17 +2023,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", - "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.24.7", - "@babel/plugin-transform-react-jsx-development": "^7.24.7", - "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2136,12 +2061,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, "node_modules/@babel/runtime": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", @@ -2154,33 +2073,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2189,14 +2105,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -5036,201 +4951,136 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "dev": true, + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dev": true, + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "dev": true + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dev": true, + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.6.tgz", + "integrity": "sha512-zcvqqf/+TicbTCa/Z+3w4eBJcAxCFymtc0UAIsR3dEVoNilWld4oXdscQ3laXamTszUZdusw97K8+DrbFiOwjw==", "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" + "@octokit/types": "^13.6.2" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz", + "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=6" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", - "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", - "dev": true, + "version": "13.2.6", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.6.tgz", + "integrity": "sha512-wMsdyHMjSfKjGINkdGKki06VEkgdEldIGstIEyGX0wbYHGByOwN/KiM+hAAlUwAtPkP3gvXtVQA9L3ITdV2tVw==", "dependencies": { - "@octokit/types": "^10.0.0" + "@octokit/types": "^13.6.1" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", - "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/core": ">=6" } }, "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dev": true, + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.3.tgz", + "integrity": "sha512-V+TFhu5fdF3K58rs1pGUJIDH5RZLbZm5BI+MNF+6o/ssFNT4vWlCh/tVpF3NxGtP15HUxTTMUbsG5llAuU2CZA==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.5.tgz", + "integrity": "sha512-IlBTfGX8Yn/oFPMwSfvugfncK2EwRLjzbrpifNaMY8o/HTEAFqCA1FZxjD9cWvSKBHgrIhc4CSBIzMxiLsbzFQ==", "dependencies": { - "whatwg-url": "^5.0.0" + "@octokit/types": "^13.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@octokit/request/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/@octokit/request/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/@octokit/request/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "node": ">= 18" } }, "node_modules/@octokit/rest": { - "version": "19.0.13", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", - "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", - "dev": true, + "version": "21.0.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.0.2.tgz", + "integrity": "sha512-+CiLisCoyWmYicH25y1cDfCrv41kRSvTq6pPWtRroRJzhsCZWZyCqGyI8foJT5LmScADSwRAnr/xo+eewL04wQ==", "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + "@octokit/core": "^6.1.2", + "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-request-log": "^5.3.1", + "@octokit/plugin-rest-endpoint-methods": "^13.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/tsconfig": { @@ -5240,12 +5090,11 @@ "dev": true }, "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dev": true, + "version": "13.6.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.6.2.tgz", + "integrity": "sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA==", "dependencies": { - "@octokit/openapi-types": "^18.0.0" + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@pkgjs/parseargs": { @@ -7498,6 +7347,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -8186,50 +8036,50 @@ } }, "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "node_modules/babel-jest/node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { @@ -8247,6 +8097,31 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/babel-jest/node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/babel-jest/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -8269,25 +8144,137 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/babel-jest/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/babel-jest/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/babel-jest/node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/babel-jest/node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-jest/node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/babel-jest/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/babel-jest/node_modules/supports-color": { @@ -8302,6 +8289,31 @@ "node": ">=8" } }, + "node_modules/babel-jest/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/babel-jest/node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/babel-loader": { "version": "9.1.3", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", @@ -8352,18 +8364,18 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", + "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-macros": { @@ -8405,13 +8417,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -8477,16 +8489,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -8709,10 +8721,9 @@ } }, "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==" }, "node_modules/bfj": { "version": "7.1.0", @@ -9309,9 +9320,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -9328,10 +9339,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -9597,9 +9608,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001628", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", - "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", + "version": "1.0.30001685", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001685.tgz", + "integrity": "sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==", "dev": true, "funding": [ { @@ -9635,6 +9646,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -9992,6 +10004,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -9999,7 +10012,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, "node_modules/colord": { "version": "2.9.3", @@ -10400,12 +10414,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dev": true, "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -10507,25 +10521,29 @@ } }, "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "dev": true, "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, "engines": { - "node": "*" + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/crypto-js": { @@ -12359,9 +12377,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", - "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", + "version": "1.5.67", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.67.tgz", + "integrity": "sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==", "dev": true }, "node_modules/elliptic": { @@ -12682,9 +12700,9 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "engines": { "node": ">=6" @@ -12712,6 +12730,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -15499,6 +15518,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -18599,6 +18619,59 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-config/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/jest-config/node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/jest-config/node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -22070,6 +22143,11 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -22233,15 +22311,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true, "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-buffer": { @@ -23785,9 +23863,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/nopt": { @@ -25077,9 +25155,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -27516,6 +27594,68 @@ } } }, + "node_modules/react-scripts/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/react-scripts/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, "node_modules/react-scripts/node_modules/babel-loader": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", @@ -27535,6 +27675,37 @@ "webpack": ">=2" } }, + "node_modules/react-scripts/node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/react-scripts/node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/react-scripts/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -27547,6 +27718,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react-scripts/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-scripts/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-scripts/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/react-scripts/node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -27592,6 +27797,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/react-scripts/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/react-scripts/node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -27634,6 +27848,18 @@ "node": ">=10" } }, + "node_modules/react-scripts/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/react-table": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", @@ -27793,9 +28019,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -27892,15 +28118,15 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dev": true, "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -27935,27 +28161,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dev": true, "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -28006,12 +28229,203 @@ "node": ">=16" } }, + "node_modules/release-it/node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true + }, + "node_modules/release-it/node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/release-it/node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/release-it/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/release-it/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/release-it/node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/request/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/release-it/node_modules/@octokit/rest": { + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/release-it/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, "node_modules/release-it/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/release-it/node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, "node_modules/release-it/node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -28272,6 +28686,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/release-it/node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true + }, + "node_modules/release-it/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/release-it/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/release-it/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -30737,6 +31179,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -31424,15 +31867,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -31991,9 +32425,9 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "engines": { "node": ">=4" @@ -32013,9 +32447,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "engines": { "node": ">=4" @@ -32061,10 +32495,9 @@ } }, "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==" }, "node_modules/universalify": { "version": "2.0.1", @@ -32169,9 +32602,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -32188,8 +32621,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" diff --git a/package.json b/package.json index d1e4f25d..151ef564 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.9.0", "private": true, "dependencies": { + "@octokit/rest": "^21.0.2", "@reduxjs/toolkit": "^1.8.6", "@sap_oss/automated-usage-tracking-tool": "^1.0.0", "@testing-library/jest-dom": "^5.16.5", @@ -17,9 +18,12 @@ "crypto-js": "^4.2.0", "fast-xml-parser": "^4.2.5", "i18next": "^23.0.0", + "js-base64": "^3.7.7", + "js-cookie": "^3.0.5", "jszip": "^3.10.1", "lodash": "^4.17.21", "os": "^0.1.2", + "pagino": "^1.4.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-i18next": "^12.1.4", @@ -50,10 +54,13 @@ }, "jest": { "transformIgnorePatterns": [ - "node_modules/(?!(@ui5|lit-html|@babel|axios)).*\\.js$" + "node_modules/(?!(@ui5|lit-html|@babel|axios|@octokit|universal-user-agent|before-after-hook)).*\\.js$" ], "moduleNameMapper": { "\\.(css)$": "identity-obj-proxy" + }, + "transform": { + "^.+\\.[t|j]sx?$": "babel-jest" } }, "nyc": { diff --git a/src/App.js b/src/App.js index 4e060396..520f5594 100644 --- a/src/App.js +++ b/src/App.js @@ -17,6 +17,8 @@ import { ROUTE_SMS_TEMPLATES, ROUTE_PRETTIER, ROUTE_PRETTIFY_ALL_SCREENS, + ROUTE_VERSION_CONTROL, + ROUTE_IMPORT_ACCOUNTS, } from './inject/constants' import CopyConfigurationExtended from './routes/copy-configuration-extended/copy-configuration-extended.component' import EmailTemplates from './routes/email-templates/email-templates.component' @@ -26,6 +28,9 @@ import '@sap_oss/automated-usage-tracking-tool/theme/sap_horizon.css' import { requestConsentConfirmation } from './lib/tracker' import PrettifyAllScreens from './routes/prettify-code/prettify-all-screens-javascript.component' import PrettifySingleScreenComponent from './routes/prettify-code/prettify-single-screen.component' +import ImportAccountsComponent from './routes/import-accounts/import-accounts.component' +import VersionControlComponent from './routes/version-control/version-control.component' + function App() { useThemeChange(() => setTheme(getCurrentConsoleTheme())) requestConsentConfirmation() @@ -45,12 +50,18 @@ function App() {
+
+ +
+
+ +
) diff --git a/src/components/import-account-configuration-tree/import-accounts-configuration-tree.component.jsx b/src/components/import-account-configuration-tree/import-accounts-configuration-tree.component.jsx new file mode 100644 index 00000000..085732db --- /dev/null +++ b/src/components/import-account-configuration-tree/import-accounts-configuration-tree.component.jsx @@ -0,0 +1,101 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import { withTranslation } from 'react-i18next' +import '@ui5/webcomponents-icons/dist/message-information.js' +import { Tree, TreeItemCustom, CheckBox, FlexBox } from '@ui5/webcomponents-react' +import MessagePopoverButton from '../message-popover-button/message-popover-button.component.jsx' +import SchemaPropertyType from '../schema-property-type/schema-property-type.component.jsx' +import { getHighestSeverity } from '../configuration-tree/utils.js' +import { setMandatoryField, setSugestionMandatoryField, setSugestionSchema } from '../../redux/importAccounts/importAccountsSlice.js' +import { findBranchAndSiblings, handleSelectChange, shouldRenderSelect } from './utils.js' +import { isMandatoryFields } from '../../redux/importAccounts/utils.js' + +const ImportAccountConfigurationTree = ({ + id, + name, + value, + error, + branches, + tooltip, + mandatory, + setConfigurationStatus, + setSwitchOptions, + expandableNode, + treeNodeInputValue, + dispatch, + t, +}) => { + const schemaNodeIds = ['internal', 'data', 'profile'] + const onCheckBoxStateChangeHandler = (event) => { + const checkBoxId = event.srcElement.id + const value = event.srcElement.checked + setFields(event) + dispatch(setConfigurationStatus({ checkBoxId, value, branches })) + + if (treeNodeInputValue) { + dispatch(setSugestionSchema({ checkBoxId, value })) + } + } + const selectChildrenField = (siblings) => { + for (let branch of siblings) { + if (isMandatoryFields(branch.id)) { + dispatch(setMandatoryField({ checkBoxId: branch.id, value: true, mandatory: true, config: true })) + dispatch(setSugestionMandatoryField({ checkBoxId: branch.id, value: true, mandatory: true, config: true })) + } + } + } + + const setFields = (event) => { + const foundSiblings = findBranchAndSiblings(branches, event.srcElement.id) + if (foundSiblings) { + selectChildrenField(foundSiblings) + } + } + + const showError = (treeNode) => { + return treeNode.error ? : '' + } + + const isReadOnly = (treeNode) => { + return (treeNode.branches.length === 0 && treeNode.mandatory === true) || (mandatory === true && treeNode.mandatory !== false) + } + + const expandTree = (treeNode, isParentLoyalty = false) => { + const isLoyaltyNode = schemaNodeIds.includes(treeNode.id) ? shouldRenderSelect(treeNode) : isParentLoyalty + return ( + + onCheckBoxStateChangeHandler(event)} + /> + + {showError(treeNode)} + {isLoyaltyNode && treeNode.branches.length > 0 && !schemaNodeIds.includes(treeNode.id) && ( + handleSelectChange(event, treeNode.id, setSwitchOptions, dispatch)} /> + )} + + } + > + {treeNode.branches.length > 0 && treeNode.branches.map((branch) => expandTree(branch, isLoyaltyNode))} + + ) + } + + return ( + <> + {expandTree({ id, name, value, error, branches, tooltip })} + + ) +} + +export default withTranslation()(ImportAccountConfigurationTree) diff --git a/src/components/import-account-configuration-tree/import-accounts-configuration-tree.styles.js b/src/components/import-account-configuration-tree/import-accounts-configuration-tree.styles.js new file mode 100644 index 00000000..47f3f3ea --- /dev/null +++ b/src/components/import-account-configuration-tree/import-accounts-configuration-tree.styles.js @@ -0,0 +1,13 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +const styles = { + tooltipIconStyle: { + alignSelf: 'center', + marginLeft: '6px', + }, +} + +export default styles diff --git a/src/components/import-account-configuration-tree/utils.js b/src/components/import-account-configuration-tree/utils.js new file mode 100644 index 00000000..6cbc72c1 --- /dev/null +++ b/src/components/import-account-configuration-tree/utils.js @@ -0,0 +1,44 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +export const handleSelectChange = (event, treeNodeId, setSwitchOptions, dispatch) => { + let selectedButton = 'object' + + if (event.detail?.selectedOption?.dataset?.id) { + selectedButton = event.detail.selectedOption.dataset.id + } + + dispatch(setSwitchOptions({ checkBoxId: treeNodeId, operation: selectedButton })) +} + +export const findBranchAndSiblings = (structure, targetId) => { + let result = null + + const traverse = (branches) => { + for (let branch of branches) { + if (branch.id === targetId) { + result = branches + return + } + if (branch.branches.length > 0) { + traverse(branch.branches) + if (result) return + } + } + } + + traverse(structure) + return result +} +export const shouldRenderSelect = (node) => { + for (const branch of node.branches) { + if (branch.branches.length === 0) { + return true + } + if (shouldRenderSelect(branch)) { + return true + } + } + return false +} diff --git a/src/components/import-accounts-configurations/import-account-configurations.styles.js b/src/components/import-accounts-configurations/import-account-configurations.styles.js new file mode 100644 index 00000000..7f539bd3 --- /dev/null +++ b/src/components/import-accounts-configurations/import-account-configurations.styles.js @@ -0,0 +1,22 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +const styles = { + selectConfigurationInnerDivStyle: { + '--sapList_AlternatingBackground': 'white', + '--sapList_SelectionBackgroundColor': 'white', + '--ui5-listitem-selected-border-bottom': '0', + '--ui5-listitem-border-bottom': '0', + }, + removeIncludedUrlButton: { + margin: '3px 12px 0 0', + }, + fullWidth: { + width: '100%', + height: '100%', + }, +} + +export default styles diff --git a/src/components/import-accounts-configurations/import-accounts-configurations.component.jsx b/src/components/import-accounts-configurations/import-accounts-configurations.component.jsx new file mode 100644 index 00000000..160c427b --- /dev/null +++ b/src/components/import-accounts-configurations/import-accounts-configurations.component.jsx @@ -0,0 +1,38 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import { withTranslation } from 'react-i18next' +import { createUseStyles } from 'react-jss' +import { CardHeader } from '@ui5/webcomponents-react' +import ImportAccountsConfigurationTree from '../import-account-configuration-tree/import-accounts-configuration-tree.component.jsx' +import styles from './import-account-configurations.styles' + +const useStyles = createUseStyles(styles, { name: 'CopyConfigurationExtended' }) + +const SiteConfigurations = ({ configurations, handleSelectChange, setSwitchOptions, setConfigurationStatus, treeNodeInputValue, expandableNode, dispatch, t }) => { + const classes = useStyles() + return configurations && configurations.length ? ( +
+
}> + {configurations.map((configuration) => ( + + ))} +
+
+ ) : ( + '' + ) +} + +export default withTranslation()(SiteConfigurations) diff --git a/src/components/risk-based-authentication-rules-buttons/utils.js b/src/components/risk-based-authentication-rules-buttons/utils.js index f1c2155d..9a618649 100644 --- a/src/components/risk-based-authentication-rules-buttons/utils.js +++ b/src/components/risk-based-authentication-rules-buttons/utils.js @@ -3,7 +3,7 @@ * License: Apache-2.0 */ -export const handleRadioButtonChange = (event, treeNode, setRbaRulesOperation, dispatch) => { +export const handleRadioButtonChange = (event, treeNode, setRbaRulesOperation, dispatch) => { const REPLACE_BUTTON_ID = 'replace' var selectedButton = 'merge' diff --git a/src/components/schema-property-type/schema-property-type.component.jsx b/src/components/schema-property-type/schema-property-type.component.jsx new file mode 100644 index 00000000..8c81c35a --- /dev/null +++ b/src/components/schema-property-type/schema-property-type.component.jsx @@ -0,0 +1,37 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import { withTranslation } from 'react-i18next' +import { Option, Select } from '@ui5/webcomponents-react' +import { useDispatch } from 'react-redux' +import { createUseStyles } from 'react-jss' +import styles from './schema-property-type.styles' + +const useStyles = createUseStyles(styles, { name: 'SchemaPropertyType' }) + +const SchemaPropertyType = ({ handleSelectChange, t, setSwitchOptions, treeNode, setTreeData, treeData }) => { + const dispatch = useDispatch() + const classes = useStyles() + return ( +
+ + + +
+ ) +} + +export default withTranslation()(SchemaPropertyType) diff --git a/src/components/schema-property-type/schema-property-type.styles.js b/src/components/schema-property-type/schema-property-type.styles.js new file mode 100644 index 00000000..a20148d6 --- /dev/null +++ b/src/components/schema-property-type/schema-property-type.styles.js @@ -0,0 +1,15 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +const styles = { + outputSelectButtonAlignment: { + alignContent: 'center', + marginLeft: '10px', + }, + outputButtonSize: { + width: '100px', + }, +} + +export default styles diff --git a/src/components/search-schema-input/search-schema-input.styles.js b/src/components/search-schema-input/search-schema-input.styles.js new file mode 100644 index 00000000..ee516c85 --- /dev/null +++ b/src/components/search-schema-input/search-schema-input.styles.js @@ -0,0 +1,13 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +const styles = { + targetInfoContainerInput: { + float: 'right', + width: '50%', + }, +} + +export default styles diff --git a/src/components/search-schema-input/search-schemas-input.component.jsx b/src/components/search-schema-input/search-schemas-input.component.jsx new file mode 100644 index 00000000..cc8aab2f --- /dev/null +++ b/src/components/search-schema-input/search-schemas-input.component.jsx @@ -0,0 +1,64 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +import '@ui5/webcomponents/dist/Input.js' +import '@ui5/webcomponents/dist/SuggestionItem.js' +import React, { useState } from 'react' +import { createUseStyles } from 'react-jss' +import { Input, InputType, SuggestionItem } from '@ui5/webcomponents-react' +import { extractIds } from '../../routes/import-accounts/utils' +import styles from './search-schema-input.styles' + +const useStyles = createUseStyles(styles, { name: 'SearchSchemaInput' }) + +const SearchBar = ({ handleSuggestionClick, configurations, setSchemaInputValue, schemaInputValue, handleTreeNodeClick }) => { + const classes = useStyles() + const [suggestions, setSuggestions] = useState([]) + + const onTargetSchemaInputHandler = (event) => { + const allNames = extractIds([configurations]) + const value = event.target.value + + setSchemaInputValue(value) + if (value !== '') { + const filteredSuggestions = allNames.filter((name) => name.includes(value)) + if (filteredSuggestions.length) { + setSuggestions(filteredSuggestions) + handleTreeNodeClick(filteredSuggestions) + } + } + if (value === '') { + handleTreeNodeClick('') + } + } + + const onSchemaInputKeyPressHandler = (event) => { + const inputValue = event.target.value.trim() + setSchemaInputValue(inputValue) + handleSuggestionClick(inputValue) + if (inputValue === '') { + handleSuggestionClick('') + } + } + + return ( + + {suggestions.map((name) => ( + + ))} + + ) +} + +export default SearchBar diff --git a/src/components/search-sites-input/dataTest.js b/src/components/search-sites-input/dataTest.js index 1e784c35..61284a31 100644 --- a/src/components/search-sites-input/dataTest.js +++ b/src/components/search-sites-input/dataTest.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - export const mockedAvailableTargetApiKeys = [ { apiKey: '111111', diff --git a/src/components/search-sites-input/search-sites-input.styles.js b/src/components/search-sites-input/search-sites-input.styles.js index 52d003c2..08f1f716 100644 --- a/src/components/search-sites-input/search-sites-input.styles.js +++ b/src/components/search-sites-input/search-sites-input.styles.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - const styles = { targetInfoContainerInput: { width: '100%', diff --git a/src/components/search-sites-input/utils.js b/src/components/search-sites-input/utils.js index 7fe42741..78b8e2d2 100644 --- a/src/components/search-sites-input/utils.js +++ b/src/components/search-sites-input/utils.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - const targetSiteContainsString = (string, availableTargetSite) => { return ( availableTargetSite.baseDomain.includes(string) || diff --git a/src/components/search-sites-input/utils.test.js b/src/components/search-sites-input/utils.test.js index 46856b48..e4a28a1c 100644 --- a/src/components/search-sites-input/utils.test.js +++ b/src/components/search-sites-input/utils.test.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - import { filterTargetSites, findStringInAvailableTargetSites, getTargetSiteByTargetApiKey } from './utils' import { mockedAvailableTargetApiKeys } from './dataTest' diff --git a/src/inject/constants.js b/src/inject/constants.js index af14531b..9417bbcd 100644 --- a/src/inject/constants.js +++ b/src/inject/constants.js @@ -25,14 +25,18 @@ export const ROUTE_SITE_DEPLOYER = '/cdc-toolbox/site-deployer' export const ROUTE_EMAIL_TEMPLATES = '/user-interfacing/email-templates' export const ROUTE_SMS_TEMPLATES = '/user-interfacing/sms-templates' export const ROUTE_COPY_CONFIG_EXTENDED = '/cdc-toolbox/copy-configuration-extended' +export const ROUTE_VERSION_CONTROL = '/cdc-toolbox/version-control' export const ROUTE_PRETTIER = '/user-interfacing/screen-sets-app/web/uiBuilder' export const ROUTE_PRETTIFY_ALL_SCREENS = '/user-interfacing/screen-sets-app' +export const ROUTE_IMPORT_ACCOUNTS = '/cdc-toolbox/import-accounts' export const INCOMPATIBLE_ROUTE_FRAGMENTS = ['/flow-builder-web-app'] export const MENU_ELEMENTS = [ { name: 'Site Deployer', appendAfterText: 'Site Settings', route: ROUTE_SITE_DEPLOYER }, { name: 'Email Templates', route: ROUTE_EMAIL_TEMPLATES }, { name: 'SMS Templates', route: ROUTE_SMS_TEMPLATES }, { name: 'Copy Config. Extended', appendAfterText: 'Copy Configuration', route: ROUTE_COPY_CONFIG_EXTENDED }, + { name: 'Import Data', appendAfterText: 'Dataflows', route: ROUTE_IMPORT_ACCOUNTS }, + { name: 'Version Control', appendAfterText: 'Certificate Provisioning', route: ROUTE_VERSION_CONTROL }, { name: 'Prettier', route: ROUTE_PRETTIER }, { name: 'Prettify all screens', route: ROUTE_PRETTIFY_ALL_SCREENS }, -] +] \ No newline at end of file diff --git a/src/inject/main.css b/src/inject/main.css new file mode 100644 index 00000000..eb95ba46 --- /dev/null +++ b/src/inject/main.css @@ -0,0 +1,49 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +.cdc-tools-app { + position: absolute; + top: 72px; + right: 0px; + height: 0; + width: calc(100% - 241px); + display: none; +} + +.cdc-tools-app-loading { + position: absolute; + top: 50px; + right: 0px; + height: 100%; + width: calc(100% - 241px); + background-color: #fff; + z-index: 9; + display: none; +} + +.cdc-tools-app-loading-show { + display: block; +} + +.cdc-tools-app-container { + position: absolute; + top: 0px; + right: 0px; + height: auto; + width: 100%; + display: none; +} + +.cdc-tools-app.show-cdc-tools { + display: block; +} + +.cdc-tools-app-container.show-cdc-tools-app-container { + display: block; +} + +.cdc-tools-background { + background-color: var(--sapBackgroundColor, #f7f7f7); +} diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index c021d275..55308e28 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -74,9 +74,19 @@ "GLOBAL.USER_KEY": "User key", "GLOBAL.VERSION": "Version", "GLOBAL.WARNING": "Warning", - "MANUAL_REMOVAL_POPUP.MANUAL_ACTION_REQUIRED": "Manual Action Required!", + "GLOBAL.LITE": "Lite", + "GLOBAL.FULL": "Full", "GLOBAL.REPORT_USAGE": "Please report the successful usage to help us track usages and being able to continue improving this tool.", "GLOBAL.BUTTON_REPORT_USAGE": "Report Usage Via E-mail", + "IMPORT_ACCOUNTS_COMPONENT_TEXT": "Import accounts and generate csv with schema and legal fields.", + "IMPORT_ACCOUNTS_DROPDOWN_ARRAY": "Array", + "IMPORT_ACCOUNTS_DROPDOWN_OBJECT": "Object", + "IMPORT_ACCOUNTS_DOWNLOAD_TEMPLATE_BUTTON": "Download Template", + "IMPORT_ACCOUNTS_FORM_HEADER_TEXT": "This will export the chosen fields to a CSV file. You can then import this file to create accounts.", + "IMPORT_ACCOUNTS_SELECT_SCHEMA_FIELDS": "Download Template", + "IMPORT_ACCOUNTS_SCHEMA_CONFIGURATION": "Select Schema Configuration", + "IMPORT_ACCOUNTS_SELECT_ACCOUNT_TYPE": "Select Account Type", + "MANUAL_REMOVAL_POPUP.MANUAL_ACTION_REQUIRED": "Manual Action Required!", "PRETTIFY.SUCCESS": "Prettify Javascript has been successful.", "PRETTIFY.MULTIPLE_SCREENS": "Prettified Screen Sets:", "PRETTIFY.BUTTON_LABEL": "Prettify Javascript", @@ -89,6 +99,8 @@ "MANUAL_REMOVAL_POPUP.ERROR_MESSAGE": "The command was executed with errors, but some sites were created and could not be deleted.", "MANUAL_REMOVAL_POPUP.CHECKBOX_TEXT": "I understand that manual action is required to avoid data duplication.", "MANUAL_REMOVAL_POPUP.TOAST_TEXT": "Site list was copied to the clipboard", + "SERVER_IMPORT_COMPONENT.TEMPLATES_LITE_ACCOUNT": "Lite Account", + "SERVER_IMPORT_COMPONENT.TEMPLATES_FULL_ACCOUNT": "Full Account", "SITE_DEPLOYER_COMPONENT.ADD_OR_REMOVE_SITES": "Quickly add or remove sites, change the structure, update the domains naming, description and select data centers.", "SITE_DEPLOYER_COMPONENT.CHOOSE_DATA_CENTER": "Choose Data Centers: *", "SITE_DEPLOYER_COMPONENT.CREATE_STRUCTURE": "Create Structure", @@ -114,5 +126,36 @@ "SMS_IMPORT_POPUP.SPECIFY_FILE": "Please specify a zip file that contains the SMS templates to import:", "SMS_TEMPLATES_COMPONENT.EXPORT_ERROR_HEADER_MESSAGE": "Error - SMS templates were not exported", "SMS_TEMPLATES_COMPONENT.IMPORT_ERROR_HEADER_MESSAGE": "Error - SMS templates were not imported", - "SMS_TEMPLATES_COMPONENT.TEMPLATES_IMPORTED_SUCCESSFULLY": "All SMS templates have been imported successfully." + "SMS_TEMPLATES_COMPONENT.TEMPLATES_IMPORTED_SUCCESSFULLY": "All SMS templates have been imported successfully.", + "VERSION_CONTROL.ACTION": "Actions", + "VERSION_CONTROL.BACKUP": "Create Backup", + "VERSION_CONTROL.BACKUP.ERROR.MESSAGE": "Backup failed!", + "VERSION_CONTROL.BACKUP.INFORMATION": "Backup Information", + "VERSION_CONTROL.BACKUP.SUCCESS.MESSAGE": "Backup completed successfully!", + "VERSION_CONTROL.CANCEL": "Cancel", + "VERSION_CONTROL.CLOSE": "Close", + "VERSION_CONTROL.COMMIT_MESSAGE": "Message", + "VERSION_CONTROL.COMMIT_MESSAGE_PLACEHOLDER": "Enter your commit message here", + "VERSION_CONTROL.CONFIRM": "Confirm", + "VERSION_CONTROL.CREDENTIALS": "Repository Configurations", + "VERSION_CONTROL.CREDENTIALS_DESCRIPTION": "Please fill in the information below to access your repository.", + "VERSION_CONTROL.DATE": "Date", + "VERSION_CONTROL.DOCUMENTATION_LINK": "(Read more)", + "VERSION_CONTROL.DESCRIPTION.TEXT": "Manage and track changes to configurations, ensuring version history and easy rollbacks.", + "VERSION_CONTROL.GIT_TOKEN": "Token", + "VERSION_CONTROL.GIT_TOKEN_MESSAGE": "Please insert the access Token.", + "VERSION_CONTROL.ID": "Commit Id", + "VERSION_CONTROL.INSERT_CONFIGURATIONS": "Please insert the correct configurations.", + "VERSION_CONTROL.NO_COMMITS": "There are no changes since your last backup.", + "VERSION_CONTROL.OWNER": "Username", + "VERSION_CONTROL.OWNER_MESSAGE": "Please insert the Username.", + "VERSION_CONTROL.REPOSITORY": "Repository", + "VERSION_CONTROL.REPOSITORY_MESSAGE": "Please insert the Repository.", + "VERSION_CONTROL.RESTORE": "Revert", + "VERSION_CONTROL.REVERT.ERROR.MESSAGE": "Restore failed!", + "VERSION_CONTROL.REVERT.SUCCESS.MESSAGE": "Restore completed successfully!", + "VERSION_CONTROL.SUCCESS_MESSAGE": "Backup created successfully!", + "VERSION_CONTROL.TITLE": "Version Control", + "VERSION_CONTROL.UPLOAD_MESSAGE": "The following configurations were modified and will be uploaded:", + "VERSION_CONTROL.VERSION_LIST": "Version List" } diff --git a/src/redux/copyConfigurationExtended/utils.js b/src/redux/copyConfigurationExtended/utils.js index 4496b4de..7b15feff 100644 --- a/src/redux/copyConfigurationExtended/utils.js +++ b/src/redux/copyConfigurationExtended/utils.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - import crypto from 'crypto-js' import i18n from '../../i18n' import { getApiKey } from '../utils' diff --git a/src/redux/encryptionUtils.js b/src/redux/encryptionUtils.js new file mode 100644 index 00000000..c6935e65 --- /dev/null +++ b/src/redux/encryptionUtils.js @@ -0,0 +1,30 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import crypto from 'crypto-js' + +export const encryptData = (dataToEncrypt, key) => { + try { + const encryptedJsonString = crypto.AES.encrypt(JSON.stringify(dataToEncrypt), key).toString() + return encryptedJsonString + } catch (error) { + console.error('Error encrypting data:', error) + return undefined + } +} + +export const decryptData = (encryptedData, key) => { + try { + const decryptedJsonString = crypto.AES.decrypt(encryptedData, key).toString(crypto.enc.Utf8) + if (!decryptedJsonString) { + console.warn('Decrypted string is empty') + return undefined + } + return JSON.parse(decryptedJsonString) + } catch (error) { + console.error('Error decrypting data:', error) + return undefined + } +} diff --git a/src/redux/importAccounts/dataTest.js b/src/redux/importAccounts/dataTest.js new file mode 100644 index 00000000..a76cd16e --- /dev/null +++ b/src/redux/importAccounts/dataTest.js @@ -0,0 +1,107 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +export const mockConfigurationTree = [ + { + id: 'data.loyalty', + name: 'loyalty', + value: false, + branches: [ + { id: 'data.loyalty.rewardPoints', name: 'rewardPoints', value: false, branches: [], switchId: 'object' }, + { + id: 'data.loyalty.rewardRedemption', + name: 'rewardRedemption', + value: false, + branches: [ + { id: 'data.loyalty.rewardRedemption.redemptionDate', name: 'redemptionDate', value: false, branches: [], switchId: 'object' }, + { id: 'data.loyalty.rewardRedemption.redemptionPoint', name: 'redemptionPoint', value: false, branches: [], switchId: 'object' }, + ], + switchId: 'object', + }, + { id: 'data.loyalty.loyaltyStatus', name: 'loyaltyStatus', value: false, branches: [], switchId: 'object' }, + { id: 'data.loyalty.rewardAmount', name: 'rewardAmount', value: false, branches: [], switchId: 'object' }, + ], + switchId: 'object', + }, + { + id: 'subscriptions.newsletter.commercial', + name: 'newsletter.commercial', + value: true, + branches: [ + { id: 'subscriptions.newsletter.commercial.isSubscribed', name: 'isSubscribed', value: true, branches: [], mandatory: false }, + { id: 'subscriptions.newsletter.commercial.tags', name: 'tags', value: true, branches: [] }, + { id: 'subscriptions.newsletter.commercial.lastUpdatedSubscriptionState', name: 'lastUpdatedSubscriptionState', value: true, branches: [] }, + { + id: 'subscriptions.newsletter.commercial.doubleOptIn', + name: 'doubleOptIn', + value: true, + branches: [{ id: 'subscriptions.newsletter.commercial.doubleOptIn.isExternallyVerified', name: 'isExternallyVerified', value: true, branches: [] }], + }, + ], + switchId: 'object', + }, +] + +export const initialState = { + configurations: [], + currentSiteApiKey: '', + currentSiteInformation: {}, + errors: [], + isLoading: false, + parentNode: [], + selectedConfiguration: [], + showSuccessMessage: false, +} + +export const initialStateWithConfigurations = { + configurations: mockConfigurationTree, + currentSiteApiKey: '', + currentSiteInformation: {}, + errors: [], + isLoading: false, + parentNode: [], + selectedConfiguration: [], + showSuccessMessage: false, +} + +export const mockConfigurationTreeTrue = [ + { + id: 'data.loyalty', + name: 'loyalty', + value: true, + branches: [ + { id: 'data.loyalty.rewardPoints', name: 'rewardPoints', value: true, branches: [], switchId: 'object' }, + { + id: 'data.loyalty.rewardRedemption', + name: 'rewardRedemption', + value: true, + branches: [ + { id: 'data.loyalty.rewardRedemption.redemptionDate', name: 'redemptionDate', value: true, branches: [], switchId: 'object' }, + { id: 'data.loyalty.rewardRedemption.redemptionPoint', name: 'redemptionPoint', value: true, branches: [], switchId: 'object' }, + ], + switchId: 'object', + }, + { id: 'data.loyalty.loyaltyStatus', name: 'loyaltyStatus', value: true, branches: [], switchId: 'object' }, + { id: 'data.loyalty.rewardAmount', name: 'rewardAmount', value: true, branches: [], switchId: 'object' }, + ], + switchId: 'object', + }, +] +export const dummyTargetApiKey = 'asdlkjpoiqwekjhdsfbvc' + +export const mockedErrorsResponse = [ + { + callId: '9203bf0eed4b4e31802d4aa02e1ad6a0', + errorCode: 500000, + apiVersion: 2, + statusCode: 200, + statusReason: 'OK', + time: '2023-02-08T12:03:36.046Z', + context: { + id: 'schemaId', + targetApiKey: dummyTargetApiKey, + }, + }, +] diff --git a/src/redux/importAccounts/importAccountsSlice.js b/src/redux/importAccounts/importAccountsSlice.js new file mode 100644 index 00000000..dd478735 --- /dev/null +++ b/src/redux/importAccounts/importAccountsSlice.js @@ -0,0 +1,146 @@ +import ImportAccounts from '../../services/importAccounts/importAccounts' +import { clearConfigurationsErrors, clearTargetSitesErrors, findConfiguration } from '../copyConfigurationExtended/utils' +import { getApiKey, getErrorAsArray } from '../utils' +import { setParentsValue, propagateConfigurationSelectBox, getAllConfiguration, clearConfigurationsState, getConfigurationPath } from './utils' +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit' +const IMPORT_ACCOUNTS_STATE_NAME = 'importAccounts' +const GET_CONFIGURATIONS_ACTION = `${IMPORT_ACCOUNTS_STATE_NAME}/getConfigurationTree` +const SET_CONFIGURATIONS_ACTION = `${IMPORT_ACCOUNTS_STATE_NAME}/setConfigurations` + +export const importAccountsSlice = createSlice({ + name: IMPORT_ACCOUNTS_STATE_NAME, + initialState: { + currentSiteApiKey: getApiKey(window.location.hash), + configurations: [], + parentNode: [], + errors: [], + isLoading: false, + showSuccessMessage: false, + currentSiteInformation: {}, + selectedConfiguration: [], + }, + reducers: { + setConfigurationStatus(state, action) { + setParentsValue(state.configurations, action.payload.checkBoxId, action.payload.value) + }, + setMandatoryField(state, action) { + const configuration = findConfiguration(state.configurations, action.payload.checkBoxId) + configuration.value = action.payload.value + configuration.mandatory = action.payload.mandatory + }, + setSugestionMandatoryField(state, action) { + const configuration = findConfiguration(state.selectedConfiguration, action.payload.checkBoxId) + if (configuration) { + configuration.value = action.payload.value + configuration.mandatory = action.payload.mandatory + } + }, + + clearErrors(state) { + state.errors = [] + state.apiCardError = undefined + clearConfigurationsErrors(state.configurations) + clearTargetSitesErrors(state.targetSites) + }, + clearConfigurations(state) { + state.configurations.forEach((configuration) => { + clearConfigurationsState(configuration, false) + }) + state.selectedConfiguration.forEach((configuration) => { + clearConfigurationsState(configuration, false) + }) + }, + setSwitchOptions(state, action) { + const configuration = findConfiguration(state.configurations, action.payload.checkBoxId) + propagateConfigurationSelectBox(configuration, action.payload) + }, + setSugestionSchema(state, action) { + setParentsValue(state.selectedConfiguration, action.payload.checkBoxId, action.payload.value) + }, + setSuggestionClickConfiguration(state, action) { + const config = getConfigurationPath(state.selectedConfiguration, action.payload.checkBoxId) + if (config) { + state.selectedConfiguration = [config] + } + }, + setSelectedConfiguration(state, action) { + const configuration = getAllConfiguration(state.configurations, action.payload) + state.selectedConfiguration = configuration + }, + }, + extraReducers: (builder) => { + builder.addCase(getConfigurationTree.pending, (state) => { + state.isLoading = true + state.errors = [] + state.configurations = [] + }) + builder.addCase(getConfigurationTree.fulfilled, (state, action) => { + state.isLoading = false + state.configurations = action.payload + }) + builder.addCase(getConfigurationTree.rejected, (state, action) => { + state.isLoading = false + state.errors = action.payload + }) + + builder.addCase(setConfigurations.pending, (state) => { + state.isLoading = true + state.errors = [] + state.showSuccessMessage = false + }) + builder.addCase(setConfigurations.fulfilled, (state, action) => { + state.isLoading = false + state.showSuccessMessage = true + }) + builder.addCase(setConfigurations.rejected, (state, action) => { + state.isLoading = false + state.showSuccessMessage = false + state.errors = action.payload + }) + }, +}) + +export const getConfigurationTree = createAsyncThunk(GET_CONFIGURATIONS_ACTION, async (selectedValue, { getState, rejectWithValue }) => { + const state = getState() + const credentials = { userKey: state.credentials.credentials.userKey, secret: state.credentials.credentials.secretKey, gigyaConsole: state.credentials.credentials.gigyaConsole } + const currentSiteApiKey = state.copyConfigurationExtended.currentSiteApiKey + const currentDataCenter = state.copyConfigurationExtended.currentSiteInformation.dataCenter + try { + if (currentDataCenter) { + return await new ImportAccounts(credentials, currentSiteApiKey, currentDataCenter).importAccountToConfigTree(selectedValue) + } + } catch (error) { + return rejectWithValue(getErrorAsArray(error)) + } +}) + +export const setConfigurations = createAsyncThunk(SET_CONFIGURATIONS_ACTION, async (accountOption, { getState, rejectWithValue }) => { + const state = getState() + const credentials = { userKey: state.credentials.credentials.userKey, secret: state.credentials.credentials.secretKey, gigyaConsole: state.credentials.credentials.gigyaConsole } + const currentSiteApiKey = state.copyConfigurationExtended.currentSiteApiKey + const currentDataCenter = state.copyConfigurationExtended.currentSiteInformation.dataCenter + + try { + return await new ImportAccounts(credentials, currentSiteApiKey, currentDataCenter).exportDataToCsv(state.importAccounts.configurations, accountOption) + } catch (error) { + return rejectWithValue(getErrorAsArray(error)) + } +}) +export const { + setSelectedConfiguration, + setSuggestionClickConfiguration, + setConfigurationStatus, + setMandatoryField, + setSugestionMandatoryField, + clearErrors, + setSugestionSchema, + setSwitchOptions, + clearConfigurations, +} = importAccountsSlice.actions + +export const selectConfigurations = (state) => state.importAccounts.configurations +export const selectIsLoading = (state) => state.importAccounts.isLoading +export const selectSugestionConfigurations = (state) => state.importAccounts.selectedConfiguration +export const selectParentNode = (state) => state.importAccounts.parentNode + +export default importAccountsSlice.reducer diff --git a/src/redux/importAccounts/importAccountsSlice.test.js b/src/redux/importAccounts/importAccountsSlice.test.js new file mode 100644 index 00000000..e186f24e --- /dev/null +++ b/src/redux/importAccounts/importAccountsSlice.test.js @@ -0,0 +1,49 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +/** + * @jest-environment jsdom + */ +import { initialState, initialStateWithConfigurations } from './dataTest' +import importAccountsReducer, { clearConfigurations, setConfigurationStatus, setMandatoryField, setSwitchOptions } from './importAccountsSlice' +import { propagateConfigurationState } from './utils' + +describe('importAccountsSlice test suite', () => { + test('should return initial state', () => { + expect(importAccountsReducer(undefined, { type: undefined })).toEqual(initialState) + }) + test('should set a configuration status to true', () => { + expect(initialStateWithConfigurations.configurations[0].value).toBe(false) + expect(initialStateWithConfigurations.configurations[0].branches[0].value).toBe(false) + const newState = importAccountsReducer(initialStateWithConfigurations, setConfigurationStatus({ checkBoxId: 'data.loyalty.rewardPoints', value: true })) + expect(newState.configurations[0].value).toBe(true) + expect(newState.configurations[0].branches[0].value).toBe(true) + }) + test('should set a mandatory field to true', () => { + expect(initialStateWithConfigurations.configurations[1].branches[0].mandatory).toBe(false) + const newState = importAccountsReducer( + initialStateWithConfigurations, + setMandatoryField({ checkBoxId: 'subscriptions.newsletter.commercial.isSubscribed', value: true, mandatory: true }), + ) + expect(newState.configurations[1].branches[0].mandatory).toBe(true) + }) + test('should change all values from true to false', () => { + const configurationTree = initialStateWithConfigurations.configurations[0] + expect(initialStateWithConfigurations.configurations[0].value).toBe(false) + expect(initialStateWithConfigurations.configurations[0].branches[0].value).toBe(false) + const newConfigurationTree = propagateConfigurationState([configurationTree], true) + expect(newConfigurationTree.value).toBe(true) + const newState = importAccountsReducer(initialStateWithConfigurations, clearConfigurations()) + expect(newState.configurations[0].value).toBe(false) + expect(newState.configurations[0].branches[0].value).toBe(false) + }) + test('should propagate the property type to children', () => { + expect(initialStateWithConfigurations.configurations[0].switchId).toBe('object') + expect(initialStateWithConfigurations.configurations[0].branches[0].switchId).toBe('object') + const newState = importAccountsReducer(initialStateWithConfigurations, setSwitchOptions({ checkBoxId: 'data.loyalty', operation: 'array' })) + expect(newState.configurations[0].switchId).toBe('array') + expect(newState.configurations[0].branches[0].switchId).toBe('array') + }) +}) diff --git a/src/redux/importAccounts/utils.js b/src/redux/importAccounts/utils.js new file mode 100644 index 00000000..321856c0 --- /dev/null +++ b/src/redux/importAccounts/utils.js @@ -0,0 +1,152 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +const mandatoryFields = ['isSubscribed', 'isConsentGranted', 'status'] +const emailFieldId = 'email' +const uidFieldId = 'uid' +export const propagateConfigurationState = (configuration, value) => { + configuration.value = value + if (configuration.branches) { + configuration.branches.forEach((branch) => { + if (isMandatoryFields(branch.id)) { + branch.value = value + branch.mandatory = value + } + branch.value = value + propagateConfigurationState(branch, value) + }) + } + return configuration +} + +export const clearConfigurationsState = (configuration, value) => { + if (configuration.id === emailFieldId || configuration.id === uidFieldId) { + return // Skip configurations with id 'email' or 'uid' + } + configuration.value = value + + if (configuration.branches) { + configuration.branches.forEach((branch) => { + if (branch.branches.length === 0) { + branch.mandatory = false + } + branch.value = value + clearConfigurationsState(branch, value) + }) + } +} + +export const getAllConfiguration = (configurations, ids) => { + const result = [] + + ids.forEach((id) => { + const path = id.split('.') + let currentLevel = configurations + let parentConfig = null + + path.forEach((part, index) => { + const configId = path.slice(0, index + 1).join('.') + const config = currentLevel.find((branch) => branch.id === configId || branch.id.endsWith(`.${part}`) || branch.id === part) + if (config) { + if (!parentConfig) { + parentConfig = findOrCreateConfig(result, config) + } else { + parentConfig = findOrCreateConfig(parentConfig.branches, config) + } + currentLevel = config.branches + } + }) + + if (parentConfig && parentConfig.branches.length === 0) { + parentConfig.branches = currentLevel + } + }) + + ids.forEach((id) => { + if (result.length === 0 || !result.some((config) => config.id === id)) { + const config = configurations.find((branch) => branch.id === id || branch.id.endsWith(`.${id}`) || branch.id === id) + if (config) { + result.push(config) + } + } + }) + + return result +} + +const findOrCreateConfig = (configs, config) => { + let existingConfig = configs.find((c) => c.id === config.id) + if (!existingConfig) { + existingConfig = { ...config, branches: [] } + configs.push(existingConfig) + } + return existingConfig +} + +const traverseWholeTree = (branches, childId, setParent) => { + for (let branch of branches) { + if (branch.id === childId) { + propagateConfigurationState(branch, setParent) + return setParent + } + if (traverseWholeTree(branch.branches, childId, setParent)) { + branch.value = setParent + return setParent + } + } + return false +} + +export const setParentsValue = (structure, childId, value) => { + function checkAndSetParents(branches) { + for (let branch of branches) { + if (branch.branches && branch.branches.length > 0) { + checkAndSetParents(branch.branches) + branch.value = branch.branches.some((child) => child.value) + } + } + } + + traverseWholeTree(structure, childId, value) + checkAndSetParents(structure) + return structure +} + +export const getConfigurationPath = (configurations, targetId) => { + const path = targetId.split('.') + + const findPath = (nodes, path) => { + if (path.length === 0) return null + + const [currentId, ...restPath] = path + const node = nodes.find((node) => node.id === currentId || node.id.endsWith(`.${currentId}`)) + + if (!node) return null + + if (restPath.length === 0) return node + + const childPath = findPath(node.branches, restPath) + if (!childPath) return null + + return { + ...node, + branches: [childPath], + } + } + + return findPath(configurations, path) +} + +export const propagateConfigurationSelectBox = (configuration, payload) => { + configuration.switchId = payload.operation + for (let branch of configuration.branches) { + if (branch.branches.length === 0) { + branch.switchId = payload.operation + } + } +} + +export const isMandatoryFields = (branchId) => { + return mandatoryFields.some((keyword) => branchId.includes(keyword)) +} diff --git a/src/redux/importAccounts/utils.test.js b/src/redux/importAccounts/utils.test.js new file mode 100644 index 00000000..f3ebcd69 --- /dev/null +++ b/src/redux/importAccounts/utils.test.js @@ -0,0 +1,36 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +/** + * @jest-environment jsdom + */ + +import { mockConfigurationTree, mockConfigurationTreeTrue } from './dataTest' +import { getParent, propagateConfigurationState } from './utils' + +describe('importAccountsSlice utils test suite', () => { + test('should propagate configuration state to first level configurations', () => { + const configuration = mockConfigurationTree[0] + expect(configuration.value).toEqual(false) + expect(configuration.branches[0].value).toEqual(false) + expect(configuration.branches[1].value).toEqual(false) + propagateConfigurationState(configuration, true) + expect(configuration.value).toEqual(true) + expect(configuration.branches[0].value).toEqual(true) + expect(configuration.branches[1].value).toEqual(true) + }) + test('should propagate configuration state to second level configurations', () => { + const configuration = mockConfigurationTreeTrue[0] + expect(configuration.branches[1].branches[0].value).toEqual(true) + expect(configuration.branches[1].value).toEqual(true) + expect(configuration.branches[1].branches[0].value).toEqual(true) + expect(configuration.branches[1].branches[1].value).toEqual(true) + propagateConfigurationState(configuration, false) + expect(configuration.branches[1].branches[0].value).toEqual(false) + expect(configuration.branches[1].value).toEqual(false) + expect(configuration.branches[1].branches[0].value).toEqual(false) + expect(configuration.branches[1].branches[1].value).toEqual(false) + }) +}) diff --git a/src/redux/store.js b/src/redux/store.js index b476256c..c62384f5 100644 --- a/src/redux/store.js +++ b/src/redux/store.js @@ -4,7 +4,6 @@ */ import { configureStore } from '@reduxjs/toolkit' - import sitesReducer from './sites/siteSlice' import dataCentersReducer from './dataCenters/dataCentersSlice' import siteStructuresReducer from './siteStructures/siteStructuresSlice' @@ -14,6 +13,8 @@ import credentialsReducer from './credentials/credentialsSlice' import copyConfigurationExtendedReducer from './copyConfigurationExtended/copyConfigurationExtendedSlice' import siteDeployerCopyConfigurationReducer from './siteDeployerCopyConfiguration/siteDeployerCopyConfigurationSlice' import targetSitesTooltipIconReducer from './targetSitesTooltipIcon/targetSitesTooltipIconSlice' +import importAccountsSliceReducer from './importAccounts/importAccountsSlice' +import versionControlReducer from './versionControl/versionControlSlice' export default configureStore({ reducer: { @@ -26,6 +27,8 @@ export default configureStore({ copyConfigurationExtended: copyConfigurationExtendedReducer, siteDeployerCopyConfiguration: siteDeployerCopyConfigurationReducer, targetSitesTooltipIcon: targetSitesTooltipIconReducer, + importAccounts: importAccountsSliceReducer, + versionControl: versionControlReducer, }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ diff --git a/src/redux/versionControl/versionControlSlice.js b/src/redux/versionControl/versionControlSlice.js new file mode 100644 index 00000000..538bfdce --- /dev/null +++ b/src/redux/versionControl/versionControlSlice.js @@ -0,0 +1,198 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import { createSlice, createAsyncThunk } from '@reduxjs/toolkit' +import VersionControlService from '../../services/versionControl/versionControlService' +import { getErrorAsArray } from '../utils' +import Cookies from 'js-cookie' +import { encryptData, decryptData } from '../encryptionUtils' +import VersionControlFactory from '../../services/versionControl/versionControlManager/versionControlFactory' +import VersionControlProviderFactory from '../../services/versionControl/versionControlManager/versionControlProviderFactory' + +const VERSION_CONTROL_STATE_NAME = 'versionControl' +const FETCH_COMMITS_ACTION = `${VERSION_CONTROL_STATE_NAME}/fetchCommits` +const GET_SERVICES_ACTION = `${VERSION_CONTROL_STATE_NAME}/getServices` +const PREPARE_FILES_FOR_UPDATE_ACTION = `${VERSION_CONTROL_STATE_NAME}/prepareFilesForUpdate` +const GET_REVERT_CHANGES = `${VERSION_CONTROL_STATE_NAME}/revertChanges` +const versionControlSlice = createSlice({ + name: 'versionControl', + initialState: { + commits: [], + gitToken: '', + owner: '', + repo: '', + isFetching: false, + error: null, + revert: false, + filesToUpdate: [], + }, + reducers: { + setGitToken(state, action) { + state.gitToken = action.payload + setCookies(state) + }, + setOwner(state, action) { + state.owner = action.payload + setCookies(state) + }, + setRepo(state, action) { + state.repo = action.payload + setCookies(state) + }, + setCredentials(state, action) { + state.credentials = action.payload + }, + clearCommits(state) { + state.commits = [] + }, + }, + extraReducers: (builder) => { + builder.addCase(fetchCommits.pending, (state) => { + state.isFetching = true + state.error = null + }) + builder.addCase(fetchCommits.fulfilled, (state, action) => { + state.isFetching = false + state.commits = action.payload + }) + builder.addCase(fetchCommits.rejected, (state, action) => { + state.isFetching = false + state.error = action.payload + }) + builder.addCase(getRevertChanges.pending, (state) => { + state.isFetching = true + state.error = null + }) + builder.addCase(getRevertChanges.fulfilled, (state, action) => { + state.isFetching = false + state.revert = action.payload + }) + builder.addCase(getRevertChanges.rejected, (state, action) => { + state.isFetching = false + state.error = action.payload + }) + builder.addCase(getServices.pending, (state) => { + state.isFetching = true + state.error = null + }) + builder.addCase(getServices.fulfilled, (state, action) => { + state.isFetching = false + state.revert = action.payload + }) + builder.addCase(getServices.rejected, (state, action) => { + state.isFetching = false + state.error = action.payload + }) + builder.addCase(prepareFilesForUpdate.pending, (state) => { + state.isFetching = true + state.error = null + }) + builder.addCase(prepareFilesForUpdate.fulfilled, (state, action) => { + state.isFetching = false + state.revert = action.payload + state.filesToUpdate = action.payload + }) + builder.addCase(prepareFilesForUpdate.rejected, (state, action) => { + state.isFetching = false + state.error = action.payload + }) + }, +}) + +export const getRevertChanges = createAsyncThunk(GET_REVERT_CHANGES, async (sha, { getState, rejectWithValue }) => { + const state = getState() + const { credentials, apiKey, currentSiteInfo, currentDataCenter, versionControl } = getCommonData(state) + try { + return await new VersionControlService(credentials, apiKey, versionControl, currentDataCenter, currentSiteInfo).handleCommitRevertServices(sha) + } catch (error) { + return rejectWithValue(getErrorAsArray(error)) + } +}) +export const getServices = createAsyncThunk(GET_SERVICES_ACTION, async (commitMessage, { getState, rejectWithValue }) => { + const state = getState() + const { credentials, apiKey, currentSiteInfo, currentDataCenter, versionControl } = getCommonData(state) + try { + return await new VersionControlService(credentials, apiKey, versionControl, currentDataCenter, currentSiteInfo).handleGetServices(commitMessage) + } catch (error) { + return rejectWithValue(getErrorAsArray(error)) + } +}) + +export const getEncryptedCookie = (name, secretKey) => { + const encryptedValue = Cookies.get(name) + if (!encryptedValue) { + console.error(`No ${name} found in cookies`) + return undefined + } + const decryptedValue = decryptData(encryptedValue, secretKey) + return decryptedValue +} +const getCommonData = (state) => { + const credentials = { + userKey: state.credentials.credentials.userKey, + secret: state.credentials.credentials.secretKey, + gigyaConsole: state.credentials.credentials.gigyaConsole, + } + const apiKey = state.copyConfigurationExtended.currentSiteApiKey + const currentSiteInfo = state.copyConfigurationExtended.currentSiteInformation + const currentDataCenter = currentSiteInfo.dataCenter + const gitToken = getEncryptedCookie('gitToken', credentials.secret) // Retrieve the encrypted token + const owner = getEncryptedCookie('owner', credentials.secret) // Retrieve the encrypted owner + const repo = Cookies.get('repo') + const versionControlProviderFactory = VersionControlProviderFactory.getVersionControlProviderFactory('github', gitToken) + const versionControl = VersionControlFactory.getVersionControlFactory('github', versionControlProviderFactory, owner, repo) + if (!gitToken || !owner) { + throw new Error('Git token or owner is missing') + } + + return { credentials, apiKey, currentSiteInfo, currentDataCenter, versionControl } +} + +export const fetchCommits = createAsyncThunk(FETCH_COMMITS_ACTION, async (_, { getState, rejectWithValue }) => { + const state = getState() + try { + const { credentials, apiKey, currentSiteInfo, currentDataCenter, versionControl } = getCommonData(state) + const { commitList } = await new VersionControlService(credentials, apiKey, versionControl, currentDataCenter, currentSiteInfo).handleCommitListRequestServices() + return commitList.filter((commit) => commit.parents.length > 0) + } catch (error) { + return rejectWithValue(error.message) + } +}) + +export const prepareFilesForUpdate = createAsyncThunk(PREPARE_FILES_FOR_UPDATE_ACTION, async (_, { getState, rejectWithValue }) => { + const state = getState() + try { + const { credentials, apiKey, currentSiteInfo, currentDataCenter, versionControl } = getCommonData(state) + const files = await new VersionControlService(credentials, apiKey, versionControl, currentDataCenter, currentSiteInfo).prepareFilesForUpdate() + return files + } catch (error) { + return rejectWithValue(error.message) + } +}) + +const setCookies = (state) => { + const credentials = state.credentials + if (state.gitToken && state.owner && state.repo && credentials?.secretKey) { + const encryptedToken = encryptData(state.gitToken, credentials.secretKey) + const encryptedOwner = encryptData(state.owner, credentials.secretKey) + if (encryptedToken && encryptedOwner) { + Cookies.set('gitToken', encryptedToken, { secure: true, sameSite: 'strict' }) + Cookies.set('owner', encryptedOwner, { secure: true, sameSite: 'strict' }) + } + } + Cookies.set('repo', state.repo, { secure: true, sameSite: 'strict' }) +} + +export const { setGitToken, setOwner, setRepo, setCredentials, clearCommits } = versionControlSlice.actions + +export const selectCommits = (state) => state.versionControl.commits +export const selectIsFetching = (state) => state.versionControl.isFetching +export const selectGitToken = (state) => state.versionControl.gitToken +export const selectOwner = (state) => state.versionControl.owner +export const selectRepo = (state) => state.versionControl.repo +export const selectError = (state) => state.versionControl.error +export const selectFilesToUpdate = (state) => state.versionControl.filesToUpdate + +export default versionControlSlice.reducer diff --git a/src/redux/versionControl/versionControlSlice.test.js b/src/redux/versionControl/versionControlSlice.test.js new file mode 100644 index 00000000..5eaa292c --- /dev/null +++ b/src/redux/versionControl/versionControlSlice.test.js @@ -0,0 +1,289 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ + +import configureMockStore from 'redux-mock-store' +import thunk from 'redux-thunk' +import Cookies from 'js-cookie' +import reducer, { + setGitToken, + setOwner, + fetchCommits, + selectCommits, + selectIsFetching, + selectGitToken, + selectOwner, + selectError, + getEncryptedCookie, + getRevertChanges, + getServices, + prepareFilesForUpdate, +} from './versionControlSlice' + +jest.mock('js-cookie', () => ({ + set: jest.fn(), + get: jest.fn(), +})) + +jest.mock('../../services/versionControl/versionControlService') + +const middlewares = [thunk] +const mockStore = configureMockStore(middlewares) + +describe('versionControlSlice', () => { + const originalWindow = { ...global.window } + const credentials = { secretKey: 'testSecretKey' } + const initialState = { + credentials: { credentials }, + copyConfigurationExtended: { currentSiteInformation: { dataCenter: 'testDataCenter' } }, + versionControl: { + commits: [], + gitToken: '', + owner: '', + isFetching: false, + error: null, + repo: '', + revert: false, + filesToUpdate: [], + }, + } + + beforeAll(() => { + if (typeof global.window === 'undefined') { + global.window = {} + } + global.window.location = { + hash: '', + } + }) + + afterAll(() => { + global.window = originalWindow + }) + + describe('reducers', () => { + it('should handle initial state', () => { + const state = reducer(undefined, {}) + expect(state).toEqual({ + commits: [], + gitToken: '', + owner: '', + isFetching: false, + error: null, + repo: '', + revert: false, + filesToUpdate: [], + }) + }) + + it('should handle setGitToken', () => { + const token = 'testToken' + const state = reducer(initialState.versionControl, setGitToken(token)) + expect(state.gitToken).toEqual(token) + }) + + it('should handle setOwner', () => { + const owner = 'testOwner' + const state = reducer(initialState.versionControl, setOwner(owner)) + expect(state.owner).toEqual(owner) + }) + + it('should update state to fetching when fetching commits', async () => { + const store = mockStore({ ...initialState, versionControl: { ...initialState.versionControl } }) + await store.dispatch(fetchCommits()) + + const actions = store.getActions() + expect(actions[0].type).toBe(fetchCommits.pending.type) + + const expectedState = { ...initialState.versionControl, isFetching: true, error: null } + const state = reducer(initialState.versionControl, actions[0]) + expect(state).toEqual(expectedState) + }) + it('should update state to revert when reverting changes', async () => { + const store = mockStore({ ...initialState, versionControl: { ...initialState.versionControl } }) + await store.dispatch(getRevertChanges('testSha')) + const actions = store.getActions() + expect(actions[0].type).toBe(getRevertChanges.pending.type) + + const expectedState = { ...initialState.versionControl, isFetching: true, error: null } + const state = reducer(initialState.versionControl, actions[0]) + expect(state).toEqual(expectedState) + }) + it('should update state when getting services', async () => { + const store = mockStore({ ...initialState, versionControl: { ...initialState.versionControl } }) + await store.dispatch(getServices('test message')) + const actions = store.getActions() + expect(actions[0].type).toBe(getServices.pending.type) + + const expectedState = { ...initialState.versionControl, isFetching: true, error: null } + const state = reducer(initialState.versionControl, actions[0]) + expect(state).toEqual(expectedState) + }) + + it('should update state with commits on fetchCommits fulfilled', () => { + const action = { type: fetchCommits.fulfilled.type, payload: ['commit1'] } + const state = reducer({ ...initialState.versionControl, isFetching: true }, action) + expect(state).toEqual({ ...initialState.versionControl, isFetching: false, commits: action.payload }) + }) + + it('should handle error state when rejected', () => { + const action = { type: fetchCommits.rejected.type, payload: 'Some error' } + const state = reducer(initialState.versionControl, action) + expect(state).toEqual({ ...initialState.versionControl, isFetching: false, error: action.payload }) + }) + }) + + describe('selectors', () => { + const state = { + versionControl: { + commits: ['commit1', 'commit2'], + gitToken: 'testToken', + owner: 'testOwner', + isFetching: true, + error: 'testError', + }, + } + + it('should select commits', () => { + expect(selectCommits(state)).toEqual(['commit1', 'commit2']) + }) + + it('should select isFetching', () => { + expect(selectIsFetching(state)).toEqual(true) + }) + + it('should select gitToken', () => { + expect(selectGitToken(state)).toEqual('testToken') + }) + + it('should select owner', () => { + expect(selectOwner(state)).toEqual('testOwner') + }) + + it('should select error', () => { + expect(selectError(state)).toEqual('testError') + }) + }) + + describe('setCookiesForGitData', () => { + it('should set encrypted cookies for gitToken and owner', () => { + const state = { + gitToken: 'testToken', + owner: 'testOwner', + credentials: { secretKey: 'testSecretKey' }, + repo: 'testRepo', + } + reducer(state, setGitToken(state.gitToken)) + reducer(state, setOwner(state.owner)) + expect(Cookies.set).toHaveBeenCalledWith('gitToken', expect.any(String), { secure: true, sameSite: 'strict' }) + expect(Cookies.set).toHaveBeenCalledWith('owner', expect.any(String), { secure: true, sameSite: 'strict' }) + }) + }) + + describe('errorHandlingForCookies', () => { + it('should log an error and return undefined for missing cookies', () => { + console.error = jest.fn() + + const name = 'missingCookie' + const encryptedValue = undefined // Simulate missing cookie + + // Add this mock before invoking the function + Cookies.get.mockReturnValueOnce(encryptedValue) + + const result = getEncryptedCookie(name, 'testSecretKey') + expect(console.error).toHaveBeenCalledWith(`No ${name} found in cookies`) + expect(result).toBeUndefined() + }) + }) + describe('Async thunk', () => { + it('should update state when getRevertChanges is fulfilled', async () => { + const action = getRevertChanges.fulfilled(true) + const newState = reducer(initialState, action) + expect(newState.revert).toEqual(true) + expect(newState.isFetching).toEqual(false) + }) + it('should update state when getRevertChanges is pending', async () => { + const action = getRevertChanges.pending + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(true) + expect(newState.error).toEqual(null) + expect(newState.versionControl.commits.length).toEqual(0) + }) + it('should update state when getRevertChanges is rejected', async () => { + const action = getRevertChanges.rejected('', '', '', 'Failed to revert configurations') + const newState = reducer(initialState, action) + expect(newState.error).toEqual('Failed to revert configurations') + expect(newState.isFetching).toEqual(false) + }) + it('should update state when fetchCommits is fulfilled', async () => { + const commits = [ + { + login: 'testOwner', + id: 48961605, + + site_admin: false, + }, + ] + const action = fetchCommits.fulfilled(commits) + const newState = reducer(initialState, action) + expect(newState.commits[0].login).toEqual('testOwner') + expect(newState.isFetching).toEqual(false) + }) + it('should update state when fetchCommits is pending', async () => { + const action = fetchCommits.pending + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(true) + expect(newState.error).toEqual(null) + expect(newState.versionControl.commits.length).toEqual(0) + }) + + it('should update state when fetchCommits is rejected', async () => { + const action = fetchCommits.rejected('', '', '', 'Failed to fetch commits for branch: testApiKey') + const newState = reducer(initialState, action) + expect(newState.error).toEqual(`Failed to fetch commits for branch: testApiKey`) + expect(newState.isFetching).toEqual(false) + }) + it('should update state when getServices is fulfilled', async () => { + const action = getServices.fulfilled(true) + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(false) + expect(newState.revert).toEqual(true) + }) + it('should update state when getServices is pending', async () => { + const action = getServices.pending + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(true) + expect(newState.error).toEqual(null) + expect(newState.versionControl.commits.length).toEqual(0) + }) + it('should update state when getServices is rejected', async () => { + const action = getServices.rejected('', '', '', 'Failed to get services') + const newState = reducer(initialState, action) + expect(newState.error).toEqual('Failed to get services') + expect(newState.isFetching).toEqual(false) + }) + it('should update state when prepareFilesForUpdate is fulfilled', async () => { + const formattedFiles = ['Dataflow', 'WebSdk'] + const action = prepareFilesForUpdate.fulfilled(formattedFiles) + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(false) + expect(newState.revert).toEqual(['Dataflow', 'WebSdk']) + }) + + it('should update state when prepareFilesForUpdate is pending', async () => { + const action = prepareFilesForUpdate.pending + const newState = reducer(initialState, action) + expect(newState.isFetching).toEqual(true) + expect(newState.error).toEqual(null) + expect(newState.versionControl.commits.length).toEqual(0) + }) + + it('should update state when prepareFilesForUpdate is rejected', async () => { + const action = prepareFilesForUpdate.rejected('', '', '', 'Failed to prepare files') + const newState = reducer(initialState, action) + expect(newState.error).toEqual('Failed to prepare files') + expect(newState.isFetching).toEqual(false) + }) + }) +}) diff --git a/src/routes/copy-configuration-extended/copy-configuration-extended.component.jsx b/src/routes/copy-configuration-extended/copy-configuration-extended.component.jsx index 5a2c5f49..2fae4b94 100644 --- a/src/routes/copy-configuration-extended/copy-configuration-extended.component.jsx +++ b/src/routes/copy-configuration-extended/copy-configuration-extended.component.jsx @@ -260,7 +260,6 @@ const CopyConfigurationExtended = ({ t }) => { {t('COPY_CONFIGURATION_EXTENDED.HEADER_TEXT')} - }> <> diff --git a/src/routes/copy-configuration-extended/copy-configuration-extended.styles.js b/src/routes/copy-configuration-extended/copy-configuration-extended.styles.js index 2d0d2652..a347ff82 100644 --- a/src/routes/copy-configuration-extended/copy-configuration-extended.styles.js +++ b/src/routes/copy-configuration-extended/copy-configuration-extended.styles.js @@ -3,7 +3,6 @@ * License: Apache-2.0 */ - import { spacing } from '@ui5/webcomponents-react-base' const styles = { diff --git a/src/routes/import-accounts/import-accounts.component.jsx b/src/routes/import-accounts/import-accounts.component.jsx new file mode 100644 index 00000000..e1fa0c21 --- /dev/null +++ b/src/routes/import-accounts/import-accounts.component.jsx @@ -0,0 +1,203 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +import { withTranslation } from 'react-i18next' +import React, { useEffect, useState } from 'react' +import { useDispatch, useSelector } from 'react-redux' +import { createUseStyles } from 'react-jss' +import { Card, Bar, Title, Text, TitleLevel, FlexBox, Grid, Button, Select, Option, CardHeader } from '@ui5/webcomponents-react' +import styles from './import-accounts.styles.js' +import { selectCurrentSiteInformation, getCurrentSiteInformation } from '../../redux/copyConfigurationExtended/copyConfigurationExtendedSlice.js' +import { selectCredentials } from '../../redux/credentials/credentialsSlice.js' +import { + getConfigurationTree, + selectConfigurations, + selectSugestionConfigurations, + setConfigurationStatus, + setConfigurations, + setSelectedConfiguration, + setSwitchOptions, + selectIsLoading, + clearConfigurations, + setSuggestionClickConfiguration, +} from '../../redux/importAccounts/importAccountsSlice.js' +import ImportAccountsConfigurations from '../../components/import-accounts-configurations/import-accounts-configurations.component.jsx' +import SearchBar from '../../components/search-schema-input/search-schemas-input.component.jsx' +import { getApiKey } from '../../redux/utils.js' +import { areConfigurationsFilled } from '../copy-configuration-extended/utils.js' +import { trackUsage } from '../../lib/tracker.js' + +const useStyles = createUseStyles(styles, { name: 'ImportAccounts' }) +const PAGE_TITLE = 'Import Data' + +const ImportAccountsComponent = ({ t }) => { + const classes = useStyles() + const dispatch = useDispatch() + const credentials = useSelector(selectCredentials) + const apikey = getApiKey(window.location.hash) + const isLoading = useSelector(selectIsLoading) + const [schemaInputValue, setSchemaInputValue] = useState('') + const [treeNodeInputValue, setTreeNodeInputValue] = useState('') + const [expandableNode, setExpandableNode] = useState(false) + const [accountOption, setAccountOption] = useState('Full') + const currentSiteInfo = useSelector(selectCurrentSiteInformation) + const configurations = useSelector(selectConfigurations) + const selectedConfigurations = useSelector(selectSugestionConfigurations) + useEffect(() => { + dispatch(getCurrentSiteInformation()) + dispatch(getConfigurationTree('Full')) + }, [dispatch, apikey, credentials, currentSiteInfo.dataCenter]) + + const onSaveHandler = async () => { + dispatch(setConfigurations(accountOption)) + await trackUsage({ featureName: PAGE_TITLE }) + } + const handleSelectChange = (event) => { + const selectedValue = event.target.value + dispatch(getCurrentSiteInformation()) + dispatch(getConfigurationTree(selectedValue)) + setAccountOption(selectedValue) + } + + const handleTreeNodeClick = (treeNodeId) => { + if (treeNodeId) { + dispatch(setSelectedConfiguration(treeNodeId)) + + setTreeNodeInputValue(treeNodeId) + setExpandableNode(true) + } else { + setTreeNodeInputValue() + setExpandableNode(false) + } + } + const handleSuggestionClick = (nodeId) => { + if (nodeId) { + dispatch(setSuggestionClickConfiguration({ checkBoxId: nodeId })) + setTreeNodeInputValue(nodeId) + setExpandableNode(true) + } else { + setTreeNodeInputValue() + setExpandableNode(false) + } + } + const disableSaveButton = () => { + return !areConfigurationsFilled(configurations) || isLoading + } + const showConfigurations = (config) => { + return ( + + ) + } + const onCancelHandler = () => { + if (!isLoading) { + dispatch(clearConfigurations()) + } + } + + return ( + <> +
+ + + <span className={classes.pageTitleSpanStyle}>{PAGE_TITLE}</span> + + + } + > +
+
+ + + {t('IMPORT_ACCOUNTS_COMPONENT_TEXT')} + + + + } + className={classes.cardContainer} + > + + <> +
+ + {t('IMPORT_ACCOUNTS_SELECT_ACCOUNT_TYPE')} + + +
+
+
+ +
+
+ +
+ {showConfigurations(treeNodeInputValue ? selectedConfigurations : configurations)} + +
+
+ + + +
+ } + > +
+
+ +
+
+ + + ) +} + +export default withTranslation()(ImportAccountsComponent) diff --git a/src/routes/import-accounts/import-accounts.styles.js b/src/routes/import-accounts/import-accounts.styles.js new file mode 100644 index 00000000..383a8165 --- /dev/null +++ b/src/routes/import-accounts/import-accounts.styles.js @@ -0,0 +1,89 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +import { spacing } from '@ui5/webcomponents-react-base' +const styles = { + errorDialogStyle: { + textAlign: 'left', + }, + titleSpanStyle: { fontSize: '24px' }, + pageTitleSpanStyle: { + ...spacing.sapUiTinyMarginBegin, + }, + titleStyle: { + ...spacing.sapUiTinyMarginBottom, + ...spacing.sapUiTinyMarginTop, + marginLeft: '10px', + }, + currentInfoContainerTitle: { + ...spacing.sapUiSmallMarginBottom, + }, + currentInfoContainer: { + marginLeft: '53px', + ...spacing.sapUiMediumMarginTop, + }, + cardHeaderStyle: { + display: 'flex', + ...spacing.sapUiTinyMarginBegin, + alignSelf: 'flex-start', + }, + + outerDivStyle: { + composes: 'cdc-tools-background', + maxHeight: '80vh', + ...spacing.sapUiSmallMargin, + }, + fullContainer: { + overflowY: 'auto', + width: '100%', + }, + headerOuterDivStyle: { + width: '100%', + }, + selectAccountDiv: { + ...spacing.sapUiSmallMarginBottom, + }, + headerTextFlexboxStyle: { + ...spacing.sapUiTinyMarginBegin, + ...spacing.sapUiTinyMarginTop, + ...spacing.sapUiSmallMarginBottom, + marginLeft: '15px', + }, + + searchBarGridItem: { + position: 'relative', + display: 'flex', + justifyContent: 'flex-end', + marginRight: '15px', + marginTop: '16px', + }, + configurationContainer: { + marginTop: '20px', + }, + searchBarContainer: { + width: '100%', + display: 'flex', + justifyContent: 'flex-end', + + ...spacing.sapUiLargeMarginTop, + ...spacing.sapUiLargeMarginEnd, + }, + componentTextStyle: { + color: 'var(--sapNeutralElementColor)', + }, + + downloadTemplateButton: { + composes: 'fd-button fd-button--compact', + marginRight: '15px !important', + boxSizing: 'border-box', + }, + + buttonContainer: { + display: 'flex', + justifyContent: 'flex-end', + margin: '10px', + }, +} + +export default styles diff --git a/src/routes/import-accounts/utils.js b/src/routes/import-accounts/utils.js new file mode 100644 index 00000000..d5291390 --- /dev/null +++ b/src/routes/import-accounts/utils.js @@ -0,0 +1,42 @@ +/* + * Copyright: Copyright 2023 SAP SE or an SAP affiliate company and cdc-tools-chrome-extension contributors + * License: Apache-2.0 + */ +export const extractIds = (data) => { + const ids = new Set() + + function traverse(node) { + if (Array.isArray(node)) { + node.forEach(traverse) + } else { + if (node.id && node.branches.length === 0) { + ids.add(node.id) + } + if (node.branches && node.branches.length > 0) { + node.branches.forEach(traverse) + } + } + } + + data.forEach((item) => { + if (item) { + traverse(item) + } + }) + return Array.from(ids) +} + +export const getAllParentNodes = (branches, targetId) => { + for (const branch of branches) { + if (branch.id === targetId) { + return [branch] + } + if (branch.branches.length > 0) { + const path = getAllParentNodes(branch.branches, targetId) + if (path.length > 0) { + return [{ ...branch, branches: path }] + } + } + } + return [] +} diff --git a/src/routes/version-control/version-control.component.jsx b/src/routes/version-control/version-control.component.jsx new file mode 100644 index 00000000..8ca7456e --- /dev/null +++ b/src/routes/version-control/version-control.component.jsx @@ -0,0 +1,469 @@ +import React, { useState, useEffect } from 'react' +import { withTranslation } from 'react-i18next' +import { + Bar, + Input, + Button, + Dialog, + TextArea, + Table, + TableGrowingMode, + TableColumn, + TableRow, + TableCell, + Title, + TitleLevel, + FlexBox, + Text, + ValueState, + Card, + Grid, + Label, +} from '@ui5/webcomponents-react' +import { createUseStyles } from 'react-jss' +import { useSelector, useDispatch } from 'react-redux' +import { + setGitToken, + setOwner, + setRepo, + setCredentials, + selectCommits, + selectIsFetching, + selectGitToken, + selectOwner, + selectRepo, + getServices, + fetchCommits, + prepareFilesForUpdate, + getRevertChanges, + clearCommits, + selectError, + selectFilesToUpdate, +} from '../../redux/versionControl/versionControlSlice' +import { selectCredentials } from '../../redux/credentials/credentialsSlice' +import Cookies from 'js-cookie' +import { decryptData } from '../../redux/encryptionUtils' +import styles from './version-control.styles' +import DialogMessageInform from '../../components/dialog-message-inform/dialog-message-inform.component' +import { getApiKey } from '../../redux/utils' +import { ROUTE_VERSION_CONTROL } from '../../inject/constants' +import { getCurrentSiteInformation, selectCurrentSiteApiKey, updateCurrentSiteApiKey } from '../../redux/copyConfigurationExtended/copyConfigurationExtendedSlice' +import { trackUsage } from '../../lib/tracker' +import { BusyIndicator } from '@ui5/webcomponents-react' + +const PAGE_TITLE = 'VersionControl' +const useStyles = createUseStyles(styles, { name: PAGE_TITLE }) + +const VersionControlComponent = ({ t }) => { + const classes = useStyles() + const dispatch = useDispatch() + const credentials = useSelector(selectCredentials) + + const commits = useSelector(selectCommits) + const isFetching = useSelector(selectIsFetching) + const gitToken = useSelector(selectGitToken) + const owner = useSelector(selectOwner) + const errors = useSelector(selectError) + const repo = useSelector(selectRepo) + const apiKey = useSelector(selectCurrentSiteApiKey) + + const filesToUpdate = useSelector(selectFilesToUpdate) + const [commitMessage, setCommitMessage] = useState('') + const [isDialogOpen, setIsDialogOpen] = useState(false) + const [showSuccessDialog, setShowSuccessDialog] = useState(false) + const [successMessage, setSuccessMessage] = useState('') + const [showErrorDialog, setShowErrorDialog] = useState(false) + const [errorMessage, setErrorMessage] = useState('') + const [isLoading, setIsLoading] = useState(false) + + window.navigation.onnavigate = (event) => { + if (event.navigationType === 'replace' && window.location.hash.includes(ROUTE_VERSION_CONTROL)) { + if (apiKey !== getApiKey(window.location.hash)) { + dispatch(updateCurrentSiteApiKey()) + } + dispatch(getCurrentSiteInformation()) + } + } + useEffect(() => { + if (credentials) { + dispatch(setCredentials(credentials)) + } + }, [dispatch, credentials]) + + useEffect(() => { + if (gitToken && owner && repo) { + dispatch(fetchCommits()) + } + }, [dispatch, gitToken, owner, repo]) + + useEffect(() => { + const secretKey = credentials?.secretKey + if (secretKey) { + const encryptedGitToken = Cookies.get('gitToken') + const encryptedOwner = Cookies.get('owner') + const repo = Cookies.get('repo') + + if (encryptedGitToken) { + const decryptedGitToken = decryptData(encryptedGitToken, secretKey) + dispatch(setGitToken(decryptedGitToken)) + } + if (encryptedOwner) { + const decryptedOwner = decryptData(encryptedOwner, secretKey) + dispatch(setOwner(decryptedOwner)) + } + if (repo) { + dispatch(setRepo(repo)) + } + } + }, [credentials, dispatch]) + + const onCreateBackupClick = async () => { + setIsLoading(true) + try { + await dispatch(prepareFilesForUpdate()) + setIsDialogOpen(true) + } catch (error) { + setErrorMessage(t('VERSION_CONTROL.BACKUP.ERROR.MESSAGE')) + setShowErrorDialog(true) + } finally { + setIsLoading(false) + } + } + + const onConfirmBackupClick = async () => { + setIsDialogOpen(false) + setIsLoading(true) + try { + await dispatch(getServices(commitMessage)) + await dispatch(fetchCommits()) + setSuccessMessage(t('VERSION_CONTROL.BACKUP.SUCCESS.MESSAGE')) + setShowSuccessDialog(true) + await trackUsage({ featureName: PAGE_TITLE }) + } catch (error) { + console.error('Error creating backup:', error) + setErrorMessage(t('VERSION_CONTROL.BACKUP.ERROR.MESSAGE')) + setShowErrorDialog(true) + } finally { + setIsLoading(false) + setIsDialogOpen(false) + } + } + + const onCancelBackupClick = () => { + setIsDialogOpen(false) + } + + const onCommitRevertClick = async (sha) => { + setIsLoading(true) + + try { + await dispatch(getRevertChanges(sha)) + await dispatch(fetchCommits()) + setSuccessMessage(t('VERSION_CONTROL.REVERT.SUCCESS.MESSAGE')) + setShowSuccessDialog(true) + await trackUsage({ featureName: PAGE_TITLE }) + } catch (error) { + console.error('Error reverting commit:', error) + setErrorMessage(t('VERSION_CONTROL.REVERT.ERROR.MESSAGE')) + setShowErrorDialog(true) + } finally { + setIsLoading(false) + } + } + + const handleGitTokenChange = (e) => { + dispatch(setGitToken(e.target.value)) + dispatch(clearCommits()) + } + + const handleOwnerChange = (e) => { + dispatch(setOwner(e.target.value)) + dispatch(clearCommits()) + } + + const handleRepoChange = (e) => { + dispatch(setRepo(e.target.value)) + dispatch(clearCommits()) + } + + const handleCommitMessageChange = (e) => { + setCommitMessage(e.target.value) + } + + const onLoadMore = () => { + if (!isFetching) { + dispatch(fetchCommits()) + } + } + + const onSuccessDialogAfterClose = () => { + setShowSuccessDialog(false) + } + + const onErrorDialogAfterClose = () => { + setShowErrorDialog(false) + } + + const renderStatusMessage = () => { + if (!gitToken || !owner || !repo || errors) { + return
+ } else if (commits.length === 0) { + return {t('VERSION_CONTROL.NO_COMMITS')}} /> + } + return null + } + + const showSuccessMessage = () => ( + + {successMessage} + + ) + + const showErrorMessage = () => ( + + {errorMessage} + + ) + + return ( + <> + +
+ + + <span className={classes.pageTitleSpanStyle}>{t('VERSION_CONTROL.TITLE')}</span> + + + } + /> +
+
+ + + {t('VERSION_CONTROL.DESCRIPTION.TEXT')} + + + + + + {t('VERSION_CONTROL.CREDENTIALS')} + + + {t('VERSION_CONTROL.CREDENTIALS_DESCRIPTION')} + + + <> +
+
+ + {t('VERSION_CONTROL.OWNER')}* + + {t('VERSION_CONTROL.OWNER_MESSAGE')}
} + required + /> +
+
+ + {t('VERSION_CONTROL.GIT_TOKEN')}* + + {t('VERSION_CONTROL.GIT_TOKEN_MESSAGE')}
} + required + /> +
+
+ + {t('VERSION_CONTROL.REPOSITORY')}* + + {t('VERSION_CONTROL.REPOSITORY_MESSAGE')}
} + required + /> +
+ {(!gitToken || !owner || errors) && ( +
+ {errors &&
{errors.toString()}
} + {t('VERSION_CONTROL.INSERT_CONFIGURATIONS')} + + {t('VERSION_CONTROL.DOCUMENTATION_LINK')} + +
+ )} +
+ +
+
+ + + <> +
+ + {t('VERSION_CONTROL.VERSION_LIST')} + + +
+ + +
+ {renderStatusMessage() ?? ( +
+ + {t('VERSION_CONTROL.DATE')} + {t('VERSION_CONTROL.ID')} + {t('VERSION_CONTROL.COMMIT_MESSAGE')} + + {t('VERSION_CONTROL.ACTION')} + + + } + > + {commits.map((commit, index) => ( + + {new Date(commit.commit.committer.date).toLocaleString()} + + + {commit.sha.substring(0, 7)} + + + {commit.commit.message} + + + + + ))} +
+
+ )} +
+
+ +
{t('VERSION_CONTROL.BACKUP.INFORMATION')}
+ + } + children={ + filesToUpdate.length > 0 ? ( +
+
+ +
+
    + {filesToUpdate.map((file, index) => ( +
  • + {file} +
  • + ))} +
+