diff --git a/.github/workflows/cd-workflow.yml b/.github/workflows/cd-workflow.yml index 81d6e656..439779bf 100644 --- a/.github/workflows/cd-workflow.yml +++ b/.github/workflows/cd-workflow.yml @@ -27,7 +27,7 @@ jobs: - name: Set-up Node uses: actions/setup-node@v1 with: - node-version: '16.13.0' + node-version: '16.19.0' - name: Install Yarn run: npm install -g yarn - name: Get yarn cache directory path diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/test-workflow.yml index 2f676c2f..809ef7a1 100644 --- a/.github/workflows/test-workflow.yml +++ b/.github/workflows/test-workflow.yml @@ -42,7 +42,7 @@ jobs: needs: build-id runs-on: ubuntu-latest container: - image: cypress/browsers:node16.13.0-chrome95-ff94 + image: cypress/browsers:node16.16.0-chrome107-ff107 options: --user 1001 strategy: fail-fast: false diff --git a/.tool-versions b/.tool-versions index ddba737d..3b2e1e77 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ # MUST match .node-version -nodejs 16.13.0 \ No newline at end of file +nodejs 16.19.0 diff --git a/README.md b/README.md index ddeecc36..b436de3e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ If you wish to maintain + deploy your own version of PagerDuty Live, we recommen #### Local Development -1. Install [NodeJS v16.13](https://nodejs.org/tr/blog/release/v16.13.0/) via [`asdf install`](https://github.com/asdf-vm/asdf) / [`nvm`](https://github.com/nvm-sh/nvm) +1. Install [NodeJS v16.19](https://nodejs.org/tr/blog/release/v16.19.0/) via [`asdf install`](https://github.com/asdf-vm/asdf) / [`nvm`](https://github.com/nvm-sh/nvm) 2. `$ git clone` repo to desired destination and `$ cd pd-live-react` into directory diff --git a/cypress/e2e/Query/query.spec.js b/cypress/e2e/Query/query.spec.js index f56c379f..9edd681f 100644 --- a/cypress/e2e/Query/query.spec.js +++ b/cypress/e2e/Query/query.spec.js @@ -8,6 +8,7 @@ import { import { acceptDisclaimer, waitForIncidentTable, + updateAutoAcceptIncidentQuery, activateButton, deactivateButton, checkIncidentCellContentAllRows, @@ -43,7 +44,7 @@ describe('Query Incidents', { failFast: { enabled: false } }, () => { }); it('Query for incidents within T-1 since date', () => { - // Limit dataset to resolved low-urgency incidents + // Limit dataset to high-urgency triggered, ackd and resolved incidents activateButton('query-status-resolved-button'); deactivateButton('query-urgency-low-button'); @@ -66,16 +67,27 @@ describe('Query Incidents', { failFast: { enabled: false } }, () => { } }); - // Reset query for next test + // Reset query for next test - both high and low-urgency triggered, ackd and resolved incidents activateButton('query-urgency-low-button'); }); - it('Query for incidents exceeding MAX_INCIDENTS_LIMIT; Cancel Request', () => { + it('Query for incidents exceeding MAX_INCIDENTS_LIMIT with auto accept incident query on', () => { // Update since date to T-2 const queryDate = moment() .subtract(2, 'days') .set({ hour: 0, minute: 0, second: 0, millisecond: 0 }); cy.get('#query-date-input').clear().type(queryDate.format('DD/MM/yyyy')).type('{enter}'); + waitForIncidentTable(); + }); + + it('Query for incidents exceeding MAX_INCIDENTS_LIMIT with auto accept incident query off; Cancel Request', () => { + // Set auto accept incident query to false to test cancel & allow request + updateAutoAcceptIncidentQuery(false); + // Update since date to T-3 + const queryDate = moment() + .subtract(3, 'days') + .set({ hour: 0, minute: 0, second: 0, millisecond: 0 }); + cy.get('#query-date-input').clear().type(queryDate.format('DD/MM/yyyy')).type('{enter}'); // Cancel request from modal cy.get('#cancel-incident-query-button').click(); @@ -88,7 +100,7 @@ describe('Query Incidents', { failFast: { enabled: false } }, () => { deactivateButton('query-status-resolved-button'); }); - it('Query for incidents exceeding MAX_INCIDENTS_LIMIT; Accept Request', () => { + it('Query for incidents exceeding MAX_INCIDENTS_LIMIT with auto accept incident query off; Accept Request', () => { // Accept request from modal activateButton('query-status-resolved-button'); cy.get('#retrieve-incident-query-button').click(); @@ -104,6 +116,8 @@ describe('Query Incidents', { failFast: { enabled: false } }, () => { .set({ hour: 0, minute: 0, second: 0, millisecond: 0 }); cy.get('#query-date-input').clear().type(queryDate.format('DD/MM/yyyy')).type('{enter}'); waitForIncidentTable(); + // Reset auto accept incident query to true + updateAutoAcceptIncidentQuery(true); }); it('Query for triggered incidents only', () => { diff --git a/cypress/e2e/Settings/settings.spec.js b/cypress/e2e/Settings/settings.spec.js index 9f2e04b9..dbcca15f 100644 --- a/cypress/e2e/Settings/settings.spec.js +++ b/cypress/e2e/Settings/settings.spec.js @@ -11,6 +11,7 @@ import { updateUserLocale, updateDefaultSinceDateLookback, updateMaxIncidentsLimit, + updateMaxRateLimit, updateAutoAcceptIncidentQuery, updateAutoRefreshInterval, manageIncidentTableColumns, @@ -90,6 +91,17 @@ describe('Manage Settings', { failFast: { enabled: false } }, () => { ).to.equal(maxIncidentsLimit)); }); + it('Update max rate limit', () => { + const maxRateLimit = faker.datatype.number({ min: 100, max: 1000 }); + updateMaxRateLimit(maxRateLimit); + cy.window() + .its('store') + .invoke('getState') + .then((state) => expect( + Number(state.settings.maxRateLimit), + ).to.equal(maxRateLimit)); + }); + it('Update auto-accept incident query', () => { [true, false].forEach((autoAcceptIncidentsQuery) => { updateAutoAcceptIncidentQuery(autoAcceptIncidentsQuery); diff --git a/cypress/support/util/common.js b/cypress/support/util/common.js index c782b005..b683b5b7 100644 --- a/cypress/support/util/common.js +++ b/cypress/support/util/common.js @@ -277,6 +277,18 @@ export const updateMaxIncidentsLimit = (limit = 200) => { cy.get('.close').click(); }; +export const updateMaxRateLimit = (limit = 200) => { + cy.get('.settings-panel-dropdown').click(); + cy.get('.dropdown-item').contains('Settings').click(); + cy.get('.nav-item').contains('User Profile').click(); + + cy.get('#user-profile-max-rate-limit-input').clear().type(`${limit}{enter}`); + + cy.get('.btn').contains('Update User Profile').click(); + checkActionAlertsModalContent('Updated user profile settings'); + cy.get('.close').click(); +}; + export const updateAutoAcceptIncidentQuery = (autoAcceptIncidentsQuery = false) => { cy.get('.settings-panel-dropdown').click(); cy.get('.dropdown-item').contains('Settings').click(); diff --git a/i18next-parser.config.js b/i18next-parser.config.js index dd23e4bc..cc503e49 100644 --- a/i18next-parser.config.js +++ b/i18next-parser.config.js @@ -8,9 +8,10 @@ module.exports = { defaultNamespace: 'translation', // Default namespace used in your i18next config - defaultValue: '', + defaultValue: (locale, namespace, key, value) => key, // Default value to give to empty keys // You may also specify a function accepting the locale, namespace, and key as arguments + // Ref: https://github.com/giranm/pd-live-react/pull/375 indentation: 2, // Indentation of the catalog files @@ -42,7 +43,7 @@ module.exports = { lineEnding: 'auto', // Control the line ending. See options at https://github.com/ryanve/eol - locales: ['en', 'fr', 'es', 'de', 'ja', 'id'], + locales: ['en', 'fr', 'es', 'de', 'ja', 'id', 'pt', 'pt-br'], // An array of the locales in your applications namespaceSeparator: ':', @@ -65,15 +66,6 @@ module.exports = { sort: true, // Whether or not to sort the catalog. Can also be a [compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#parameters) - skipDefaultValues: false, - // Whether to ignore default values - // You may also specify a function accepting the locale and namespace as arguments - - useKeysAsDefaultValue: true, - // Whether to use the keys as the default value; ex. "Hello": "Hello", "World": "World" - // This option takes precedence over the `defaultValue` and `skipDefaultValues` options - // You may also specify a function accepting the locale and namespace as arguments - verbose: false, // Display info about the parsing including some stats diff --git a/package.json b/package.json index e1c58064..9763c12f 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "pd-live-react", "homepage": "https://giranm.github.io/pd-live-react", - "version": "0.5.1-beta.0", + "version": "0.6.0-beta.0", "private": true, "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "@craco/craco": "7.0.0-alpha.3", - "@datadog/browser-rum": "^4.23.1", + "@braintree/sanitize-url": "^6.0.2", + "@craco/craco": "7.0.0", + "@datadog/browser-rum": "^4.32.1", "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.2.0", "@fortawesome/free-regular-svg-icons": "^6.2.0", @@ -16,9 +16,9 @@ "@testing-library/jest-dom": "^5.16.5", "@testing-library/react": "^12.1.5", "@testing-library/user-event": "^14.4.3", - "@wojtekmaj/enzyme-adapter-react-17": "^0.6.7", - "autoprefixer": "10.4.12", - "axios": "^1.1.3", + "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0", + "autoprefixer": "10.4.13", + "axios": "^1.2.2", "babel-eslint": "^10.1.0", "bootstrap": "^4.6.2", "bottleneck": "^2.19.5", @@ -26,9 +26,9 @@ "enzyme": "^3.11.0", "font-awesome": "^4.7.0", "fuse.js": "^6.6.2", - "i18next": "^22.0.4", + "i18next": "^22.4.8", "i18next-browser-languagedetector": "^7.0.1", - "immer": "^9.0.15", + "immer": "^9.0.18", "jsonpath-plus": "^7.2.0", "lodash": "^4.17.21", "mezr": "^0.6.2", @@ -36,23 +36,23 @@ "node-sass": "^7.0.3", "react": "^17.0.2", "react-bootstrap": "^1.6.6", - "react-datepicker": "^4.8.0", + "react-datepicker": "^4.10.0", "react-dom": "^17.0.2", - "react-dual-listbox": "^3.0.1", - "react-i18next": "^12.0.0", + "react-dual-listbox": "^4.0.0", + "react-i18next": "^12.1.5", "react-inject-env": "^2.0.1", "react-redux": "^8.0.5", "react-scripts": "5.0.1", - "react-select": "^5.6.0", + "react-select": "^5.7.0", "react-table": "^7.8.0", "react-window": "^1.8.8", - "redux": "^4.2.0", + "redux": "^4.2.1", "redux-persist": "^6.0.0", "redux-saga": "^1.2.1", "styled-components": "^5.3.6", - "use-debounce": "^8.0.4", + "use-debounce": "^9.0.3", "validator": "^13.7.0", - "web-vitals": "^3.0.3" + "web-vitals": "^3.1.0" }, "resolutions": { "autoprefixer": "10.4.5" @@ -96,30 +96,30 @@ "@4tw/cypress-drag-drop": "^2.2.1", "@babel/preset-env": "^7.18.9", "@babel/preset-react": "^7.16.7", - "@cypress/react": "6.2.1", - "@cypress/webpack-dev-server": "^2.5.0", + "@cypress/react": "7.0.1", + "@cypress/webpack-dev-server": "^3.2.3", "@faker-js/faker": "^7.6.0", - "cy2": "^3.1.7", + "cy2": "^3.4.3", "cypress": "^10.10.0", - "cypress-fail-fast": "^5.0.1", + "cypress-fail-fast": "^7.0.0", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", - "eslint-config-prettier": "^8.5.0", + "eslint-config-prettier": "^8.6.0", "eslint-config-react-app": "^7.0.1", "eslint-plugin-cypress": "^2.12.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsx-a11y": "^6.6.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.0", "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-react": "^7.31.8", + "eslint-plugin-react": "^7.32.1", "eslint-plugin-react-hooks": "^4.6.0", "genversion": "^3.1.1", "gh-pages": "^4.0.0", "html-webpack-plugin": "5", - "i18next-parser": "^6.6.0", + "i18next-parser": "^7.6.0", "identity-obj-proxy": "^3.0.0", "jest-canvas-mock": "^2.4.0", "jest-location-mock": "^1.0.9", - "prettier": "^2.6.2", + "prettier": "^2.8.0", "prettier-eslint": "^15.0.1", "prettier-eslint-cli": "^7.1.0", "redux-mock-store": "^1.5.4", @@ -127,7 +127,7 @@ "resolve-url-loader": "^5.0.0", "string.prototype.replaceall": "^1.0.6", "svg-jest": "^1.0.1", - "wait-on": "^6.0.1", + "wait-on": "^7.0.1", "yarn-audit-fix": "^9.3.6" } } diff --git a/src/App.js b/src/App.js index b3efaffc..9cbbee7c 100644 --- a/src/App.js +++ b/src/App.js @@ -53,6 +53,7 @@ import { } from 'redux/response_plays/actions'; import { checkConnectionStatus as checkConnectionStatusConnected, + updateQueueStats as updateQueueStatsConnected, checkAbilities as checkAbilitiesConnected, } from 'redux/connection/actions'; import { @@ -61,6 +62,9 @@ import { import { store, } from 'redux/store'; +import { + limiter, +} from 'util/pd-api-wrapper'; import { PD_OAUTH_CLIENT_ID, @@ -80,6 +84,7 @@ const App = ({ userAuthorize, checkAbilities, checkConnectionStatus, + updateQueueStats, getServicesAsync, getTeamsAsync, getPrioritiesAsync, @@ -190,6 +195,16 @@ const App = ({ return () => clearInterval(clearingInterval); }, [userAuthorized]); + // Setup queue stats update for status beacon tooltip + useEffect(() => { + const queueStateInterval = setInterval(() => { + if (userAuthorized) { + updateQueueStats(limiter.counts()); + } + }, 1000); + return () => clearInterval(queueStateInterval); + }, [userAuthorized]); + // Setup auto-refresh for incidents useEffect(() => { const refreshInterval = setInterval(() => { @@ -250,6 +265,7 @@ const mapDispatchToProps = (dispatch) => ({ userAuthorize: () => dispatch(userAuthorizeConnected()), checkAbilities: () => dispatch(checkAbilitiesConnected()), checkConnectionStatus: () => dispatch(checkConnectionStatusConnected()), + updateQueueStats: (queueStats) => dispatch(updateQueueStatsConnected(queueStats)), getServicesAsync: (teamIds) => dispatch(getServicesAsyncConnected(teamIds)), getTeamsAsync: () => dispatch(getTeamsAsyncConnected()), getPrioritiesAsync: () => dispatch(getPrioritiesAsyncConnected()), diff --git a/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.js b/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.js index 78fef2f0..5d748768 100644 --- a/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.js +++ b/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.js @@ -25,6 +25,7 @@ const ConfirmQueryModalComponent = ({ t, } = useTranslation(); const { + // eslint-disable-next-line no-unused-vars maxIncidentsLimit, } = settings; const { @@ -46,7 +47,7 @@ const ConfirmQueryModalComponent = ({ {t('Current query parameters match X incidents', { totalIncidentsFromQuery })} {'. '}
- {t('Only the first X incidents will be retrieved', { maxIncidentsLimit })} + {t('Retrieving notes and alerts could take a long time')} {'. '}

diff --git a/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.test.js b/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.test.js index 965e8159..272b75c2 100644 --- a/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.test.js +++ b/src/components/ConfirmQueryModal/ConfirmQueryModalComponent.test.js @@ -35,7 +35,7 @@ describe('ConfirmQueryModalComponent', () => { expect(wrapper.find('.modal-body').at(0).getDOMNode().textContent).toEqual( [ `Current query parameters match ${totalIncidentsFromQuery} incidents.`, - `Only the first ${limit} incidents will be retrieved. Continue?`, + 'Retrieving notes and alerts could take a long time. Continue?', ].join(' '), ); }); diff --git a/src/components/NavigationBar/StatusBeaconComponent.js b/src/components/NavigationBar/StatusBeaconComponent.js index 4e7b041a..ee4d59e1 100644 --- a/src/components/NavigationBar/StatusBeaconComponent.js +++ b/src/components/NavigationBar/StatusBeaconComponent.js @@ -6,24 +6,44 @@ import { OverlayTrigger, Tooltip, } from 'react-bootstrap'; +import i18next from 'i18n'; + import Beacon from './subcomponents/Beacon'; const StatusBeaconComponent = ({ - connectionStatus, connectionStatusMessage, -}) => ( -
- {connectionStatusMessage}} - > - - -
-); + connectionStatus, connectionStatusMessage, queueStats, +}) => { + const waiting = queueStats.RECEIVED + queueStats.QUEUED; + const running = queueStats.RUNNING + queueStats.EXECUTING; + + const queueStatsStr = `${waiting} ${i18next.t('waiting')}, ${running} ${i18next.t('running')}`; + return ( +
+ + <> + {i18next.t('Status')} + : + {connectionStatusMessage} +
+ {queueStatsStr} + + + )} + > + +
+
+ ); +}; const mapStateToProps = (state) => ({ connectionStatus: state.connection.connectionStatus, connectionStatusMessage: state.connection.connectionStatusMessage, + queueStats: state.connection.queueStats, }); export default connect(mapStateToProps)(StatusBeaconComponent); diff --git a/src/components/SettingsModal/SettingsModalComponent.js b/src/components/SettingsModal/SettingsModalComponent.js index 252f4f98..73ce86e2 100644 --- a/src/components/SettingsModal/SettingsModalComponent.js +++ b/src/components/SettingsModal/SettingsModalComponent.js @@ -35,6 +35,7 @@ import { setDefaultSinceDateTenor as setDefaultSinceDateTenorConnected, setAlertCustomDetailColumns as setAlertCustomDetailColumnsConnected, setMaxIncidentsLimit as setMaxIncidentsLimitConnected, + setMaxRateLimit as setMaxRateLimitConnected, setAutoAcceptIncidentsQuery as setAutoAcceptIncidentsQueryConnected, setAutoRefreshInterval as setAutoRefreshIntervalConnected, clearLocalCache as clearLocalCacheConnected, @@ -48,6 +49,8 @@ import { import { MAX_INCIDENTS_LIMIT_LOWER, MAX_INCIDENTS_LIMIT_UPPER, + MAX_RATE_LIMIT_LOWER, + MAX_RATE_LIMIT_UPPER, REFRESH_INTERVAL_LOWER, REFRESH_INTERVAL_UPPER, } from 'config/constants'; @@ -94,6 +97,7 @@ const SettingsModalComponent = ({ setAlertCustomDetailColumns, saveIncidentTable, setMaxIncidentsLimit, + setMaxRateLimit, setAutoAcceptIncidentsQuery, setAutoRefreshInterval, clearLocalCache, @@ -107,6 +111,7 @@ const SettingsModalComponent = ({ displaySettingsModal, defaultSinceDateTenor, maxIncidentsLimit, + maxRateLimit, autoAcceptIncidentsQuery, autoRefreshInterval, alertCustomDetailFields, @@ -156,6 +161,16 @@ const SettingsModalComponent = ({ } }, [tempMaxIncidentsLimit]); + const [isValidMaxRateLimit, setIsValidMaxRateLimit] = useState(true); + const [tempMaxRateLimit, setTempMaxRateLimit] = useState(maxRateLimit); + useEffect(() => { + if (tempMaxRateLimit < MAX_RATE_LIMIT_LOWER || tempMaxRateLimit > MAX_RATE_LIMIT_UPPER) { + setIsValidMaxRateLimit(false); + } else { + setIsValidMaxRateLimit(true); + } + }, [tempMaxRateLimit]); + const [tempAutoAcceptQuery, setTempAutoAcceptQuery] = useState(autoAcceptIncidentsQuery); const [selectedColumns, setSelectedColumns] = useState( @@ -302,6 +317,23 @@ const SettingsModalComponent = ({ /> + + + {t('Max API Call Rate')} + + + setTempMaxRateLimit(Number(e.target.value))} + isInvalid={!isValidMaxRateLimit} + /> + + {t('Auto Accept Incident Query')} @@ -321,7 +353,11 @@ const SettingsModalComponent = ({ id="update-user-profile-button" variant="primary" disabled={(() => { - if (!isValidAutoRefreshInterval || !isValidMaxIncidentsLimit) { + if ( + !isValidAutoRefreshInterval + || !isValidMaxIncidentsLimit + || !isValidMaxRateLimit + ) { return true; } return false; @@ -330,6 +366,7 @@ const SettingsModalComponent = ({ updateUserLocale(selectedLocale.value); setDefaultSinceDateTenor(tempSinceDateTenor); setMaxIncidentsLimit(tempMaxIncidentsLimit); + setMaxRateLimit(tempMaxRateLimit); setAutoAcceptIncidentsQuery(tempAutoAcceptQuery); setAutoRefreshInterval(tempAutoRefreshInterval); updateActionAlertsModal('success', t('Updated user profile settings')); @@ -440,6 +477,9 @@ const mapDispatchToProps = (dispatch) => ({ setMaxIncidentsLimit: (maxIncidentsLimit) => { dispatch(setMaxIncidentsLimitConnected(maxIncidentsLimit)); }, + setMaxRateLimit: (maxRateLimit) => { + dispatch(setMaxRateLimitConnected(maxRateLimit)); + }, setAutoAcceptIncidentsQuery: (autoAcceptIncidentsQuery) => { dispatch(setAutoAcceptIncidentsQueryConnected(autoAcceptIncidentsQuery)); }, diff --git a/src/components/SettingsModal/SettingsModalComponent.test.js b/src/components/SettingsModal/SettingsModalComponent.test.js index a99d717a..2a397e69 100644 --- a/src/components/SettingsModal/SettingsModalComponent.test.js +++ b/src/components/SettingsModal/SettingsModalComponent.test.js @@ -11,6 +11,8 @@ import { import { MAX_INCIDENTS_LIMIT_LOWER, MAX_INCIDENTS_LIMIT_UPPER, + MAX_RATE_LIMIT_LOWER, + MAX_RATE_LIMIT_UPPER, REFRESH_INTERVAL_LOWER, REFRESH_INTERVAL_UPPER, } from 'config/constants'; @@ -27,7 +29,8 @@ describe('SettingsModalComponent', () => { displaySettingsModal: true, defaultSinceDateTenor: '1 Day', maxIncidentsLimit: MAX_INCIDENTS_LIMIT_LOWER, - autoAcceptIncidentsQuery: false, + maxRateLimit: MAX_RATE_LIMIT_LOWER, + autoAcceptIncidentsQuery: true, autoRefreshInterval: REFRESH_INTERVAL_LOWER, alertCustomDetailFields: [ { @@ -114,7 +117,7 @@ describe('SettingsModalComponent', () => { ).toBeTruthy(); expect( wrapper.find('input#user-profile-auto-accept-incident-query-checkbox').prop('checked'), - ).toEqual(false); + ).toEqual(true); expect( wrapper.find('#update-user-profile-button').contains('Update User Profile'), @@ -153,6 +156,20 @@ describe('SettingsModalComponent', () => { expect(wrapper.find('button#update-user-profile-button').prop('disabled')).toBeTruthy(); }); + it('should deactivate user profile update button for incorrect rate limit input', () => { + baseStore.settings.maxRateLimit = MAX_RATE_LIMIT_UPPER + 1; + store = mockStore(baseStore); + const wrapper = componentWrapper(store, SettingsModalComponent); + const tabSelector = 'a[data-rb-event-key="user-profile"]'; + const tabElement = wrapper.find(tabSelector); + tabElement.simulate('click'); + + expect( + wrapper.find('input#user-profile-max-rate-limit-input').hasClass('form-control is-invalid'), + ).toBeTruthy(); + expect(wrapper.find('button#update-user-profile-button').prop('disabled')).toBeTruthy(); + }); + it('should set autoAcceptIncidentsQuery to true when checked', () => { const autoAcceptIncidentsQuery = true; store = mockStore(baseStore); diff --git a/src/config/constants.js b/src/config/constants.js index 482e9834..d78880c8 100644 --- a/src/config/constants.js +++ b/src/config/constants.js @@ -27,6 +27,8 @@ export const LOG_ENTRIES_CLEARING_INTERVAL_SECONDS = 30; export const INCIDENTS_PAGINATION_LIMIT = 100; export const MAX_INCIDENTS_LIMIT_LOWER = 100; export const MAX_INCIDENTS_LIMIT_UPPER = 1000; +export const MAX_RATE_LIMIT_LOWER = 100; +export const MAX_RATE_LIMIT_UPPER = 2000; export const REFRESH_INTERVAL_LOWER = 5; export const REFRESH_INTERVAL_UPPER = 60; diff --git a/src/config/version.js b/src/config/version.js index 93df6566..11d9e748 100644 --- a/src/config/version.js +++ b/src/config/version.js @@ -1,2 +1,2 @@ // Generated by genversion. -module.exports = '0.5.1-beta.0'; +module.exports = '0.6.0-beta.0'; diff --git a/src/i18n.js b/src/i18n.js index 2fac9a16..4b2a0585 100644 --- a/src/i18n.js +++ b/src/i18n.js @@ -11,6 +11,9 @@ import es from 'date-fns/locale/es'; import de from 'date-fns/locale/de'; import ja from 'date-fns/locale/ja'; import id from 'date-fns/locale/id'; +import pt from 'date-fns/locale/pt'; +import ptbr from 'date-fns/locale/pt-BR'; + import { registerLocale, } from 'react-datepicker'; @@ -21,6 +24,8 @@ import translationES from './locales/es/translation.json'; import translationDE from './locales/de/translation.json'; import translationJA from './locales/ja/translation.json'; import translationID from './locales/id/translation.json'; +import translationPT from './locales/pt/translation.json'; +import translationPTBR from './locales/pt-br/translation.json'; // Variable for supported locales registerLocale('en-GB', gb); @@ -30,6 +35,8 @@ registerLocale('es', es); registerLocale('de', de); registerLocale('ja', ja); registerLocale('id', id); +registerLocale('pt', pt); +registerLocale('pt-br', ptbr); // the translations export const lngs = { @@ -61,6 +68,14 @@ export const lngs = { translation: translationID, nativeName: 'Bahasa Indonesia', }, + pt: { + translation: translationPT, + nativeName: 'Português', + }, + 'pt-BR': { + translation: translationPTBR, + nativeName: 'Português (Brasil)', + }, }; // locales is generated from the lngs object for compatibility with original locales implementation @@ -77,7 +92,7 @@ i18n resources: lngs, fallbackLng: 'en', // use en if detected lng is not available // array of allowed languages - supportedLngs: ['en', 'fr', 'es', 'de', 'ja', 'id'], + supportedLngs: ['en', 'fr', 'es', 'de', 'ja', 'id', 'pt', 'pt-br'], // if true, will consider variants as supported when the main language is. // E.g. en-US will be valid if en is in supportedLngs. nonExplicitSupportedLngs: true, diff --git a/src/locales/de/translation.json b/src/locales/de/translation.json index e98029d5..c73a9168 100644 --- a/src/locales/de/translation.json +++ b/src/locales/de/translation.json @@ -80,6 +80,7 @@ "Locale": "Gebietsschema", "Log Out": "Abmelden", "Low": "Niedrig", + "Max API Call Rate": "Maximale API-Aufrufrate", "Max Incidents Limit": "Maximale Vorfallgrenze", "Max Incidents Limit Reached": "Maximale Vorfallgrenze erreicht", "Merge": "Zusammenführen", @@ -99,7 +100,6 @@ "No selected options": "Keine ausgewählten Optionen", "Num Alerts": "Anzahl Benachrichtigungen", "on": "ein", - "Only the first X incidents will be retrieved": "Nur die ersten {{maxIncidentsLimit}} Vorfälle werden abgerufen", "Please contact the associated site owner for access": "Bitte wenden Sie sich an den Eigentümer der zugehörigen Website, um Zugriff zu erhalten", "Priorities": "Prioritäten", "Priority": "Priorität", @@ -119,7 +119,9 @@ "response play for": "Response Play für", "Response Plays": "Response Play", "Retrieve Incidents": "Vorfälle abrufen", + "Retrieving notes and alerts could take a long time": "Das Abrufen von Notizen und Warnungen kann lange dauern", "Run Action": "Aktion ausführen", + "running": "läuft", "Search": " Suche", "Search for Escalation Policies and/or Users": "Nach Eskalationsrichtlinien und/oder Benutzern suchen", "Search for Escalation Policy or User": "Nach Eskalationsrichtlinie oder Benutzer suchen", @@ -175,6 +177,7 @@ "Users": "Benutzer", "Version": "Version", "View Disclaimer": "Haftungsausschluss anzeigen", + "waiting": "warten", "warning": "warnung", "were not": "waren nicht", "You must agree before submitting": "Vor dem Absenden bitte zustimmen" diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 36024ad9..418a74d4 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -80,6 +80,7 @@ "Locale": "Locale", "Log Out": "Log Out", "Low": "Low", + "Max API Call Rate": "Max API Call Rate", "Max Incidents Limit": "Max Incidents Limit", "Max Incidents Limit Reached": "Max Incidents Limit Reached", "Merge": "Merge", @@ -99,7 +100,6 @@ "No selected options": "No selected options", "Num Alerts": "Num Alerts", "on": "on", - "Only the first X incidents will be retrieved": "Only the first {{maxIncidentsLimit}} incidents will be retrieved", "Please contact the associated site owner for access": "Please contact the associated site owner for access", "Priorities": "Priorities", "Priority": "Priority", @@ -119,7 +119,9 @@ "response play for": "response play for", "Response Plays": "Response Plays", "Retrieve Incidents": "Retrieve Incidents", + "Retrieving notes and alerts could take a long time": "Retrieving notes and alerts could take a long time", "Run Action": "Run Action", + "running": "running", "Search": "Search", "Search for Escalation Policies and/or Users": "Search for Escalation Policies and/or Users", "Search for Escalation Policy or User": "Search for Escalation Policy or User", @@ -175,6 +177,7 @@ "Users": "Users", "Version": "Version", "View Disclaimer": "View Disclaimer", + "waiting": "waiting", "warning": "warning", "were not": "were not", "You must agree before submitting": "You must agree before submitting" diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 391a68e0..718f9ca7 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -80,6 +80,7 @@ "Locale": "Configuracion regional", "Log Out": "Cerrar sesión", "Low": "Bajo", + "Max API Call Rate": "Tasa máxima de llamadas API", "Max Incidents Limit": "Límite máximo de incidentes", "Max Incidents Limit Reached": "Se ha alcanzado el límite máximo de incidentes", "Merge": "Combinar", @@ -99,7 +100,6 @@ "No selected options": "No hay opciones seleccionadas", "Num Alerts": "Número de Alertas", "on": "en", - "Only the first X incidents will be retrieved": "Solo se recuperarán los primeros {{maxIncidentsLimit}} incidentes", "Please contact the associated site owner for access": "Póngase en contacto con el propietario del sitio asociado para obtener acceso", "Priorities": "Prioridades", "Priority": "Prioridad", @@ -119,7 +119,9 @@ "response play for": "juego de respuesta para", "Response Plays": "Respuestas de juego", "Retrieve Incidents": "Recuperar incidentes", + "Retrieving notes and alerts could take a long time": "La recuperación de notas y alertas puede llevar mucho tiempo", "Run Action": "Ejecutar acción", + "running": "ejecutando", "Search": "Buscar", "Search for Escalation Policies and/or Users": "Buscar políticas de escalada y/o usuarios", "Search for Escalation Policy or User": "Buscar política de escalada o usuario", @@ -175,6 +177,7 @@ "Users": "Usuarios", "Version": "Versión", "View Disclaimer": "Ver aviso legal", + "waiting": "esperando", "warning": "aviso", "were not": "no eran", "You must agree before submitting": "Debe aceptar antes de enviar" diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json index 5ec8ce61..679da502 100644 --- a/src/locales/fr/translation.json +++ b/src/locales/fr/translation.json @@ -80,6 +80,7 @@ "Locale": "Paramètres régionaux", "Log Out": "Se déconnecter", "Low": "Basse", + "Max API Call Rate": "Taux d'appel API maximal", "Max Incidents Limit": "Limite maximale d'incidents", "Max Incidents Limit Reached": "Limite maximale d'incidents atteinte", "Merge": "Fusionner", @@ -99,7 +100,6 @@ "No selected options": "Aucune option sélectionnée", "Num Alerts": "Nombre d'alertes", "on": "sur", - "Only the first X incidents will be retrieved": "Seuls les {{maxIncidentsLimit}} premiers incidents seront récupérés", "Please contact the associated site owner for access": "Please contact the associated site owner for access", "Priorities": "Priorités", "Priority": "Priorité", @@ -119,7 +119,9 @@ "response play for": "jouer la réponse pour", "Response Plays": "Réponses", "Retrieve Incidents": "Récupérer les incidents", + "Retrieving notes and alerts could take a long time": "La récupération des notes et des alertes peut prendre beaucoup de temps", "Run Action": "Actions", + "running": "en cours d'exécution", "Search": "Chercher", "Search for Escalation Policies and/or Users": "Rechercher des politiques d'escalade et/ou des utilisateurs", "Search for Escalation Policy or User": "Rechercher une politique d'escalade ou un utilisateur", @@ -175,6 +177,7 @@ "Users": "Utilisateurs", "Version": "Version", "View Disclaimer": "Clause de non-responsabilité", + "waiting": "en attente", "warning": "avertissement", "were not": "n'ont pas été", "You must agree before submitting": "Vous devez accepter avant de soumettre" diff --git a/src/locales/id/translation.json b/src/locales/id/translation.json index 14d6fd2b..05a2d403 100644 --- a/src/locales/id/translation.json +++ b/src/locales/id/translation.json @@ -80,6 +80,7 @@ "Locale": "Lokal", "Log Out": "Keluar", "Low": "Low", + "Max API Call Rate": "Batas Maksimal Panggilan API", "Max Incidents Limit": "Batas Maksimal Insiden", "Max Incidents Limit Reached": "Batas Maksimal Insiden Tercapai", "Merge": "Gabung", @@ -99,7 +100,6 @@ "No selected options": "Jumlah pilihan yang terpilih", "Num Alerts": "Jumlah peringatan", "on": "on", - "Only the first X incidents will be retrieved": "Hanya insiden {{maxIncidentsLimit}} pertama yang akan diambil", "Please contact the associated site owner for access": "Silakan hubungi pemilik situs terkait untuk akses", "Priorities": "Prioritas", "Priority": "Prioritas", @@ -119,7 +119,9 @@ "response play for": "response play untuk", "Response Plays": "Response Plays", "Retrieve Incidents": "Ambil insiden", + "Retrieving notes and alerts could take a long time": "Mengambil catatan dan peringatan bisa memakan waktu lama", "Run Action": "Jalankan Aksi", + "running": "sedang berjalan", "Search": "Cari", "Search for Escalation Policies and/or Users": "Cari kebijakan eskalasi dan/atau pengguna", "Search for Escalation Policy or User": "Cari kebijakan eskalasi atau pengguna", @@ -175,6 +177,7 @@ "Users": "Pengguna", "Version": "Versi", "View Disclaimer": "Lihat Sanggahan", + "waiting": "menunggu", "warning": "peringatan", "were not": "tidak", "You must agree before submitting": "Anda harus setuju sebelum menyerahkan" diff --git a/src/locales/ja/translation.json b/src/locales/ja/translation.json index 955c50e5..8be78be9 100644 --- a/src/locales/ja/translation.json +++ b/src/locales/ja/translation.json @@ -80,6 +80,7 @@ "Locale": "ロケール", "Log Out": "ログアウト", "Low": "低", + "Max API Call Rate": "最大API呼び出しレート", "Max Incidents Limit": "最大インシデント数", "Max Incidents Limit Reached": "最大インシデント数の上限に達しました", "Merge": "マージ", @@ -99,7 +100,6 @@ "No selected options": "選択中のオプションはありません", "Num Alerts": "アラート数", "on": "。対象:", - "Only the first X incidents will be retrieved": "最初の {{maxIncidentsLimit}} インシデントのみ取得されます", "Please contact the associated site owner for access": "アクセスするには、サイトオーナーにお問い合わせください", "Priorities": "優先度", "Priority": "優先度", @@ -119,7 +119,9 @@ "response play for": "レスポンスプレイ対象", "Response Plays": "レスポンスプレイ", "Retrieve Incidents": "インシデントを取得", + "Retrieving notes and alerts could take a long time": "メモとアラートの取得には時間がかかる場合があります", "Run Action": "アクションを実行", + "running": "実行中", "Search": "検索", "Search for Escalation Policies and/or Users": "エスカレーションポリシー及びユーザーを検索", "Search for Escalation Policy or User": "エスカレーションポリシー及びユーザーを検索", @@ -175,6 +177,7 @@ "Users": "ユーザー", "Version": "バージョン", "View Disclaimer": "免責事項表示", + "waiting": "待機中", "warning": "warning", "were not": "はスキップされ、", "You must agree before submitting": "提出する前に同意する必要があります" diff --git a/src/locales/pt-br/translation.json b/src/locales/pt-br/translation.json new file mode 100644 index 00000000..6137d7ac --- /dev/null +++ b/src/locales/pt-br/translation.json @@ -0,0 +1,184 @@ +{ + "1 Day": "1 Dia", + "1 Month": "1 Mês", + "1 Week": "1 Semana", + "2 Weeks": "2 Semanas", + "3 Days": "3 Dias", + "3 Months": "3 Meses", + "6 Months": "6 Meses", + "Accept": "Aceitar", + "Acknowledge": "Confirmar", + "acknowledged": "confirmado(s)", + "Acknowledged": "Confirmado(s)", + "Acknowledgments": "Confirmações", + "Actions": "Ações", + "Add Note": "Adicionar Anotação", + "Add Note to incident(s) here": "Adicionar Anotação a incidente(s) aqui", + "Add Responders": "Adicionar Respondentes", + "Alert Custom Detail Column Definitions": "Coluna de Definições dos Detalhes Personalizados do Alerta", + "Alert Custom Detail Column Definitions Placeholder": "Marcador de Coluna de Definições dos Detalhes Personalizados do Alerta", + "and their alerts have been merged onto incident": "e os seus alertas foram combinados no incidente", + "Assignees": "Detentores", + "Auto Accept Incident Query": "Consulta de incidente de aceitação automática", + "Auto Refresh Interval (mins)": "Intervalo de atualização automática (min)", + "Available": "Disponível", + "because they have already been suppressed or resolved": "porque já foram eliminados ou resolvidos", + "Cancel": "Cancelar", + "characters remaining": "caracteres restantes", + "Class": "Classe", + "Clear Local Cache": "Limpar Cache Local", + "Column Selector": "Seletor de Coluna", + "Component": "Componente", + "Connect using PagerDuty OAuth to use this app": "Conectar usando PagerDuty OAuth para usar esta aplicação", + "Connected": "Conectado", + "Connecting": "Conectando", + "Continue": "Continuar", + "Created At": "Criado Em", + "critical": "urgente", + "Current query parameters match X incidents": "Os parâmetros de consulta atuais coincidem com {{totalIncidentsFromQuery}} incidentes", + "Current subdomain does not have the correct ability to use PagerDuty Live": "O subdomínio atual não tem a capacidade correta para usar PagerDuty Live", + "Custom": "Personalizado", + "Custom Incident Action": "Ação de Incidente Personalizada", + "Decline": "Recusar", + "Default Since Date Lookback": "Retrospectiva a partir de Data Predefinida", + "Description": "Descrição", + "Disclaimer & License": "Aviso Legal & Licença", + "error": "erro", + "Escalate": "Escalar", + "Escalation Policy": "Política de Escalação", + "External References": "Referências Externas", + "External Systems": "Sistemas Externos", + "Fetching Alerts": "Buscando Alertas", + "Fetching Notes": "Buscando Anotações", + "Filter available": "Filtro disponível", + "Filter selected": "Filtro selecionado", + "Filters": "Filtros", + "Group": "Grupo", + "have been": "foram", + "have been manually escalated to level": "foram escalados manualmente para o nível", + "have been reassigned to": "foram reatribuídos a", + "have been updated with a note": "foram atualizados com uma anotação", + "have been updated with priority": "foram atualizados com a prioridade", + "High": "Alta", + "hour": "hora", + "hours": "horas", + "I agree to the disclaimer and license above": "Aceito o aviso legal e a licença acima", + "incident": "incidente", + "Incident": "Incidente", + "Incident ID": "ID do Incidente", + "Incident Key": "Chave do Incidente", + "Incident Table": "Tabela de Incidentes", + "Incidents": "Incidentes", + "info": "informação", + "Invalid JSON Path": "Caminho JSON inválido", + "Last Status Change At": "Última Alteração de Estado às", + "Last Status Change By": "Última Alteração de Estado por", + "Latest Note": "Última Anotação", + "Live Incidents Console": "Console de Incidentes ao Vivo", + "Live updates disabled": "Atualizações ao Vivo Desativadas", + "Local Cache": "Cache Local", + "Locale": "Região", + "Log Out": "Terminar Sessão", + "Low": "Baixo", + "Max API Call Rate": "Taxa Máxima de Chamada da API", + "Max Incidents Limit": "Limite Máximo de Incidentes", + "Max Incidents Limit Reached": "Limite Máximo de Incidentes Atingido", + "Merge": "Combinar", + "Merge Incidents": "Combinar Incidentes", + "minutes": "minutos", + "Move all left": "Mover tudo para a esquerda", + "Move all right": "Mover tudo para a direita", + "Move down": "Mover para baixo", + "Move left": "Mover para a esquerda", + "Move right": "Mover para a direita", + "Move to bottom": "Mover para o fim", + "Move to top": "Mover para o topo", + "Move up": "Mover para cima", + "N/A": "N/D", + "No available options": "Nenhuma opção disponível", + "No Incidents Found": "Nenhum Incidente Encontrado", + "No selected options": "Nenhuma opção selecionada", + "Num Alerts": "Número de Alertas", + "on": "em", + "Please contact the associated site owner for access": "Por favor entre em contato com o proprietário do site associado para obter acesso", + "Priorities": "Prioridades", + "Priority": "Prioridade", + "Provide brief message for additional responders": "Forneça uma mensagem breve para respondentes adicionais", + "Query has been cancelled by user": "A consulta foi cancelada pelo usuário", + "Querying": "Consultando", + "Querying PagerDuty API": "Consultando a API da PagerDuty", + "Ran": "Executado", + "Reassign": "Reatribuir", + "Reassign To": "Reatribuir a", + "Refreshing": "Atualizando", + "Requested additional response for": "Resposta adicional solicitada para", + "Resolve": "Resolver", + "resolved": "resolvido", + "Resolved": "Resolvido", + "Responders": "Respondentes", + "response play for": "conjunto de respostas para", + "Response Plays": "Conjunto de Respostas", + "Retrieve Incidents": "Obter Incidentes", + "Retrieving notes and alerts could take a long time": "Obter anotações e alertas pode levar muito tempo", + "Run Action": "Executar Ação", + "running": "executando", + "Search": "Pesquisar", + "Search for Escalation Policies and/or Users": "Pesquisar Políticas de Escalação e/ou Usuários", + "Search for Escalation Policy or User": "Pesquisar Política de Escalação ou Usuário", + "Select an open incident to merge into": "Selecione um incidente aberto com o qual será combinado", + "Select dotdotdot": "Selecione...", + "Selected": "Selecionado", + "Service": "Serviço", + "Settings": "Configurações", + "Severity": "Severidade", + "Sign In": "Entrar", + "Signing into PagerDuty Live": "Entrando em PagerDuty Live", + "Since": "Desde", + "Snooze": "Suspender", + "Snooze for the following hours": "Suspender durante as próximas horas", + "Snooze Incident #X": "Suspender incidente #{{unresolvedIncidents.0.incident_number}}", + "Snooze until tomorrow at": "Suspender até amanhã às", + "Snooze X incidents": "Adiar {{unresolvedIncidents.length}} incidentes", + "snoozed": "adiado", + "Source": "Origem", + "State": "Estado", + "Status": "Estado", + "Summary": "Resumo", + "Sync with": "Sincronizar com", + "Synced with": "Sincronizado com", + "Team": "Equipe", + "Teams": "Equipes", + "The alerts of the selected incidents will be merged into a single incident": "Os alertas dos incidentes selecionados serão combinados em um único incidente", + "The remaining selected incidents will be resolved after the merge is complete": "Os restantes incidentes selecionados serão resolvidos, uma vez completa a combinação", + "Title": "Título", + "Triggered": "Acionado", + "triggered for": "acionado para", + "Unable to fetch account abilities": "Não foi possível obter as capacidades da conta", + "Unable to fetch current user details": "Não foi possível obter os dados atuais do usuário", + "Unable to fetch escalation policies": "Não foi possível obter as políticas de escalação", + "Unable to fetch extensions": "Não foi possível obter as extensões", + "Unable to fetch incidents": "Não foi possível obter os incidentes", + "Unable to fetch log entries": "Não foi possível obter as entradas de registro", + "Unable to fetch priorities": "Não foi possível obter as prioridades", + "Unable to fetch response plays": "Não foi possível obter os conjuntos de respostas", + "Unable to fetch services": "Não foi possível obter os serviços", + "Unable to fetch teams": "Não foi possível obter as equipes", + "Unable to fetch users": "Não foi possível obter os usuários", + "Unauthorized Access": "Acesso não autorizado", + "Unknown error while using PD API": "Erro desconhecido ao usar a API da PD", + "Update Incident Table": "Atualizar Tabela de incidentes", + "Update Priority": "Atualizar Prioridade", + "Update User Profile": "Atualizar Perfil de Usuário", + "Updated incident table settings": "Configurações de tabela de incidentes atualizadas", + "Updated user profile settings": "Configurações de perfil de usuário atualizadas", + "Urgency": "Urgência", + "User is not permitted to access this instance of PagerDuty Live": "O usuário não tem permissão para acessar a esta instância do PagerDuty Live", + "User Profile": "Perfil de usuário", + "Users": "Usuários", + "Version": "Versão", + "View Disclaimer": "Ver Aviso Legal", + "waiting": "aguardando", + "warning": "aviso", + "were not": "não eram", + "You must agree before submitting": "Deve aceitar antes de enviar" +} diff --git a/src/locales/pt/translation.json b/src/locales/pt/translation.json new file mode 100644 index 00000000..bdf950cb --- /dev/null +++ b/src/locales/pt/translation.json @@ -0,0 +1,184 @@ +{ + "1 Day": "1 Dia", + "1 Month": "1 Mês", + "1 Week": "1 Semana", + "2 Weeks": "2 Semanas", + "3 Days": "3 Dias", + "3 Months": "3 Meses", + "6 Months": "6 Meses", + "Accept": "Aceitar", + "Acknowledge": "Confirmar", + "acknowledged": "confirmado(s)", + "Acknowledged": "Confirmado(s)", + "Acknowledgments": "Confirmações", + "Actions": "Ações", + "Add Note": "Adicionar Nota", + "Add Note to incident(s) here": "Adicionar Nota a incidente(s) aqui", + "Add Responders": "Adicionar Respondentes", + "Alert Custom Detail Column Definitions": "Coluna de Definições dos Detalhes Personalizados do Alerta", + "Alert Custom Detail Column Definitions Placeholder": "Marcador de Coluna de Definições dos Detalhes Personalizados do Alerta", + "and their alerts have been merged onto incident": "e os seus alertas foram combinados no incidente", + "Assignees": "Responsáveis", + "Auto Accept Incident Query": "Consulta de incidente de aceitação automática", + "Auto Refresh Interval (mins)": "Intervalo de atualização automática (min)", + "Available": "Disponível", + "because they have already been suppressed or resolved": "porque já foram eliminados ou resolvidos", + "Cancel": "Cancelar", + "characters remaining": "caracteres restantes", + "Class": "Classe", + "Clear Local Cache": "Limpar Cache Local", + "Column Selector": "Seletor de Coluna", + "Component": "Componente", + "Connect using PagerDuty OAuth to use this app": "Ligue usando PagerDuty OAuth para usar esta aplicação", + "Connected": "Ligado", + "Connecting": "A ligar", + "Continue": "Continuar", + "Created At": "Criado Em", + "critical": "urgente", + "Current query parameters match X incidents": "Os parâmetros de consulta atuais coincidem com {{totalIncidentsFromQuery}} incidentes", + "Current subdomain does not have the correct ability to use PagerDuty Live": "O subdomínio atual não tem a capacidade correta para usar PagerDuty Live", + "Custom": "Personalizado", + "Custom Incident Action": "Ação de Incidente Personalizada", + "Decline": "Recusar", + "Default Since Date Lookback": "Retrospetiva a partir de Data Predefinida", + "Description": "Descrição", + "Disclaimer & License": "Aviso Legal & Licença", + "error": "erro", + "Escalate": "Escalar", + "Escalation Policy": "Política de Escalação", + "External References": "Referências Externas", + "External Systems": "Sistemas Externos", + "Fetching Alerts": "A obter Alertas", + "Fetching Notes": "A obter Notas", + "Filter available": "Filtro disponível", + "Filter selected": "Filtro selecionado", + "Filters": "Filtros", + "Group": "Grupo", + "have been": "foram", + "have been manually escalated to level": "foram escalados manualmente para o nível", + "have been reassigned to": "foram reatribuídos a", + "have been updated with a note": "foram atualizados com uma nota", + "have been updated with priority": "foram atualizados com a prioridade", + "High": "Alta", + "hour": "hora", + "hours": "horas", + "I agree to the disclaimer and license above": "Aceito o aviso legal e a licença acima", + "incident": "incidente", + "Incident": "Incidente", + "Incident ID": "ID do Incidente", + "Incident Key": "Chave do Incidente", + "Incident Table": "Tabela de Incidentes", + "Incidents": "Incidentes", + "info": "informação", + "Invalid JSON Path": "Caminho JSON inválido", + "Last Status Change At": "Última Alteração de Estado às", + "Last Status Change By": "Última Alteração de Estado por", + "Latest Note": "Última Nota", + "Live Incidents Console": "Consola de Incidentes ao Vivo", + "Live updates disabled": "Atualizações ao Vivo Desativadas", + "Local Cache": "Cache Local", + "Locale": "Região", + "Log Out": "Terminar Sessão", + "Low": "Baixo", + "Max API Call Rate": "Taxa Máxima de Chamada API", + "Max Incidents Limit": "Limite Máximo de Incidentes", + "Max Incidents Limit Reached": "Limite Máximo de Incidentes Atingido", + "Merge": "Combinar", + "Merge Incidents": "Combinar Incidentes", + "minutes": "minutos", + "Move all left": "Mover tudo para a esquerda", + "Move all right": "Mover tudo para a direita", + "Move down": "Mover para baixo", + "Move left": "Mover para a esquerda", + "Move right": "Mover para a direita", + "Move to bottom": "Mover para o fim", + "Move to top": "Mover para o topo", + "Move up": "Mover para cima", + "N/A": "N/D", + "No available options": "Nenhuma opção disponível", + "No Incidents Found": "Nenhum Incidente Encontrado", + "No selected options": "Nenhuma opção selecionada", + "Num Alerts": "Número de Alertas", + "on": "em", + "Please contact the associated site owner for access": "Por favor entre em contato com o proprietário do site associado para obter acesso", + "Priorities": "Prioridades", + "Priority": "Prioridade", + "Provide brief message for additional responders": "Forneça uma mensagem breve para respondentes adicionais", + "Query has been cancelled by user": "A consulta foi cancelada pelo utilizador", + "Querying": "Consultando", + "Querying PagerDuty API": "Consultando a API da PagerDuty", + "Ran": "Executado", + "Reassign": "Reatribuir", + "Reassign To": "Reatribuir a", + "Refreshing": "Atualizando", + "Requested additional response for": "Resposta adicional solicitada para", + "Resolve": "Resolver", + "resolved": "resolvido", + "Resolved": "Resolvido", + "Responders": "Respondentes", + "response play for": "conjunto de respostas para", + "Response Plays": "Conjunto de Respostas", + "Retrieve Incidents": "Obter Incidentes", + "Retrieving notes and alerts could take a long time": "A obter notas e alertas pode demorar muito tempo", + "Run Action": "Executar Ação", + "running": "executando", + "Search": "Pesquisar", + "Search for Escalation Policies and/or Users": "Pesquisar Políticas de Escalação e/ou Utilizadores", + "Search for Escalation Policy or User": "Pesquisar Política de Escalação ou Utilizador", + "Select an open incident to merge into": "Seleccione um incidente aberto com o qual será combinado", + "Select dotdotdot": "Selecione...", + "Selected": "Selecionado", + "Service": "Serviço", + "Settings": "Configurações", + "Severity": "Severidade", + "Sign In": "Iniciar Sessão", + "Signing into PagerDuty Live": "Iniciando sessão em PagerDuty Live", + "Since": "Desde", + "Snooze": "Suspender", + "Snooze for the following hours": "Suspender durante as próximas horas", + "Snooze Incident #X": "Suspender incidente #{{unresolvedIncidents.0.incident_number}}", + "Snooze until tomorrow at": "Suspender até amanhã às", + "Snooze X incidents": "Suspender {{unresolvedIncidents.length}} incidentes", + "snoozed": "suspendido", + "Source": "Origem", + "State": "Estado", + "Status": "Estado", + "Summary": "Resumo", + "Sync with": "Sincronizar com", + "Synced with": "Sincronizado com", + "Team": "Equipa", + "Teams": "Equipas", + "The alerts of the selected incidents will be merged into a single incident": "Os alertas dos incidentes selecionados serão combinados num único incidente", + "The remaining selected incidents will be resolved after the merge is complete": "Os restantes incidentes selecionados serão resolvidos, uma vez completa a combinação", + "Title": "Título", + "Triggered": "Acionado", + "triggered for": "acionado para", + "Unable to fetch account abilities": "Não foi possível obter as capacidades da conta", + "Unable to fetch current user details": "Não foi possível obter os dados atuais do utilizador", + "Unable to fetch escalation policies": "Não foi possível obter as políticas de escalação", + "Unable to fetch extensions": "Não foi possível obter as extensões", + "Unable to fetch incidents": "Não foi possível obter os incidentes", + "Unable to fetch log entries": "Não foi possível obter as entradas de registro", + "Unable to fetch priorities": "Não foi possível obter as prioridades", + "Unable to fetch response plays": "Não foi possível obter os conjuntos de respostas", + "Unable to fetch services": "Não foi possível obter os serviços", + "Unable to fetch teams": "Não foi possível obter as equipas", + "Unable to fetch users": "Não foi possível obter os utilizadores", + "Unauthorized Access": "Acesso não autorizado", + "Unknown error while using PD API": "Erro desconhecido ao usar a API da PD", + "Update Incident Table": "Atualizar Tabela de incidentes", + "Update Priority": "Atualizar Prioridade", + "Update User Profile": "Atualizar Perfil de Utilizador", + "Updated incident table settings": "Configurações de tabela de incidentes atualizadas", + "Updated user profile settings": "Configurações de perfil de utilizador atualizadas", + "Urgency": "Urgência", + "User is not permitted to access this instance of PagerDuty Live": "O utilizador não tem permissão para aceder a esta instância do PagerDuty Live", + "User Profile": "Perfil de utilizador", + "Users": "Utilizadores", + "Version": "Versão", + "View Disclaimer": "Ver Aviso Legal", + "waiting": "aguardando", + "warning": "aviso", + "were not": "não eram", + "You must agree before submitting": "Deve aceitar antes de enviar" +} diff --git a/src/mocks/escalation_policies.test.js b/src/mocks/escalation_policies.test.js index 6956cb5b..3488d37b 100644 --- a/src/mocks/escalation_policies.test.js +++ b/src/mocks/escalation_policies.test.js @@ -14,9 +14,7 @@ const generateMockEscalationPolicy = () => { }; }; -export const generateMockEscalationPolicies = (num) => Array.from( - { length: num }, () => generateMockEscalationPolicy(), -); +export const generateMockEscalationPolicies = (num) => Array.from({ length: num }, () => generateMockEscalationPolicy()); export default generateMockEscalationPolicies; diff --git a/src/mocks/services.test.js b/src/mocks/services.test.js index a0694722..d373c626 100644 --- a/src/mocks/services.test.js +++ b/src/mocks/services.test.js @@ -14,9 +14,7 @@ const generateMockService = () => { }; }; -export const generateMockServices = (num) => Array.from( - { length: num }, () => generateMockService(), -); +export const generateMockServices = (num) => Array.from({ length: num }, () => generateMockService()); export default generateMockServices; diff --git a/src/redux/connection/actions.js b/src/redux/connection/actions.js index f8b14d9f..2fced144 100644 --- a/src/redux/connection/actions.js +++ b/src/redux/connection/actions.js @@ -2,6 +2,9 @@ export const UPDATE_CONNECTION_STATUS_REQUESTED = 'UPDATE_CONNECTION_STATUS_REQUESTED'; export const UPDATE_CONNECTION_STATUS_COMPLETED = 'UPDATE_CONNECTION_STATUS_COMPLETED'; +export const UPDATE_QUEUE_STATS_REQUESTED = 'UPDATE_QUEUE_STATS_REQUESTED'; +export const UPDATE_QUEUE_STATS_COMPLETED = 'UPDATE_QUEUE_STATS_COMPLETED'; + export const CHECK_CONNECTION_STATUS_REQUESTED = 'CHECK_CONNECTION_STATUS_REQUESTED'; export const CHECK_CONNECTION_STATUS_COMPLETED = 'CHECK_CONNECTION_STATUS_COMPLETED'; @@ -16,6 +19,11 @@ export const updateConnectionStatus = (connectionStatus, connectionStatusMessage connectionStatusMessage, }); +export const updateQueueStats = (queueStats) => ({ + type: UPDATE_QUEUE_STATS_REQUESTED, + queueStats, +}); + export const checkConnectionStatus = () => ({ type: CHECK_CONNECTION_STATUS_REQUESTED, }); diff --git a/src/redux/connection/reducers.js b/src/redux/connection/reducers.js index 18aa11fc..94a15b31 100644 --- a/src/redux/connection/reducers.js +++ b/src/redux/connection/reducers.js @@ -4,6 +4,8 @@ import i18next from 'i18n'; import { UPDATE_CONNECTION_STATUS_REQUESTED, UPDATE_CONNECTION_STATUS_COMPLETED, + UPDATE_QUEUE_STATS_REQUESTED, + UPDATE_QUEUE_STATS_COMPLETED, CHECK_CONNECTION_STATUS_REQUESTED, CHECK_CONNECTION_STATUS_COMPLETED, CHECK_ABILITIES_REQUESTED, @@ -24,6 +26,15 @@ const connection = produce( draft.connectionStatusMessage = action.connectionStatusMessage; break; + case UPDATE_QUEUE_STATS_REQUESTED: + draft.status = UPDATE_QUEUE_STATS_REQUESTED; + break; + + case UPDATE_QUEUE_STATS_COMPLETED: + draft.status = UPDATE_QUEUE_STATS_COMPLETED; + draft.queueStats = action.queueStats; + break; + case CHECK_CONNECTION_STATUS_REQUESTED: draft.status = CHECK_CONNECTION_STATUS_REQUESTED; break; @@ -52,6 +63,7 @@ const connection = produce( { connectionStatus: 'dormant', connectionStatusMessage: i18next.t('Connecting'), + queueStats: { RECEIVED: 0, QUEUED: 0, RUNNING: 0, EXECUTING: 0 }, abilities: [], status: '', }, diff --git a/src/redux/connection/sagas.js b/src/redux/connection/sagas.js index 45d98508..7c62ad1b 100644 --- a/src/redux/connection/sagas.js +++ b/src/redux/connection/sagas.js @@ -28,6 +28,8 @@ import { import { UPDATE_CONNECTION_STATUS_REQUESTED, UPDATE_CONNECTION_STATUS_COMPLETED, + UPDATE_QUEUE_STATS_REQUESTED, + UPDATE_QUEUE_STATS_COMPLETED, CHECK_CONNECTION_STATUS_REQUESTED, CHECK_CONNECTION_STATUS_COMPLETED, CHECK_ABILITIES_REQUESTED, @@ -50,6 +52,20 @@ export function* updateConnectionStatusImpl(action) { }); } +export function* updateQueueStats() { + yield takeLatest(UPDATE_QUEUE_STATS_REQUESTED, updateQueueStatsImpl); +} + +export function* updateQueueStatsImpl(action) { + const { + queueStats, + } = action; + yield put({ + type: UPDATE_QUEUE_STATS_COMPLETED, + queueStats, + }); +} + export function* checkConnectionStatus() { yield takeLatest(CHECK_CONNECTION_STATUS_REQUESTED, checkConnectionStatusImpl); } diff --git a/src/redux/incident_table/sagas.test.js b/src/redux/incident_table/sagas.test.js index 9c7594e8..70590184 100644 --- a/src/redux/incident_table/sagas.test.js +++ b/src/redux/incident_table/sagas.test.js @@ -37,9 +37,7 @@ describe('Sagas: Incident Table', () => { }, ]; - it('saveIncidentTableImpl', () => expectSaga( - saveIncidentTableImpl, { updatedIncidentTableColumns }, - ) + it('saveIncidentTableImpl', () => expectSaga(saveIncidentTableImpl, { updatedIncidentTableColumns }) .withReducer(incidentTable) .provide([ [select(selectIncidentTable), { incidentTableColumns: [], incidentTableState: {} }], diff --git a/src/redux/incidents/sagas.js b/src/redux/incidents/sagas.js index a00b0706..9badacdb 100644 --- a/src/redux/incidents/sagas.js +++ b/src/redux/incidents/sagas.js @@ -7,7 +7,10 @@ import { import Fuse from 'fuse.js'; import { - pd, throttledPdAxiosRequest, + pd, + throttledPdAxiosRequest, + pdParallelFetch, + resetLimiterWithRateLimit, } from 'util/pd-api-wrapper'; import { @@ -97,9 +100,6 @@ export function* getIncidentsImpl() { yield put({ type: UPDATE_INCIDENT_LAST_FETCH_DATE, }); - const { - maxIncidentsLimit, - } = yield select(selectSettings); const { sinceDate, incidentStatus, incidentUrgency, teamIds, serviceIds, userIds, } = yield select(selectQuerySettings); @@ -118,26 +118,7 @@ export function* getIncidentsImpl() { if (serviceIds.length) baseParams.service_ids = serviceIds; if (userIds.length) baseParams.user_ids = userIds; - // Define API requests to be made in parallel - const numberOfApiCalls = Math.ceil(maxIncidentsLimit / INCIDENTS_PAGINATION_LIMIT); - const incidentRequests = []; - for (let i = 0; i < numberOfApiCalls; i++) { - const params = { ...baseParams }; - params.offset = i * INCIDENTS_PAGINATION_LIMIT; - incidentRequests.push(call(throttledPdAxiosRequest, 'GET', 'incidents', params)); - } - const incidentResults = yield all(incidentRequests); - - // Stitch results together - const fetchedIncidents = []; - const incidentResultsData = incidentResults.map((res) => [...res.data.incidents]); - incidentResultsData.forEach((data) => { - data.forEach((incident) => fetchedIncidents.push(incident)); - }); - - // Sort incidents by reverse created_at date (i.e. recent incidents at the top) and truncate - fetchedIncidents.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); - incidents = fetchedIncidents.slice(0, maxIncidentsLimit); + incidents = yield call(pdParallelFetch, 'incidents', baseParams); } catch (e) { yield put({ type: FETCH_INCIDENTS_ERROR, message: e.message }); yield put({ @@ -162,11 +143,17 @@ export function* getIncidents() { fetchingIncidents: true, }); + const { + maxRateLimit, + } = yield select(selectSettings); + const { incidentPriority, escalationPolicyIds, searchQuery, } = yield select( selectQuerySettings, ); + + yield call(resetLimiterWithRateLimit, maxRateLimit); const incidents = yield getIncidentsImpl(); yield put({ type: FETCH_INCIDENTS_COMPLETED, @@ -197,11 +184,29 @@ export function* refreshIncidentsAsync() { export function* refreshIncidents() { try { // Fetch incidents, notes, and alerts for refresh + const { + incidentPriority, escalationPolicyIds, searchQuery, + } = yield select( + selectQuerySettings, + ); + + const { + maxRateLimit, + } = yield select(selectSettings); + + yield call(resetLimiterWithRateLimit, maxRateLimit); const incidents = yield getIncidentsImpl(); yield put({ type: REFRESH_INCIDENTS_COMPLETED, incidents, }); + // Filter incident list on priority (can't do this from API) + yield call(filterIncidentsByPriorityImpl, { incidentPriority }); + // Filter incident list on escalation policy (can't do this from API) + yield call(filterIncidentsByEscalationPolicyImpl, { escalationPolicyIds }); + // Filter updated incident list by query; updates memoized data within incidents table + yield call(filterIncidentsByQueryImpl, { searchQuery }); + yield call(getAllIncidentNotes); yield call(getAllIncidentAlerts); } catch (e) { diff --git a/src/redux/query_settings/sagas.test.js b/src/redux/query_settings/sagas.test.js index 31c5589c..6cc727aa 100644 --- a/src/redux/query_settings/sagas.test.js +++ b/src/redux/query_settings/sagas.test.js @@ -90,7 +90,7 @@ describe('Sagas: Query Settings', () => { }; const mockSettings = { maxIncidentsLimit: MAX_INCIDENTS_LIMIT_LOWER, - autoAcceptIncidentsQuery: false, + autoAcceptIncidentsQuery: true, }; it('validateIncidentQueryImpl: Within MAX_INCIDENTS_LIMIT_LOWER', () => { @@ -129,7 +129,9 @@ describe('Sagas: Query Settings', () => { ]) .silentRun() .then((result) => { - expect(result.storeState.status).toEqual(TOGGLE_DISPLAY_CONFIRM_QUERY_MODAL_REQUESTED); + // FIXME: This was previously `expect(result.storeState.status).toEqual(TOGGLE_DISPLAY_CONFIRM_QUERY_MODAL_REQUESTED);` + // but changed in https://github.com/giranm/pd-live-react/pull/449 due to introduction of a better implementation with API rate limits + expect(result.storeState.status).toEqual(CONFIRM_INCIDENT_QUERY_REQUESTED); }); }); diff --git a/src/redux/rootSaga.js b/src/redux/rootSaga.js index 16400ed9..33910a19 100644 --- a/src/redux/rootSaga.js +++ b/src/redux/rootSaga.js @@ -111,13 +111,17 @@ import { setDefaultSinceDateTenor, setAlertCustomDetailColumns, setMaxIncidentsLimit, + setMaxRateLimit, setAutoAcceptIncidentsQuery, setAutoRefreshInterval, clearLocalCache, } from './settings/sagas'; import { - updateConnectionStatus, checkConnectionStatus, checkAbilities, + updateConnectionStatus, + checkConnectionStatus, + checkAbilities, + updateQueueStats, } from './connection/sagas'; import { @@ -224,6 +228,7 @@ export default function* rootSaga() { setDefaultSinceDateTenor(), setAlertCustomDetailColumns(), setMaxIncidentsLimit(), + setMaxRateLimit(), setAutoAcceptIncidentsQuery(), setAutoRefreshInterval(), clearLocalCache(), @@ -231,6 +236,7 @@ export default function* rootSaga() { // Connection updateConnectionStatus(), checkConnectionStatus(), + updateQueueStats(), checkAbilities(), // Monitoring diff --git a/src/redux/settings/actions.js b/src/redux/settings/actions.js index 2a96a3ea..09c9f78d 100644 --- a/src/redux/settings/actions.js +++ b/src/redux/settings/actions.js @@ -12,6 +12,9 @@ export const SET_ALERT_CUSTOM_DETAIL_COLUMNS_COMPLETED = 'SET_ALERT_CUSTOM_DETAI export const SET_MAX_INCIDENTS_LIMIT_REQUESTED = 'SET_MAX_INCIDENTS_LIMIT_REQUESTED'; export const SET_MAX_INCIDENTS_LIMIT_COMPLETED = 'SET_MAX_INCIDENTS_LIMIT_COMPLETED'; +export const SET_MAX_RATE_LIMIT_REQUESTED = 'SET_MAX_RATE_LIMIT_REQUESTED'; +export const SET_MAX_RATE_LIMIT_COMPLETED = 'SET_MAX_RATE_LIMIT_COMPLETED'; + export const SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED = 'SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED'; export const SET_AUTO_ACCEPT_INCIDENTS_QUERY_COMPLETED = 'SET_AUTO_ACCEPT_INCIDENTS_QUERY_COMPLETED'; @@ -41,6 +44,11 @@ export const setMaxIncidentsLimit = (maxIncidentsLimit) => ({ maxIncidentsLimit, }); +export const setMaxRateLimit = (maxRateLimit) => ({ + type: SET_MAX_RATE_LIMIT_REQUESTED, + maxRateLimit, +}); + export const setAutoAcceptIncidentsQuery = (autoAcceptIncidentsQuery) => ({ type: SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED, autoAcceptIncidentsQuery, diff --git a/src/redux/settings/reducers.js b/src/redux/settings/reducers.js index 0264c08a..86c50cee 100644 --- a/src/redux/settings/reducers.js +++ b/src/redux/settings/reducers.js @@ -9,6 +9,8 @@ import { SET_ALERT_CUSTOM_DETAIL_COLUMNS_COMPLETED, SET_MAX_INCIDENTS_LIMIT_REQUESTED, SET_MAX_INCIDENTS_LIMIT_COMPLETED, + SET_MAX_RATE_LIMIT_REQUESTED, + SET_MAX_RATE_LIMIT_COMPLETED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_COMPLETED, SET_AUTO_REFRESH_INTERVAL_REQUESTED, @@ -56,6 +58,15 @@ const settings = produce( draft.status = SET_MAX_INCIDENTS_LIMIT_COMPLETED; break; + case SET_MAX_RATE_LIMIT_REQUESTED: + draft.status = SET_MAX_RATE_LIMIT_REQUESTED; + break; + + case SET_MAX_RATE_LIMIT_COMPLETED: + draft.maxRateLimit = action.maxRateLimit; + draft.status = SET_MAX_RATE_LIMIT_COMPLETED; + break; + case SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED: draft.status = SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED; break; @@ -90,7 +101,8 @@ const settings = produce( displaySettingsModal: false, defaultSinceDateTenor: '1 Day', maxIncidentsLimit: 200, - autoAcceptIncidentsQuery: false, + maxRateLimit: 200, + autoAcceptIncidentsQuery: true, autoRefreshInterval: 5, alertCustomDetailFields: [ { label: 'Environment:details.env', value: 'Environment:details.env', columnType: 'alert' }, diff --git a/src/redux/settings/sagas.js b/src/redux/settings/sagas.js index 3e87b913..8f4a1e07 100644 --- a/src/redux/settings/sagas.js +++ b/src/redux/settings/sagas.js @@ -16,6 +16,8 @@ import { SET_ALERT_CUSTOM_DETAIL_COLUMNS_COMPLETED, SET_MAX_INCIDENTS_LIMIT_REQUESTED, SET_MAX_INCIDENTS_LIMIT_COMPLETED, + SET_MAX_RATE_LIMIT_REQUESTED, + SET_MAX_RATE_LIMIT_COMPLETED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_COMPLETED, SET_AUTO_REFRESH_INTERVAL_REQUESTED, @@ -82,6 +84,20 @@ export function* setMaxIncidentsLimitImpl(action) { }); } +export function* setMaxRateLimit() { + yield takeLatest(SET_MAX_RATE_LIMIT_REQUESTED, setMaxRateLimitImpl); +} + +export function* setMaxRateLimitImpl(action) { + const { + maxRateLimit, + } = action; + yield put({ + type: SET_MAX_RATE_LIMIT_COMPLETED, + maxRateLimit, + }); +} + export function* setAutoAcceptIncidentsQuery() { yield takeLatest(SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED, setAutoAcceptIncidentsQueryImpl); } diff --git a/src/redux/settings/sagas.test.js b/src/redux/settings/sagas.test.js index 6cfd4371..5566d5ba 100644 --- a/src/redux/settings/sagas.test.js +++ b/src/redux/settings/sagas.test.js @@ -9,6 +9,8 @@ import { import { MAX_INCIDENTS_LIMIT_LOWER, MAX_INCIDENTS_LIMIT_UPPER, + MAX_RATE_LIMIT_LOWER, + MAX_RATE_LIMIT_UPPER, REFRESH_INTERVAL_LOWER, REFRESH_INTERVAL_UPPER, } from 'config/constants'; @@ -21,6 +23,8 @@ import { SET_ALERT_CUSTOM_DETAIL_COLUMNS_COMPLETED, SET_MAX_INCIDENTS_LIMIT_REQUESTED, SET_MAX_INCIDENTS_LIMIT_COMPLETED, + SET_MAX_RATE_LIMIT_REQUESTED, + SET_MAX_RATE_LIMIT_COMPLETED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_REQUESTED, SET_AUTO_ACCEPT_INCIDENTS_QUERY_COMPLETED, SET_AUTO_REFRESH_INTERVAL_REQUESTED, @@ -30,6 +34,7 @@ import { setDefaultSinceDateTenor, setAlertCustomDetailColumns, setMaxIncidentsLimit, + setMaxRateLimit, setAutoAcceptIncidentsQuery, setAutoRefreshInterval, } from './sagas'; @@ -51,7 +56,8 @@ describe('Sagas: Settings', () => { displaySettingsModal: false, defaultSinceDateTenor: tenor, maxIncidentsLimit: 200, - autoAcceptIncidentsQuery: false, + maxRateLimit: 200, + autoAcceptIncidentsQuery: true, autoRefreshInterval: 5, alertCustomDetailFields: [ { @@ -86,7 +92,8 @@ describe('Sagas: Settings', () => { displaySettingsModal: false, defaultSinceDateTenor: '1 Day', maxIncidentsLimit: 200, - autoAcceptIncidentsQuery: false, + maxRateLimit: 200, + autoAcceptIncidentsQuery: true, autoRefreshInterval: 5, alertCustomDetailFields, status: SET_ALERT_CUSTOM_DETAIL_COLUMNS_COMPLETED, @@ -112,7 +119,8 @@ describe('Sagas: Settings', () => { displaySettingsModal: false, defaultSinceDateTenor: '1 Day', maxIncidentsLimit, - autoAcceptIncidentsQuery: false, + maxRateLimit: 200, + autoAcceptIncidentsQuery: true, autoRefreshInterval: 5, alertCustomDetailFields: [ { @@ -125,6 +133,39 @@ describe('Sagas: Settings', () => { }) .silentRun(); }); + it('setMaxRateLimit', () => { + const maxRateLimit = faker.datatype.number({ + min: MAX_RATE_LIMIT_LOWER, + max: MAX_RATE_LIMIT_UPPER, + }); + return expectSaga(setMaxRateLimit) + .withReducer(settings) + .dispatch({ + type: SET_MAX_RATE_LIMIT_REQUESTED, + maxRateLimit, + }) + .put({ + type: SET_MAX_RATE_LIMIT_COMPLETED, + maxRateLimit, + }) + .hasFinalState({ + displaySettingsModal: false, + defaultSinceDateTenor: '1 Day', + maxIncidentsLimit: 200, + maxRateLimit, + autoAcceptIncidentsQuery: true, + autoRefreshInterval: 5, + alertCustomDetailFields: [ + { + label: 'Environment:details.env', + value: 'Environment:details.env', + columnType: 'alert', + }, + ], + status: SET_MAX_RATE_LIMIT_COMPLETED, + }) + .silentRun(); + }); it('setAutoAcceptIncidentsQuery', () => { const autoAcceptIncidentsQuery = true; return expectSaga(setAutoAcceptIncidentsQuery) @@ -141,6 +182,7 @@ describe('Sagas: Settings', () => { displaySettingsModal: false, defaultSinceDateTenor: '1 Day', maxIncidentsLimit: 200, + maxRateLimit: 200, autoAcceptIncidentsQuery, autoRefreshInterval: 5, alertCustomDetailFields: [ @@ -173,7 +215,8 @@ describe('Sagas: Settings', () => { displaySettingsModal: false, defaultSinceDateTenor: '1 Day', maxIncidentsLimit: 200, - autoAcceptIncidentsQuery: false, + maxRateLimit: 200, + autoAcceptIncidentsQuery: true, autoRefreshInterval, alertCustomDetailFields: [ { diff --git a/src/util/helpers.js b/src/util/helpers.js index 20714f3b..ffb8fd93 100644 --- a/src/util/helpers.js +++ b/src/util/helpers.js @@ -65,9 +65,7 @@ export const compareCreatedAt = (a, b) => moment(a.created_at).diff(moment(b.cre export const getSubdomainFromUserUrl = (htmlUrl) => htmlUrl.split('.')[0].split('https://')[1]; // Generate random integer between numbers -export const generateRandomInteger = (min = 0, max = 100) => Math.floor( - min + Math.random() * (max - min + 1), -); +export const generateRandomInteger = (min = 0, max = 100) => Math.floor(min + Math.random() * (max - min + 1)); /** * Uses canvas.measureText to compute and return the width of the given text of given font in pixels diff --git a/src/util/pd-api-wrapper.js b/src/util/pd-api-wrapper.js index 97144a23..fede6da0 100644 --- a/src/util/pd-api-wrapper.js +++ b/src/util/pd-api-wrapper.js @@ -67,15 +67,37 @@ export const pdAxiosRequest = async (method, endpoint, params = {}, data = {}) = }); // Ref: https://www.npmjs.com/package/bottleneck#refresh-interval -const limiter = new Bottleneck({ - reservoir: 1900, - reservoirRefreshAmount: 1900, +const limiterSettings = { + reservoir: 200, + reservoirRefreshAmount: 200, reservoirRefreshInterval: 60 * 1000, maxConcurrent: 20, - minTime: 60, -}); +}; -export const throttledPdAxiosRequest = limiter.wrap(pdAxiosRequest); +// limiter needs to be a mutable export because we need it to get the +// queue stats, and we have to reassign it when we clear the queue + +// eslint-disable-next-line import/no-mutable-exports +export let limiter = new Bottleneck(limiterSettings); + +// throttledPdAxiosRequest needs to be a mutable export because when we +// reset the limiter, we have to re-wrap pdAxiosRequest + +// eslint-disable-next-line import/no-mutable-exports +export let throttledPdAxiosRequest = limiter.wrap(pdAxiosRequest); + +// drop all the queued requests in the limiter - needed if we are getting +// the list of incidents again but there are still outstanding requests +// for notes, etc. +export const resetLimiterWithRateLimit = async (limit = 200) => { + await limiter.stop({ dropWaitingJobs: true }); + limiter = new Bottleneck({ + ...limiterSettings, + reservoir: limit, + reservoirRefreshAmount: limit, + }); + throttledPdAxiosRequest = limiter.wrap(pdAxiosRequest); +}; /* Optimized parallel fetch for paginated endpoints @@ -101,26 +123,20 @@ export const pdParallelFetch = async (endpoint, params, progressCallback) => { if (endpoint.indexOf('log_entries') > -1) reversedSortOrder = true; const firstPage = (await pdAxiosRequest('GET', endpoint, requestParams)).data; - let fetchedData = [...firstPage[endpointIdentifier(endpoint)]]; - requestParams.offset += requestParams.limit; + const fetchedData = firstPage[endpointIdentifier(endpoint)]; const promises = []; - let outerOffset = 0; - let more = true; - while (more && outerOffset + requestParams.offset < firstPage.total) { - while ( - more - && outerOffset + requestParams.offset < firstPage.total - && requestParams.offset < 10000 + if (firstPage.more) { + for ( + let offset = requestParams.limit; + offset < firstPage.total; + offset += requestParams.limit ) { - const promise = pdAxiosRequest('GET', endpoint, requestParams) + const promise = throttledPdAxiosRequest('GET', endpoint, { ...requestParams, offset }) .then(({ data, }) => { - fetchedData = [...fetchedData, ...data[endpointIdentifier(endpoint)]]; - if (data.more === false) { - more = false; - } + fetchedData.push(...data[endpointIdentifier(endpoint)]); if (progressCallback) { progressCallback(firstPage.total, fetchedData.length); } @@ -130,16 +146,10 @@ export const pdParallelFetch = async (endpoint, params, progressCallback) => { console.error(error); }); promises.push(promise); - requestParams.offset += requestParams.limit; } - await Promise.all(promises); - // eslint-disable-next-line max-len - fetchedData.sort((a, b) => (reversedSortOrder ? compareCreatedAt(b, a) : compareCreatedAt(a, b))); - const untilOrSince = reversedSortOrder ? 'until' : 'since'; - requestParams[untilOrSince] = fetchedData[fetchedData.length - 1].created_at; - outerOffset = fetchedData.length; - requestParams.offset = 0; } + await Promise.all(promises); + // eslint-disable-next-line max-len fetchedData.sort((a, b) => (reversedSortOrder ? compareCreatedAt(b, a) : compareCreatedAt(a, b))); return fetchedData; }; diff --git a/yarn.lock b/yarn.lock index c7784783..4e911e98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1203,20 +1203,12 @@ "@babel/helper-validator-option" "^7.16.7" "@babel/plugin-transform-typescript" "^7.16.7" -"@babel/runtime-corejs3@^7.10.2": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz#ea533d96eda6fdc76b1812248e9fbd0c11d4a1a7" - integrity sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg== - dependencies: - core-js-pure "^3.20.2" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.13.8", "@babel/runtime@^7.14.0", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== dependencies: - regenerator-runtime "^0.13.10" + regenerator-runtime "^0.13.11" "@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" @@ -1265,22 +1257,23 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@braintree/sanitize-url@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== +"@braintree/sanitize-url@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" + integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== -"@craco/craco@7.0.0-alpha.3": - version "7.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-7.0.0-alpha.3.tgz#158355141c9a007cf2ee04c8071b0ee44dfa4aae" - integrity sha512-ht3RsMMsg0xWaEbe1hh4DMM84njUzUXoBZ/lQXptPrQ0CR3w4dEXEn6kgw0rNwZbkbURxuB/dVRxroOQJ4F1YQ== +"@craco/craco@7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@craco/craco/-/craco-7.0.0.tgz#4e9243e53fba6ed4d2bc08aa65aae9d1b63541ed" + integrity sha512-OyjL9zpURB6Ha1HO62Hlt27Xd7UYJ8DRiBNuE4DBB8Ue0iQ9q/xsv3ze7ROm6gCZqV6I2Gxjnq0EHCCye+4xDQ== dependencies: + autoprefixer "^10.4.12" cosmiconfig "^7.0.1" cosmiconfig-typescript-loader "^1.0.0" - cross-spawn "^7.0.0" - lodash "^4.17.15" - semver "^7.3.2" - webpack-merge "^4.2.2" + cross-spawn "^7.0.3" + lodash "^4.17.21" + semver "^7.3.7" + webpack-merge "^5.8.0" "@cspotcode/source-map-consumer@0.8.0": version "0.8.0" @@ -1370,10 +1363,10 @@ resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.0.tgz#f6e0e58376f09e381a49bd553772a97a477da3fd" integrity sha512-T5ZyNSw9G0x0UDFiXV40a7VjKw2b+l4G+S0sctKqxhx8cg9QtMUAGwJBVU9mHPDPoZEmwm0tEoukjl4zb9MU7Q== -"@cypress/react@6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@cypress/react/-/react-6.2.1.tgz#3473136165c1bbe658f89becbe9fd0782aa506fa" - integrity sha512-c/ELgS2AgYM+6cKrSIRc0wd1fktalRWEvQRhuV+bVrvZHmU/BcrfIGsLT4juVLVjsK/jzl003vfQav2g9vF7ew== +"@cypress/react@7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@cypress/react/-/react-7.0.1.tgz#30089e918434a934db70e5d0d7efaa49c653c791" + integrity sha512-kDTHt2A4kpnGsot7fh+86G5lSS+gSH2NQypQVtfLOolit99rdTOuEY9zit7fIlSvxcNsGzNQ27sE1vre7CsywA== "@cypress/request@^2.88.10": version "2.88.10" @@ -1399,10 +1392,10 @@ tunnel-agent "^0.6.0" uuid "^8.3.2" -"@cypress/webpack-dev-server@^2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@cypress/webpack-dev-server/-/webpack-dev-server-2.5.0.tgz#a4b5e51a3ff47765f5eee5abb73efe4f3e4f44ee" - integrity sha512-IWd6nFiGTMXh89Si6KC3Snq9FnV4raijLt4jDHYvRt4S7y6IoG8Uiw37UpFfzbUpwSFl8FVbWr8VosIotEj1Pw== +"@cypress/webpack-dev-server@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@cypress/webpack-dev-server/-/webpack-dev-server-3.2.3.tgz#c907982bfcea2884aef16ffaed4e119ce0b111d3" + integrity sha512-59+567BQRO7kXEVz64vzbEv/9I53Tp7K+CUBd492wYZNrhjY8iDtWNmG4l5LX0ibtHmeG46rBCbd8PTViLD8Fg== dependencies: find-up "6.3.0" fs-extra "9.1.0" @@ -1422,25 +1415,25 @@ debug "^3.1.0" lodash.once "^4.1.1" -"@datadog/browser-core@4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@datadog/browser-core/-/browser-core-4.23.1.tgz#a7fe5c70613459f35e42d3830c52324dec9bc057" - integrity sha512-qPM3tnOwAw9BUL1b9KZ4yFQTQ8Z4vRKujnwS1c/EgQ/yzXltNLfphGi+Kn6wUzKP1QlwmERXUPKL7S+QXnc88Q== +"@datadog/browser-core@4.32.1": + version "4.32.1" + resolved "https://registry.yarnpkg.com/@datadog/browser-core/-/browser-core-4.32.1.tgz#bd35c24d8a44fd1613222ec49ca239ec24ba1b28" + integrity sha512-fDW0ZfyNSZwLowIFD5QRRm90f85PW1MSItiQmrzlC/l68FpKGEZ7PeKgIFypTTzX9NpvL0O/3s3YXf9E8e+dwg== -"@datadog/browser-rum-core@4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@datadog/browser-rum-core/-/browser-rum-core-4.23.1.tgz#b79d2ad4e855d75969fc4981a55d9d4ffde969d4" - integrity sha512-IaJ4KDe7hl4Qf5+O2Dl+i1DNrhaHhSE8h3jrunecrx/su4tDVL4OoOPTsA1wiZwVia31hkoyW/LhMzGmgMUFyQ== +"@datadog/browser-rum-core@4.32.1": + version "4.32.1" + resolved "https://registry.yarnpkg.com/@datadog/browser-rum-core/-/browser-rum-core-4.32.1.tgz#55f069d9ed953427a27cb4a590f0bc45c7e11a84" + integrity sha512-ojUn8Le1B/IwrefgqSD5Y83qFNTS5YW8TUry7amU22tCf2Yio1NjDARCZYJPXxgn60emK3+4R8fvbr/GvY0RGw== dependencies: - "@datadog/browser-core" "4.23.1" + "@datadog/browser-core" "4.32.1" -"@datadog/browser-rum@^4.23.1": - version "4.23.1" - resolved "https://registry.yarnpkg.com/@datadog/browser-rum/-/browser-rum-4.23.1.tgz#7f99a372b9917db92fe1f6f58b4a2668de718aa6" - integrity sha512-kWZaRpGqXWAPdBdjKD8nC2TRJQSq2Tc98vSc5b0bdXN0xugGq3Ptf79gz4kXyhQGMGLFLO70J/DKEBepXkGLfw== +"@datadog/browser-rum@^4.32.1": + version "4.32.1" + resolved "https://registry.yarnpkg.com/@datadog/browser-rum/-/browser-rum-4.32.1.tgz#f485582cfab90d4ef5dfe357c77ab67087e4a7b2" + integrity sha512-a+CL5KUpF5jIGjhQnK3CZUya2RexsQ0LJW45F3ukaDO7QhRlZ/bUYQCBLy0OMtzfGgQTKzDpyTxGyBP2wuu/ww== dependencies: - "@datadog/browser-core" "4.23.1" - "@datadog/browser-rum-core" "4.23.1" + "@datadog/browser-core" "4.32.1" + "@datadog/browser-rum-core" "4.32.1" "@emotion/babel-plugin@^11.7.1": version "11.9.2" @@ -1553,6 +1546,116 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@esbuild/android-arm64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.2.tgz#73aa058f1fdc43770afd9a7b39654ce7e1b2e774" + integrity sha512-QSkmYISXr2uFoR+NdmmKyR5svYb0cXDCfzwNblLsrC8wTpx/I1L7u/zrjrf4aLoHoRTycZFIewJwBiUrO5DWtQ== + +"@esbuild/android-arm@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.2.tgz#7cdb67672350177edbaa1de1bedd71b295989fab" + integrity sha512-Art7v3xYfqH1gEMUSP0Nx67pNAlC/Y3qSg3mOw8Wg7MP9bJLXL0DrmJaV1Qz1o4FwagtvDgkVOeBDpZgxdj13Q== + +"@esbuild/android-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.2.tgz#58cb40ea9502a619551dab8145ec19de3192f3d8" + integrity sha512-5VOaFBI0RK8jJVDHdeU1YJmpxXoOf1RPoiOBhk/Tvpulw7R1SwCsxHvC3eDQcoF0gV7YM4V2wJO0PR9tem6gCQ== + +"@esbuild/darwin-arm64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.2.tgz#d9d60f704e13611db85acf2cc1ce2ed34fe5e46a" + integrity sha512-iQJu1Zn1Wi91D5x/sslEn/jwae1tgSAEHK0R/kYzIr5jO992IJwDDuWhSGll23jHt18RECxahhGG0BWY/bVUTw== + +"@esbuild/darwin-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.2.tgz#4ae5735e1cd09b584cff4b8066a246cc62b06c97" + integrity sha512-j750nyrwoRZd3VnPo5sd12/5U27TxFGmvmoDv93G2jiaGJPYKJ/+5IfRAvHahGePTUIRPyOlE5YLFw9MlzuBnw== + +"@esbuild/freebsd-arm64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.2.tgz#0265bd51eb1951b27eb693fd4989a4154e32bd58" + integrity sha512-ti7GU+/KUQQXEPmSUep7efZpA3KR2SkKsVuSL2FE7Yxka9apuqKfymAgQmVPMxstzAgCRBIu8uEu0KFmTfs3/Q== + +"@esbuild/freebsd-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.2.tgz#7b29d68def0ab7c5a21e3d8ec67a7a47db5f9993" + integrity sha512-NgooSKWSnrNKRuiumY1dg7KAGpsyXIMcwyOXN9imnqe8VFjqqrEOMqZRik0C1wlfLjiSCuMsj+YUSmBMAJMt0A== + +"@esbuild/linux-arm64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.2.tgz#4ac9edc5011e0d5e3f8673c3c3b00dc5c9bf4459" + integrity sha512-jcJ4cxwQyqEqgDwkqj7820nKx9cM5WBPCCU4oUXvTeG+DkkJE6/P75od0VPHmItFfEJu+/2vV85ebvFVomZcBg== + +"@esbuild/linux-arm@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.2.tgz#5b3f46608b682e32255f6dce10ddcc150826df4d" + integrity sha512-8dfrRTd39n+THdAetwQKNwK6zBPR5oPjMtgRNXvRq8gsn/J5o69zTaOWVi3QO09BljqdShxU2dxDA09lDhdIqQ== + +"@esbuild/linux-ia32@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.2.tgz#21e123e2557236c847b38c2ea4dac3d8fbd1081c" + integrity sha512-dXZ3m++zaRVD2fqOUPP8QTh1Lfg6WO6uZDo/QJ3KdfnIR7dDToDtaA12AgKYvCed9Nuzf/gpKs/7/f6I02b/sg== + +"@esbuild/linux-loong64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.2.tgz#05e2ca319a925de0a28fe2d8a31e158f8172dac9" + integrity sha512-/vntXkzSe9TUp0Rh35Wgye1EOhDtmIMjwC4rtahHcALmDXL+iuQGvwGFvXrP+sBigia/ltLryMAvCiqGV6plqw== + +"@esbuild/linux-mips64el@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.2.tgz#98f0e25b86153d725d4379bc267a2cd4c9bcdd24" + integrity sha512-guYcNHjMRO1BMxWAeb8LDfgQaU8oeUO65xtlclwBD+hX3163KBifEHyao1hK96J10BP9n0UmZug6GhtGZaNm2Q== + +"@esbuild/linux-ppc64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.2.tgz#45252f5343c5178dae93f8f7fc97aa4304cc5cca" + integrity sha512-fzHTnIGIVqgUGZcFnnisguKD4UneF4uwWwkG+i8kBspMDdU1wJ0jha1VdtxWP7Ob1KGxuXcoUlrQkCVO+Z5iOw== + +"@esbuild/linux-riscv64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.2.tgz#6c4446ad19a4d8b070ea0ddf124b6ea53750d5e2" + integrity sha512-Sa+z7csvNVeAsTD83tVSggOb8CAU7EdDuihC8WhtoJfuDVkF5+Vi0imaiCjXQ7Ci5rz/a8IJ1H1MWX3eI9AmuQ== + +"@esbuild/linux-s390x@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.2.tgz#5c03feb73b0c3fa80834eb150cd9c14206681b4e" + integrity sha512-jUFCO+/VA1Y/oeauSNBubp2UtGu4xjBUEFVgMPm0qLuw6xw18yOagKwBOPVmyE3ZSFqGd9BAPZM/JrtadgBryA== + +"@esbuild/linux-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.2.tgz#60405f2a40fb792557293a11ba0c380cfe744fcc" + integrity sha512-naygxkSmr6x9tuvpa8iGefnXo3Rc3Noz7c4+Dn0MSfSWJwLaN2YR686e7HkI09irfjDdU5UAq9wcxUwjkYQNUA== + +"@esbuild/netbsd-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.2.tgz#be8afb6d91827ecb8a8f42a43c63b528bbdd9c53" + integrity sha512-Hagbdq4EpiG9XXJY6Ozfrl2RN5jkXZXd6BD39f43tWz0d8yyOrRZlofM1eA6JYQbdv6c8BUsUOcgopavIqwx4Q== + +"@esbuild/openbsd-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.2.tgz#18e9f4c8284ade701039df1de246a35161dd382e" + integrity sha512-Pkby+VEXY7+aWP8J2RUCfqWbbZz2M1GavRGGnE2kEPzwarba/BOk3B45PSaKwc3iKdK2rgCPCTjC/p9JoKNejA== + +"@esbuild/sunos-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.2.tgz#c45c5b6fa406af451e3ebe2ba610bfaad106d20b" + integrity sha512-WAyg4dBTUsAPJ9cRnuQ23cwJWYRhP4e4y0M/l2+EpRjWW+g1MNAXKQQNNhRQ71zc8UixRVrqj+43ReHeZC8mJQ== + +"@esbuild/win32-arm64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.2.tgz#6b6d31077cba24bd8bc9e173b9ae052b0bef5b0c" + integrity sha512-rMbO3gPpxuENd+AnZLgo4J/g+BkwxT3NK7nYpSZ0KlYtSdlxYMIMG5pznX7a1ISZKo67aGStne+K41jdkBywpA== + +"@esbuild/win32-ia32@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.2.tgz#88bb3a510006114d8291506b6ec9ff93f66d0d5c" + integrity sha512-73dWKDMhFk+4owS19OjEVbEDGFPRS1fyga3qOu5HPd5eTxJTjtlVTT/fG/S7AchA0vXS7hOqY70AAir1CkmICg== + +"@esbuild/win32-x64@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.2.tgz#a7ce1ae475e14febb80e2690430e399491206a61" + integrity sha512-QFJlhf73HCBjTqAWWSIlD8JQBtmue0Dd6UV+KGccycJ3HKj1dCkXdRKJGwc5bZWiI9hrxcWsVEa1kVFaltC4vQ== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -3158,22 +3261,22 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" -"@wojtekmaj/enzyme-adapter-react-17@^0.6.7": - version "0.6.7" - resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.7.tgz#7784bd32f518b186218cebb26c98c852676f30b0" - integrity sha512-B+byiwi/T1bx5hcj9wc0fUL5Hlb5giSXJzcnEfJVl2j6dGV2NJfcxDBYX0WWwIxlzNiFz8kAvlkFWI2y/nscZQ== +"@wojtekmaj/enzyme-adapter-react-17@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.8.0.tgz#138f404f82f502d152242c049e87d9621dcda4bd" + integrity sha512-zeUGfQRziXW7R7skzNuJyi01ZwuKCH8WiBNnTgUJwdS/CURrJwAhWsfW7nG7E30ak8Pu3ZwD9PlK9skBfAoOBw== dependencies: - "@wojtekmaj/enzyme-adapter-utils" "^0.1.4" + "@wojtekmaj/enzyme-adapter-utils" "^0.2.0" enzyme-shallow-equal "^1.0.0" has "^1.0.0" prop-types "^15.7.0" react-is "^17.0.0" react-test-renderer "^17.0.0" -"@wojtekmaj/enzyme-adapter-utils@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.4.tgz#bcd411ad6e368f17dce5425582c2907104cdb1ad" - integrity sha512-ARGIQSIIv3oBia1m5Ihn1VU0FGmft6KPe39SBKTb8p7LSXO23YI4kNtc4M/cKoIY7P+IYdrZcgMObvedyjoSQA== +"@wojtekmaj/enzyme-adapter-utils@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.2.0.tgz#dc2a8c14f92e502da28ea6b3fad96a082076d028" + integrity sha512-ZvZm9kZxZEKAbw+M1/Q3iDuqQndVoN8uLnxZ8bzxm7KgGTBejrGRoJAp8f1EN8eoO3iAjBNEQnTDW/H4Ekb0FQ== dependencies: function.prototype.name "^1.1.0" has "^1.0.0" @@ -3488,18 +3591,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -aria-query@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" - integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + deep-equal "^2.0.5" arr-union@^3.1.0: version "3.1.0" @@ -3516,15 +3613,15 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== +array-includes@^3.1.5, array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^1.0.1: @@ -3555,23 +3652,24 @@ array.prototype.filter@^1.0.0: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" -array.prototype.flat@^1.2.3, array.prototype.flat@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== +array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz#a7e8ed4225f4788a70cd910abcf0791e76a5534f" - integrity sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg== +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" array.prototype.reduce@^1.0.4: @@ -3585,6 +3683,17 @@ array.prototype.reduce@^1.0.4: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -3649,19 +3758,19 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@10.4.12: - version "10.4.12" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129" - integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q== +autoprefixer@10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: browserslist "^4.21.4" - caniuse-lite "^1.0.30001407" + caniuse-lite "^1.0.30001426" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -autoprefixer@10.4.5, autoprefixer@^10.4.6: +autoprefixer@10.4.5, autoprefixer@^10.4.12, autoprefixer@^10.4.6: version "10.4.5" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.5.tgz#662193c744094b53d3637f39be477e07bd904998" integrity sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw== @@ -3673,6 +3782,11 @@ autoprefixer@10.4.5, autoprefixer@^10.4.6: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3683,31 +3797,34 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" - integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== +axe-core@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.2.tgz#6e566ab2a3d29e415f5115bc0fd2597a5eb3e5e3" + integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== dependencies: - follow-redirects "^1.14.7" + follow-redirects "^1.14.9" + form-data "^4.0.0" -axios@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35" - integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA== +axios@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.3.tgz#31a3d824c0ebf754a004b585e5f04a5f87e6c4ff" + integrity sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw== dependencies: follow-redirects "^1.15.0" form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== + dependencies: + deep-equal "^2.0.5" babel-eslint@^10.1.0: version "10.1.0" @@ -4242,11 +4359,16 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001370: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz#3038bee70d8b875604cd8833cb0e5e254ee0281a" integrity sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA== -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001407: +caniuse-lite@^1.0.30001400: version "1.0.30001419" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001419.tgz#3542722d57d567c8210d5e4d0f9f17336b776457" integrity sha512-aFO1r+g6R7TW+PNQxKzjITwLOyDhVRLjW0LcwS/HCZGUUKTGNp9+IwLC4xyDSZBygVL/mxaFR3HIV6wEKQuSzw== +caniuse-lite@^1.0.30001426: + version "1.0.30001431" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== + case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" @@ -4577,11 +4699,16 @@ commander@^8.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@^9.4.0, commander@~9.4.1: +commander@^9.4.0: version "9.4.1" resolved "https://registry.yarnpkg.com/commander/-/commander-9.4.1.tgz#d1dd8f2ce6faf93147295c0df13c7c21141cfbdd" integrity sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw== +commander@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.0.tgz#71797971162cd3cf65f0b9d24eb28f8d303acdf1" + integrity sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" @@ -4689,11 +4816,6 @@ core-js-compat@^3.21.0, core-js-compat@^3.22.1: browserslist "^4.21.2" semver "7.0.0" -core-js-pure@^3.20.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.20.3.tgz#6cc4f36da06c61d95254efc54024fe4797fd5d02" - integrity sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA== - core-js-pure@^3.8.1: version "3.22.4" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.4.tgz#a992210f4cad8b32786b8654563776c56b0e0d0a" @@ -5009,10 +5131,10 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== -cy2@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/cy2/-/cy2-3.1.7.tgz#e1b9514b924b3c2dea5332b0783fc4e3375c985a" - integrity sha512-JOcwkcNU/41v+cBMvnRgIfVgn8ul4bgRkdPWsmy0JwsbcIVRdPwAxrrtBtYbsz/BH+wBfzWYO3NpwQkZOiQq8w== +cy2@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/cy2/-/cy2-3.4.3.tgz#c61665a953256e22399804f69067bb407ca922da" + integrity sha512-I1yfJWJTRy2ROti1TlLM5Qk86WSeKMrtZbY/G6VD2tjm3VKTu6pDkpcV56C2HhN+txK5p6MMsmzKXJM2W9JlxA== dependencies: acorn "^8.8.0" debug "^4.3.2" @@ -5022,10 +5144,10 @@ cy2@^3.1.7: npm-which "^3.0.1" slash "3.0.0" -cypress-fail-fast@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/cypress-fail-fast/-/cypress-fail-fast-5.0.1.tgz#b86803ec2df0292b55f7f2b0d9d9b7eb593fa359" - integrity sha512-8x1RGWki0Vldq3dNUuWnSUiDPBSdDqznSl8S8Z6aK3JBPaqMZOlVYWhCzoyymSpt4Ta8rL+IAuDJ/+5GA2faTA== +cypress-fail-fast@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cypress-fail-fast/-/cypress-fail-fast-7.0.0.tgz#d50c58a6807df3df14e4c9154ce9d9b01c3b4b24" + integrity sha512-N8ei7clcqSWD4jrRMO6zPzSWcQTabGdnkIJBPCcnYYrlNyqsO3xFSGo6x796cR5soqetv10LCTJyCbvqNniUyA== dependencies: chalk "4.1.2" @@ -5113,7 +5235,7 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== -debug@2.6.9, debug@^2.2.0, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.2.0, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -5157,6 +5279,29 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5704,16 +5849,78 @@ es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1: string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-abstract@^1.20.4: + version "1.21.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" + integrity sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.3" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.4" + is-array-buffer "^3.0.1" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.2" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + es-array-method-boxes-properly@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -5730,6 +5937,34 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild@^0.17.0: + version "0.17.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.2.tgz#c37ee608434be1c0e79f872c8bd484fb46af59df" + integrity sha512-odaHSgtYafOXt2nSISwdWlfRkb4ceMX3akY1mWspQpT08jsqVYEK1XtVusr250Rmbx8AVNWjMPI/yyvKqxOKMw== + optionalDependencies: + "@esbuild/android-arm" "0.17.2" + "@esbuild/android-arm64" "0.17.2" + "@esbuild/android-x64" "0.17.2" + "@esbuild/darwin-arm64" "0.17.2" + "@esbuild/darwin-x64" "0.17.2" + "@esbuild/freebsd-arm64" "0.17.2" + "@esbuild/freebsd-x64" "0.17.2" + "@esbuild/linux-arm" "0.17.2" + "@esbuild/linux-arm64" "0.17.2" + "@esbuild/linux-ia32" "0.17.2" + "@esbuild/linux-loong64" "0.17.2" + "@esbuild/linux-mips64el" "0.17.2" + "@esbuild/linux-ppc64" "0.17.2" + "@esbuild/linux-riscv64" "0.17.2" + "@esbuild/linux-s390x" "0.17.2" + "@esbuild/linux-x64" "0.17.2" + "@esbuild/netbsd-x64" "0.17.2" + "@esbuild/openbsd-x64" "0.17.2" + "@esbuild/sunos-x64" "0.17.2" + "@esbuild/win32-arm64" "0.17.2" + "@esbuild/win32-ia32" "0.17.2" + "@esbuild/win32-x64" "0.17.2" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5785,10 +6020,10 @@ eslint-config-airbnb@^18.2.1: object.assign "^4.1.2" object.entries "^1.1.2" -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== +eslint-config-prettier@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz#dec1d29ab728f4fa63061774e1672ac4e363d207" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== eslint-config-react-app@^7.0.1: version "7.0.1" @@ -5810,21 +6045,21 @@ eslint-config-react-app@^7.0.1: eslint-plugin-react-hooks "^4.3.0" eslint-plugin-testing-library "^5.0.1" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.3: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== +eslint-module-utils@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-cypress@^2.12.1: version "2.12.1" @@ -5841,23 +6076,25 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jest@^25.3.0: @@ -5867,23 +6104,26 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" - integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== +eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.0.tgz#b7a8ced4a427bb54eab050fc2a59e31938a16445" + integrity sha512-EGGRKhzejSzXKtjmEjWNtr4SK/DkMkSzkBH7g7e7moBDXZXrqaUIxkmD7uF93upMysc4dKYEJwupu7Dff+ShwA== dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" + axe-core "^4.6.2" + axobject-query "^3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" semver "^6.3.0" eslint-plugin-prettier@^4.2.1: @@ -5898,25 +6138,26 @@ eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.31.8: - version "7.31.8" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.8.tgz#3a4f80c10be1bcbc8197be9e8b641b2a3ef219bf" - integrity sha512-5lBTZmgQmARLLSYiwI71tiGVTLUuqXantZM6vlSY39OaDSV0M7+32K5DnLkmFrwTe+Ksz0ffuLUC91RUviVZfw== +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.1: + version "7.32.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.1.tgz#88cdeb4065da8ca0b64e1274404f53a0f9890200" + integrity sha512-vOjdgyd0ZHBXNsmvU+785xY8Bfe57EFbTYYk8XrROzWpr9QBvpjITvAXt9xqcE6+8cjR/g1+mfumPToxsl1www== dependencies: - array-includes "^3.1.5" - array.prototype.flatmap "^1.3.0" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.5" - object.fromentries "^2.0.5" - object.hasown "^1.1.1" - object.values "^1.1.5" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" - string.prototype.matchall "^4.0.7" + string.prototype.matchall "^4.0.8" eslint-plugin-testing-library@^5.0.1: version "5.0.3" @@ -6446,13 +6687,6 @@ find-up@6.3.0, find-up@^6.3.0: locate-path "^7.1.0" path-exists "^5.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -6497,7 +6731,7 @@ flush-write-stream@^1.0.2: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@^1.0.0, follow-redirects@^1.14.7, follow-redirects@^1.15.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -6507,6 +6741,13 @@ font-awesome@^4.7.0: resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -6592,6 +6833,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" + integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.0.1, fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -6751,6 +7001,15 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.3" + get-own-enumerable-property-symbols@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" @@ -6927,6 +7186,13 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + globby@^11.0.4, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -6970,6 +7236,13 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -7061,6 +7334,11 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" @@ -7363,22 +7641,24 @@ i18next-browser-languagedetector@^7.0.1: dependencies: "@babel/runtime" "^7.19.4" -i18next-parser@^6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/i18next-parser/-/i18next-parser-6.6.0.tgz#bb47e1a85369ff6fe8144b7bb03fe505374ecac2" - integrity sha512-yA3W6PL+7epCyUFTpUDdztKArfpeGMWRUOnB/4FZRodfXkjCIBcBg728h6b/lrBTbva4OlFjVgv1kCXbvZVRWQ== +i18next-parser@^7.6.0: + version "7.6.0" + resolved "https://registry.yarnpkg.com/i18next-parser/-/i18next-parser-7.6.0.tgz#6cf39b07513b1852a072b4ce70e088b3273c4785" + integrity sha512-NpBhaPzQXo9mo5nBP/eniOgUOlbDEd6WV7oEslUz3cxM8vClCz4c09iJ16tWUOTqbqSwoN2qhU2Y8w23SMwSnw== dependencies: "@babel/runtime" "^7.15.4" broccoli-plugin "^4.0.7" cheerio "^1.0.0-rc.2" colors "1.4.0" - commander "~9.4.1" + commander "~10.0.0" concat-stream "~2.0.0" eol "^0.9.1" - fs-extra "^10.0.0" + esbuild "^0.17.0" + fs-extra "^11.1.0" gulp-sort "^2.0.0" - i18next "^21.2.0" + i18next "^22.0.4" js-yaml "4.1.0" + lilconfig "^2.0.6" rsvp "^4.8.2" sort-keys "^5.0.0" through2 "~4.0.2" @@ -7387,19 +7667,19 @@ i18next-parser@^6.6.0: vinyl-fs "^3.0.2" vue-template-compiler "^2.6.11" -i18next@^21.2.0: - version "21.9.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.9.2.tgz#3f7c5594393eb27117c1db4c38f5ec766e68de0e" - integrity sha512-00fVrLQOwy45nm3OtC9l1WiLK3nJlIYSljgCt0qzTaAy65aciMdRy9GsuW+a2AtKtdg9/njUGfRH30LRupV7ZQ== +i18next@^22.0.4: + version "22.4.5" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.5.tgz#7324e4946c2facbe743ca25bca8980af05b0a109" + integrity sha512-Kc+Ow0guRetUq+kv02tj0Yof9zveROPBAmJ8UxxNODLVBRSwsM4iD0Gw3BEieOmkWemF6clU3K1fbnCuTqiN2Q== dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.6" -i18next@^22.0.4: - version "22.0.4" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.0.4.tgz#77d8871687b0ab072b38991e3887187823667e30" - integrity sha512-TOp7BTMKDbUkOHMzDlVsCYWpyaFkKakrrO3HNXfSz4EeJaWwnBScRmgQSTaWHScXVHBUFXTvShrCW8uryBYFcg== +i18next@^22.4.8: + version "22.4.9" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.9.tgz#98c8384c6bd41ff937da98b1e809ba03d3b41053" + integrity sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw== dependencies: - "@babel/runtime" "^7.17.2" + "@babel/runtime" "^7.20.6" iconv-lite@0.4.24: version "0.4.24" @@ -7447,7 +7727,12 @@ ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -immer@^9.0.15, immer@^9.0.7: +immer@^9.0.18: + version "9.0.19" + resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.19.tgz#67fb97310555690b5f9cd8380d38fc0aabb6b38b" + integrity sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ== + +immer@^9.0.7: version "9.0.15" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc" integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ== @@ -7520,6 +7805,15 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +internal-slot@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" + integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + side-channel "^1.0.4" + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -7555,6 +7849,23 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" +is-arguments@^1.1.0, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -7587,6 +7898,11 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -7599,14 +7915,14 @@ is-ci@^3.0.0: dependencies: ci-info "^3.2.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7670,6 +7986,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -7759,6 +8080,11 @@ is-root@^2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" @@ -7795,6 +8121,17 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -7822,6 +8159,11 @@ is-valid-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" integrity sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.1, is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7829,6 +8171,14 @@ is-weakref@^1.0.1, is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7841,6 +8191,11 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -8437,10 +8792,10 @@ jest@^27.4.3: import-local "^3.0.2" jest-cli "^27.5.1" -joi@^17.6.0: - version "17.6.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.6.0.tgz#0bb54f2f006c09a96e75ce687957bd04290054b2" - integrity sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw== +joi@^17.7.0: + version "17.7.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" + integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" @@ -8614,13 +8969,13 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.2.tgz#afe5efe4332cd3515c065072bd4d6b0aa22152bd" - integrity sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" + integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== dependencies: array-includes "^3.1.5" - object.assign "^4.1.2" + object.assign "^4.1.3" kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" @@ -8642,7 +8997,7 @@ language-subtag-registry@~0.3.2: resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" integrity sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg== -language-tags@^1.0.5: +language-tags@=1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" integrity sha1-0yHbxNowuovzAk4ED6XBRmH5GTo= @@ -8689,10 +9044,10 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lilconfig@^2.0.3, lilconfig@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" - integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" + integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== lines-and-columns@^1.1.6: version "1.2.4" @@ -8746,14 +9101,6 @@ local-pkg@0.4.1: resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.1.tgz#e7b0d7aa0b9c498a1110a5ac5b00ba66ef38cfff" integrity sha512-lL87ytIGP2FU5PWwNDo0w3WhIo2gopIAxPg9RxDYF7m4rr5ahuZxP22xnJHIvaLTe4Z9P6uKKY2UHiwyB4pcrw== -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -9153,12 +9500,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minimist@^1.2.0: +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== @@ -9526,12 +9868,12 @@ object-inspect@^1.11.0, object-inspect@^1.7.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-inspect@^1.12.0: +object-inspect@^1.12.0, object-inspect@^1.12.2: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-is@^1.0.2, object-is@^1.1.2: +object-is@^1.0.2, object-is@^1.1.2, object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -9544,7 +9886,7 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.0.4: +object.assign@^4.0.4, object.assign@^4.1.3, object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -9564,23 +9906,23 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" - integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== +object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" -object.fromentries@^2.0.0, object.fromentries@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" - integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== +object.fromentries@^2.0.0, object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" object.getownpropertydescriptors@^2.0.3: version "2.1.4" @@ -9601,22 +9943,22 @@ object.getownpropertydescriptors@^2.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" -object.hasown@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.1.tgz#ad1eecc60d03f49460600430d97f23882cf592a3" - integrity sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A== +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== dependencies: define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" -object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== +object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -9694,13 +10036,6 @@ ospath@^1.2.2: resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -9722,13 +10057,6 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" @@ -9772,11 +10100,6 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -9877,7 +10200,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -10552,10 +10875,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.5.1, prettier@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^2.5.1, prettier@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.0.tgz#c7df58393c9ba77d6fba3921ae01faf994fb9dc9" + integrity sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: version "5.6.0" @@ -10846,17 +11169,17 @@ react-bootstrap@^1.6.6: uncontrollable "^7.2.1" warning "^4.0.3" -react-datepicker@^4.8.0: - version "4.8.0" - resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.8.0.tgz#11b8918d085a1ce4781eee4c8e4641b3cd592010" - integrity sha512-u69zXGHMpxAa4LeYR83vucQoUCJQ6m/WBsSxmUMu/M8ahTSVMMyiyQzauHgZA2NUr9y0FUgOAix71hGYUb6tvg== +react-datepicker@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.10.0.tgz#3f386ac5873dac5ea56544e51cdc01109938796c" + integrity sha512-6IfBCZyWj54ZZGLmEZJ9c4Yph0s9MVfEGDC2evOvf9AmVz+RRcfP2Czqad88Ff9wREbcbqa4dk7IFYeXF1d3Ag== dependencies: "@popperjs/core" "^2.9.2" classnames "^2.2.6" date-fns "^2.24.0" prop-types "^15.7.2" - react-onclickoutside "^6.12.0" - react-popper "^2.2.5" + react-onclickoutside "^6.12.2" + react-popper "^2.3.0" react-dev-utils@^12.0.1: version "12.0.1" @@ -10897,10 +11220,10 @@ react-dom@^17.0.2: object-assign "^4.1.1" scheduler "^0.20.2" -react-dual-listbox@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/react-dual-listbox/-/react-dual-listbox-3.0.1.tgz#2086b75443bffc0b9f106841c7c4fce7da62e19f" - integrity sha512-eR/c7R9izOZAe+/cH6QgFEWT4bwPW1dlbhOjyP6H+DwKjFyRJ/O5jncQn4Tum4vR26OcR8Ytbh6mqx0K8oYs8g== +react-dual-listbox@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/react-dual-listbox/-/react-dual-listbox-4.0.0.tgz#8955ced5da4e39f5c4d14fceadf875e53dad295d" + integrity sha512-2SaJdRmQMtU95BYxoHQDKTsuOVQBJkvsP1iiY3Q33Td+OGg1Fq3JcMGSfGY77OypAmE5uhTfmCqBMnhoNy1pMw== dependencies: classnames "^2.2.5" lodash "^4.17.21" @@ -10917,12 +11240,12 @@ react-fast-compare@^3.0.1: resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== -react-i18next@^12.0.0: - version "12.0.0" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.0.0.tgz#634015a2c035779c5736ae4c2e5c34c1659753b1" - integrity sha512-/O7N6aIEAl1FaWZBNvhdIo9itvF/MO/nRKr9pYqRc9LhuC1u21SlfwpiYQqvaeNSEW3g3qUXLREOWMt+gxrWbg== +react-i18next@^12.1.5: + version "12.1.5" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.1.5.tgz#b65f5733dd2f96188a9359c009b7dbe27443f009" + integrity sha512-7PQAv6DA0TcStG96fle+8RfTwxVbHVlZZJPoEszwUNvDuWpGldJmNWa3ZPesEsZQZGF6GkzwvEh6p57qpFD2gQ== dependencies: - "@babel/runtime" "^7.14.5" + "@babel/runtime" "^7.20.6" html-parse-stringify "^3.0.1" react-inject-env@^2.0.1: @@ -10956,10 +11279,10 @@ react-lifecycles-compat@^3.0.4: resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== -react-onclickoutside@^6.12.0: - version "6.12.1" - resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.1.tgz#92dddd28f55e483a1838c5c2930e051168c1e96b" - integrity sha512-a5Q7CkWznBRUWPmocCvE8b6lEYw1s6+opp/60dCunhO+G6E4tDTO2Sd2jKE+leEnnrLAE2Wj5DlDHNqj5wPv1Q== +react-onclickoutside@^6.12.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz#8e6cf80c7d17a79f2c908399918158a7b02dda01" + integrity sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA== react-overlays@^5.1.2: version "5.2.0" @@ -10975,10 +11298,10 @@ react-overlays@^5.1.2: uncontrollable "^7.2.1" warning "^4.0.3" -react-popper@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.5.tgz#1214ef3cec86330a171671a4fbcbeeb65ee58e96" - integrity sha512-kxGkS80eQGtLl18+uig1UIf9MKixFSyPxglsgLBxlYnyDf65BiY9B3nZSc6C9XUNDgStROB0fMQlTEz1KxGddw== +react-popper@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== dependencies: react-fast-compare "^3.0.1" warning "^4.0.2" @@ -11055,10 +11378,10 @@ react-scripts@5.0.1: optionalDependencies: fsevents "^2.3.2" -react-select@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.6.0.tgz#d987f4c86b3dcd32307a0104e503e4e8a9777a34" - integrity sha512-uUvP/72rA8NGhOL16RVBaeC12Wa4NUE0iXIa6hz0YRno9ZgxTmpuMeKzjR7vHcwmigpVCoe0prP+3NVb6Obq8Q== +react-select@^5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/react-select/-/react-select-5.7.0.tgz#82921b38f1fcf1471a0b62304da01f2896cd8ce6" + integrity sha512-lJGiMxCa3cqnUr2Jjtg9YHsaytiZqeNOKeibv6WF5zbK/fPegZ1hg3y/9P1RZVLhqBTs0PfqQLKuAACednYGhQ== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -11217,17 +11540,10 @@ redux-saga@^1.2.1: dependencies: "@redux-saga/core" "^1.2.1" -redux@^4.0.4: - version "4.1.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" - integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== - dependencies: - "@babel/runtime" "^7.9.2" - -redux@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13" - integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA== +redux@^4.0.4, redux@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== dependencies: "@babel/runtime" "^7.9.2" @@ -11243,12 +11559,12 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== @@ -11265,7 +11581,7 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: +regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== @@ -11480,22 +11796,23 @@ resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" - integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" restore-cursor@^3.1.0: version "3.1.0" @@ -11586,10 +11903,10 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.1, rxjs@^7.5.4, rxjs@^7.5.6: - version "7.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc" - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw== +rxjs@^7.5.1, rxjs@^7.5.6, rxjs@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" @@ -11608,6 +11925,15 @@ safe-identifier@^0.4.1: resolved "https://registry.yarnpkg.com/safe-identifier/-/safe-identifier-0.4.2.tgz#cf6bfca31c2897c588092d1750d30ef501d59fcb" integrity sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w== +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -12184,18 +12510,18 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d" - integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg== +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" has-symbols "^1.0.3" internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.1" + regexp.prototype.flags "^1.4.3" side-channel "^1.0.4" string.prototype.replaceall@^1.0.6: @@ -12236,6 +12562,15 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string.prototype.trimstart@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" @@ -12253,6 +12588,15 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -12883,6 +13227,15 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -13067,10 +13420,10 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -use-debounce@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-8.0.4.tgz#27e93b2f010bd0b8ad06e9fc7de891d9ee5d6b8e" - integrity sha512-fGqsYQzl8kLHF2QpQSgIwgOgJmnh6j5L6SIzQiHdLfwp3q1egUL3btq5Bg2SJysH6A0ILLgT2IqXZKoNJr0nFw== +use-debounce@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.3.tgz#bac660c19ab7b38662e08608fee23c7ad303f532" + integrity sha512-FhtlbDtDXILJV7Lix5OZj5yX/fW1tzq+VrvK1fnT2bUrPOGruU9Rw8NCEn+UI9wopfERBEZAOQ8lfeCJPllgnw== use-isomorphic-layout-effect@^1.1.2: version "1.1.2" @@ -13270,16 +13623,16 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== +wait-on@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" + integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== dependencies: - axios "^0.25.0" - joi "^17.6.0" + axios "^0.27.2" + joi "^17.7.0" lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" + minimist "^1.2.7" + rxjs "^7.8.0" walk-sync@^2.2.0: version "2.2.0" @@ -13320,10 +13673,10 @@ wbuf@^1.1.0, wbuf@^1.7.3: dependencies: minimalistic-assert "^1.0.0" -web-vitals@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.0.4.tgz#a78ea93e95f7d7961dd151e0a76ac132c5dee2c9" - integrity sha512-Yau8qf1AJ/dm6MY180Bi0qpCIuWmAfKAnOqmxLecGfIHn0+ND3H4JOhXeY73Pyi9zjSF5J4SNUewHLNUzU7mmA== +web-vitals@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.1.0.tgz#a6f5156cb6c7fee562da46078540265ac2cd2d16" + integrity sha512-zCeQ+bOjWjJbXv5ZL0r8Py3XP2doCQMZXNKlBGfUjPAVZWokApdeF/kFlK1peuKlCt8sL9TFkKzyXE9/cmNJQA== webidl-conversions@^3.0.0: version "3.0.1" @@ -13399,14 +13752,7 @@ webpack-manifest-plugin@^4.0.2: tapable "^2.0.0" webpack-sources "^2.2.0" -webpack-merge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@^5.4.0: +webpack-merge@^5.4.0, webpack-merge@^5.8.0: version "5.8.0" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== @@ -13533,11 +13879,33 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.10, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"