From bf6d21ec2f1c321521a173de4f56c828172a536b Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Mon, 7 Feb 2022 15:09:45 +0100 Subject: [PATCH 01/16] include validation that checks if there are service types in associated metric profile which are not used in aggregation profile --- .../frontend/react/AggregationProfiles.js | 39 ++++++- .../__tests__/AggregationProfiles.test.js | 109 +++++++++++++++++- 2 files changed, 141 insertions(+), 7 deletions(-) diff --git a/poem/Poem/frontend/react/AggregationProfiles.js b/poem/Poem/frontend/react/AggregationProfiles.js index 599c1b7e4..49df8aa0e 100644 --- a/poem/Poem/frontend/react/AggregationProfiles.js +++ b/poem/Poem/frontend/react/AggregationProfiles.js @@ -95,7 +95,7 @@ const AggregationProfileAutocompleteField = ({service, index, isNew, groupNew, g }} getSuggestionValue={(suggestion) => suggestion} suggestions={suggestionList} - renderSuggestion={(suggestion, {query, isHighlighted}) => + renderSuggestion={(suggestion, {_, isHighlighted}) =>
{ const [modalTitle, setModalTitle] = useState(undefined); const [onYes, setOnYes] = useState('') const [dropdownOpen, setDropdownOpen] = useState(false); - // TODO: useFormik hook with formik 2.x const [formikValues, setFormikValues] = useState({}) const hiddenFileInput = React.useRef(null); const formikRef = React.useRef(); @@ -939,6 +938,27 @@ export const AggregationProfilesChange = (props) => { return isMissing } + const checkIfServiceExtraInMetricProfile = (servicesMetricProfile, serviceGroupsAggregationProfile) => { + let serviceGroupsInAggregationProfile = new Set() + let _difference = new Set(servicesMetricProfile) + let isExtra = false + + serviceGroupsAggregationProfile.forEach(group => { + for (let service of group.services) { + serviceGroupsInAggregationProfile.add(service.name) + } + }) + + for (let elem of serviceGroupsInAggregationProfile) { + _difference.delete(elem) + } + + if (_difference.size > 0) + isExtra = true + + return { isServiceExtra: isExtra, extraServices: Array.from(_difference).sort(sortServices) } + } + const handleFileRead = (e) => { let jsonData = JSON.parse(e.target.result); formikRef.current.setFieldValue('metric_operation', jsonData.metric_operation); @@ -981,6 +1001,7 @@ export const AggregationProfilesChange = (props) => { setListServices(!addview ? extractListOfServices(webApiAP.metric_profile, metricProfiles) : []) let isServiceMissing = checkIfServiceMissingInMetricProfile(listServices, !addview ? webApiAP.groups : []) + let { isServiceExtra, extraServices } = checkIfServiceExtraInMetricProfile(listServices, !addview ? webApiAP.groups : []) let write_perm = undefined if (publicView) { @@ -1082,12 +1103,24 @@ export const AggregationProfilesChange = (props) => { { (isServiceMissing && !publicView) && -
+
  Some Service Flavours used in Aggregation profile are not presented in associated Metric profile meaning that two profiles are out of sync. Check below for Service Flavours in blue borders.
} + { + (isServiceExtra && !publicView) && + +
+

+   + There are some extra Service Flavours in associated metric profile which are not used in the aggregation profile, meaning that two profiles are out of sync: +

+

{ extraServices.join(', ') }

+
+
+ } { }) }) - test('Test that page renders properly', async () => { + test('Test that page renders properly without alerts', async () => { renderChangeView(); await waitFor(() => { @@ -662,7 +737,33 @@ describe('Tests for aggregation profiles changeview', () => { expect(screen.getByRole('button', { name: 'Add new group' })).toBeInTheDocument(); expect(screen.getByRole('button', { name: /json/i })).toBeInTheDocument(); - expect(screen.getByRole('alert')).toBeInTheDocument(); + expect(screen.queryByTestId(/alert/i)).not.toBeInTheDocument(); + }) + + test('Test alert if metric profile is missing service types', async () => { + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change aggregation profile'); + }) + + await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'FEDCLOUD') + + expect(screen.getByTestId('alert-missing')).toBeInTheDocument(); + expect(screen.queryByTestId('alert-extra')).not.toBeInTheDocument() + }) + + test('Test alert if metric profile has extra service types', async () => { + renderChangeView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change aggregation profile') + }) + + await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'ARGO_MON_TEST') + + expect(screen.queryByTestId('alert-missing')).not.toBeInTheDocument() + expect(screen.getByTestId('alert-extra')).toBeInTheDocument() }) test('Test that public page renders properly', async () => { @@ -757,7 +858,7 @@ describe('Tests for aggregation profiles changeview', () => { expect(screen.queryByRole('button', { name: 'Add new group' })).not.toBeInTheDocument(); expect(screen.queryByRole('button', { name: /json/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('alert')).not.toBeInTheDocument(); + expect(screen.queryByTestId(/alert/i)).not.toBeInTheDocument(); }) test('Test import json successfully', async () => { @@ -2937,4 +3038,4 @@ describe('Test for aggregation profile version detail page', () => { expect(screen.queryByRole('alert')).not.toBeInTheDocument(); }) -}) \ No newline at end of file +}) From 359370334086380b224f8c6cb3dbfd8bdb8bce25 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Tue, 22 Feb 2022 11:53:20 +0100 Subject: [PATCH 02/16] use form values for validation --- .../frontend/react/AggregationProfiles.js | 181 +++++++++--------- 1 file changed, 89 insertions(+), 92 deletions(-) diff --git a/poem/Poem/frontend/react/AggregationProfiles.js b/poem/Poem/frontend/react/AggregationProfiles.js index 49df8aa0e..3c6d98a0e 100644 --- a/poem/Poem/frontend/react/AggregationProfiles.js +++ b/poem/Poem/frontend/react/AggregationProfiles.js @@ -941,7 +941,6 @@ export const AggregationProfilesChange = (props) => { const checkIfServiceExtraInMetricProfile = (servicesMetricProfile, serviceGroupsAggregationProfile) => { let serviceGroupsInAggregationProfile = new Set() let _difference = new Set(servicesMetricProfile) - let isExtra = false serviceGroupsAggregationProfile.forEach(group => { for (let service of group.services) { @@ -953,10 +952,7 @@ export const AggregationProfilesChange = (props) => { _difference.delete(elem) } - if (_difference.size > 0) - isExtra = true - - return { isServiceExtra: isExtra, extraServices: Array.from(_difference).sort(sortServices) } + return Array.from(_difference).sort(sortServices) } const handleFileRead = (e) => { @@ -1001,7 +997,6 @@ export const AggregationProfilesChange = (props) => { setListServices(!addview ? extractListOfServices(webApiAP.metric_profile, metricProfiles) : []) let isServiceMissing = checkIfServiceMissingInMetricProfile(listServices, !addview ? webApiAP.groups : []) - let { isServiceExtra, extraServices } = checkIfServiceExtraInMetricProfile(listServices, !addview ? webApiAP.groups : []) let write_perm = undefined if (publicView) { @@ -1088,96 +1083,98 @@ export const AggregationProfilesChange = (props) => { validateOnChange={false} innerRef={formikRef} > - {props => ( -
- { - if (current.values.metric_profile !== prev.values.metric_profile) { - let selected_profile = { - name: current.values.metric_profile + {props => { + let extraServices = checkIfServiceExtraInMetricProfile(listServices, props.values.groups) + return ( + + { + if (current.values.metric_profile !== prev.values.metric_profile) { + let selected_profile = { + name: current.values.metric_profile + } + setListServices(extractListOfServices(selected_profile, + metricProfiles)) } - setListServices(extractListOfServices(selected_profile, - metricProfiles)) - } - }} - /> - { - (isServiceMissing && !publicView) && - -
-   - Some Service Flavours used in Aggregation profile are not presented in associated Metric profile meaning that two profiles are out of sync. Check below for Service Flavours in blue borders. -
-
- } - { - (isServiceExtra && !publicView) && + }} + /> + { + (isServiceMissing && !publicView) && -
-

-   - There are some extra Service Flavours in associated metric profile which are not used in the aggregation profile, meaning that two profiles are out of sync: -

-

{ extraServices.join(', ') }

+
+   + Some Service Flavours used in Aggregation profile are not presented in associated Metric profile meaning that two profiles are out of sync. Check below for Service Flavours in blue borders.
- } - - { - !publicView ? - ( - - - - )} - /> - : - - } - { - (write_perm) && -
- { - !addview ? - - : -
- } - -
- } - - )} + } + { + (extraServices.length > 0 && !publicView) && + +
+

+   + There are some extra Service Flavours in associated metric profile which are not used in the aggregation profile, meaning that two profiles are out of sync: +

+

{ extraServices.join(', ') }

+
+
+ } + + { + !publicView ? + ( + + + + )} + /> + : + + } + { + (write_perm) && +
+ { + !addview ? + + : +
+ } + +
+ } + + )}} ) From 74d65cf7a97ac949aaadf2951ec3566e0e61765e Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Tue, 8 Mar 2022 11:29:43 +0100 Subject: [PATCH 03/16] separated tests into smaller, more detailed ones --- .../frontend/react/__tests__/Reports.test.js | 5177 ++++++++++++----- 1 file changed, 3568 insertions(+), 1609 deletions(-) diff --git a/poem/Poem/frontend/react/__tests__/Reports.test.js b/poem/Poem/frontend/react/__tests__/Reports.test.js index 4595812a8..36e2c5e68 100644 --- a/poem/Poem/frontend/react/__tests__/Reports.test.js +++ b/poem/Poem/frontend/react/__tests__/Reports.test.js @@ -175,6 +175,7 @@ const mockReport = { ] }; + const mockReport2 = { id: "yee9chel-5o4u-l4j4-410b-eipi3ohrah5i", tenant: "EGI", @@ -886,6 +887,107 @@ describe('Tests for reports listview', () => { }) +const report4sending = { + id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', + info: { + name: 'Critical', + description: 'Critical report' + }, + thresholds: { + availability: 80, + reliability: 85, + uptime: 0.8, + unknown: 0.1, + downtime: 0.1 + }, + disabled: false, + profiles: [ + { + id: 'iethai8e-5nv4-urd2-6frc-eequ1saifoon', + name: 'ARGO_MON_CRITICAL', + type: 'metric' + }, + { + id: 'goo4nohb-lc8y-l5bj-v991-ohzah8xethie', + name: 'critical', + type: 'aggregation' + }, + { + id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', + name: 'egi_ops', + type: 'operations' + } + ], + topology_schema: { + group: { + type: "NGI", + group: { + type: "SITES" + } + } + }, + filter_tags: [ + { + name: "certification", + value: "Certified", + context: "argo.group.filter.tags.array" + }, + { + name: "infrastructure", + value: "Production", + context: "argo.group.filter.tags.array" + }, + { + name: "scope", + value: "EGI*", + context: "argo.group.filter.tags.array" + }, + { + name: "info_ext_GLUE2ComputingShareMappingQueue", + value: "condor", + context: "argo.group.filter.tags.array" + }, + { + name: "production", + value: "1", + context: "argo.endpoint.filter.tags" + }, + { + name: "monitored", + value: "1", + context: "argo.endpoint.filter.tags" + }, + { + name: "scope", + value: "EGI*", + context: "argo.endpoint.filter.tags.array" + }, + { + name: "group", + value: "iris.ac.uk", + context: "argo.group.filter.fields" + }, + { + name: "group", + value: "dirac-durham", + context: "argo.group.filter.fields" + }, + { + name: "group", + value: "IRISOPS-IAM", + context: "argo.group.filter.fields" + } + ] +} + +const backendReport4sending = { + name: 'Critical', + description: 'Critical report', + groupname: 'ARGO', + apiid: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' +} + + describe('Tests for reports changeview', () => { jest.spyOn(NotificationManager, 'success'); jest.spyOn(NotificationManager, 'error'); @@ -922,6 +1024,39 @@ describe('Tests for reports changeview', () => { expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Change report'); }) + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) + const nameField = screen.getByTestId('name'); const disabledField = screen.getByLabelText(/disabled/i); const descriptionField = screen.getByLabelText(/description/i); @@ -1351,7 +1486,7 @@ describe('Tests for reports changeview', () => { expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); }) - test('Test change report and save', async () => { + test('Test change report name', async () => { mockChangeObject.mockReturnValueOnce( Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) ) @@ -1359,119 +1494,194 @@ describe('Tests for reports changeview', () => { Promise.resolve({ ok: 'ok' }) ) - renderChangeView(); + renderChangeView() await waitFor(() => { expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); }) - await selectEvent.select(screen.getByText('ARGO'), 'TEST') - - fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) - - await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') - await selectEvent.select(screen.getAllByText(/select/i)[0], 'TEST_PROFILE') - - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); - - fireEvent.click(card_groups.getByTestId(/removeTag-2/i)); - fireEvent.click(card_groups.getByText(/add new tag/i)); - - const selectTagName = card_groups.getAllByText(/select/i)[0] - const selectTagValue = card_groups.getAllByText(/select/i)[1] - - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); - - await selectEvent.select(selectTagName, 'monitored') + fireEvent.change(screen.getByTestId('name'), { target: { value: 'new-report-name' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'new-report-name', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await selectEvent.select(selectTagValue, 'yes') + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + let backendReport = JSON.parse(JSON.stringify(backendReport4sending)) + frontendReport.info.name = 'new-report-name' + backendReport.name = 'new-report-name' + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - expect(card_groups.queryByText(/select/i)).not.toBeInTheDocument(); - await selectEvent.select(card_groups.getByText('GLUE2ComputingShareMappingQueue'), 'GLUE2EndpointImplementationName') + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport + ) + }) - const selectExtensionValue = card_groups.getByText('condor'); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + test('Test disable report', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - expect(selectExtensionValue).toBeInTheDocument(); - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') + renderChangeView() - await selectEvent.select(card_groups.getByText('dirac-durham'), 'RU-SARFTI'); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) - fireEvent.click(card_endpoints.getByTestId(/removeTag-0/i)); - fireEvent.click(card_endpoints.getByText(/add new extension/i)) + fireEvent.click(screen.getByLabelText(/disabled/i)) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': true, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - expect(card_endpoints.getAllByText(/select/i)).toHaveLength(2) + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.disabled = true + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] - const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + test('Test change groupname', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + renderChangeView() - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') + await selectEvent.select(screen.getByText('ARGO'), 'TEST') - fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); - fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }); - fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }); - fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }); - fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.2' } }); + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'TEST', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) fireEvent.click(screen.getByRole('button', { name: /save/i })); await waitFor(() => { @@ -1480,245 +1690,302 @@ describe('Tests for reports changeview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockChangeReport).toHaveBeenCalledWith({ - id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', - info: { - name: 'Critical', - description: 'More elaborate description of the critical report.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - }, - { - id: 'Iesh4Eis-Z6JC-xWK8-O5KG-nae4eephoLah', - name: 'TEST_PROFILE', - type: 'thresholds' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags.array', - name: 'certification', - value: 'Certified' - }, - { - context: 'argo.group.filter.tags.array', - name: 'infrastructure', - value: 'Production' - }, - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'scope', - value: 'EGI*' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - }, - { - name: "group", - value: "iris.ac.uk", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "dirac-durham", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "IRISOPS-IAM", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "RU-SARFTI", - context: "argo.group.filter.fields" - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockChangeReport).toHaveBeenCalledWith(report4sending) }) + let backendReport = JSON.parse(JSON.stringify(backendReport4sending)) + backendReport.groupname = 'TEST' await waitFor(() => { expect(mockChangeObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - name: 'Critical', - description: 'More elaborate description of the critical report.', - groupname: 'TEST', - apiid: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - } + '/api/v2/internal/reports/', backendReport ) }) - expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') expect(NotificationManager.success).toHaveBeenCalledWith( 'Report successfully changed', 'Changed', 2000 ) }) - test('Test error changing report on web api with error message', async () => { - mockChangeReport.mockImplementationOnce( () => { - throw Error('406 Content Not acceptable: There has been an error.') - } ); + test('Test change description', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - renderChangeView(); + renderChangeView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() }) - await selectEvent.select(screen.getByText('ARGO'), 'TEST') - - fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'Some new description' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Some new description', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.info.description = 'Some new description' + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - fireEvent.click(card_groups.getByTestId(/removeTag-2/i)); - fireEvent.click(card_groups.getByText(/add new tag/i)); + let backendReport = JSON.parse(JSON.stringify(backendReport4sending)) + backendReport.description = 'Some new description' + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport + ) + }) - const selectTagName = card_groups.getAllByText(/select/i)[0] - const selectTagValue = card_groups.getAllByText(/select/i)[1] + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); + test('Test change metric profile', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - await selectEvent.select(selectTagName, 'monitored') + renderChangeView() - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - await selectEvent.select(selectTagValue, 'yes') + await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - expect(card_groups.queryByText(/select/i)).not.toBeInTheDocument(); - await selectEvent.select(card_groups.getByText('GLUE2ComputingShareMappingQueue'), 'GLUE2EndpointImplementationName') + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'OPS_MONITOR_RHEL7', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - const selectExtensionValue = card_groups.getByText('condor'); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.profiles.forEach(profile => { + if (profile.type === 'metric') { + profile.id = 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s' + profile.name = 'OPS_MONITOR_RHEL7' + } + }) + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - expect(selectExtensionValue).toBeInTheDocument(); - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - await selectEvent.select(card_groups.getByText('dirac-durham'), 'RU-SARFTI'); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - fireEvent.click(card_endpoints.getByTestId(/removeTag-0/i)); - fireEvent.click(card_endpoints.getByText(/add new extension/i)) + test('Test change aggregation profile', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - expect(card_endpoints.getAllByText(/select/i)).toHaveLength(2) + renderChangeView() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] - const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] + await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'ops-mon-critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.profiles.forEach(profile => { + if (profile.type === 'aggregation') { + profile.id = 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2' + profile.name = 'ops-mon-critical' + } + }) + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); - fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }); - fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }); - fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }); - fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.2' } }); + test('Test change thresholds profile', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) + + renderChangeView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) + + await selectEvent.select(screen.getAllByText(/select/i)[0], 'test-thresholds') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': 'test-thresholds', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) fireEvent.click(screen.getByRole('button', { name: /save/i })); await waitFor(() => { @@ -1726,237 +1993,307 @@ describe('Tests for reports changeview', () => { }) fireEvent.click(screen.getByRole('button', { name: /yes/i })); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.profiles.push({ + id: 'aH9se5aJ-MP2e-3oIF-GQU2-ShoobeeK3ohs', + name: 'test-thresholds', + type: 'thresholds' + }) + await waitFor(() => { - expect(mockChangeReport).toHaveBeenCalledWith({ - id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', - info: { - name: 'Critical', - description: 'More elaborate description of the critical report.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags.array', - name: 'certification', - value: 'Certified' - }, - { - context: 'argo.group.filter.tags.array', - name: 'infrastructure', - value: 'Production' - }, - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'scope', - value: 'EGI*' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - }, - { - name: "group", - value: "iris.ac.uk", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "dirac-durham", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "IRISOPS-IAM", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "RU-SARFTI", - context: "argo.group.filter.fields" - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) }) await waitFor(() => { - expect(mockChangeObject).not.toHaveBeenCalled(); + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

406 Content Not acceptable: There has been an error.

-

Click to dismiss.

-
, - 'Web API error', - 0, - expect.any(Function) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 ) }) - test('Test error changing report on web api without error message', async () => { - mockChangeReport.mockImplementationOnce( () => { throw Error() } ); + test('Test change topology type', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - renderChangeView(); + renderChangeView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() }) - await selectEvent.select(screen.getByText('ARGO'), 'TEST') + expect(screen.getAllByText(/sites/i)).toHaveLength(2) + expect(screen.getByText(/ngis/i)).toBeInTheDocument() + expect(screen.queryByText(/service groups/i)).not.toBeInTheDocument() + expect(screen.queryByText(/projects/i)).not.toBeInTheDocument() + + await selectEvent.select(screen.getByText('Sites'), 'ServiceGroups') + + expect(screen.getByText(/projects/i)).toBeInTheDocument() + expect(screen.getByText(/service groups/i)).toBeInTheDocument() + expect(screen.queryByText(/sites/i)).not.toBeInTheDocument() + expect(screen.queryByText(/ngis/i)).not.toBeInTheDocument() + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'ServiceGroups', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.topology_schema = { + group: { + type: 'PROJECT', + group: { + type: 'SERVICEGROUPS' + } + } + } - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - fireEvent.click(card_groups.getByTestId(/removeTag-2/i)); - fireEvent.click(card_groups.getByText(/add new tag/i)); + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - const selectTagName = card_groups.getAllByText(/select/i)[0] - const selectTagValue = card_groups.getAllByText(/select/i)[1] + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); + test('Test change groups tags', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - await selectEvent.select(selectTagName, 'monitored') + renderChangeView() - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - await selectEvent.select(selectTagValue, 'yes') + const card_groups = within(screen.getByTestId('card-group-of-groups')); - expect(card_groups.queryByText(/select/i)).not.toBeInTheDocument(); - await selectEvent.select(card_groups.getByText('GLUE2ComputingShareMappingQueue'), 'GLUE2EndpointImplementationName') + await selectEvent.select(card_groups.getByText('Certified'), 'Candidate') - const selectExtensionValue = card_groups.getByText('condor'); + fireEvent.click(card_groups.getByTestId('removeTag-1')) - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + fireEvent.click(card_groups.getByRole('button', { name: /add new tag/i })) - expect(selectExtensionValue).toBeInTheDocument(); - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'monitored') + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'yes') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': ['Certified', 'Candidate'], + 'groupsTags.1.name': 'scope', + 'groupsTags.1.value': 'EGI*', + 'groupsTags.2.name': 'monitored', + 'groupsTags.2.value': 'yes', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - await selectEvent.select(card_groups.getByText('dirac-durham'), 'RU-SARFTI'); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - fireEvent.click(card_endpoints.getByTestId(/removeTag-0/i)); - fireEvent.click(card_endpoints.getByText(/add new extension/i)) + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.filter_tags[0] = { + name: 'certification', + value: 'Certified, Candidate', + context: 'argo.group.filter.tags.array' + } + frontendReport.filter_tags.splice(1, 1) + frontendReport.filter_tags.splice( + 2, 0, { + name: 'monitored', + value: '1', + context: 'argo.group.filter.tags' + } + ) - expect(card_endpoints.getAllByText(/select/i)).toHaveLength(2) + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] - const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + test('Test change group extensions', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + renderChangeView() - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + const card_groups = within(screen.getByTestId('card-group-of-groups')); - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') + await selectEvent.select(card_groups.getByText('condor'), 'eddie') + + fireEvent.click(card_groups.getByText(/add new extension/i)) + + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'GLUE2EndpointImplementationName') + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'ARC-CE') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': ['condor', 'eddie'], + 'groupsExtensions.1.name': 'GLUE2EndpointImplementationName', + 'groupsExtensions.1.value': 'ARC-CE', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); - fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }); - fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }); - fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }); - fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.2' } }); + fireEvent.click(card_groups.getByTestId('removeExtension-0')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2EndpointImplementationName', + 'groupsExtensions.0.value': 'ARC-CE', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) fireEvent.click(screen.getByRole('button', { name: /save/i })); await waitFor(() => { @@ -1964,242 +2301,302 @@ describe('Tests for reports changeview', () => { }) fireEvent.click(screen.getByRole('button', { name: /yes/i })); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.filter_tags[3] = { + name: 'info_ext_GLUE2EndpointImplementationName', + value: 'ARC-CE', + context: 'argo.group.filter.tags.array' + } + await waitFor(() => { - expect(mockChangeReport).toHaveBeenCalledWith({ - id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', - info: { - name: 'Critical', - description: 'More elaborate description of the critical report.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags.array', - name: 'certification', - value: 'Certified' - }, - { - context: 'argo.group.filter.tags.array', - name: 'infrastructure', - value: 'Production' - }, - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'scope', - value: 'EGI*' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - }, - { - name: "group", - value: "iris.ac.uk", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "dirac-durham", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "IRISOPS-IAM", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "RU-SARFTI", - context: "argo.group.filter.fields" - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) }) await waitFor(() => { - expect(mockChangeObject).not.toHaveBeenCalled(); + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

Web API error changing report

-

Click to dismiss.

-
, - 'Web API error', - 0, - expect.any(Function) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 ) }) - test('Test error changing report on internal API with error message', async () => { - mockChangeObject.mockImplementationOnce( () => { - throw Error('400 BAD REQUEST: There has been an error.') - } ); + test('Test change group entities', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) mockChangeReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ) - renderChangeView(); + renderChangeView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() }) - await selectEvent.select(screen.getByText('ARGO'), 'TEST') - - fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) - - await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); - - fireEvent.click(card_groups.getByTestId(/removeTag-2/i)); - fireEvent.click(card_groups.getByText(/add new tag/i)); - - const selectTagName = card_groups.getAllByText(/select/i)[0] - const selectTagValue = card_groups.getAllByText(/select/i)[1] + const entity1 = card_groups.getByText('iris.ac.uk') + const entity2 = card_groups.getByText(/dirac/i) + + await selectEvent.select(entity1, 'Russia') + await selectEvent.select(entity2, 'RU-SARFTI') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': ['iris.ac.uk', 'Russia'], + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM', 'RU-SARFTI'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await selectEvent.select(selectTagName, 'monitored') + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.filter_tags.splice(8, 0, { + name: 'group', + value: 'Russia', + context: 'argo.group.filter.fields' + }) + frontendReport.filter_tags.push( + { + name: 'group', + value: 'RU-SARFTI', + context: 'argo.group.filter.fields' + } + ) - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - await selectEvent.select(selectTagValue, 'yes') + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - expect(card_groups.queryByText(/select/i)).not.toBeInTheDocument(); - await selectEvent.select(card_groups.getByText('GLUE2ComputingShareMappingQueue'), 'GLUE2EndpointImplementationName') + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - const selectExtensionValue = card_groups.getByText('condor'); + test('Test change endpoint tags', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + renderChangeView() - expect(selectExtensionValue).toBeInTheDocument(); - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - await selectEvent.select(card_groups.getByText('dirac-durham'), 'RU-SARFTI'); + const endpoint_groups = within(screen.getByTestId('card-group-of-endpoints')); + + await selectEvent.select(endpoint_groups.getAllByText('yes')[0], 'no') + + fireEvent.click(endpoint_groups.getByTestId('removeTag-1')) + fireEvent.click(endpoint_groups.getByTestId('removeTag-1')) + + fireEvent.click(endpoint_groups.getByRole('button', { name: /add new tag/i })) + + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'monitored') + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'yes') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'no', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - fireEvent.click(card_endpoints.getByTestId(/removeTag-0/i)); - fireEvent.click(card_endpoints.getByText(/add new extension/i)) + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - expect(card_endpoints.getAllByText(/select/i)).toHaveLength(2) + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.filter_tags[4].value = '0' + frontendReport.filter_tags.splice(6, 1) - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] - const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + test('Test change endpoint extensions', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + renderChangeView() - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') + const endpoint_groups = within(screen.getByTestId('card-group-of-endpoints')); + + fireEvent.click(endpoint_groups.getByText(/add new extension/i)) + + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'GLUE2EndpointID') + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'ce1.gridpp.ecdf.ed.ac.uk') + await selectEvent.select(endpoint_groups.getByText('ce1.gridpp.ecdf.ed.ac.uk'), 'svr009.gla.scotgrid.ac.uk') + + fireEvent.click(endpoint_groups.getByText(/add new extension/i)) + + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'GLUE2EndpointImplementationName') + await selectEvent.select(endpoint_groups.getAllByText(/select/i)[0], 'ARC-CE') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': ['ce1.gridpp.ecdf.ed.ac.uk', 'svr009.gla.scotgrid.ac.uk'], + 'endpointsExtensions.1.name': 'GLUE2EndpointImplementationName', + 'endpointsExtensions.1.value': 'ARC-CE', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); - fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }); - fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }); - fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }); - fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.2' } }); + fireEvent.click(endpoint_groups.getByTestId('removeExtension-0')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'endpointsExtensions.0.name': 'GLUE2EndpointImplementationName', + 'endpointsExtensions.0.value': 'ARC-CE', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) fireEvent.click(screen.getByRole('button', { name: /save/i })); await waitFor(() => { @@ -2207,246 +2604,299 @@ describe('Tests for reports changeview', () => { }) fireEvent.click(screen.getByRole('button', { name: /yes/i })); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.filter_tags.splice(7, 0, { + name: 'info_ext_GLUE2EndpointImplementationName', + value: 'ARC-CE', + context: 'argo.endpoint.filter.tags.array' + }) + await waitFor(() => { - expect(mockChangeReport).toHaveBeenCalledWith({ - id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', - info: { - name: 'Critical', - description: 'More elaborate description of the critical report.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags.array', - name: 'certification', - value: 'Certified' - }, - { - context: 'argo.group.filter.tags.array', - name: 'infrastructure', - value: 'Production' - }, - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'scope', - value: 'EGI*' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - }, - { - name: "group", - value: "iris.ac.uk", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "dirac-durham", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "IRISOPS-IAM", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "RU-SARFTI", - context: "argo.group.filter.fields" - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) }) await waitFor(() => { expect(mockChangeObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - name: 'Critical', - description: 'More elaborate description of the critical report.', - groupname: 'TEST', - apiid: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - } + '/api/v2/internal/reports/', backendReport4sending ) }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

400 BAD REQUEST: There has been an error.

-

Click to dismiss.

-
, - 'Internal API error', - 0, - expect.any(Function) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 ) }) - test('Test error changing report on internal API without error message', async () => { - mockChangeObject.mockImplementationOnce( () => { throw Error() } ); - mockChangeReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + test('Test change availability threshold', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - renderChangeView(); + renderChangeView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() }) - await selectEvent.select(screen.getByText('ARGO'), 'TEST') - - fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '70', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - await selectEvent.select(screen.getByText('ARGO_MON_CRITICAL'), 'OPS_MONITOR_RHEL7') - await selectEvent.select(screen.getByText('critical'), 'ops-mon-critical') + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.thresholds.availability = 70 - fireEvent.click(card_groups.getByTestId(/removeTag-2/i)); - fireEvent.click(card_groups.getByText(/add new tag/i)); + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - const selectTagName = card_groups.getAllByText(/select/i)[0] - const selectTagValue = card_groups.getAllByText(/select/i)[1] + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - await selectEvent.select(selectTagName, 'monitored') + test('Test change reliability threshold', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); + renderChangeView() - await selectEvent.select(selectTagValue, 'yes') + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - expect(card_groups.queryByText(/select/i)).not.toBeInTheDocument(); - await selectEvent.select(card_groups.getByText('GLUE2ComputingShareMappingQueue'), 'GLUE2EndpointImplementationName') + fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '90' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '90', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - const selectExtensionValue = card_groups.getByText('condor'); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.thresholds.reliability = 90 - expect(selectExtensionValue).toBeInTheDocument(); - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - await selectEvent.select(card_groups.getByText('dirac-durham'), 'RU-SARFTI'); + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - fireEvent.click(card_endpoints.getByTestId(/removeTag-0/i)); - fireEvent.click(card_endpoints.getByText(/add new extension/i)) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) - expect(card_endpoints.getAllByText(/select/i)).toHaveLength(2) + test('Test change uptime threshold', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + renderChangeView() - const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] - const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '1.0', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.1' + }) - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.thresholds.uptime = 1.0 - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending + ) + }) - fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); - fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }); - fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '1.0' } }); - fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }); - fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.2' } }); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) + + test('Test change unknown threshold', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) + + renderChangeView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) + + fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.2' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.2', + 'downtimeThreshold' : '0.1' + }) fireEvent.click(screen.getByRole('button', { name: /save/i })); await waitFor(() => { @@ -2454,450 +2904,2320 @@ describe('Tests for reports changeview', () => { }) fireEvent.click(screen.getByRole('button', { name: /yes/i })); + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.thresholds.unknown = 0.2 + await waitFor(() => { - expect(mockChangeReport).toHaveBeenCalledWith({ - id: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i', - info: { - name: 'Critical', - description: 'More elaborate description of the critical report.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags.array', - name: 'certification', - value: 'Certified' - }, - { - context: 'argo.group.filter.tags.array', - name: 'infrastructure', - value: 'Production' - }, - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'scope', - value: 'EGI*' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - }, - { - name: "group", - value: "iris.ac.uk", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "dirac-durham", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "IRISOPS-IAM", - context: "argo.group.filter.fields" - }, - { - name: "group", - value: "RU-SARFTI", - context: "argo.group.filter.fields" - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) }) await waitFor(() => { expect(mockChangeObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - name: 'Critical', - description: 'More elaborate description of the critical report.', - groupname: 'TEST', - apiid: 'yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - } + '/api/v2/internal/reports/', backendReport4sending + ) + }) + + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) + + test('Test change downtime threshold', async () => { + mockChangeObject.mockReturnValueOnce( + Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) + ) + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) + + renderChangeView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i })).toBeInTheDocument() + }) + + fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.3' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'Critical', + 'disabled': false, + 'groupname': 'ARGO', + 'description': 'Critical report', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': 'critical', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Certified', + 'groupsTags.1.name': 'infrastructure', + 'groupsTags.1.value': 'Production', + 'groupsTags.2.name': 'scope', + 'groupsTags.2.value': 'EGI*', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'entities.0.value': 'iris.ac.uk', + 'entities.1.value': ['dirac-durham', 'IRISOPS-IAM'], + 'endpointsTags.0.name': 'production', + 'endpointsTags.0.value': 'yes', + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'endpointsTags.2.name': 'scope', + 'endpointsTags.2.value': 'EGI*', + 'availabilityThreshold': '80', + 'reliabilityThreshold': '85', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '0.1', + 'downtimeThreshold' : '0.3' + }) + + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.thresholds.downtime = 0.3 + + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) + + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport4sending ) }) + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report') + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully changed', 'Changed', 2000 + ) + }) + + test('Test error changing report on web api with error message', async () => { + mockChangeReport.mockImplementationOnce( () => { + throw Error('406 Content Not acceptable: There has been an error.') + } ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.info.description = 'More elaborate description of the critical report.' + + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) + + await waitFor(() => { + expect(mockChangeObject).not.toHaveBeenCalled(); + }) + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); expect(NotificationManager.error).toHaveBeenCalledWith(
-

Internal API error changing report

+

406 Content Not acceptable: There has been an error.

Click to dismiss.

, - 'Internal API error', + 'Web API error', 0, expect.any(Function) ) }) - test('Test successfully deleting report', async () => { - mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + test('Test error changing report on web api without error message', async () => { + mockChangeReport.mockImplementationOnce( () => { throw Error() } ); renderChangeView(); - await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.info.description = 'More elaborate description of the critical report.' + + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) + + await waitFor(() => { + expect(mockChangeObject).not.toHaveBeenCalled(); + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

Web API error changing report

+

Click to dismiss.

+
, + 'Web API error', + 0, + expect.any(Function) + ) + }) + + test('Test error changing report on internal API with error message', async () => { + mockChangeObject.mockImplementationOnce( () => { + throw Error('400 BAD REQUEST: There has been an error.') + } ); + mockChangeReport.mockReturnValueOnce( + Promise.resolve({ ok: 'ok' }) + ) + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.info.description = 'More elaborate description of the critical report.' + + let backendReport = JSON.parse(JSON.stringify(backendReport4sending)) + backendReport.description = 'More elaborate description of the critical report.' + + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) + + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport + ) + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

400 BAD REQUEST: There has been an error.

+

Click to dismiss.

+
, + 'Internal API error', + 0, + expect.any(Function) + ) + }) + + test('Test error changing report on internal API without error message', async () => { + mockChangeObject.mockImplementationOnce( () => { throw Error() } ); + mockChangeReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'More elaborate description of the critical report.' } }) + + fireEvent.click(screen.getByRole('button', { name: /save/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /change/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + let frontendReport = JSON.parse(JSON.stringify(report4sending)) + frontendReport.info.description = 'More elaborate description of the critical report.' + + let backendReport = JSON.parse(JSON.stringify(backendReport4sending)) + backendReport.description = 'More elaborate description of the critical report.' + + await waitFor(() => { + expect(mockChangeReport).toHaveBeenCalledWith(frontendReport) + }) + + await waitFor(() => { + expect(mockChangeObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/', backendReport + ) + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

Internal API error changing report

+

Click to dismiss.

+
, + 'Internal API error', + 0, + expect.any(Function) + ) + }) + + test('Test successfully deleting report', async () => { + mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.click(screen.getByRole('button', { name: /delete/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + await waitFor(() => { + expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + }) + + await waitFor(() => { + expect(mockDeleteObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' + ) + }) + + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); + expect(NotificationManager.success).toHaveBeenCalledWith( + 'Report successfully deleted', 'Deleted', 2000 + ) + }) + + test('Test error deleting report on web api with error message', async () => { + mockDeleteReport.mockImplementationOnce( () => { + throw Error('406 Content Not acceptable: There has been an error.') + } ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.click(screen.getByRole('button', { name: /delete/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + await waitFor(() => { + expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + }) + + await waitFor(() => { + expect(mockDeleteObject).not.toHaveBeenCalled(); + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

406 Content Not acceptable: There has been an error.

+

Click to dismiss.

+
, + 'Web API error', + 0, + expect.any(Function) + ) + }) + + test('Test error deleting report on web api without error message', async () => { + mockDeleteReport.mockImplementationOnce( () => { throw Error() } ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.click(screen.getByRole('button', { name: /delete/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + await waitFor(() => { + expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + }) + + await waitFor(() => { + expect(mockDeleteObject).not.toHaveBeenCalled(); + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

Web API error deleting report

+

Click to dismiss.

+
, + 'Web API error', + 0, + expect.any(Function) + ) + }) + + test('Test error deleting report on internal backend with error message', async () => { + mockDeleteObject.mockImplementationOnce( () => { + throw Error('400 BAD REQUEST: There has been an error.') + } ); + mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.click(screen.getByRole('button', { name: /delete/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + await waitFor(() => { + expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + }) + + await waitFor(() => { + expect(mockDeleteObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' + ) + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

400 BAD REQUEST: There has been an error.

+

Click to dismiss.

+
, + 'Internal API error', + 0, + expect.any(Function) + ) + }) + + test('Test error deleting report on internal backend without error message', async () => { + mockDeleteObject.mockImplementationOnce( () => { throw Error() } ); + mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + + renderChangeView(); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + }) + + fireEvent.click(screen.getByRole('button', { name: /delete/i })); + await waitFor(() => { + expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + }) + fireEvent.click(screen.getByRole('button', { name: /yes/i })); + + await waitFor(() => { + expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + }) + + await waitFor(() => { + expect(mockDeleteObject).toHaveBeenCalledWith( + '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' + ) + }) + + expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(NotificationManager.error).toHaveBeenCalledWith( +
+

Internal API error deleting report

+

Click to dismiss.

+
, + 'Internal API error', + 0, + expect.any(Function) + ) + }) +}) + + +const newReport4Sending = { + info: { + name: 'OPS-MONITOR', + description: 'A/R report for Operations services.' + }, + thresholds: { + availability: 70, + reliability: 80, + uptime: 1.0, + unknown: 0.2, + downtime: 0.2 + }, + disabled: false, + profiles: [ + { + id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', + name: 'OPS_MONITOR_RHEL7', + type: 'metric' + }, + { + id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', + name: 'ops-mon-critical', + type: 'aggregation' + }, + { + id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', + name: 'egi_ops', + type: 'operations' + }, + { + id: 'Iesh4Eis-Z6JC-xWK8-O5KG-nae4eephoLah', + name: 'TEST_PROFILE', + type: 'thresholds' + } + ], + topology_schema: { + group: { + type: 'NGI', + group: { + type: 'SITES' + } + } + }, + filter_tags: [ + { + name: 'monitored', + value: '1', + context: 'argo.group.filter.tags' + }, + { + name: 'info_ext_GLUE2EndpointImplementationName', + value: 'ARC-CE', + context: 'argo.group.filter.tags.array' + }, + { + name: 'info_ext_GLUE2EndpointID', + value: 'ce1.gridpp.ecdf.ed.ac.uk', + context: 'argo.endpoint.filter.tags.array' + } + ] +} + + +const newBackendReport4Sending = { + name: 'OPS-MONITOR', + description: 'A/R report for Operations services.', + groupname: 'ARGO', + apiid: 'Ohs2duRu-tU6N-mF3Q-jV8F-Wiush8ieR7me' +} + + +describe('Tests for reports addview', () => { + jest.spyOn(NotificationManager, 'success'); + jest.spyOn(NotificationManager, 'error'); + jest.spyOn(queryClient, 'invalidateQueries'); + + beforeAll(() => { + WebApi.mockImplementation(() => { + return { + fetchMetricProfiles: () => Promise.resolve(mockMetricProfiles), + fetchAggregationProfiles: () => Promise.resolve(mockAggregationProfiles), + fetchOperationsProfiles: () => Promise.resolve(mockOperationsProfiles), + fetchThresholdsProfiles: () => Promise.resolve(mockThresholdsProfiles), + fetchReportsTopologyTags: () => Promise.resolve(mockReportsTopologyTags), + fetchReportsTopologyGroups: () => Promise.resolve(mockReportsTopologyGroups), + addReport: mockAddReport + } + }) + Backend.mockImplementation(() => { + return { + isActiveSession: () => Promise.resolve(mockActiveSession), + addObject: mockAddObject + } + }) + }) + + test('Test that page renders properly', async () => { + renderAddView(); + + await waitFor(() => { + expect(screen.getByText(/loading/i).textContent).toBe('Loading data...'); + }) + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + const nameField = screen.getByTestId('name'); + const disabledField = screen.getByLabelText(/disabled/i); + const descriptionField = screen.getByLabelText(/description/i); + const groupField = screen.getAllByText(/select/i)[0]; + + const metricProfileField = screen.getAllByText(/select/i)[1] + const aggrProfileField = screen.getAllByText(/select/i)[2] + const operationsProfileField = screen.getAllByText(/select/i)[3] + const thresholdsProfileField = screen.getAllByText(/select/i)[4] + + const topologyTypeField = screen.getAllByText(/select/i)[5]; + + const availabilityThresholdField = screen.getByLabelText(/availability/i); + const reliabilityThresholdField = screen.getByLabelText(/reliability/i); + const uptimeThresholdField = screen.getByLabelText(/uptime/i); + const unknownThresholdField = screen.getByLabelText(/unknown/i); + const downtimeThresholdField = screen.getByLabelText(/downtime/i); + + expect(nameField.value).toBe(''); + expect(nameField).toBeEnabled(); + expect(disabledField.checked).toBeFalsy(); + expect(descriptionField.value).toBe(''); + expect(descriptionField).toBeEnabled(); + expect(groupField).toBeEnabled(); + + expect(metricProfileField).toBeEnabled(); + expect(aggrProfileField).toBeEnabled(); + expect(operationsProfileField).toBeEnabled(); + expect(thresholdsProfileField).toBeEnabled() + expect(topologyTypeField).toBeEnabled() + + expect(screen.queryByText('ARGO')).not.toBeInTheDocument() + expect(screen.queryByText('TEST')).not.toBeInTheDocument() + + selectEvent.openMenu(groupField) + expect(screen.getByText('ARGO')).toBeInTheDocument() + expect(screen.getByText('TEST')).toBeInTheDocument() + + expect(screen.queryByText('ARGO_MON_CRITICAL')).not.toBeInTheDocument() + expect(screen.queryByText('FEDCLOUD')).not.toBeInTheDocument() + expect(screen.queryByText('OPS_MONITOR_RHEL7')).not.toBeInTheDocument() + + selectEvent.openMenu(metricProfileField) + expect(screen.getByText('ARGO_MON_CRITICAL')).toBeInTheDocument() + expect(screen.getByText('FEDCLOUD')).toBeInTheDocument() + expect(screen.getByText('OPS_MONITOR_RHEL7')).toBeInTheDocument() + + expect(screen.queryByText('critical')).not.toBeInTheDocument() + expect(screen.queryByText('ops-mon-critical')).not.toBeInTheDocument() + + selectEvent.openMenu(aggrProfileField) + expect(screen.getByText('critical')).toBeInTheDocument() + expect(screen.getByText('ops-mon-critical')).toBeInTheDocument() + + expect(screen.queryByText('TEST_PROFILE')).not.toBeInTheDocument() + expect(screen.queryByText('test-thresholds')).not.toBeInTheDocument() + + selectEvent.openMenu(thresholdsProfileField) + expect(screen.getByText('TEST_PROFILE')).toBeInTheDocument() + expect(screen.getByText('test-thresholds')).toBeInTheDocument() + + expect(screen.queryByText('egi_ops')).not.toBeInTheDocument() + + selectEvent.openMenu(operationsProfileField) + expect(screen.getByText('egi_ops')).toBeInTheDocument() + + expect(screen.queryByText('Sites')).not.toBeInTheDocument() + expect(screen.queryByText('ServiceGroups')).not.toBeInTheDocument() + + selectEvent.openMenu(topologyTypeField) + expect(screen.getByText('Sites')).toBeInTheDocument() + expect(screen.getByText('ServiceGroups')).toBeInTheDocument() + + expect(screen.getAllByTestId(/card/i)).toHaveLength(2); + const card_groups = within(screen.getByTestId('card-group-of-groups')); + const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + + expect(card_groups.getAllByRole('combobox')).toHaveLength(2); + expect(card_groups.queryAllByTestId(/remove/i)).toHaveLength(0); + expect(card_groups.getByRole('button', { name: /add new tag/i })).toBeInTheDocument(); + expect(card_groups.getByRole('button', { name: /add new extension/i })).toBeInTheDocument(); + expect(card_groups.getAllByText(/search/i)).toHaveLength(2); + + expect(card_endpoints.queryAllByRole('combobox')).toHaveLength(0); + expect(card_endpoints.getByRole('button', { name: /add new tag/i })).toBeInTheDocument(); + expect(card_endpoints.getByRole('button', { name: /add new extension/i })).toBeInTheDocument(); + + expect(availabilityThresholdField.value).toBe(''); + expect(availabilityThresholdField).toBeEnabled(); + expect(reliabilityThresholdField.value).toBe(''); + expect(reliabilityThresholdField).toBeEnabled(); + expect(uptimeThresholdField.value).toBe(''); + expect(uptimeThresholdField).toBeEnabled(); + expect(unknownThresholdField.value).toBe(''); + expect(unknownThresholdField).toBeEnabled(); + expect(downtimeThresholdField.value).toBe(''); + expect(downtimeThresholdField).toBeEnabled(); + + expect(screen.getByRole('button', { name: /save/i })).toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); + }) + + test('Test add name', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + fireEvent.change(screen.getByTestId('name'), { target: { value: 'OPS-MONITOR' } }); + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': 'OPS-MONITOR', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) + + test('Test disable report', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + fireEvent.click(screen.getByLabelText(/disable/i)) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': true, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) + + test('Test add description', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + fireEvent.change(screen.getByLabelText(/description/i), { target: { value: 'A/R report for Operations services.' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': 'A/R report for Operations services.', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) + + test('Test add group name', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + const groupField = screen.getAllByText(/select/i)[0] + + expect(screen.queryByText('ARGO')).not.toBeInTheDocument() + expect(screen.queryByText('TEST')).not.toBeInTheDocument() + + selectEvent.openMenu(groupField) + expect(screen.queryByText('ARGO')).toBeInTheDocument() + expect(screen.queryByText('TEST')).toBeInTheDocument() + + await selectEvent.select(groupField, 'ARGO') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': 'ARGO', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) + + test('Test add metric profile', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + const metricProfileField = screen.getAllByText(/select/i)[1] + + expect(screen.queryByText('FEDCLOUD')).not.toBeInTheDocument() + expect(screen.queryByText('OPS_MONITOR_RHEL7')).not.toBeInTheDocument() + expect(screen.queryByText('ARGO_MON_CRITICAL')).not.toBeInTheDocument() + + selectEvent.openMenu(metricProfileField) + expect(screen.queryByText('FEDCLOUD')).toBeInTheDocument() + expect(screen.queryByText('OPS_MONITOR_RHEL7')).toBeInTheDocument() + expect(screen.queryByText('ARGO_MON_CRITICAL')).toBeInTheDocument() + + await selectEvent.select(metricProfileField, 'ARGO_MON_CRITICAL') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': 'ARGO_MON_CRITICAL', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) + + test('Test add aggregation profile', async () => { + renderAddView() + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + const aggregationProfileField = screen.getAllByText(/select/i)[2] + + expect(screen.queryByText('critical')).not.toBeInTheDocument() + expect(screen.queryByText('ops-mon-critical')).not.toBeInTheDocument() + + selectEvent.openMenu(aggregationProfileField) + expect(screen.queryByText('critical')).toBeInTheDocument() + expect(screen.queryByText('ops-mon-critical')).toBeInTheDocument() + + await selectEvent.select(aggregationProfileField, 'critical') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': 'critical', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) + }) + + test('Test add operations profile', async () => { + renderAddView() - fireEvent.click(screen.getByRole('button', { name: /delete/i })); await waitFor(() => { - expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await waitFor(() => { - expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + const operationsProfileField = screen.getAllByText(/select/i)[3] + + expect(screen.queryByText('egi_ops')).not.toBeInTheDocument() + + selectEvent.openMenu(operationsProfileField) + expect(screen.queryByText('egi_ops')).toBeInTheDocument() + + await selectEvent.select(operationsProfileField, 'egi_ops') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': 'egi_ops', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) + }) + + test('Test add thresholds profile', async () => { + renderAddView() await waitFor(() => { - expect(mockDeleteObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - ) + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); - expect(NotificationManager.success).toHaveBeenCalledWith( - 'Report successfully deleted', 'Deleted', 2000 - ) - }) - - test('Test error deleting report on web api with error message', async () => { - mockDeleteReport.mockImplementationOnce( () => { - throw Error('406 Content Not acceptable: There has been an error.') - } ); + const thresholdsProfileField = screen.getAllByText(/select/i)[4] - renderChangeView(); + expect(screen.queryByText('TEST_PROFILE')).not.toBeInTheDocument() + expect(screen.queryByText('test-thresholds')).not.toBeInTheDocument() - await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + selectEvent.openMenu(thresholdsProfileField) + expect(screen.queryByText('TEST_PROFILE')).toBeInTheDocument() + expect(screen.queryByText('test-thresholds')).toBeInTheDocument() + + await selectEvent.select(thresholdsProfileField, 'TEST_PROFILE') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': 'TEST_PROFILE', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) + }) + + test('Test add topology type', async () => { + renderAddView() - fireEvent.click(screen.getByRole('button', { name: /delete/i })); await waitFor(() => { - expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await waitFor(() => { - expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + const topologyTypeField = screen.getAllByText(/select/i)[5] + + expect(screen.queryByText(/upper group/i)).toBeInTheDocument() + expect(screen.queryByText(/lower group/i)).toBeInTheDocument() + + expect(screen.queryByText(/sites/i)).not.toBeInTheDocument() + expect(screen.queryByText(/ngis/i)).not.toBeInTheDocument() + + expect(screen.queryByText(/projects/i)).not.toBeInTheDocument() + expect(screen.queryByText(/service groups/i)).not.toBeInTheDocument() + + expect(screen.queryByText('Sites')).not.toBeInTheDocument() + expect(screen.queryByText('ServiceGroups')).not.toBeInTheDocument() + + selectEvent.openMenu(topologyTypeField) + expect(screen.queryByText('Sites')).toBeInTheDocument() + expect(screen.queryByText('ServiceGroups')).toBeInTheDocument() + + await selectEvent.select(topologyTypeField, 'Sites') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': 'Sites', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - await waitFor(() => { - expect(mockDeleteObject).not.toHaveBeenCalled(); + expect(screen.queryByText(/upper group/i)).not.toBeInTheDocument() + expect(screen.queryByText(/lower group/i)).not.toBeInTheDocument() + + expect(screen.queryAllByText(/sites/i)).toHaveLength(2) + expect(screen.queryByText(/ngis/i)).toBeInTheDocument() + + expect(screen.queryByText(/service groups/i)).not.toBeInTheDocument() + expect(screen.queryByText(/projects/i)).not.toBeInTheDocument() + + await selectEvent.select(screen.getByText('Sites'), 'ServiceGroups') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': 'ServiceGroups', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

406 Content Not acceptable: There has been an error.

-

Click to dismiss.

-
, - 'Web API error', - 0, - expect.any(Function) - ) - }) + expect(screen.queryByText(/upper group/i)).not.toBeInTheDocument() + expect(screen.queryByText(/lower group/i)).not.toBeInTheDocument() - test('Test error deleting report on web api without error message', async () => { - mockDeleteReport.mockImplementationOnce( () => { throw Error() } ); + expect(screen.queryByText(/sites/i)).not.toBeInTheDocument() + expect(screen.queryByText(/ngis/i)).not.toBeInTheDocument() - renderChangeView(); + expect(screen.queryByText(/service groups/i)).toBeInTheDocument() + expect(screen.queryByText(/projects/i)).toBeInTheDocument() + }) + + test('Test add group tags', async () => { + renderAddView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - fireEvent.click(screen.getByRole('button', { name: /delete/i })); - await waitFor(() => { - expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + const card_groups = within(screen.getByTestId('card-group-of-groups')); + + fireEvent.click(card_groups.getByText(/add new tag/i)) + + expect(card_groups.queryByText('certification')).not.toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.getAllByText(/select/i)[0]) + expect(card_groups.queryByText('certification')).toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).toBeInTheDocument() + expect(card_groups.queryByText('monitored')).toBeInTheDocument() + expect(card_groups.queryByText('scope')).toBeInTheDocument() + + expect(card_groups.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_groups.queryByText('Certified')).not.toBeInTheDocument() + expect(card_groups.queryByText('Closed')).not.toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'certification') + selectEvent.openMenu(card_groups.queryByText(/select/i)) + expect(card_groups.queryByText('Candidate')).toBeInTheDocument() + expect(card_groups.queryByText('Certified')).toBeInTheDocument() + expect(card_groups.queryByText('Closed')).toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await waitFor(() => { - expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + await selectEvent.select(card_groups.queryByText(/select/i), 'Candidate') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': 'Candidate', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - await waitFor(() => { - expect(mockDeleteObject).not.toHaveBeenCalled(); + await selectEvent.select(card_groups.queryByText('Candidate'), 'Certified') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': ['Candidate', 'Certified'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

Web API error deleting report

-

Click to dismiss.

-
, - 'Web API error', - 0, - expect.any(Function) - ) - }) + fireEvent.click(card_groups.getByText(/add new tag/i)) + + expect(card_groups.queryAllByText('certification')).toHaveLength(1) + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.queryAllByText(/select/i)[0]) + expect(card_groups.queryAllByText('certification')).toHaveLength(1) + expect(card_groups.queryByText('infrastructure')).toBeInTheDocument() + expect(card_groups.queryByText('monitored')).toBeInTheDocument() + expect(card_groups.queryByText('scope')).toBeInTheDocument() + + await selectEvent.select(card_groups.queryAllByText(/select/i)[0], 'infrastructure') + + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.getByText(/select/i)) + expect(card_groups.queryByText('PPS')).toBeInTheDocument() + expect(card_groups.queryByText('Production')).toBeInTheDocument() + expect(card_groups.queryByText('Test')).toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getByText('infrastructure'), 'monitored') + selectEvent.openMenu(card_groups.getByText(/select/i)) + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).toBeInTheDocument() + expect(card_groups.queryByText('no')).toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getByText('monitored'), 'scope') + selectEvent.openMenu(card_groups.getByText(/select/i)) + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).toBeInTheDocument() + + await selectEvent.select(card_groups.getByText(/select/i), 'EGI') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsTags.0.name': 'certification', + 'groupsTags.0.value': ['Candidate', 'Certified'], + 'groupsTags.1.name': 'scope', + 'groupsTags.1.value': 'EGI', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - test('Test error deleting report on internal backend with error message', async () => { - mockDeleteObject.mockImplementationOnce( () => { - throw Error('400 BAD REQUEST: There has been an error.') - } ); - mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); + fireEvent.click(card_groups.getByTestId('removeTag-0')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsTags.0.name': 'scope', + 'groupsTags.0.value': 'EGI', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) - renderChangeView(); + test('Test add group extensions', async () => { + renderAddView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - fireEvent.click(screen.getByRole('button', { name: /delete/i })); - await waitFor(() => { - expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); + const card_groups = within(screen.getByTestId('card-group-of-groups')); + + fireEvent.click(card_groups.getByText(/add new extension/i)) + + expect(card_groups.queryByText('certification')).not.toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2ComputingShareMappingQueue/i)).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2EndpointImplementationName/i)).not.toBeInTheDocument() + expect(card_groups.queryByText('production')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_ID')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_URL')).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2EndpointID/i)).not.toBeInTheDocument() + expect(card_groups.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.getAllByText(/select/i)[0]) + expect(card_groups.queryByText('certification')).not.toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + expect(card_groups.queryByText('GLUE2ComputingShareMappingQueue')).toBeInTheDocument() + expect(card_groups.queryByText('GLUE2EndpointImplementationName')).toBeInTheDocument() + expect(card_groups.queryByText('info_ext_GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_ext_GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_groups.queryByText('production')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_ID')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_URL')).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2EndpointID/i)).not.toBeInTheDocument() + expect(card_groups.queryByText(/vo_/i)).not.toBeInTheDocument() + + expect(card_groups.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_groups.queryByText('Certified')).not.toBeInTheDocument() + expect(card_groups.queryByText('Closed')).not.toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_groups.queryByText('condor')).not.toBeInTheDocument() + expect(card_groups.queryByText('condor_q2d')).not.toBeInTheDocument() + expect(card_groups.queryByText('eddie')).not.toBeInTheDocument() + expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_groups.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('meh')).not.toBeInTheDocument() + expect(card_groups.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_groups.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/fis.puc.cl/home/afigrid')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'GLUE2ComputingShareMappingQueue') + selectEvent.openMenu(card_groups.getByText(/select/i)) + expect(card_groups.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_groups.queryByText('Certified')).not.toBeInTheDocument() + expect(card_groups.queryByText('Closed')).not.toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_groups.queryByText('condor')).toBeInTheDocument() + expect(card_groups.queryByText('condor_q2d')).toBeInTheDocument() + expect(card_groups.queryByText('eddie')).toBeInTheDocument() + expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_groups.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('meh')).not.toBeInTheDocument() + expect(card_groups.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_groups.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/fis.puc.cl/home/afigrid')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getByText(/select/i), 'condor') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': 'condor', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - fireEvent.click(screen.getByRole('button', { name: /yes/i })); - await waitFor(() => { - expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + await selectEvent.select(card_groups.getByText('condor'), 'eddie') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': ['condor', 'eddie'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - await waitFor(() => { - expect(mockDeleteObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - ) + fireEvent.click(card_groups.getByText(/add new extension/i)) + + expect(card_groups.queryByText('certification')).not.toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + expect(card_groups.getAllByText(/GLUE2ComputingShareMappingQueue/i)).toHaveLength(1) + expect(card_groups.queryByText(/GLUE2EndpointImplementationName/i)).not.toBeInTheDocument() + expect(card_groups.queryByText('production')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_ID')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_URL')).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2EndpointID/i)).not.toBeInTheDocument() + expect(card_groups.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.getAllByText(/select/i)[0]) + expect(card_groups.queryByText('certification')).not.toBeInTheDocument() + expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_groups.queryByText('monitored')).not.toBeInTheDocument() + expect(card_groups.queryByText('scope')).not.toBeInTheDocument() + expect(card_groups.getAllByText(/GLUE2ComputingShareMappingQueue/i)).toHaveLength(1) + expect(card_groups.queryByText(/GLUE2EndpointImplementationName/i)).toBeInTheDocument() + expect(card_groups.queryByText('production')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_ID')).not.toBeInTheDocument() + expect(card_groups.queryByText('info_URL')).not.toBeInTheDocument() + expect(card_groups.queryByText(/GLUE2EndpointID/i)).not.toBeInTheDocument() + expect(card_groups.queryByText(/vo_/i)).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getAllByText(/select/i)[0], 'GLUE2EndpointImplementationName') + + expect(card_groups.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_groups.queryByText('Certified')).not.toBeInTheDocument() + expect(card_groups.queryByText('Closed')).not.toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_groups.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('meh')).not.toBeInTheDocument() + expect(card_groups.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_groups.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/fis.puc.cl/home/afigrid')).not.toBeInTheDocument() + + selectEvent.openMenu(card_groups.getByText(/select/i)) + expect(card_groups.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_groups.queryByText('Certified')).not.toBeInTheDocument() + expect(card_groups.queryByText('Closed')).not.toBeInTheDocument() + expect(card_groups.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_groups.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_groups.queryByText('PPS')).not.toBeInTheDocument() + expect(card_groups.queryByText('Production')).not.toBeInTheDocument() + expect(card_groups.queryByText('Test')).not.toBeInTheDocument() + expect(card_groups.queryByText('yes')).not.toBeInTheDocument() + expect(card_groups.queryByText('no')).not.toBeInTheDocument() + expect(card_groups.queryByText('1')).not.toBeInTheDocument() + expect(card_groups.queryByText('0')).not.toBeInTheDocument() + expect(card_groups.queryByText('EGI')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_groups.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_groups.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_groups.queryByText('ARC-CE')).toBeInTheDocument() + expect(card_groups.queryByText('nordugrid-arc')).toBeInTheDocument() + expect(card_groups.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_groups.queryByText('meh')).not.toBeInTheDocument() + expect(card_groups.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_groups.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_groups.queryByText('/dpm/fis.puc.cl/home/afigrid')).not.toBeInTheDocument() + + await selectEvent.select(card_groups.getByText(/select/i), 'ARC-CE') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': ['condor', 'eddie'], + 'groupsExtensions.1.name': 'GLUE2EndpointImplementationName', + 'groupsExtensions.1.value': 'ARC-CE', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

400 BAD REQUEST: There has been an error.

-

Click to dismiss.

-
, - 'Internal API error', - 0, - expect.any(Function) - ) + fireEvent.click(card_groups.getByTestId('removeExtension-1')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'groupsExtensions.0.name': 'GLUE2ComputingShareMappingQueue', + 'groupsExtensions.0.value': ['condor', 'eddie'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) }) - test('Test error deleting report on internal backend without error message', async () => { - mockDeleteObject.mockImplementationOnce( () => { throw Error() } ); - mockDeleteReport.mockReturnValueOnce( Promise.resolve({ ok: 'ok' }) ); - - renderChangeView(); + test('Test add group entities', async () => { + renderAddView() await waitFor(() => { - expect(screen.getByRole('heading', { name: /change/i }).textContent).toBe('Change report'); + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - fireEvent.click(screen.getByRole('button', { name: /delete/i })); - await waitFor(() => { - expect(screen.getByRole('dialog', { title: /delete/i })).toBeInTheDocument(); - }) - fireEvent.click(screen.getByRole('button', { name: /yes/i })); + const card_groups = within(screen.getByTestId('card-group-of-groups')); - await waitFor(() => { - expect(mockDeleteReport).toHaveBeenCalledWith('yee9chel-5o4u-l4j4-410b-eipi3ohrah5i') + const entity1 = card_groups.getAllByText(/search/i)[0] + const entity2 = card_groups.getAllByText(/search/i)[1] + + await selectEvent.select(entity1, 'Russia') + + await selectEvent.select(entity2, 'dirac-durham') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'entities.0.value': 'Russia', + 'entities.1.value': 'dirac-durham', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) + }) + + test('Test add endpoint tags', async () => { + renderAddView() await waitFor(() => { - expect(mockDeleteObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/yee9chel-5o4u-l4j4-410b-eipi3ohrah5i' - ) + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); - expect(NotificationManager.error).toHaveBeenCalledWith( -
-

Internal API error deleting report

-

Click to dismiss.

-
, - 'Internal API error', - 0, - expect.any(Function) - ) - }) -}) - + const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); -describe('Tests for reports addview', () => { - jest.spyOn(NotificationManager, 'success'); - jest.spyOn(NotificationManager, 'error'); - jest.spyOn(queryClient, 'invalidateQueries'); + fireEvent.click(card_endpoints.getByText(/add new tag/i)) + + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.getAllByText(/select/i)[0]) + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).toBeInTheDocument() + expect(card_endpoints.queryByText('production')).toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.getAllByText(/select/i)[0], 'scope') + selectEvent.openMenu(card_endpoints.queryByText(/select/i)) + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsTags.0.name': 'scope', + 'endpointsTags.0.value': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - beforeAll(() => { - WebApi.mockImplementation(() => { - return { - fetchMetricProfiles: () => Promise.resolve(mockMetricProfiles), - fetchAggregationProfiles: () => Promise.resolve(mockAggregationProfiles), - fetchOperationsProfiles: () => Promise.resolve(mockOperationsProfiles), - fetchThresholdsProfiles: () => Promise.resolve(mockThresholdsProfiles), - fetchReportsTopologyTags: () => Promise.resolve(mockReportsTopologyTags), - fetchReportsTopologyGroups: () => Promise.resolve(mockReportsTopologyGroups), - addReport: mockAddReport - } + await selectEvent.select(card_endpoints.queryByText(/select/i), 'EOSCCore') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsTags.0.name': 'scope', + 'endpointsTags.0.value': 'EOSCCore', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - Backend.mockImplementation(() => { - return { - isActiveSession: () => Promise.resolve(mockActiveSession), - addObject: mockAddObject - } + + await selectEvent.select(card_endpoints.queryByText('EOSCCore'), 'EGI') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsTags.0.name': 'scope', + 'endpointsTags.0.value': ['EOSCCore', 'EGI'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) - }) - test('Test that page renders properly', async () => { - renderAddView(); + fireEvent.click(card_endpoints.getByText(/add new tag/i)) + + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryAllByText('scope')).toHaveLength(1) + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.queryAllByText(/select/i)[0]) + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).toBeInTheDocument() + expect(card_endpoints.queryByText('production')).toBeInTheDocument() + expect(card_endpoints.queryAllByText('scope')).toHaveLength(1) + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.queryAllByText(/select/i)[0], 'monitored') + + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.getByText(/select/i)) + expect(card_endpoints.queryByText('yes')).toBeInTheDocument() + expect(card_endpoints.queryByText('no')).toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.getByText(/select/i), 'yes') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsTags.0.name': 'scope', + 'endpointsTags.0.value': ['EOSCCore', 'EGI'], + 'endpointsTags.1.name': 'monitored', + 'endpointsTags.1.value': 'yes', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - await waitFor(() => { - expect(screen.getByText(/loading/i).textContent).toBe('Loading data...'); + fireEvent.click(card_endpoints.getByTestId('removeTag-1')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsTags.0.name': 'scope', + 'endpointsTags.0.value': ['EOSCCore', 'EGI'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' }) + }) + + test('Test add endpoint extensions', async () => { + renderAddView() await waitFor(() => { expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); }) - const nameField = screen.getByTestId('name'); - const disabledField = screen.getByLabelText(/disabled/i); - const descriptionField = screen.getByLabelText(/description/i); - const groupField = screen.getAllByText(/select/i)[0]; + const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); - const metricProfileField = screen.getAllByText(/select/i)[1] - const aggrProfileField = screen.getAllByText(/select/i)[2] - const operationsProfileField = screen.getAllByText(/select/i)[3] - const thresholdsProfileField = screen.getAllByText(/select/i)[4] + fireEvent.click(card_endpoints.getByText(/add new extension/i)) - const topologyTypeField = screen.getAllByText(/select/i)[5]; + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.getAllByText(/select/i)[0]) + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointID')).toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).toBeInTheDocument() + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.getAllByText(/select/i)[0], 'GLUE2EndpointID') + selectEvent.openMenu(card_endpoints.queryByText(/select/i)) + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() + expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).toBeInTheDocument() + expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - const availabilityThresholdField = screen.getByLabelText(/availability/i); - const reliabilityThresholdField = screen.getByLabelText(/reliability/i); - const uptimeThresholdField = screen.getByLabelText(/uptime/i); - const unknownThresholdField = screen.getByLabelText(/unknown/i); - const downtimeThresholdField = screen.getByLabelText(/downtime/i); + await selectEvent.select(card_endpoints.queryByText(/select/i), 'ce1.gridpp.ecdf.ed.ac.uk') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': 'ce1.gridpp.ecdf.ed.ac.uk', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - expect(nameField.value).toBe(''); - expect(nameField).toBeEnabled(); - expect(disabledField.checked).toBeFalsy(); - expect(descriptionField.value).toBe(''); - expect(descriptionField).toBeEnabled(); - expect(groupField).toBeEnabled(); + await selectEvent.select(card_endpoints.queryByText('GLUE2EndpointID'), 'svr009.gla.scotgrid.ac.uk') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': ['ce1.gridpp.ecdf.ed.ac.uk', 'svr009.gla.scotgrid.ac.uk'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - expect(metricProfileField).toBeEnabled(); - expect(aggrProfileField).toBeEnabled(); - expect(operationsProfileField).toBeEnabled(); - expect(thresholdsProfileField).toBeEnabled() - expect(topologyTypeField).toBeEnabled() + fireEvent.click(card_endpoints.getByText(/add new extension/i)) - expect(screen.queryByText('ARGO')).not.toBeInTheDocument() - expect(screen.queryByText('TEST')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryAllByText('GLUE2EndpointID')).toHaveLength(1) + expect(card_endpoints.queryAllByText('GLUE2EndpointImplementationName')).toHaveLength(1) + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.queryAllByText(/select/i)[0]) + expect(card_endpoints.queryByText('certification')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('infrastructure')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('monitored')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('scope')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_ext_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/info_/i)).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ID')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('URL')).not.toBeInTheDocument() + expect(card_endpoints.queryAllByText('GLUE2EndpointID')).toHaveLength(1) + expect(card_endpoints.queryAllByText('GLUE2EndpointImplementationName')).toHaveLength(2) + expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() + expect(card_endpoints.queryByText(/vo_/i)).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.queryAllByText(/select/i)[0], 'GLUE2EndpointImplementationName') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': ['ce1.gridpp.ecdf.ed.ac.uk', 'svr009.gla.scotgrid.ac.uk'], + 'endpointsExtensions.1.name': 'GLUE2EndpointImplementationName', + 'endpointsExtensions.1.value': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - selectEvent.openMenu(groupField) - expect(screen.getByText('ARGO')).toBeInTheDocument() - expect(screen.getByText('TEST')).toBeInTheDocument() + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + selectEvent.openMenu(card_endpoints.getByText(/select/i)) + expect(card_endpoints.queryByText('yes')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('no')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EGI')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSC-hub')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('EOSCCore')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('FedCloud')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1111G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('2222G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('3333G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('4444G0')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('meh')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('mock_url')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('ARC-CE')).toBeInTheDocument() + expect(card_endpoints.queryByText('nordugrid-arc')).toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/a')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('/dpm/farm.particle.cz/home/aaa')).not.toBeInTheDocument() + expect(card_endpoints.queryByText("/dpm/fis.puc.cl/home/afigrid")).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Candidate')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Certified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Closed')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Suspended')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Uncertified')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('PPS')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Production')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('Test')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('1')).not.toBeInTheDocument() + expect(card_endpoints.queryByText('0')).not.toBeInTheDocument() + + await selectEvent.select(card_endpoints.getByText(/select/i), 'ARC-CE') + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': ['ce1.gridpp.ecdf.ed.ac.uk', 'svr009.gla.scotgrid.ac.uk'], + 'endpointsExtensions.1.name': 'GLUE2EndpointImplementationName', + 'endpointsExtensions.1.value': 'ARC-CE', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) - expect(screen.queryByText('ARGO_MON_CRITICAL')).not.toBeInTheDocument() - expect(screen.queryByText('FEDCLOUD')).not.toBeInTheDocument() - expect(screen.queryByText('OPS_MONITOR_RHEL7')).not.toBeInTheDocument() + fireEvent.click(card_endpoints.getByTestId('removeExtension-1')) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'endpointsExtensions.0.name': 'GLUE2EndpointID', + 'endpointsExtensions.0.value': ['ce1.gridpp.ecdf.ed.ac.uk', 'svr009.gla.scotgrid.ac.uk'], + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) - selectEvent.openMenu(metricProfileField) - expect(screen.getByText('ARGO_MON_CRITICAL')).toBeInTheDocument() - expect(screen.getByText('FEDCLOUD')).toBeInTheDocument() - expect(screen.getByText('OPS_MONITOR_RHEL7')).toBeInTheDocument() + test('Test add availability threshold', async () => { + renderAddView(); - expect(screen.queryByText('critical')).not.toBeInTheDocument() - expect(screen.queryByText('ops-mon-critical')).not.toBeInTheDocument() + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) - selectEvent.openMenu(aggrProfileField) - expect(screen.getByText('critical')).toBeInTheDocument() - expect(screen.getByText('ops-mon-critical')).toBeInTheDocument() + fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '70', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) - expect(screen.queryByText('TEST_PROFILE')).not.toBeInTheDocument() - expect(screen.queryByText('test-thresholds')).not.toBeInTheDocument() + test('Test add reliability threshold', async () => { + renderAddView(); - selectEvent.openMenu(thresholdsProfileField) - expect(screen.getByText('TEST_PROFILE')).toBeInTheDocument() - expect(screen.getByText('test-thresholds')).toBeInTheDocument() + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) - expect(screen.queryByText('egi_ops')).not.toBeInTheDocument() + fireEvent.change(screen.getByLabelText(/reliability/i), { target: { value: '80' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '80', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) - selectEvent.openMenu(operationsProfileField) - expect(screen.getByText('egi_ops')).toBeInTheDocument() + test('Test add uptime threshold', async () => { + renderAddView(); - expect(screen.queryByText('Sites')).not.toBeInTheDocument() - expect(screen.queryByText('ServiceGroups')).not.toBeInTheDocument() + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) - selectEvent.openMenu(topologyTypeField) - expect(screen.getByText('Sites')).toBeInTheDocument() - expect(screen.getByText('ServiceGroups')).toBeInTheDocument() + fireEvent.change(screen.getByLabelText(/uptime/i), { target: { value: '0.8' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '0.8', + 'unknownThreshold': '', + 'downtimeThreshold' : '' + }) + }) - expect(screen.getAllByTestId(/card/i)).toHaveLength(2); - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + test('Test add unknown threshold', async () => { + renderAddView(); - expect(card_groups.getAllByRole('combobox')).toHaveLength(2); - expect(card_groups.queryAllByTestId(/remove/i)).toHaveLength(0); - expect(card_groups.getByRole('button', { name: /add new tag/i })).toBeInTheDocument(); - expect(card_groups.getByRole('button', { name: /add new extension/i })).toBeInTheDocument(); - expect(card_groups.getAllByText(/search/i)).toHaveLength(2); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) - expect(card_endpoints.queryAllByRole('combobox')).toHaveLength(0); - expect(card_endpoints.getByRole('button', { name: /add new tag/i })).toBeInTheDocument(); - expect(card_endpoints.getByRole('button', { name: /add new extension/i })).toBeInTheDocument(); + fireEvent.change(screen.getByLabelText(/unknown/i), { target: { value: '0.8' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '0.8', + 'downtimeThreshold' : '' + }) + }) - expect(availabilityThresholdField.value).toBe(''); - expect(availabilityThresholdField).toBeEnabled(); - expect(reliabilityThresholdField.value).toBe(''); - expect(reliabilityThresholdField).toBeEnabled(); - expect(uptimeThresholdField.value).toBe(''); - expect(uptimeThresholdField).toBeEnabled(); - expect(unknownThresholdField.value).toBe(''); - expect(unknownThresholdField).toBeEnabled(); - expect(downtimeThresholdField.value).toBe(''); - expect(downtimeThresholdField).toBeEnabled(); + test('Test add downtime threshold', async () => { + renderAddView(); - expect(screen.getByRole('button', { name: /save/i })).toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByRole('heading', { name: /report/i }).textContent).toBe('Add report'); + }) + + fireEvent.change(screen.getByLabelText(/downtime/i), { target: { value: '0.8' } }) + + expect(screen.getByTestId('form')).toHaveFormValues({ + 'name': '', + 'disabled': false, + 'groupname': '', + 'description': '', + 'metricProfile': '', + 'aggregationProfile': '', + 'operationsProfile': '', + 'thresholdsProfile': '', + 'topologyType': '', + 'availabilityThreshold': '', + 'reliabilityThreshold': '', + 'uptimeThreshold': '', + 'unknownThreshold': '', + 'downtimeThreshold' : '0.8' + }) }) test('Test successfully adding a report', async () => { @@ -2949,27 +5269,8 @@ describe('Tests for reports addview', () => { const selectTagName = card_groups.getAllByText(/select/i)[0] const selectTagValue = card_groups.getAllByText(/select/i)[1] - expect(card_groups.queryByText('certification')).not.toBeInTheDocument(); - expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument(); - expect(card_groups.queryByText('monitored')).not.toBeInTheDocument(); - expect(card_groups.queryByText('scope')).not.toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument(); - - selectEvent.openMenu(selectTagName) - expect(card_groups.getByText('certification')).toBeInTheDocument(); - expect(card_groups.getByText('infrastructure')).toBeInTheDocument(); - expect(card_groups.getByText('monitored')).toBeInTheDocument(); - expect(card_groups.getByText('scope')).toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument(); - await selectEvent.select(selectTagName, 'monitored') - selectEvent.openMenu(selectTagValue) - expect(card_groups.getByText('yes')).toBeInTheDocument(); - expect(card_groups.getByText('no')).toBeInTheDocument(); - await selectEvent.select(selectTagValue, 'yes') fireEvent.click(card_groups.getByRole('button', { name: /add new extension/i })) @@ -2977,34 +5278,8 @@ describe('Tests for reports addview', () => { const selectExtensionName = card_groups.getAllByText(/select/i)[0] const selectExtensionValue = card_groups.getAllByText(/select/i)[1] - expect(card_groups.queryByText('certification')).not.toBeInTheDocument(); - expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument(); - expect(card_groups.queryByText('scope')).not.toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument(); - expect(card_groups.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument(); - - selectEvent.openMenu(selectExtensionName) - expect(card_groups.queryByText('certification')).not.toBeInTheDocument(); - expect(card_groups.queryByText('infrastructure')).not.toBeInTheDocument(); - expect(card_groups.queryByText('scope')).not.toBeInTheDocument(); - expect(card_groups.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument(); - expect(card_groups.getByText('GLUE2ComputingShareMappingQueue')).toBeInTheDocument(); - await selectEvent.select(selectExtensionName, 'GLUE2EndpointImplementationName') - expect(card_groups.queryByText('condor')).not.toBeInTheDocument(); - expect(card_groups.queryByText('condor_q2d')).not.toBeInTheDocument(); - expect(card_groups.queryByText('eddie')).not.toBeInTheDocument(); - expect(card_groups.queryByText('ARC-CE')).not.toBeInTheDocument(); - expect(card_groups.queryByText('nordugrid-arc')).not.toBeInTheDocument(); - - selectEvent.openMenu(selectExtensionValue) - expect(card_groups.queryByText('condor')).not.toBeInTheDocument(); - expect(card_groups.queryByText('condor_q2d')).not.toBeInTheDocument(); - expect(card_groups.queryByText('eddie')).not.toBeInTheDocument(); - expect(card_groups.getByText('ARC-CE')).toBeInTheDocument() - expect(card_groups.getByText('nordugrid-arc')).toBeInTheDocument() - await selectEvent.select(selectExtensionValue, 'ARC-CE') fireEvent.click(card_endpoints.getByText(/add new extension/i)) @@ -3014,50 +5289,8 @@ describe('Tests for reports addview', () => { const endpointExtensionName = card_endpoints.getAllByText(/select/i)[0] const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] - expect(card_endpoints.queryByText('GLUE2ComputingShareMappingQueue')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('GLUE2EndpointImplementationName')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('condor_q2d')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('eddie')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); - - selectEvent.openMenu(endpointExtensionName) - expect(card_endpoints.getByText('GLUE2EndpointID')).toBeInTheDocument() - expect(card_endpoints.getByText('GLUE2EndpointImplementationName')).toBeInTheDocument() - expect(card_endpoints.queryByText('ce1.gridpp.ecdf.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('svr009.gla.scotgrid.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('t3-mw1.ph.ed.ac.uk')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); - await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') - selectEvent.openMenu(endpointExtensionValue) - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('ce1.gridpp.ecdf.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.getByText('t3-mw1.ph.ed.ac.uk')).toBeInTheDocument() - expect(card_endpoints.queryByText('ARC-CE')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('nordugrid-arc')).not.toBeInTheDocument() - expect(card_endpoints.queryByText('info_ID')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('info_URL')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_a_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_aaa_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText('vo_afigrid_attr_SE_PATH')).not.toBeInTheDocument(); - expect(card_endpoints.queryByText(/dpm/i)).not.toBeInTheDocument(); - await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); @@ -3073,78 +5306,12 @@ describe('Tests for reports addview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockAddReport).toHaveBeenCalledWith({ - info: { - name: 'OPS-MONITOR', - description: 'A/R report for Operations services.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - }, - { - id: 'Iesh4Eis-Z6JC-xWK8-O5KG-nae4eephoLah', - name: 'TEST_PROFILE', - type: 'thresholds' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockAddReport).toHaveBeenCalledWith(newReport4Sending) }) await waitFor(() => { expect(mockAddObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - apiid: 'Ohs2duRu-tU6N-mF3Q-jV8F-Wiush8ieR7me', - name: 'OPS-MONITOR', - groupname: 'ARGO', - description: 'A/R report for Operations services.' - } + '/api/v2/internal/reports/', newBackendReport4Sending ) }) @@ -3172,12 +5339,15 @@ describe('Tests for reports addview', () => { const metricProfile = screen.getAllByText(/select/i)[1] const aggregationProfile = screen.getAllByText(/select/i)[2] const operationsProfile = screen.getAllByText(/select/i)[3] + const thresholdsProfile = screen.getAllByText(/select/i)[4] const topologyType = screen.getAllByText(/select/i)[5] await selectEvent.select(groupField, 'ARGO') + await selectEvent.select(metricProfile, 'OPS_MONITOR_RHEL7') await selectEvent.select(aggregationProfile, 'ops-mon-critical') await selectEvent.select(operationsProfile, 'egi_ops') + await selectEvent.select(thresholdsProfile, 'TEST_PROFILE') await selectEvent.select(topologyType, 'Sites') @@ -3190,6 +5360,7 @@ describe('Tests for reports addview', () => { const selectTagValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectTagName, 'monitored') + await selectEvent.select(selectTagValue, 'yes') fireEvent.click(card_groups.getByRole('button', { name: /add new extension/i })) @@ -3198,6 +5369,7 @@ describe('Tests for reports addview', () => { const selectExtensionValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectExtensionName, 'GLUE2EndpointImplementationName') + await selectEvent.select(selectExtensionValue, 'ARC-CE') fireEvent.click(card_endpoints.getByText(/add new extension/i)) @@ -3208,6 +5380,7 @@ describe('Tests for reports addview', () => { const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); @@ -3223,62 +5396,7 @@ describe('Tests for reports addview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockAddReport).toHaveBeenCalledWith({ - info: { - name: 'OPS-MONITOR', - description: 'A/R report for Operations services.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockAddReport).toHaveBeenCalledWith(newReport4Sending) }) await waitFor(() => { @@ -3313,12 +5431,15 @@ describe('Tests for reports addview', () => { const metricProfile = screen.getAllByText(/select/i)[1] const aggregationProfile = screen.getAllByText(/select/i)[2] const operationsProfile = screen.getAllByText(/select/i)[3] + const thresholdsProfile = screen.getAllByText(/select/i)[4] const topologyType = screen.getAllByText(/select/i)[5] await selectEvent.select(groupField, 'ARGO') + await selectEvent.select(metricProfile, 'OPS_MONITOR_RHEL7') await selectEvent.select(aggregationProfile, 'ops-mon-critical') await selectEvent.select(operationsProfile, 'egi_ops') + await selectEvent.select(thresholdsProfile, 'TEST_PROFILE') await selectEvent.select(topologyType, 'Sites') @@ -3331,6 +5452,7 @@ describe('Tests for reports addview', () => { const selectTagValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectTagName, 'monitored') + await selectEvent.select(selectTagValue, 'yes') fireEvent.click(card_groups.getByRole('button', { name: /add new extension/i })) @@ -3339,6 +5461,7 @@ describe('Tests for reports addview', () => { const selectExtensionValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectExtensionName, 'GLUE2EndpointImplementationName') + await selectEvent.select(selectExtensionValue, 'ARC-CE') fireEvent.click(card_endpoints.getByText(/add new extension/i)) @@ -3349,6 +5472,7 @@ describe('Tests for reports addview', () => { const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); @@ -3364,62 +5488,7 @@ describe('Tests for reports addview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockAddReport).toHaveBeenCalledWith({ - info: { - name: 'OPS-MONITOR', - description: 'A/R report for Operations services.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockAddReport).toHaveBeenCalledWith(newReport4Sending) }) await waitFor(() => { @@ -3470,12 +5539,15 @@ describe('Tests for reports addview', () => { const metricProfile = screen.getAllByText(/select/i)[1] const aggregationProfile = screen.getAllByText(/select/i)[2] const operationsProfile = screen.getAllByText(/select/i)[3] + const thresholdsProfile = screen.getAllByText(/select/i)[4] const topologyType = screen.getAllByText(/select/i)[5] await selectEvent.select(groupField, 'ARGO') + await selectEvent.select(metricProfile, 'OPS_MONITOR_RHEL7') await selectEvent.select(aggregationProfile, 'ops-mon-critical') await selectEvent.select(operationsProfile, 'egi_ops') + await selectEvent.select(thresholdsProfile, 'TEST_PROFILE') await selectEvent.select(topologyType, 'Sites') @@ -3488,6 +5560,7 @@ describe('Tests for reports addview', () => { const selectTagValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectTagName, 'monitored') + await selectEvent.select(selectTagValue, 'yes') fireEvent.click(card_groups.getByRole('button', { name: /add new extension/i })) @@ -3496,6 +5569,7 @@ describe('Tests for reports addview', () => { const selectExtensionValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectExtensionName, 'GLUE2EndpointImplementationName') + await selectEvent.select(selectExtensionValue, 'ARC-CE') fireEvent.click(card_endpoints.getByText(/add new extension/i)) @@ -3506,6 +5580,7 @@ describe('Tests for reports addview', () => { const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); @@ -3521,73 +5596,12 @@ describe('Tests for reports addview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockAddReport).toHaveBeenCalledWith({ - info: { - name: 'OPS-MONITOR', - description: 'A/R report for Operations services.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockAddReport).toHaveBeenCalledWith(newReport4Sending) }) await waitFor(() => { expect(mockAddObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - apiid: 'Ohs2duRu-tU6N-mF3Q-jV8F-Wiush8ieR7me', - name: 'OPS-MONITOR', - groupname: 'ARGO', - description: 'A/R report for Operations services.' - } + '/api/v2/internal/reports/', newBackendReport4Sending ) }) @@ -3633,12 +5647,15 @@ describe('Tests for reports addview', () => { const metricProfile = screen.getAllByText(/select/i)[1] const aggregationProfile = screen.getAllByText(/select/i)[2] const operationsProfile = screen.getAllByText(/select/i)[3] + const thresholdsProfile = screen.getAllByText(/select/i)[4] const topologyType = screen.getAllByText(/select/i)[5] await selectEvent.select(groupField, 'ARGO') + await selectEvent.select(metricProfile, 'OPS_MONITOR_RHEL7') await selectEvent.select(aggregationProfile, 'ops-mon-critical') await selectEvent.select(operationsProfile, 'egi_ops') + await selectEvent.select(thresholdsProfile, 'TEST_PROFILE') await selectEvent.select(topologyType, 'Sites') @@ -3651,6 +5668,7 @@ describe('Tests for reports addview', () => { const selectTagValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectTagName, 'monitored') + await selectEvent.select(selectTagValue, 'yes') fireEvent.click(card_groups.getByRole('button', { name: /add new extension/i })) @@ -3659,6 +5677,7 @@ describe('Tests for reports addview', () => { const selectExtensionValue = card_groups.getAllByText(/select/i)[1] await selectEvent.select(selectExtensionName, 'GLUE2EndpointImplementationName') + await selectEvent.select(selectExtensionValue, 'ARC-CE') fireEvent.click(card_endpoints.getByText(/add new extension/i)) @@ -3669,6 +5688,7 @@ describe('Tests for reports addview', () => { const endpointExtensionValue = card_endpoints.getAllByText(/select/i)[1] await selectEvent.select(endpointExtensionName, 'GLUE2EndpointID') + await selectEvent.select(endpointExtensionValue, 'ce1.gridpp.ecdf.ed.ac.uk') fireEvent.change(screen.getByLabelText(/availability/i), { target: { value: '70' } }); @@ -3684,73 +5704,12 @@ describe('Tests for reports addview', () => { fireEvent.click(screen.getByRole('button', { name: /yes/i })); await waitFor(() => { - expect(mockAddReport).toHaveBeenCalledWith({ - info: { - name: 'OPS-MONITOR', - description: 'A/R report for Operations services.' - }, - thresholds: { - availability: 70, - reliability: 80, - uptime: 1.0, - unknown: 0.2, - downtime: 0.2 - }, - disabled: false, - profiles: [ - { - id: 'il8aimoh-r2ov-05aq-z4l2-uko2moophi9s', - name: 'OPS_MONITOR_RHEL7', - type: 'metric' - }, - { - id: 'ye3ioph5-1ryg-k4ea-e6eb-nei6zoupain2', - name: 'ops-mon-critical', - type: 'aggregation' - }, - { - id: 'gahjohf1-xx39-e0c9-p0rj-choh6ahziz9e', - name: 'egi_ops', - type: 'operations' - } - ], - filter_tags: [ - { - context: 'argo.group.filter.tags', - name: 'monitored', - value: '1' - }, - { - context: 'argo.group.filter.tags.array', - name: 'info_ext_GLUE2EndpointImplementationName', - value: 'ARC-CE' - }, - { - context: 'argo.endpoint.filter.tags.array', - name: 'info_ext_GLUE2EndpointID', - value: 'ce1.gridpp.ecdf.ed.ac.uk' - } - ], - topology_schema: { - group: { - type: 'NGI', - group: { - type: 'SITES' - } - } - } - }) + expect(mockAddReport).toHaveBeenCalledWith(newReport4Sending) }) await waitFor(() => { expect(mockAddObject).toHaveBeenCalledWith( - '/api/v2/internal/reports/', - { - apiid: 'Ohs2duRu-tU6N-mF3Q-jV8F-Wiush8ieR7me', - name: 'OPS-MONITOR', - groupname: 'ARGO', - description: 'A/R report for Operations services.' - } + '/api/v2/internal/reports/', newBackendReport4Sending ) }) From 0a8873be6e6c4e8021626caa6e42c3d921bcec5e Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Tue, 8 Mar 2022 14:16:21 +0100 Subject: [PATCH 04/16] renamed query functions --- .../frontend/react/AggregationProfiles.js | 8 +++-- poem/Poem/frontend/react/App.js | 33 +++++++++++++++---- poem/Poem/frontend/react/MetricProfiles.js | 2 +- poem/Poem/frontend/react/QueryFunctions.js | 6 ++-- poem/Poem/frontend/react/Reports.js | 4 +-- poem/Poem/frontend/react/ThresholdProfiles.js | 6 ++-- 6 files changed, 41 insertions(+), 18 deletions(-) diff --git a/poem/Poem/frontend/react/AggregationProfiles.js b/poem/Poem/frontend/react/AggregationProfiles.js index 3c6d98a0e..6b03a40d4 100644 --- a/poem/Poem/frontend/react/AggregationProfiles.js +++ b/poem/Poem/frontend/react/AggregationProfiles.js @@ -46,7 +46,11 @@ import ReactDiffViewer from 'react-diff-viewer'; import "react-notifications/lib/notifications.css"; import './AggregationProfiles.css'; -import { fetchAggregationProfiles, fetchMetricProfiles, fetchUserDetails } from './QueryFunctions'; +import { + fetchBackendAggregationProfiles, + fetchMetricProfiles, + fetchUserDetails +} from './QueryFunctions'; const AggregationProfilesChangeContext = React.createContext(); @@ -1201,7 +1205,7 @@ export const AggregationProfilesList = (props) => { const { data: aggregations, error: errorAggregations, isLoading: loadingAggregations } = useQuery( [`${publicView ? 'public_' : ''}aggregationprofile`, 'backend'], - () => fetchAggregationProfiles(publicView), + () => fetchBackendAggregationProfiles(publicView), { enabled: !publicView ? !!userDetails : true } ); diff --git a/poem/Poem/frontend/react/App.js b/poem/Poem/frontend/react/App.js index 92ff2230d..8a690af28 100644 --- a/poem/Poem/frontend/react/App.js +++ b/poem/Poem/frontend/react/App.js @@ -55,7 +55,26 @@ import { OperationsProfilesList, OperationsProfileDetails } from './OperationsPr import { CookiePolicy } from './CookiePolicy'; import { QueryClient, QueryClientProvider } from 'react-query'; import { ReactQueryDevtools } from 'react-query/devtools'; -import { fetchAggregationProfiles, fetchAPIKeys, fetchBackendMetricProfiles, fetchMetrics, fetchMetricTags, fetchMetricTemplates, fetchMetricTemplateTypes, fetchMetricTypes, fetchOperationsProfiles, fetchOStags, fetchPackages, fetchProbes, fetchReports, fetchTenants, fetchThresholdsProfiles, fetchUserGroups, fetchUsers, fetchYumRepos } from './QueryFunctions'; +import { + fetchBackendAggregationProfiles, + fetchAPIKeys, + fetchBackendMetricProfiles, + fetchMetrics, + fetchMetricTags, + fetchMetricTemplates, + fetchMetricTemplateTypes, + fetchMetricTypes, + fetchOperationsProfiles, + fetchOStags, + fetchPackages, + fetchProbes, + fetchBackendReports, + fetchTenants, + fetchBackendThresholdsProfiles, + fetchUserGroups, + fetchUsers, + fetchYumRepos +} from './QueryFunctions'; const NavigationBarWithRouter = withRouter(NavigationBar); @@ -647,16 +666,16 @@ const App = () => { ['metric', 'usergroups'], () => fetchUserGroups(true, false, 'metrics') ) queryClient.prefetchQuery( - 'report', () => fetchReports() + ['report', 'backend'], () => fetchBackendReports() ); queryClient.prefetchQuery( ['metricprofile', 'backend'], () => fetchBackendMetricProfiles() ); queryClient.prefetchQuery( - ['aggregationprofile', 'backend'], () => fetchAggregationProfiles() + ['aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles() ); queryClient.prefetchQuery( - 'thresholdsprofile', () => fetchThresholdsProfiles() + ['thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles() ); queryClient.prefetchQuery( 'operationsprofile', () => fetchOperationsProfiles( @@ -715,13 +734,13 @@ const App = () => { 'public_ostags', () => fetchOStags(true) ); queryClient.prefetchQuery( - 'public_metricprofile', () => fetchBackendMetricProfiles(true) + ['public_metricprofile', 'backend'], () => fetchBackendMetricProfiles(true) ); queryClient.prefetchQuery( - ['public_aggregationprofile', 'backend'], () => fetchAggregationProfiles(true) + ['public_aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles(true) ); queryClient.prefetchQuery( - 'public_thresholdsprofile', () => fetchThresholdsProfiles(true) + ['public_thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles(true) ); queryClient.prefetchQuery( 'public_operationsprofile', () => fetchOperationsProfiles(new WebApi({ token: token, operationsProfiles: webApiOperations })) diff --git a/poem/Poem/frontend/react/MetricProfiles.js b/poem/Poem/frontend/react/MetricProfiles.js index 4858abaac..1214dd8ae 100644 --- a/poem/Poem/frontend/react/MetricProfiles.js +++ b/poem/Poem/frontend/react/MetricProfiles.js @@ -1127,7 +1127,7 @@ export const MetricProfilesList = (props) => { ); const { data: metricProfiles, error: errorMetricProfiles, status: statusMetricProfiles} = useQuery( - `${publicView ? 'public_' : ''}metricprofile`, + [`${publicView ? 'public_' : ''}metricprofile`, 'backend'], () => fetchBackendMetricProfiles(publicView), { enabled: !publicView ? !!userDetails : true } ); diff --git a/poem/Poem/frontend/react/QueryFunctions.js b/poem/Poem/frontend/react/QueryFunctions.js index 78b89b290..996099da5 100644 --- a/poem/Poem/frontend/react/QueryFunctions.js +++ b/poem/Poem/frontend/react/QueryFunctions.js @@ -130,7 +130,7 @@ export const fetchTenants = async () => { } -export const fetchReports = async (publicView=false) => { +export const fetchBackendReports = async (publicView=false) => { const backend = new Backend(); return await backend.fetchData(`/api/v2/internal/${publicView ? 'public_' : ''}reports`); @@ -149,14 +149,14 @@ export const fetchMetricProfiles = async (webapi) => { } -export const fetchAggregationProfiles = async (publicView=false) => { +export const fetchBackendAggregationProfiles = async (publicView=false) => { const backend = new Backend(); return await backend.fetchData(`/api/v2/internal/${publicView ? 'public_' : ''}aggregations`) } -export const fetchThresholdsProfiles = async (publicView=false) => { +export const fetchBackendThresholdsProfiles = async (publicView=false) => { const backend = new Backend(); return await backend.fetchData(`/api/v2/internal/${publicView ? 'public_' : ''}thresholdsprofiles`); diff --git a/poem/Poem/frontend/react/Reports.js b/poem/Poem/frontend/react/Reports.js index 592db0716..90d7adb52 100644 --- a/poem/Poem/frontend/react/Reports.js +++ b/poem/Poem/frontend/react/Reports.js @@ -37,7 +37,7 @@ import { fetchMetricProfiles, fetchOperationsProfiles, fetchUserDetails, - fetchReports + fetchBackendReports } from './QueryFunctions'; @@ -107,7 +107,7 @@ export const ReportsList = (props) => { ); const { data: reports, error: errorReports, isLoading: loadingReports } = useQuery( - [`${publicView ? 'public_' : ''}report`, 'backend'], () => fetchReports(publicView), + [`${publicView ? 'public_' : ''}report`, 'backend'], () => fetchBackendReports(publicView), { enabled: !publicView ? !!userDetails : true } ); diff --git a/poem/Poem/frontend/react/ThresholdProfiles.js b/poem/Poem/frontend/react/ThresholdProfiles.js index 696527304..bd703e83a 100644 --- a/poem/Poem/frontend/react/ThresholdProfiles.js +++ b/poem/Poem/frontend/react/ThresholdProfiles.js @@ -42,7 +42,7 @@ import { useMutation, useQuery, useQueryClient } from 'react-query'; import { fetchUserDetails, fetchAllMetrics, - fetchThresholdsProfiles, + fetchBackendThresholdsProfiles, fetchMetricProfiles } from './QueryFunctions'; @@ -1006,8 +1006,8 @@ export const ThresholdsProfilesList = (props) => { ); const { data: thresholdsProfiles, error: errorThresholdsProfiles, status: statusThresholdsProfiles } = useQuery( - `${publicView ? 'public_' : ''}thresholdsprofile`, - () => fetchThresholdsProfiles(publicView), + [`${publicView ? 'public_' : ''}thresholdsprofile`, 'backend'], + () => fetchBackendThresholdsProfiles(publicView), { enabled: !publicView ? !!userDetails : true } From c5b55764aa4ae7a7630441dbebc4f61e67684050 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 9 Mar 2022 08:57:49 +0100 Subject: [PATCH 05/16] remove prefetch from reports listview, and include data prefetch from web-api in the App component --- poem/Poem/frontend/react/App.js | 57 +++++++++++++- poem/Poem/frontend/react/QueryFunctions.js | 25 ++++++ poem/Poem/frontend/react/Reports.js | 90 +++++----------------- 3 files changed, 96 insertions(+), 76 deletions(-) diff --git a/poem/Poem/frontend/react/App.js b/poem/Poem/frontend/react/App.js index 8a690af28..acdafbf20 100644 --- a/poem/Poem/frontend/react/App.js +++ b/poem/Poem/frontend/react/App.js @@ -73,7 +73,13 @@ import { fetchBackendThresholdsProfiles, fetchUserGroups, fetchUsers, - fetchYumRepos + fetchYumRepos, + fetchReports, + fetchMetricProfiles, + fetchAggregationProfiles, + fetchThresholdsProfiles, + fetchTopologyTags, + fetchTopologyGroups } from './QueryFunctions'; @@ -656,6 +662,14 @@ const App = () => { setWebApiOperations(options && options.result.webapioperations); setWebApiReports(options && options.result.webapireports); setTenantName(options && options.result.tenant_name); + let webapi = new WebApi({ + token: token, + metricProfiles: webApiMetric, + aggregationProfiles: webApiAggregation, + thresholdsProfiles: webApiThresholds, + operationsProfiles: webApiOperations, + reportsConfigurations: webApiReports + }) queryClient.prefetchQuery( 'metric', () => fetchMetrics(false) ); @@ -668,23 +682,41 @@ const App = () => { queryClient.prefetchQuery( ['report', 'backend'], () => fetchBackendReports() ); + queryClient.prefetchQuery( + ['report', 'webapi'], () => fetchReports(webapi) + ) queryClient.prefetchQuery( ['metricprofile', 'backend'], () => fetchBackendMetricProfiles() ); + queryClient.prefetchQuery( + ['metricprofile', 'webapi'], () => fetchMetricProfiles(webapi) + ) queryClient.prefetchQuery( ['aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles() ); + queryClient.prefetchQuery( + ['aggregationprofile', 'webapi'], () => fetchAggregationProfiles(webapi) + ) queryClient.prefetchQuery( ['thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles() ); queryClient.prefetchQuery( - 'operationsprofile', () => fetchOperationsProfiles( - new WebApi({ token: token, operationsProfiles: webApiOperations }) - ) + ['thresholdsprofile', 'webapi'], () => fetchThresholdsProfiles(webapi) + ) + queryClient.prefetchQuery( + 'operationsprofile', () => fetchOperationsProfiles(webapi) ); queryClient.prefetchQuery( 'usergroups', () => fetchUserGroups(true) ); + if (webApiReports && webApiReports.crud) { + queryClient.prefetchQuery( + 'topologytags', () => fetchTopologyTags(webapi) + ) + queryClient.prefetchQuery( + 'topologygroups', () => fetchTopologyGroups(webapi) + ) + } } else { queryClient.prefetchQuery( 'tenant', () => fetchTenants() @@ -709,6 +741,14 @@ const App = () => { setTermsLink(options && options.result.terms_privacy_links.terms); setTenantName(options && options.result.tenant_name); setPublicView(true); + let webapi = new WebApi({ + token: token, + metricProfiles: webApiMetric, + aggregationProfiles: webApiAggregation, + thresholdsProfiles: webApiThresholds, + operationsProfiles: webApiOperations, + reportsConfigurations: webApiReports + }) queryClient.prefetchQuery( 'public_probe', () => fetchProbes(true) ); @@ -736,12 +776,21 @@ const App = () => { queryClient.prefetchQuery( ['public_metricprofile', 'backend'], () => fetchBackendMetricProfiles(true) ); + queryClient.prefetchQuery( + ['public_metricprofile', 'webapi'], () => fetchMetricProfiles(webapi) + ) queryClient.prefetchQuery( ['public_aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles(true) ); + queryClient.prefetchQuery( + ['public_aggregationprofile', 'webapi'], () => fetchAggregationProfiles(webapi) + ) queryClient.prefetchQuery( ['public_thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles(true) ); + queryClient.prefetchQuery( + ['public_thresholdsprofile', 'webapi'], () => fetchThresholdsProfiles(webapi) + ) queryClient.prefetchQuery( 'public_operationsprofile', () => fetchOperationsProfiles(new WebApi({ token: token, operationsProfiles: webApiOperations })) ); diff --git a/poem/Poem/frontend/react/QueryFunctions.js b/poem/Poem/frontend/react/QueryFunctions.js index 996099da5..1aeb97f02 100644 --- a/poem/Poem/frontend/react/QueryFunctions.js +++ b/poem/Poem/frontend/react/QueryFunctions.js @@ -137,6 +137,11 @@ export const fetchBackendReports = async (publicView=false) => { } +export const fetchReports = async (webapi) => { + return await webapi.fetchReports() +} + + export const fetchBackendMetricProfiles = async (publicView=false) => { const backend = new Backend(); @@ -156,6 +161,11 @@ export const fetchBackendAggregationProfiles = async (publicView=false) => { } +export const fetchAggregationProfiles = async (webapi) => { + return await webapi.fetchAggregationProfiles() +} + + export const fetchBackendThresholdsProfiles = async (publicView=false) => { const backend = new Backend(); @@ -163,6 +173,21 @@ export const fetchBackendThresholdsProfiles = async (publicView=false) => { } +export const fetchThresholdsProfiles = async (webapi) => { + return await webapi.fetchThresholdsProfiles() +} + + export const fetchOperationsProfiles = async (webapi) => { return await webapi.fetchOperationsProfiles(); } + + +export const fetchTopologyTags = async (webapi) => { + return await webapi.fetchReportsTopologyTags() +} + + +export const fetchTopologyGroups = async (webapi) => { + return await webapi.fetchReportsTopologyGroups() +} diff --git a/poem/Poem/frontend/react/Reports.js b/poem/Poem/frontend/react/Reports.js index 90d7adb52..c1ebf95d3 100644 --- a/poem/Poem/frontend/react/Reports.js +++ b/poem/Poem/frontend/react/Reports.js @@ -37,7 +37,11 @@ import { fetchMetricProfiles, fetchOperationsProfiles, fetchUserDetails, - fetchBackendReports + fetchBackendReports, + fetchAggregationProfiles, + fetchThresholdsProfiles, + fetchTopologyTags, + fetchTopologyGroups } from './QueryFunctions'; @@ -64,24 +68,6 @@ const fetchReport = async (webapi, name) => { } -const fetchAggregationProfiles = async (webapi) => { - return await webapi.fetchAggregationProfiles(); -} - -const fetchThresholdsProfiles = async (webapi) => { - return await webapi.fetchThresholdsProfiles() -} - - -const fetchTopologyTags = async (webapi) => { - return await webapi.fetchReportsTopologyTags(); -} - - -const fetchTopologyGroups = async (webapi) => { - return await webapi.fetchReportsTopologyGroups(); -} - const getCrud = (props) => { return props.webapireports ? props.webapireports.crud : undefined; } @@ -90,18 +76,6 @@ export const ReportsList = (props) => { const location = props.location; const publicView = props.publicView; - const queryClient = useQueryClient(); - - const webapi = new WebApi({ - token: props.webapitoken, - reportsConfigurations: props.webapireports, - metricProfiles: props.webapimetric, - aggregationProfiles: props.webapiaggregation, - operationsProfiles: props.webapioperations, - thresholdsProfiles: props.webapithresholds - }); - const crud = getCrud(props); - const { data: userDetails, error: errorUserDetails, isLoading: loadingUserDetails } = useQuery( 'userdetails', () => fetchUserDetails(true) ); @@ -124,31 +98,6 @@ export const ReportsList = (props) => { accessor: e => { - await queryClient.prefetchQuery( - [`${publicView ? 'public_' : ''}report`, 'webapi', e.name], () => fetchReport(webapi, e.name) - ); - await queryClient.prefetchQuery( - [`${publicView ? 'public_' : ''}metricprofile`, 'webapi'], () => fetchMetricProfiles(webapi) - ); - await queryClient.prefetchQuery( - [`${publicView ? 'public_' : ''}aggregationprofile`, 'webapi'], () => fetchAggregationProfiles(webapi) - ); - await queryClient.prefetchQuery( - `${publicView ? 'public_' : ''}operationsprofile`, () => fetchOperationsProfiles(webapi) - ); - await queryClient.prefetchQuery( - [`${publicView ? 'public_' : ''}thresholdsprofile`, 'webapi'], () => fetchThresholdsProfiles(webapi) - ) - if (crud) { - await queryClient.prefetchQuery( - 'topologytags', () => fetchTopologyTags(webapi) - ); - await queryClient.prefetchQuery( - 'topologygroups', () => fetchTopologyGroups(webapi) - ); - } - } } > {e.name} , @@ -709,30 +658,27 @@ export const ReportsComponent = (props) => { ); const { data: webApiReport, error: errorWebApiReport, isLoading: loadingWebApiReport } = useQuery( - ['report', 'webapi', report_name], () => fetchReport(webapi, report_name), - { - enabled: publicView - || (!!userDetails && !addview), - } + [`${publicView ? 'public_' : ''}report`, 'webapi', report_name], () => fetchReport(webapi, report_name), + { enabled: publicView || (!!userDetails && !addview) } ) const { data: listMetricProfiles, error: listMetricProfilesError, isLoading: listMetricProfilesLoading } = useQuery( - ['metricprofile', 'webapi'], () => fetchMetricProfiles(webapi), + [`${publicView ? 'public_' : ''}metricprofile`, 'webapi'], () => fetchMetricProfiles(webapi), { enabled: !publicView && !!userDetails } ); const { data: listAggregationProfiles, error: listAggregationProfilesError, isLoading: listAggregationProfilesLoading } = useQuery( - ['aggregationprofile', 'webapi'], () => fetchAggregationProfiles(webapi), + [`${publicView ? 'public_' : ''}aggregationprofile`, 'webapi'], () => fetchAggregationProfiles(webapi), { enabled: !publicView && !!userDetails } ); const { data: listOperationsProfiles, error: listOperationsProfilesError, isLoading: listOperationsProfilesLoading } = useQuery( - 'operationsprofile', () => fetchOperationsProfiles(webapi), + `${publicView ? 'public_' : ''}operationsprofile`, () => fetchOperationsProfiles(webapi), { enabled: !publicView && !!userDetails } ); const { data: listThresholdsProfiles, error: listThresholdsProfilesError, isLoading: listThresholdsProfilesLoading } = useQuery( - ['thresholdsprofile', 'webapi'], () => fetchThresholdsProfiles(webapi), + [`${publicView ? 'public_' : ''}thresholdsprofile`, 'webapi'], () => fetchThresholdsProfiles(webapi), { enabled: !publicView && !!userDetails } ) @@ -1394,17 +1340,17 @@ export const ReportsComponent = (props) => { initialValues = {{ id: webApiReport ? webApiReport.id : '', disabled: webApiReport ? webApiReport.disabled : false, - name: webApiReport ? webApiReport.info.name : '', - description: webApiReport ? webApiReport.info.description : '', + name: webApiReport ? webApiReport.info ? webApiReport.info.name : '' : '', + description: webApiReport ? webApiReport.info ? webApiReport.info.description : '' : '', metricProfile: metricProfile, aggregationProfile: aggregationProfile, operationsProfile: operationsProfile, thresholdsProfile: thresholdsProfile, - availabilityThreshold: webApiReport ? webApiReport.thresholds.availability : '', - reliabilityThreshold: webApiReport ? webApiReport.thresholds.reliability : '', - uptimeThreshold: webApiReport ? webApiReport.thresholds.uptime : '', - unknownThreshold: webApiReport ? webApiReport.thresholds.unknown : '', - downtimeThreshold: webApiReport ? webApiReport.thresholds.downtime : '', + availabilityThreshold: webApiReport ? webApiReport.thresholds ? webApiReport.thresholds.availability : '' : '', + reliabilityThreshold: webApiReport ? webApiReport.thresholds ? webApiReport.thresholds.reliability : '' : '', + uptimeThreshold: webApiReport ? webApiReport.thresholds ? webApiReport.thresholds.uptime : '' : '', + unknownThreshold: webApiReport ? webApiReport.thresholds ? webApiReport.thresholds.unknown : '' : '', + downtimeThreshold: webApiReport ? webApiReport.thresholds ? webApiReport.thresholds.downtime : '' : '', topologyType: whichTopologyType(webApiReport ? webApiReport.topology_schema : {}), groupname: backendReport ? backendReport.groupname : '', groupsTags: groupsTags, From fa26e5201061d5eb1d0d6374136b0eaadb09ec53 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 9 Mar 2022 11:46:25 +0100 Subject: [PATCH 06/16] invalidateQueries when deleting reports even in case of error --- poem/Poem/frontend/react/Reports.js | 2 +- poem/Poem/frontend/react/__tests__/Reports.test.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poem/Poem/frontend/react/Reports.js b/poem/Poem/frontend/react/Reports.js index c1ebf95d3..7b2d8d749 100644 --- a/poem/Poem/frontend/react/Reports.js +++ b/poem/Poem/frontend/react/Reports.js @@ -975,7 +975,6 @@ export const ReportsComponent = (props) => { title: 'Deleted', callback: () => history.push('/ui/reports') }); - queryClient.invalidateQueries('report'); }, onError: (error) => { NotifyError({ @@ -992,6 +991,7 @@ export const ReportsComponent = (props) => { }) } }) + queryClient.invalidateQueries('report') } const doChange = (formValues) => { diff --git a/poem/Poem/frontend/react/__tests__/Reports.test.js b/poem/Poem/frontend/react/__tests__/Reports.test.js index 36e2c5e68..818f1335d 100644 --- a/poem/Poem/frontend/react/__tests__/Reports.test.js +++ b/poem/Poem/frontend/react/__tests__/Reports.test.js @@ -3231,7 +3231,7 @@ describe('Tests for reports changeview', () => { expect(mockDeleteObject).not.toHaveBeenCalled(); }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); expect(NotificationManager.error).toHaveBeenCalledWith(

406 Content Not acceptable: There has been an error.

@@ -3266,7 +3266,7 @@ describe('Tests for reports changeview', () => { expect(mockDeleteObject).not.toHaveBeenCalled(); }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); expect(NotificationManager.error).toHaveBeenCalledWith(

Web API error deleting report

@@ -3306,7 +3306,7 @@ describe('Tests for reports changeview', () => { ) }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); expect(NotificationManager.error).toHaveBeenCalledWith(

400 BAD REQUEST: There has been an error.

@@ -3344,7 +3344,7 @@ describe('Tests for reports changeview', () => { ) }) - expect(queryClient.invalidateQueries).not.toHaveBeenCalled(); + expect(queryClient.invalidateQueries).toHaveBeenCalledWith('report'); expect(NotificationManager.error).toHaveBeenCalledWith(

Internal API error deleting report

From 11cfbe315d2ffa7d708325b0a87995fdb5e7f415 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 9 Mar 2022 13:45:20 +0100 Subject: [PATCH 07/16] separate public changeview tests --- poem/Poem/frontend/react/Reports.js | 2 +- .../frontend/react/__tests__/Reports.test.js | 449 +++++++++--------- 2 files changed, 234 insertions(+), 217 deletions(-) diff --git a/poem/Poem/frontend/react/Reports.js b/poem/Poem/frontend/react/Reports.js index 7b2d8d749..973ef8405 100644 --- a/poem/Poem/frontend/react/Reports.js +++ b/poem/Poem/frontend/react/Reports.js @@ -648,7 +648,7 @@ export const ReportsComponent = (props) => { ) const { data: topologyGroups, error: topologyGroupsErrors, isLoading: loadingTopologyGroups } = useQuery( - 'topologygroups', () => fetchTopologyGroups(webapi), + `${publicView ? 'public_' : ''}topologygroups`, () => fetchTopologyGroups(webapi), { enabled: (publicView || !!userDetails) && crud } ); diff --git a/poem/Poem/frontend/react/__tests__/Reports.test.js b/poem/Poem/frontend/react/__tests__/Reports.test.js index 818f1335d..77982e193 100644 --- a/poem/Poem/frontend/react/__tests__/Reports.test.js +++ b/poem/Poem/frontend/react/__tests__/Reports.test.js @@ -1270,222 +1270,6 @@ describe('Tests for reports changeview', () => { expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); }) - test('Test that public page renders properly', async () => { - renderChangeView(true); - - await waitFor(() => { - expect(screen.getByRole('heading', { name: /details/i }).textContent).toBe('Report details'); - }) - - const nameField = screen.getByTestId('name'); - const disabledField = screen.getByLabelText(/disabled/i); - const descriptionField = screen.getByLabelText(/description/i); - const groupField = screen.getByTestId('groupname'); - const metricProfileField = screen.getByLabelText('Metric profile:') - const aggrProfileField = screen.getByLabelText('Aggregation profile:') - const operationsProfileField = screen.getByLabelText('Operations profile:') - const thresholdsProfileField = screen.getByLabelText('Thresholds profile:') - const topologyTypeField = screen.getByLabelText('Topology type:'); - const availabilityThresholdField = screen.getByLabelText(/availability/i); - const reliabilityThresholdField = screen.getByLabelText(/reliability/i); - const uptimeThresholdField = screen.getByLabelText(/uptime/i); - const unknownThresholdField = screen.getByLabelText(/unknown/i); - const downtimeThresholdField = screen.getByLabelText(/downtime/i); - - expect(nameField.value).toBe('Critical'); - expect(nameField).toBeDisabled(); - expect(disabledField.checked).toBeFalsy(); - expect(disabledField).toBeDisabled(); - expect(descriptionField.value).toBe('Critical report'); - expect(descriptionField).toBeDisabled(); - expect(groupField.value).toBe('ARGO') - expect(groupField).toBeDisabled(); - - expect(metricProfileField.value).toBe('ARGO_MON_CRITICAL') - expect(metricProfileField).toBeDisabled() - - expect(aggrProfileField.value).toBe('critical') - expect(aggrProfileField).toBeDisabled() - - expect(operationsProfileField.value).toBe('egi_ops') - expect(operationsProfileField).toBeDisabled() - - expect(thresholdsProfileField.value).toBe('') - expect(thresholdsProfileField).toBeDisabled() - - expect(topologyTypeField.value).toBe('Sites'); - expect(topologyTypeField).toBeDisabled() - - expect(screen.getAllByTestId(/card/i)).toHaveLength(2); - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); - - const tag1name = card_groups.getByTestId('groupsTags.0.name') - const tag1value = card_groups.getByTestId('groupsTags.0.value') - const tag2name = card_groups.getByTestId('groupsTags.1.name') - const tag2value = card_groups.getByTestId('groupsTags.1.value') - const tag3name = card_groups.getByTestId('groupsTags.2.name') - const tag3value = card_groups.getByTestId('groupsTags.2.value') - - expect(tag1name.value).toBe('certification') - expect(tag1name).toBeDisabled() - expect(tag1value.value).toBe('Certified') - expect(tag1value).toBeDisabled() - expect(tag2name.value).toBe('infrastructure') - expect(tag2name).toBeDisabled() - expect(tag2value.value).toBe('Production') - expect(tag2value).toBeDisabled() - expect(tag3name.value).toBe('scope') - expect(tag3name).toBeDisabled() - expect(tag3value.value).toBe('EGI*') - expect(tag3value).toBeDisabled() - expect(card_groups.queryByTestId(/remove/i)).not.toBeInTheDocument() - - expect(card_groups.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); - expect(card_groups.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); - expect(card_groups.getByTestId('groupsExtensions.0.name').value).toBe('GLUE2ComputingShareMappingQueue') - expect(card_groups.getByTestId('groupsExtensions.0.value').value).toBe('condor') - expect(card_groups.getByLabelText('NGIs:').value).toBe('iris.ac.uk') - expect(card_groups.getByLabelText('Sites:').value).toBe('dirac-durham, IRISOPS-IAM') - - expect(card_endpoints.getByTestId('endpointsTags.0.name').value).toBe('production') - expect(card_endpoints.getByTestId('endpointsTags.0.value').value).toBe('yes') - expect(card_endpoints.getByTestId('endpointsTags.1.name').value).toBe('monitored') - expect(card_endpoints.getByTestId('endpointsTags.1.value').value).toBe('yes') - expect(card_endpoints.getByTestId('endpointsTags.2.name').value).toBe('scope') - expect(card_endpoints.getByTestId('endpointsTags.2.value').value).toBe('EGI*') - - expect(card_endpoints.queryByTestId(/remove/i)).not.toBeInTheDocument(); - expect(card_endpoints.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); - expect(card_endpoints.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); - - expect(availabilityThresholdField.value).toBe('80'); - expect(availabilityThresholdField).toBeDisabled(); - expect(reliabilityThresholdField.value).toBe('85'); - expect(reliabilityThresholdField).toBeDisabled(); - expect(uptimeThresholdField.value).toBe('0.8'); - expect(uptimeThresholdField).toBeDisabled(); - expect(unknownThresholdField.value).toBe('0.1'); - expect(unknownThresholdField).toBeDisabled(); - expect(downtimeThresholdField.value).toBe('0.1'); - expect(downtimeThresholdField).toBeDisabled(); - - expect(screen.queryByRole('button', { name: /save/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); - }) - - test('Test that public page renders properly if report has no entities', async () => { - WebApi.mockImplementation(() => { - return { - fetchReport: () => Promise.resolve(mockReport2), - fetchReportsTopologyTags: () => Promise.resolve(mockReportsTopologyTags) - } - }) - renderChangeView(true); - - await waitFor(() => { - expect(screen.getByRole('heading', { name: /details/i }).textContent).toBe('Report details'); - }) - - const nameField = screen.getByTestId('name'); - const disabledField = screen.getByLabelText(/disabled/i); - const descriptionField = screen.getByLabelText(/description/i); - const groupField = screen.getByTestId('groupname'); - const metricProfileField = screen.getByLabelText('Metric profile:') - const aggrProfileField = screen.getByLabelText('Aggregation profile:') - const operationsProfileField = screen.getByLabelText('Operations profile:') - const thresholdsProfileField = screen.getByLabelText('Thresholds profile:') - const topologyTypeField = screen.getByLabelText('Topology type:'); - const availabilityThresholdField = screen.getByLabelText(/availability/i); - const reliabilityThresholdField = screen.getByLabelText(/reliability/i); - const uptimeThresholdField = screen.getByLabelText(/uptime/i); - const unknownThresholdField = screen.getByLabelText(/unknown/i); - const downtimeThresholdField = screen.getByLabelText(/downtime/i); - - expect(nameField.value).toBe('Critical'); - expect(nameField).toBeDisabled(); - expect(disabledField.checked).toBeFalsy(); - expect(disabledField).toBeDisabled(); - expect(descriptionField.value).toBe('Critical report'); - expect(descriptionField).toBeDisabled(); - expect(groupField.value).toBe('ARGO') - expect(groupField).toBeDisabled(); - - expect(metricProfileField.value).toBe('ARGO_MON_CRITICAL') - expect(metricProfileField).toBeDisabled() - - expect(aggrProfileField.value).toBe('critical') - expect(aggrProfileField).toBeDisabled() - - expect(operationsProfileField.value).toBe('egi_ops') - expect(operationsProfileField).toBeDisabled() - - expect(thresholdsProfileField.value).toBe('') - expect(thresholdsProfileField).toBeDisabled() - - expect(topologyTypeField.value).toBe('Sites'); - expect(topologyTypeField).toBeDisabled() - - expect(screen.getAllByTestId(/card/i)).toHaveLength(2); - const card_groups = within(screen.getByTestId('card-group-of-groups')); - const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); - - const tag1name = card_groups.getByTestId('groupsTags.0.name') - const tag1value = card_groups.getByTestId('groupsTags.0.value') - const tag2name = card_groups.getByTestId('groupsTags.1.name') - const tag2value = card_groups.getByTestId('groupsTags.1.value') - const tag3name = card_groups.getByTestId('groupsTags.2.name') - const tag3value = card_groups.getByTestId('groupsTags.2.value') - - expect(tag1name.value).toBe('certification') - expect(tag1name).toBeDisabled() - expect(tag1value.value).toBe('Certified') - expect(tag1value).toBeDisabled() - expect(tag2name.value).toBe('infrastructure') - expect(tag2name).toBeDisabled() - expect(tag2value.value).toBe('Production') - expect(tag2value).toBeDisabled() - expect(tag3name.value).toBe('scope') - expect(tag3name).toBeDisabled() - expect(tag3value.value).toBe('EGI*') - expect(tag3value).toBeDisabled() - expect(card_groups.queryByTestId(/remove/i)).not.toBeInTheDocument() - - expect(card_groups.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); - expect(card_groups.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); - expect(card_groups.getByTestId('groupsExtensions.0.name').value).toBe('') - expect(card_groups.getByTestId('groupsExtensions.0.value').value).toBe('') - expect(card_groups.getByLabelText('NGIs:').value).toBe('') - expect(card_groups.getByLabelText('Sites:').value).toBe('') - - expect(card_endpoints.getByTestId('endpointsTags.0.name').value).toBe('production') - expect(card_endpoints.getByTestId('endpointsTags.0.value').value).toBe('yes') - expect(card_endpoints.getByTestId('endpointsTags.1.name').value).toBe('monitored') - expect(card_endpoints.getByTestId('endpointsTags.1.value').value).toBe('yes') - expect(card_endpoints.getByTestId('endpointsTags.2.name').value).toBe('scope') - expect(card_endpoints.getByTestId('endpointsTags.2.value').value).toBe('EGI*') - - expect(card_endpoints.queryByTestId(/remove/i)).not.toBeInTheDocument(); - expect(card_endpoints.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); - expect(card_endpoints.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); - - expect(availabilityThresholdField.value).toBe('80'); - expect(availabilityThresholdField).toBeDisabled(); - expect(reliabilityThresholdField.value).toBe('85'); - expect(reliabilityThresholdField).toBeDisabled(); - expect(uptimeThresholdField.value).toBe('0.8'); - expect(uptimeThresholdField).toBeDisabled(); - expect(unknownThresholdField.value).toBe('0.1'); - expect(unknownThresholdField).toBeDisabled(); - expect(downtimeThresholdField.value).toBe('0.1'); - expect(downtimeThresholdField).toBeDisabled(); - - expect(screen.queryByRole('button', { name: /save/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); - expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); - }) - test('Test change report name', async () => { mockChangeObject.mockReturnValueOnce( Promise.resolve({ ok: true, status: 200, statusText: 'OK' }) @@ -3358,6 +3142,239 @@ describe('Tests for reports changeview', () => { }) +describe('Tests for public reports changeview', () => { + beforeEach(() => { + WebApi.mockImplementation(() => { + return { + fetchReport: () => Promise.resolve(mockReport), + fetchReportsTopologyGroups: () => Promise.resolve(mockReportsTopologyGroups), + } + }) + Backend.mockImplementation(() => { + return { + fetchData: () => Promise.resolve(mockBackendReport) + } + }) + }) + + test('Test that page renders properly', async () => { + renderChangeView(true); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /details/i }).textContent).toBe('Report details'); + }) + + const nameField = screen.getByTestId('name'); + const disabledField = screen.getByLabelText(/disabled/i); + const descriptionField = screen.getByLabelText(/description/i); + const groupField = screen.getByTestId('groupname'); + const metricProfileField = screen.getByLabelText('Metric profile:') + const aggrProfileField = screen.getByLabelText('Aggregation profile:') + const operationsProfileField = screen.getByLabelText('Operations profile:') + const thresholdsProfileField = screen.getByLabelText('Thresholds profile:') + const topologyTypeField = screen.getByLabelText('Topology type:'); + const availabilityThresholdField = screen.getByLabelText(/availability/i); + const reliabilityThresholdField = screen.getByLabelText(/reliability/i); + const uptimeThresholdField = screen.getByLabelText(/uptime/i); + const unknownThresholdField = screen.getByLabelText(/unknown/i); + const downtimeThresholdField = screen.getByLabelText(/downtime/i); + + expect(nameField.value).toBe('Critical'); + expect(nameField).toBeDisabled(); + expect(disabledField.checked).toBeFalsy(); + expect(disabledField).toBeDisabled(); + expect(descriptionField.value).toBe('Critical report'); + expect(descriptionField).toBeDisabled(); + expect(groupField.value).toBe('ARGO') + expect(groupField).toBeDisabled(); + + expect(metricProfileField.value).toBe('ARGO_MON_CRITICAL') + expect(metricProfileField).toBeDisabled() + + expect(aggrProfileField.value).toBe('critical') + expect(aggrProfileField).toBeDisabled() + + expect(operationsProfileField.value).toBe('egi_ops') + expect(operationsProfileField).toBeDisabled() + + expect(thresholdsProfileField.value).toBe('') + expect(thresholdsProfileField).toBeDisabled() + + expect(topologyTypeField.value).toBe('Sites'); + expect(topologyTypeField).toBeDisabled() + + expect(screen.getAllByTestId(/card/i)).toHaveLength(2); + const card_groups = within(screen.getByTestId('card-group-of-groups')); + const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + + const tag1name = card_groups.getByTestId('groupsTags.0.name') + const tag1value = card_groups.getByTestId('groupsTags.0.value') + const tag2name = card_groups.getByTestId('groupsTags.1.name') + const tag2value = card_groups.getByTestId('groupsTags.1.value') + const tag3name = card_groups.getByTestId('groupsTags.2.name') + const tag3value = card_groups.getByTestId('groupsTags.2.value') + + expect(tag1name.value).toBe('certification') + expect(tag1name).toBeDisabled() + expect(tag1value.value).toBe('Certified') + expect(tag1value).toBeDisabled() + expect(tag2name.value).toBe('infrastructure') + expect(tag2name).toBeDisabled() + expect(tag2value.value).toBe('Production') + expect(tag2value).toBeDisabled() + expect(tag3name.value).toBe('scope') + expect(tag3name).toBeDisabled() + expect(tag3value.value).toBe('EGI*') + expect(tag3value).toBeDisabled() + expect(card_groups.queryByTestId(/remove/i)).not.toBeInTheDocument() + + expect(card_groups.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); + expect(card_groups.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); + expect(card_groups.getByTestId('groupsExtensions.0.name').value).toBe('GLUE2ComputingShareMappingQueue') + expect(card_groups.getByTestId('groupsExtensions.0.value').value).toBe('condor') + expect(card_groups.getByLabelText('NGIs:').value).toBe('iris.ac.uk') + expect(card_groups.getByLabelText('Sites:').value).toBe('dirac-durham, IRISOPS-IAM') + + expect(card_endpoints.getByTestId('endpointsTags.0.name').value).toBe('production') + expect(card_endpoints.getByTestId('endpointsTags.0.value').value).toBe('yes') + expect(card_endpoints.getByTestId('endpointsTags.1.name').value).toBe('monitored') + expect(card_endpoints.getByTestId('endpointsTags.1.value').value).toBe('yes') + expect(card_endpoints.getByTestId('endpointsTags.2.name').value).toBe('scope') + expect(card_endpoints.getByTestId('endpointsTags.2.value').value).toBe('EGI*') + + expect(card_endpoints.queryByTestId(/remove/i)).not.toBeInTheDocument(); + expect(card_endpoints.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); + expect(card_endpoints.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); + + expect(availabilityThresholdField.value).toBe('80'); + expect(availabilityThresholdField).toBeDisabled(); + expect(reliabilityThresholdField.value).toBe('85'); + expect(reliabilityThresholdField).toBeDisabled(); + expect(uptimeThresholdField.value).toBe('0.8'); + expect(uptimeThresholdField).toBeDisabled(); + expect(unknownThresholdField.value).toBe('0.1'); + expect(unknownThresholdField).toBeDisabled(); + expect(downtimeThresholdField.value).toBe('0.1'); + expect(downtimeThresholdField).toBeDisabled(); + + expect(screen.queryByRole('button', { name: /save/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); + }) + + test('Test that page renders properly if report has no entities', async () => { + WebApi.mockImplementation(() => { + return { + fetchReport: () => Promise.resolve(mockReport2), + fetchReportsTopologyTags: () => Promise.resolve(mockReportsTopologyTags) + } + }) + renderChangeView(true); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: /details/i }).textContent).toBe('Report details'); + }) + + const nameField = screen.getByTestId('name'); + const disabledField = screen.getByLabelText(/disabled/i); + const descriptionField = screen.getByLabelText(/description/i); + const groupField = screen.getByTestId('groupname'); + const metricProfileField = screen.getByLabelText('Metric profile:') + const aggrProfileField = screen.getByLabelText('Aggregation profile:') + const operationsProfileField = screen.getByLabelText('Operations profile:') + const thresholdsProfileField = screen.getByLabelText('Thresholds profile:') + const topologyTypeField = screen.getByLabelText('Topology type:'); + const availabilityThresholdField = screen.getByLabelText(/availability/i); + const reliabilityThresholdField = screen.getByLabelText(/reliability/i); + const uptimeThresholdField = screen.getByLabelText(/uptime/i); + const unknownThresholdField = screen.getByLabelText(/unknown/i); + const downtimeThresholdField = screen.getByLabelText(/downtime/i); + + expect(nameField.value).toBe('Critical'); + expect(nameField).toBeDisabled(); + expect(disabledField.checked).toBeFalsy(); + expect(disabledField).toBeDisabled(); + expect(descriptionField.value).toBe('Critical report'); + expect(descriptionField).toBeDisabled(); + expect(groupField.value).toBe('ARGO') + expect(groupField).toBeDisabled(); + + expect(metricProfileField.value).toBe('ARGO_MON_CRITICAL') + expect(metricProfileField).toBeDisabled() + + expect(aggrProfileField.value).toBe('critical') + expect(aggrProfileField).toBeDisabled() + + expect(operationsProfileField.value).toBe('egi_ops') + expect(operationsProfileField).toBeDisabled() + + expect(thresholdsProfileField.value).toBe('') + expect(thresholdsProfileField).toBeDisabled() + + expect(topologyTypeField.value).toBe('Sites'); + expect(topologyTypeField).toBeDisabled() + + expect(screen.getAllByTestId(/card/i)).toHaveLength(2); + const card_groups = within(screen.getByTestId('card-group-of-groups')); + const card_endpoints = within(screen.getByTestId('card-group-of-endpoints')); + + const tag1name = card_groups.getByTestId('groupsTags.0.name') + const tag1value = card_groups.getByTestId('groupsTags.0.value') + const tag2name = card_groups.getByTestId('groupsTags.1.name') + const tag2value = card_groups.getByTestId('groupsTags.1.value') + const tag3name = card_groups.getByTestId('groupsTags.2.name') + const tag3value = card_groups.getByTestId('groupsTags.2.value') + + expect(tag1name.value).toBe('certification') + expect(tag1name).toBeDisabled() + expect(tag1value.value).toBe('Certified') + expect(tag1value).toBeDisabled() + expect(tag2name.value).toBe('infrastructure') + expect(tag2name).toBeDisabled() + expect(tag2value.value).toBe('Production') + expect(tag2value).toBeDisabled() + expect(tag3name.value).toBe('scope') + expect(tag3name).toBeDisabled() + expect(tag3value.value).toBe('EGI*') + expect(tag3value).toBeDisabled() + expect(card_groups.queryByTestId(/remove/i)).not.toBeInTheDocument() + + expect(card_groups.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); + expect(card_groups.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); + expect(card_groups.getByTestId('groupsExtensions.0.name').value).toBe('') + expect(card_groups.getByTestId('groupsExtensions.0.value').value).toBe('') + expect(card_groups.getByLabelText('NGIs:').value).toBe('') + expect(card_groups.getByLabelText('Sites:').value).toBe('') + + expect(card_endpoints.getByTestId('endpointsTags.0.name').value).toBe('production') + expect(card_endpoints.getByTestId('endpointsTags.0.value').value).toBe('yes') + expect(card_endpoints.getByTestId('endpointsTags.1.name').value).toBe('monitored') + expect(card_endpoints.getByTestId('endpointsTags.1.value').value).toBe('yes') + expect(card_endpoints.getByTestId('endpointsTags.2.name').value).toBe('scope') + expect(card_endpoints.getByTestId('endpointsTags.2.value').value).toBe('EGI*') + + expect(card_endpoints.queryByTestId(/remove/i)).not.toBeInTheDocument(); + expect(card_endpoints.queryByRole('button', { name: /add new tag/i })).not.toBeInTheDocument(); + expect(card_endpoints.queryByRole('button', { name: /add new extension/i })).not.toBeInTheDocument(); + + expect(availabilityThresholdField.value).toBe('80'); + expect(availabilityThresholdField).toBeDisabled(); + expect(reliabilityThresholdField.value).toBe('85'); + expect(reliabilityThresholdField).toBeDisabled(); + expect(uptimeThresholdField.value).toBe('0.8'); + expect(uptimeThresholdField).toBeDisabled(); + expect(unknownThresholdField.value).toBe('0.1'); + expect(unknownThresholdField).toBeDisabled(); + expect(downtimeThresholdField.value).toBe('0.1'); + expect(downtimeThresholdField).toBeDisabled(); + + expect(screen.queryByRole('button', { name: /save/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /history/i })).not.toBeInTheDocument(); + }) +}) + + const newReport4Sending = { info: { name: 'OPS-MONITOR', From 3c77b29bbb9093cf7ec41de5c9db45079e008e9b Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 9 Mar 2022 13:45:41 +0100 Subject: [PATCH 08/16] improve data prefetching --- poem/Poem/frontend/react/App.js | 225 +++++++++++++------------------- 1 file changed, 94 insertions(+), 131 deletions(-) diff --git a/poem/Poem/frontend/react/App.js b/poem/Poem/frontend/react/App.js index acdafbf20..c63822ff4 100644 --- a/poem/Poem/frontend/react/App.js +++ b/poem/Poem/frontend/react/App.js @@ -620,40 +620,13 @@ const App = () => { async function initalizeState(poemType, response) { let options = await backend.fetchConfigOptions(); - setIsTenantSchema(poemType); - setIsSessionActive(response.active); - setUserDetails(response.userdetails); - setVersion(options && options.result.version); - setPrivacyLink(options && options.result.terms_privacy_links.privacy); - setTermsLink(options && options.result.terms_privacy_links.terms); - setPublicView(false); - queryClient.prefetchQuery( - 'user', () => fetchUsers() - ); - queryClient.prefetchQuery( - 'yumrepo', () => fetchYumRepos() - ); - queryClient.prefetchQuery( - 'ostags', () => fetchOStags() - ); - queryClient.prefetchQuery( - 'package', () => fetchPackages() - ); - queryClient.prefetchQuery( - 'metrictemplate', () => fetchMetricTemplates(publicView) - ); - queryClient.prefetchQuery( - 'metrictemplatestypes', () => fetchMetricTemplateTypes(publicView) - ); - queryClient.prefetchQuery( - 'metrictags', () => fetchMetricTags(publicView) - ); - queryClient.prefetchQuery( - 'apikey', () => fetchAPIKeys() - ); - queryClient.prefetchQuery( - 'probe', () => fetchProbes(publicView) - ); + setIsTenantSchema(poemType); + setIsSessionActive(response.active); + setUserDetails(response.userdetails); + setVersion(options && options.result.version); + setPrivacyLink(options && options.result.terms_privacy_links.privacy); + setTermsLink(options && options.result.terms_privacy_links.terms); + setPublicView(false); if (poemType) { setToken(response.userdetails.token); setWebApiMetric(options && options.result.webapimetric); @@ -662,59 +635,121 @@ const App = () => { setWebApiOperations(options && options.result.webapioperations); setWebApiReports(options && options.result.webapireports); setTenantName(options && options.result.tenant_name); + } + options && prefetchData(false, poemType, options, poemType ? response.userdetails.token : null) + } + + async function initalizePublicState() { + let token = await backend.fetchPublicToken() + let options = await backend.fetchConfigOptions(); + let isTenantSchema = await backend.isTenantSchema(); + setIsTenantSchema(isTenantSchema); + setIsSessionActive(false); + setUserDetails({username: 'Anonymous'}); + setToken(token); + setWebApiMetric(options && options.result.webapimetric); + setWebApiAggregation(options && options.result.webapiaggregation); + setWebApiThresholds(options && options.result.webapithresholds); + setWebApiOperations(options && options.result.webapioperations); + setWebApiReports(options && options.result.webapireports); + setPrivacyLink(options && options.result.terms_privacy_links.privacy); + setTermsLink(options && options.result.terms_privacy_links.terms); + setTenantName(options && options.result.tenant_name); + setPublicView(true); + options && prefetchData(true, isTenantSchema, options, token) + } + + function prefetchData(isPublic, isTenant, options, token) { + if (!isPublic) { + queryClient.prefetchQuery( + 'user', () => fetchUsers() + ) + queryClient.prefetchQuery( + 'yumrepo', () => fetchYumRepos() + ) + queryClient.prefetchQuery( + 'apikey', () => fetchAPIKeys() + ) + } + + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}ostags`, () => fetchOStags(isPublic) + ) + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}package`, () => fetchPackages(isPublic) + ) + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}metrictemplate`, () => fetchMetricTemplates(isPublic) + ) + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}metrictemplatestypes`, () => fetchMetricTemplateTypes(isPublic) + ) + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}metrictags`, () => fetchMetricTags(isPublic) + ) + queryClient.prefetchQuery( + `${isPublic ? 'public_' : ''}probe`, () => fetchProbes(isPublic) + ) + + if (isTenant) { let webapi = new WebApi({ token: token, - metricProfiles: webApiMetric, - aggregationProfiles: webApiAggregation, - thresholdsProfiles: webApiThresholds, - operationsProfiles: webApiOperations, - reportsConfigurations: webApiReports + metricProfiles: options.result.webapimetric, + aggregationProfiles: options.result.webapiaggregation, + thresholdsProfiles: options.result.webapithresholds, + operationsProfiles: options.result.webapioperations, + reportsConfigurations: options.result.webapireports }) + + if (!isPublic) + queryClient.prefetchQuery( + 'usergroups', () => fetchUserGroups(isTenant) + ); + queryClient.prefetchQuery( - 'metric', () => fetchMetrics(false) + `${isPublic ? 'public_' : ''}metric`, () => fetchMetrics(isPublic) ); queryClient.prefetchQuery( - 'metricstypes', () => fetchMetricTypes(false) + `${isPublic ? 'public_' : ''}metricstypes`, () => fetchMetricTypes(isPublic) ); queryClient.prefetchQuery( - ['metric', 'usergroups'], () => fetchUserGroups(true, false, 'metrics') + [`${isPublic ? 'public_' : ''}metric`, 'usergroups'], () => fetchUserGroups(isTenant, isPublic, 'metrics') ) queryClient.prefetchQuery( - ['report', 'backend'], () => fetchBackendReports() + [`${isPublic ? 'public_' : ''}report`, 'backend'], () => fetchBackendReports(isPublic) ); queryClient.prefetchQuery( - ['report', 'webapi'], () => fetchReports(webapi) + [`${isPublic ? 'public_' : ''}report`, 'webapi'], () => fetchReports(webapi) ) queryClient.prefetchQuery( - ['metricprofile', 'backend'], () => fetchBackendMetricProfiles() + [`${isPublic ? 'public_' : ''}metricprofile`, 'backend'], () => fetchBackendMetricProfiles(isPublic) ); queryClient.prefetchQuery( - ['metricprofile', 'webapi'], () => fetchMetricProfiles(webapi) + [`${isPublic ? 'public_' : ''}metricprofile`, 'webapi'], () => fetchMetricProfiles(webapi) ) queryClient.prefetchQuery( - ['aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles() + [`${isPublic ? 'public_' : ''}aggregationprofile`, 'backend'], () => fetchBackendAggregationProfiles(isPublic) ); queryClient.prefetchQuery( - ['aggregationprofile', 'webapi'], () => fetchAggregationProfiles(webapi) + [`${isPublic ? 'public_' : ''}aggregationprofile`, 'webapi'], () => fetchAggregationProfiles(webapi) ) queryClient.prefetchQuery( - ['thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles() + [`${isPublic ? 'public_' : ''}thresholdsprofile`, 'backend'], () => fetchBackendThresholdsProfiles(isPublic) ); queryClient.prefetchQuery( - ['thresholdsprofile', 'webapi'], () => fetchThresholdsProfiles(webapi) + [`${isPublic ? 'public_' : ''}thresholdsprofile`, 'webapi'], () => fetchThresholdsProfiles(webapi) ) queryClient.prefetchQuery( - 'operationsprofile', () => fetchOperationsProfiles(webapi) - ); - queryClient.prefetchQuery( - 'usergroups', () => fetchUserGroups(true) + `${isPublic ? 'public_' : ''}operationsprofile`, () => fetchOperationsProfiles(webapi) ); - if (webApiReports && webApiReports.crud) { - queryClient.prefetchQuery( - 'topologytags', () => fetchTopologyTags(webapi) - ) + if (options.result.webapireports && options.result.webapireports.crud) { + if (!isPublic) + queryClient.prefetchQuery( + 'topologytags', () => fetchTopologyTags(webapi) + ) + queryClient.prefetchQuery( - 'topologygroups', () => fetchTopologyGroups(webapi) + `${isPublic ? 'public_' : ''}topologygroups`, () => fetchTopologyGroups(webapi) ) } } else { @@ -724,78 +759,6 @@ const App = () => { } } - async function initalizePublicState() { - let token = await backend.fetchPublicToken() - let options = await backend.fetchConfigOptions(); - let isTenantSchema = await backend.isTenantSchema(); - setIsTenantSchema(isTenantSchema); - setIsSessionActive(false); - setUserDetails({username: 'Anonymous'}); - setToken(token); - setWebApiMetric(options && options.result.webapimetric); - setWebApiAggregation(options && options.result.webapiaggregation); - setWebApiThresholds(options && options.result.webapithresholds); - setWebApiOperations(options && options.result.webapioperations); - setWebApiReports(options && options.result.webapireports); - setPrivacyLink(options && options.result.terms_privacy_links.privacy); - setTermsLink(options && options.result.terms_privacy_links.terms); - setTenantName(options && options.result.tenant_name); - setPublicView(true); - let webapi = new WebApi({ - token: token, - metricProfiles: webApiMetric, - aggregationProfiles: webApiAggregation, - thresholdsProfiles: webApiThresholds, - operationsProfiles: webApiOperations, - reportsConfigurations: webApiReports - }) - queryClient.prefetchQuery( - 'public_probe', () => fetchProbes(true) - ); - queryClient.prefetchQuery( - 'public_metrictemplate', () => fetchMetricTemplates(true) - ); - queryClient.prefetchQuery( - 'public_metric', () => fetchMetrics(true) - ); - queryClient.prefetchQuery( - 'public_metricstypes', () => fetchMetricTypes(true) - ); - queryClient.prefetchQuery( - 'public_metrictemplatestypes', () => fetchMetricTemplateTypes(true) - ); - queryClient.prefetchQuery( - 'public_metrictags', () => fetchMetricTags(true) - ); - queryClient.prefetchQuery( - ['public_metric', 'usergroups'], () => fetchUserGroups(isTenantSchema, true, 'metrics') - ); - queryClient.prefetchQuery( - 'public_ostags', () => fetchOStags(true) - ); - queryClient.prefetchQuery( - ['public_metricprofile', 'backend'], () => fetchBackendMetricProfiles(true) - ); - queryClient.prefetchQuery( - ['public_metricprofile', 'webapi'], () => fetchMetricProfiles(webapi) - ) - queryClient.prefetchQuery( - ['public_aggregationprofile', 'backend'], () => fetchBackendAggregationProfiles(true) - ); - queryClient.prefetchQuery( - ['public_aggregationprofile', 'webapi'], () => fetchAggregationProfiles(webapi) - ) - queryClient.prefetchQuery( - ['public_thresholdsprofile', 'backend'], () => fetchBackendThresholdsProfiles(true) - ); - queryClient.prefetchQuery( - ['public_thresholdsprofile', 'webapi'], () => fetchThresholdsProfiles(webapi) - ) - queryClient.prefetchQuery( - 'public_operationsprofile', () => fetchOperationsProfiles(new WebApi({ token: token, operationsProfiles: webApiOperations })) - ); - } - function isPublicUrl () { const pathname = window.location.pathname; From 9de2db50baca11e170919325bcfe58c5091fba37 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Thu, 10 Mar 2022 13:58:49 +0100 Subject: [PATCH 09/16] fix 500 status code on particular API key page on SuperPOEM --- poem/Poem/api/internal_views/apikey.py | 32 +++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/poem/Poem/api/internal_views/apikey.py b/poem/Poem/api/internal_views/apikey.py index e59beaf18..04c930a08 100644 --- a/poem/Poem/api/internal_views/apikey.py +++ b/poem/Poem/api/internal_views/apikey.py @@ -4,6 +4,7 @@ from Poem.api.views import NotFound from Poem.poem import models as poem_models from django.db.models import Q +from django_tenants.utils import get_public_schema_name from rest_framework import status from rest_framework.authentication import SessionAuthentication from rest_framework.response import Response @@ -18,19 +19,24 @@ class ListAPIKeys(APIView): def get(self, request, name=None): if name: try: - userprofile = poem_models.UserProfile.objects.get( - user=request.user - ) - regular_user = not request.user.is_superuser and ( - len(userprofile.groupsofaggregations.all()) > 0 or - len(userprofile.groupsofmetricprofiles.all()) > 0 or - len(userprofile.groupsofthresholdsprofiles.all()) > 0 - ) - regular_user_no_perms = not request.user.is_superuser and ( - len(userprofile.groupsofaggregations.all()) == 0 and - len(userprofile.groupsofmetricprofiles.all()) == 0 and - len(userprofile.groupsofthresholdsprofiles.all()) == 0 - ) + if request.tenant.schema_name == get_public_schema_name(): + regular_user = None + regular_user_no_perms = None + + else: + userprofile = poem_models.UserProfile.objects.get( + user=request.user + ) + regular_user = not request.user.is_superuser and ( + len(userprofile.groupsofaggregations.all()) > 0 or + len(userprofile.groupsofmetricprofiles.all()) > 0 or + len(userprofile.groupsofthresholdsprofiles.all()) > 0 + ) + regular_user_no_perms = not request.user.is_superuser and ( + len(userprofile.groupsofaggregations.all()) == 0 and + len(userprofile.groupsofmetricprofiles.all()) == 0 and + len(userprofile.groupsofthresholdsprofiles.all()) == 0 + ) if request.user.is_superuser or ( regular_user and name.startswith('WEB-API') ) or ( From 620c3a2c8b5d9ea793960ae2041d465633ba4b82 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Fri, 11 Mar 2022 09:14:16 +0100 Subject: [PATCH 10/16] included token protected metric template API view --- poem/Poem/api/tests/test_apikey.py | 10 ++ poem/Poem/api/tests/test_views.py | 240 +++++++++++++++++++++++++++++ poem/Poem/api/urls.py | 4 +- poem/Poem/api/views.py | 38 ++++- 4 files changed, 286 insertions(+), 6 deletions(-) diff --git a/poem/Poem/api/tests/test_apikey.py b/poem/Poem/api/tests/test_apikey.py index 035a00342..bcb9a60eb 100644 --- a/poem/Poem/api/tests/test_apikey.py +++ b/poem/Poem/api/tests/test_apikey.py @@ -69,11 +69,13 @@ def setUp(self): def test_permission_denied_in_case_no_authorization(self): request = self.factory.get(self.url) + request.tenant = self.tenant response = self.view(request) self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) def test_get_list_of_apikeys(self): request = self.factory.get(self.url) + request.tenant = self.tenant force_authenticate(request, user=self.user) response = self.view(request) self.assertEqual( @@ -114,6 +116,7 @@ def test_get_list_of_apikeys(self): def test_get_list_of_apikeys_regular_user_with_some_permissions(self): request = self.factory.get(self.url) + request.tenant = self.tenant force_authenticate(request, user=self.regular_user) response = self.view(request) self.assertEqual( @@ -136,6 +139,7 @@ def test_get_list_of_apikeys_regular_user_with_some_permissions(self): def test_get_list_of_apikeys_regular_user_with_no_permissions(self): request = self.factory.get(self.url) + request.tenant = self.tenant force_authenticate(request, user=self.poor_user) response = self.view(request) self.assertEqual( @@ -158,6 +162,7 @@ def test_get_list_of_apikeys_regular_user_with_no_permissions(self): def test_get_apikey_for_given_name(self): request = self.factory.get(self.url + 'EGI') + request.tenant = self.tenant force_authenticate(request, user=self.user) response = self.view(request, 'EGI') self.assertEqual( @@ -173,6 +178,7 @@ def test_get_apikey_for_given_name(self): def test_get_apikey_for_given_name_regular_user(self): request = self.factory.get(self.url + 'EGI') + request.tenant = self.tenant force_authenticate(request, user=self.regular_user) response = self.view(request, 'EGI') self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) @@ -183,6 +189,7 @@ def test_get_apikey_for_given_name_regular_user(self): def test_get_apikey_for_given_name_regular_user_without_permissions(self): request = self.factory.get(self.url + 'EGI') + request.tenant = self.tenant force_authenticate(request, user=self.poor_user) response = self.view(request, 'EGI') self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) @@ -193,6 +200,7 @@ def test_get_apikey_for_given_name_regular_user_without_permissions(self): def test_get_apikey_for_webapi_name_regular_user(self): request = self.factory.get(self.url + 'WEB-API') + request.tenant = self.tenant force_authenticate(request, user=self.regular_user) response = self.view(request, 'WEB-API') self.assertEqual( @@ -208,6 +216,7 @@ def test_get_apikey_for_webapi_name_regular_user(self): def test_get_apikey_for_webapi_name_regular_user_without_permissions(self): request = self.factory.get(self.url + 'WEB-API') + request.tenant = self.tenant force_authenticate(request, user=self.poor_user) response = self.view(request, 'WEB-API') self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) @@ -218,6 +227,7 @@ def test_get_apikey_for_webapi_name_regular_user_without_permissions(self): def test_get_apikey_for_webapi_ro_name_regular_user_without_perms(self): request = self.factory.get(self.url + 'WEB-API-RO') + request.tenant = self.tenant force_authenticate(request, user=self.poor_user) response = self.view(request, 'WEB-API-RO') self.assertEqual( diff --git a/poem/Poem/api/tests/test_views.py b/poem/Poem/api/tests/test_views.py index 618bff053..54b3c91ea 100644 --- a/poem/Poem/api/tests/test_views.py +++ b/poem/Poem/api/tests/test_views.py @@ -40,6 +40,13 @@ def mock_function(profile): @factory.django.mute_signals(post_save) def mock_db_for_metrics_tests(): + active_template = admin_models.MetricTemplateType.objects.create( + name='Active' + ) + passive_template = admin_models.MetricTemplateType.objects.create( + name='Passive' + ) + active = poem_models.MetricType.objects.create(name='Active') passive = poem_models.MetricType.objects.create(name='Passive') @@ -138,6 +145,24 @@ def mock_db_for_metrics_tests(): mtag3 = admin_models.MetricTags.objects.create(name='internal') admin_models.MetricTags.objects.create(name='empty_tag') + mt1 = admin_models.MetricTemplate.objects.create( + name='test.AMS-Check', + mtype=active_template, + probekey=probekey1, + parent='["org.nagios.CDMI-TCP"]', + probeexecutable='["ams-probe"]', + config='["maxCheckAttempts 3", "timeout 60", ' + '"path /usr/libexec/argo-monitoring/probes/argo", "interval 5", ' + '"retryInterval 3"]', + attribute='["argo.ams_TOKEN --token"]', + dependency='["argo.AMS-Check 1"]', + flags='["OBSESS 1"]', + files='["UCC_CONFIG UCC_CONFIG"]', + parameter='["--project EGI"]', + fileparameter='["FILE_SIZE_KBS 1000"]' + ) + mt1.tags.add(mtag1, mtag2) + metric1 = poem_models.Metric.objects.create( name='test.AMS-Check', mtype=active, @@ -157,6 +182,20 @@ def mock_db_for_metrics_tests(): ) metric1.tags.add(mtag1, mtag2) + mt2 = admin_models.MetricTemplate.objects.create( + name='argo.AMSPublisher-Check', + mtype=active_template, + probekey=probekey2, + probeexecutable='["ams-publisher-probe"]', + config='["maxCheckAttempts 1", "timeout 120", ' + '"path /usr/libexec/argo-monitoring/probes/argo", ' + '"interval 180", "retryInterval 1"]', + parameter='["-s /var/run/argo-nagios-ams-publisher/sock", ' + '"-q w:metrics+g:published180"]', + flags='["NOHOSTNAME 1", "NOTIMEOUT 1", "NOPUBLISH 1"]' + ) + mt2.tags.add(mtag1, mtag3) + metric2 = poem_models.Metric.objects.create( name='argo.AMSPublisher-Check', mtype=active, @@ -172,6 +211,19 @@ def mock_db_for_metrics_tests(): ) metric2.tags.add(mtag1, mtag3) + mt3 = admin_models.MetricTemplate.objects.create( + name='hr.srce.CertLifetime-Local', + mtype=active_template, + probekey=probekey3, + probeexecutable='["CertLifetime-probe"]', + config='["maxCheckAttempts 2", "timeout 60", ' + '"path /usr/libexec/argo-monitoring/probes/cert", ' + '"interval 240", "retryInterval 30"]', + attribute='["NAGIOS_HOST_CERT -f"]', + flags='["NOHOSTNAME 1", "NOPUBLISH 1"]' + ) + mt3.tags.add(mtag3) + metric3 = poem_models.Metric.objects.create( name='hr.srce.CertLifetime-Local', mtype=active, @@ -186,6 +238,12 @@ def mock_db_for_metrics_tests(): ) metric3.tags.add(mtag3) + admin_models.MetricTemplate.objects.create( + name='org.apel.APEL-Pub', + mtype=passive_template, + flags='["OBSESS 1", "PASSIVE 1"]' + ) + poem_models.Metric.objects.create( name='org.apel.APEL-Pub', mtype=passive, @@ -193,6 +251,11 @@ def mock_db_for_metrics_tests(): flags='["OBSESS 1", "PASSIVE 1"]' ) + admin_models.MetricTemplate.objects.create( + name='test.EMPTY-metric', + mtype=active_template + ) + poem_models.Metric.objects.create( name='test.EMPTY-metric', mtype=active @@ -1130,3 +1193,180 @@ def test_list_repos_if_version_is_wrong_os(self, mock_get_metrics): 'missing_packages': ['nagios-promoo (1.4.0)'] } ) + + +class ListMetricTemplateAPIViewTests(TenantTestCase): + def setUp(self): + self.token = create_credentials() + self.view = views.ListMetrics.as_view() + self.factory = TenantRequestFactory(self.tenant) + self.url = '/api/v2/metrics' + + mock_db_for_metrics_tests() + + def test_list_metric_templates_if_wrong_token(self): + request = self.factory.get( + self.url, **{'HTTP_X_API_KEY': 'wrong_token'} + ) + response = self.view(request) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + + def test_list_metric_templates(self): + request = self.factory.get(self.url, **{'HTTP_X_API_KEY': self.token}) + response = self.view(request) + self.assertEqual( + response.data, + [ + { + 'argo.AMSPublisher-Check': { + 'probe': 'ams-publisher-probe', + 'tags': ['internal', 'test_tag1'], + 'config': { + 'maxCheckAttempts': '1', + 'timeout': '120', + 'path': '/usr/libexec/argo-monitoring/probes/argo', + 'interval': '180', + 'retryInterval': '1' + }, + 'flags': { + 'NOHOSTNAME': '1', + 'NOTIMEOUT': '1', + 'NOPUBLISH': '1' + }, + 'dependency': {}, + 'attribute': {}, + 'parameter': { + '-s': '/var/run/argo-nagios-ams-publisher/sock', + '-q': 'w:metrics+g:published180' + }, + 'file_parameter': {}, + 'file_attribute': {}, + 'parent': '', + 'docurl': + 'https://github.com/ARGOeu/nagios-plugins-argo' + '/blob/master/README.md' + } + }, + { + 'hr.srce.CertLifetime-Local': { + 'probe': 'CertLifetime-probe', + 'tags': ['internal'], + 'config': { + 'maxCheckAttempts': '2', + 'timeout': '60', + 'path': '/usr/libexec/argo-monitoring/probes/cert', + 'interval': '240', + 'retryInterval': '30' + }, + 'flags': { + 'NOHOSTNAME': '1', + 'NOPUBLISH': '1' + }, + 'dependency': {}, + 'attribute': { + 'NAGIOS_HOST_CERT': '-f' + }, + 'parameter': {}, + 'file_parameter': {}, + 'file_attribute': {}, + 'parent': '', + 'docurl': + 'https://wiki.egi.eu/wiki/ROC_SAM_Tests#hr.srce.' + 'CREAMCE-CertLifetime' + } + }, + { + 'org.apel.APEL-Pub': { + 'probe': '', + 'tags': [], + 'config': {}, + 'flags': { + 'OBSESS': '1', + 'PASSIVE': '1' + }, + 'dependency': {}, + 'attribute': {}, + 'parameter': {}, + 'file_parameter': {}, + 'file_attribute': {}, + 'parent': '', + 'docurl': '' + } + }, + { + 'test.AMS-Check': { + 'probe': 'ams-probe', + 'tags': ['test_tag1', 'test_tag2'], + 'config': { + 'maxCheckAttempts': '3', + 'timeout': '60', + 'path': '/usr/libexec/argo-monitoring/probes/argo', + 'interval': '5', + 'retryInterval': '3' + }, + 'flags': { + 'OBSESS': '1' + }, + 'dependency': { + 'argo.AMS-Check': '1' + }, + 'attribute': { + 'argo.ams_TOKEN': '--token' + }, + 'parameter': { + '--project': 'EGI' + }, + 'file_parameter': { + 'FILE_SIZE_KBS': '1000' + }, + 'file_attribute': { + 'UCC_CONFIG': 'UCC_CONFIG' + }, + 'parent': 'org.nagios.CDMI-TCP', + 'docurl': + 'https://github.com/ARGOeu/nagios-plugins-argo' + '/blob/master/README.md' + } + }, + { + 'test.EMPTY-metric': { + 'probe': '', + 'tags': [], + 'config': {}, + 'flags': {}, + 'dependency': {}, + 'attribute': {}, + 'parameter': {}, + 'file_parameter': {}, + 'file_attribute': {}, + 'parent': '', + 'docurl': '' + } + } + ] + ) + + def test_get_internal_metric_templates(self): + request = self.factory.get( + self.url + '/internal', **{'HTTP_X_API_KEY': self.token} + ) + response = self.view(request, 'internal') + self.assertEqual( + response.data, + ['argo.AMSPublisher-Check', 'hr.srce.CertLifetime-Local'] + ) + + def test_get_metric_templates_if_no_tagged_metrics(self): + request = self.factory.get( + self.url + '/empty_tag', **{'HTTP_X_API_KEY': self.token} + ) + response = self.view(request, 'empty_tag') + self.assertEqual(response.data, []) + + def test_get_metric_templates_if_nonexistent_tag(self): + request = self.factory.get( + self.url + '/nonexistent', **{'HTTP_X_API_KEY': self.token} + ) + response = self.view(request, 'nonexistent') + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + self.assertEqual(response.data, {'detail': 'Requested tag not found.'}) diff --git a/poem/Poem/api/urls.py b/poem/Poem/api/urls.py index 796a9d871..5a2a57dfc 100644 --- a/poem/Poem/api/urls.py +++ b/poem/Poem/api/urls.py @@ -1,5 +1,5 @@ -from django.urls import path from django.conf.urls import include +from django.urls import path from . import views @@ -11,5 +11,7 @@ path('repos/', views.ListRepos.as_view()), path('repos//', views.ListRepos.as_view()), path('repos/', views.ListRepos.as_view()), + path('metrictemplates/', views.ListMetricTemplates.as_view()), + path('metrictemplates/', views.ListMetricTemplates.as_view()), path('internal/', include('Poem.api.urls_internal', namespace='internal')) ] diff --git a/poem/Poem/api/views.py b/poem/Poem/api/views.py index f92652433..56b2cd8e9 100644 --- a/poem/Poem/api/views.py +++ b/poem/Poem/api/views.py @@ -19,10 +19,14 @@ def __init__(self, status, detail, code=None): self.code = code if code else detail -def build_metricconfigs(): +def build_metricconfigs(templates=False): ret = [] - metricsobjs = models.Metric.objects.all().order_by('name') + if templates: + metricsobjs = admin_models.MetricTemplate.objects.all().order_by('name') + + else: + metricsobjs = models.Metric.objects.all().order_by('name') for m in metricsobjs: mdict = dict() @@ -32,7 +36,10 @@ def build_metricconfigs(): parent = one_value_inline(m.parent) probeexecutable = one_value_inline(m.probeexecutable) attribute = two_value_inline_dict(m.attribute) - dependancy = two_value_inline_dict(m.dependancy) + if templates: + dependency = two_value_inline_dict(m.dependency) + else: + dependency = two_value_inline_dict(m.dependancy) flags = two_value_inline_dict(m.flags) files = two_value_inline_dict(m.files) parameter = two_value_inline_dict(m.parameter) @@ -57,8 +64,8 @@ def build_metricconfigs(): else: mdict[m.name].update({'flags': dict()}) - if dependancy: - mdict[m.name].update({'dependency': dependancy}) + if dependency: + mdict[m.name].update({'dependency': dependency}) else: mdict[m.name].update({'dependency': dict()}) @@ -244,3 +251,24 @@ def get(self, request, tag=None): 'data': data, 'missing_packages': sorted(missing_packages) }) + + +class ListMetricTemplates(APIView): + permission_classes = (MyHasAPIKey,) + + def get(self, request, tag=None): + if tag: + try: + admin_models.MetricTags.objects.get(name=tag) + mts = admin_models.MetricTemplate.objects.filter(tags__name=tag) + + return Response(sorted([mt.name for mt in mts])) + + except admin_models.MetricTags.DoesNotExist: + return Response( + {"detail": "Requested tag not found."}, + status=status.HTTP_404_NOT_FOUND + ) + + else: + return Response(build_metricconfigs(templates=True)) From eadf793eb967284e6ef97c017e646d24ade18ea8 Mon Sep 17 00:00:00 2001 From: Daniel Vrcic Date: Fri, 25 Mar 2022 15:59:28 +0100 Subject: [PATCH 11/16] bump frontend packages --- poem/Poem/package-lock.json | 5742 +++++++---------------------------- poem/Poem/package.json | 6 +- 2 files changed, 1109 insertions(+), 4639 deletions(-) diff --git a/poem/Poem/package-lock.json b/poem/Poem/package-lock.json index 093d5c743..f19eb0735 100644 --- a/poem/Poem/package-lock.json +++ b/poem/Poem/package-lock.json @@ -56,7 +56,7 @@ "file-loader": "^3.0.1", "install": "^0.11.0", "jest": "^26.6.3", - "jest-junit": "^12.2.0", + "jest-junit": "^13.0.0", "jsctags": "git+https://github.com/ramitos/jsctags.git", "jshint": "^2.13.4", "postcss-loader": "^3.0.0", @@ -68,9 +68,9 @@ "reactstrap": "^9.0.1", "style-loader": "^0.23.1", "url-loader": "^1.1.2", - "webpack": "^4.46.0", + "webpack": "^5.70.0", "webpack-bundle-tracker": "^1.4.0", - "webpack-cli": "^3.3.12", + "webpack-cli": "^4.9.2", "word-wrap": "^1.2.3", "yup": "^0.32.11" } @@ -153,19 +153,6 @@ "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -1895,6 +1882,15 @@ "node": ">=0.1.95" } }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -1910,8 +1906,7 @@ "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@emotion/memoize": { "version": "0.7.4", @@ -1957,11 +1952,6 @@ "stylis": "^4.0.3" } }, - "node_modules/@emotion/react/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, "node_modules/@emotion/react/node_modules/@emotion/memoize": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", @@ -1984,21 +1974,11 @@ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz", "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" }, - "node_modules/@emotion/react/node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, "node_modules/@emotion/react/node_modules/@emotion/utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" }, - "node_modules/@emotion/react/node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, "node_modules/@emotion/react/node_modules/csstype": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", @@ -2032,8 +2012,7 @@ "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { "version": "0.11.3", @@ -3725,6 +3704,32 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, + "node_modules/@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -3902,19 +3907,6 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.9.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz", @@ -4014,178 +4006,185 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "dependencies": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "node_modules/@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "node_modules/@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "node_modules/@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "node_modules/@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } } }, "node_modules/@xtuc/ieee754": { @@ -4240,6 +4239,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -4338,12 +4346,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -4460,49 +4462,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -4521,13 +4480,6 @@ "lodash": "^4.17.14" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -5217,26 +5169,6 @@ "node": ">=0.10.0" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/big-integer": { "version": "1.6.49", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", @@ -5254,28 +5186,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, "node_modules/bootstrap": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", @@ -5339,131 +5249,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, "node_modules/browserslist": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", @@ -5496,93 +5287,12 @@ "node-int64": "^0.4.0" } }, - "node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -5712,41 +5422,13 @@ "node": ">=10" } }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, - "optional": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" + "node": ">=6.0" } }, "node_modules/ci-info": { @@ -5755,16 +5437,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "node_modules/cjs-module-lexer": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", @@ -5857,6 +5529,20 @@ "node": ">=8" } }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5976,12 +5662,6 @@ "date-now": "^0.1.4" } }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "node_modules/convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -5999,20 +5679,6 @@ "node": ">= 0.6" } }, - "node_modules/copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -6096,22 +5762,6 @@ "node": ">=4" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/create-emotion": { "version": "10.0.27", "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-10.0.27.tgz", @@ -6124,33 +5774,6 @@ "@emotion/utils": "0.11.3" } }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -6167,28 +5790,6 @@ "node": ">=4.8" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, "node_modules/css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -6294,12 +5895,6 @@ "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==", "dev": true }, - "node_modules/cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "node_modules/data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -6447,25 +6042,6 @@ "node": ">=0.4.0" } }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6498,23 +6074,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -6590,16 +6149,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -6646,51 +6195,12 @@ "domelementtype": "1" } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.43", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.43.tgz", "integrity": "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==", "devOptional": true }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "node_modules/emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", @@ -6703,12 +6213,6 @@ "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -6770,6 +6274,18 @@ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -6825,6 +6341,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, "node_modules/es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -7332,16 +6854,16 @@ } }, "node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.0.0" } }, "node_modules/eslint-utils": { @@ -7789,16 +7311,6 @@ "node": ">=0.8.x" } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "node_modules/exec-sh": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", @@ -7889,18 +7401,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -8162,6 +7662,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -8180,12 +7686,6 @@ "bser": "2.1.1" } }, - "node_modules/figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -8226,307 +7726,113 @@ "node": ">=8" } }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" }, "engines": { - "node": ">=6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "glob": "^7.1.3" }, - "engines": { - "node": ">= 0.10" + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/findup-sync/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/force-array": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/force-array/-/force-array-3.1.0.tgz", + "integrity": "sha1-oGD21BiNx9qm/lYt85rqq8pAR4Q=", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "is-array": "^1.0.1" } }, - "node_modules/findup-sync/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, + "node_modules/formik": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", + "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], "dependencies": { - "is-extendable": "^0.1.0" + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^1.10.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/findup-sync/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "dependencies": { - "kind-of": "^3.0.2" + "map-cache": "^0.2.2" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/force-array": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/force-array/-/force-array-3.1.0.tgz", - "integrity": "sha1-oGD21BiNx9qm/lYt85rqq8pAR4Q=", - "dev": true, - "dependencies": { - "is-array": "^1.0.1" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formik": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz", - "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "dependencies": { - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^1.10.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8664,47 +7970,11 @@ "node": ">= 6" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-modules/node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "node_modules/globals": { "version": "11.12.0", @@ -8745,9 +8015,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, "node_modules/growly": { @@ -8877,70 +8147,6 @@ "node": ">=0.10.0" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -8954,17 +8160,6 @@ "value-equal": "^1.0.1" } }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -8973,18 +8168,6 @@ "react-is": "^16.7.0" } }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -9060,12 +8243,6 @@ "node": ">= 6" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -9118,32 +8295,6 @@ "node": ">= 6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -9294,12 +8445,6 @@ "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -9314,12 +8459,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/install": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/install/-/install-0.11.2.tgz", @@ -9344,9 +8483,9 @@ } }, "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true, "engines": { "node": ">= 0.10" @@ -9400,19 +8539,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -9576,15 +8702,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -10091,15 +9208,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-changed-files/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-changed-files/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -10112,21 +9220,6 @@ "node": ">=8" } }, - "node_modules/jest-changed-files/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jest-changed-files/node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -11095,13 +10188,13 @@ } }, "node_modules/jest-junit": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.3.0.tgz", - "integrity": "sha512-+NmE5ogsEjFppEl90GChrk7xgz8xzvF0f+ZT5AnhW6suJC93gvQtmQjfyjDnE0Z2nXJqEkxF0WXlvjG/J+wn/g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", "dev": true, "dependencies": { "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", + "strip-ansi": "^6.0.1", "uuid": "^8.3.2", "xml": "^1.0.1" }, @@ -11109,15 +10202,6 @@ "node": ">=10.12.0" } }, - "node_modules/jest-junit/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-junit/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -11130,18 +10214,6 @@ "node": ">=10" } }, - "node_modules/jest-junit/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", @@ -13387,12 +12459,12 @@ "dev": true }, "node_modules/loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6.11.5" } }, "node_modules/loader-utils": { @@ -13421,19 +12493,6 @@ "json5": "lib/cli.js" } }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -13573,19 +12632,6 @@ "lz-string": "bin/bin.js" } }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -13625,17 +12671,6 @@ "remove-accents": "0.4.2" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "node_modules/memoize-one": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", @@ -13684,25 +12719,6 @@ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -13736,6 +12752,15 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -13745,18 +12770,6 @@ "node": ">=4" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -13769,32 +12782,11 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "devOptional": true }, - "node_modules/mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -13820,32 +12812,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13912,43 +12878,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node_modules/node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "dependencies": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - } - }, - "node_modules/node-libs-browser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "node_modules/node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -14254,6 +13183,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -14287,12 +13231,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "node_modules/p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -14329,18 +13267,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -14350,28 +13276,11 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "node_modules/papaparse": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" }, - "node_modules/parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "dependencies": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -14384,19 +13293,6 @@ "node": ">=6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -14410,15 +13306,6 @@ "node": ">=4" } }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -14434,19 +13321,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -14501,22 +13375,6 @@ "node": ">=8" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -14535,15 +13393,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -14556,18 +13405,6 @@ "node": ">= 6" } }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -14757,15 +13594,6 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14781,12 +13609,6 @@ "node": ">=0.4.0" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "node_modules/prompts": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", @@ -14828,26 +13650,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -14858,27 +13660,6 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -14888,29 +13669,10 @@ "node": ">=6" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -14936,16 +13698,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "16.13.0", "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz", @@ -15340,17 +14092,16 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "optional": true, "dependencies": { - "picomatch": "^2.2.1" + "resolve": "^1.9.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.10" } }, "node_modules/redent": { @@ -15556,33 +14307,6 @@ "node": ">=8" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-dir/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -15623,28 +14347,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "node_modules/rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -15677,15 +14379,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "dependencies": { - "aproba": "^1.1.1" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -15924,9 +14617,9 @@ } }, "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -15965,23 +14658,16 @@ "node": ">=0.10.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" }, - "bin": { - "sha.js": "bin.js" + "engines": { + "node": ">=8" } }, "node_modules/shallow-equal": { @@ -16211,12 +14897,6 @@ "urix": "^0.1.0" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -16311,15 +14991,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "dependencies": { - "figgy-pudding": "^3.5.1" - } - }, "node_modules/stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -16366,45 +15037,6 @@ "node": ">=0.10.0" } }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -16695,52 +15327,96 @@ } }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "dependencies": { + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^5.7.2" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0" + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/terser-webpack-plugin/node_modules/source-map": { @@ -16752,13 +15428,28 @@ "node": ">=0.10.0" } }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/test-exclude": { @@ -16807,28 +15498,6 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "dependencies": { - "setimmediate": "^1.0.4" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/tiny-invariant": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", @@ -16845,12 +15514,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -16993,12 +15656,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -17128,24 +15785,6 @@ "node": ">=0.10.0" } }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, "node_modules/universal-cookie": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-3.1.0.tgz", @@ -17223,17 +15862,6 @@ "node": ">=0.10.0" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -17250,16 +15878,6 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-loader": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", @@ -17277,12 +15895,6 @@ "webpack": "^3.0.0 || ^4.0.0" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -17292,15 +15904,6 @@ "node": ">=0.10.0" } }, - "node_modules/util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -17360,12 +15963,6 @@ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -17405,349 +16002,78 @@ } }, "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" - } - }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "dependencies": { - "chokidar": "^2.1.8" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "engines": { + "node": ">=10.4" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "node_modules/webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - }, - "webpack-command": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-tracker": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-1.4.0.tgz", - "integrity": "sha512-5dbAdtS+DbvJfXIXfCytRv5D4I2EWBdBBVOzDMpSa52goTroryWcH4lm3h2qwVqSQEgTTWCkgLGGlZYZmYRM9g==", + "node_modules/webpack-bundle-tracker": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-1.4.0.tgz", + "integrity": "sha512-5dbAdtS+DbvJfXIXfCytRv5D4I2EWBdBBVOzDMpSa52goTroryWcH4lm3h2qwVqSQEgTTWCkgLGGlZYZmYRM9g==", "dev": true, "dependencies": { "lodash.assign": "^4.2.0", @@ -17757,405 +16083,253 @@ "strip-ansi": "^6.0.0" } }, - "node_modules/webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=6.11.5" - }, - "peerDependencies": { - "webpack": "4.x.x" - } - }, - "node_modules/webpack-cli/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/webpack-cli/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/webpack-cli/node_modules/import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "dependencies": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, - "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" - } - }, - "node_modules/webpack-cli/node_modules/resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "node_modules/webpack-cli": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" + "bin": { + "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" + "node": ">=10.13.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } } }, - "node_modules/webpack-cli/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "node_modules/webpack-cli/node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/webpack-cli/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/webpack-cli/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-cli/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "node": ">= 8" } }, - "node_modules/webpack-cli/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/webpack-cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "node_modules/webpack-cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack-sources/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/webpack-cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10.17.0" } }, - "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "node_modules/webpack-cli/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "node_modules/webpack-cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "path-key": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/webpack-cli/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "node_modules/webpack-cli/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/webpack/node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "node_modules/webpack-cli/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=8" } }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/webpack-cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "engines": { "node": ">=6" } }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -18219,6 +16393,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -18237,15 +16417,6 @@ "node": ">=0.4.0" } }, - "node_modules/worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "dependencies": { - "errno": "~0.1.7" - } - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -18378,15 +16549,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -18595,16 +16757,6 @@ "semver": "^6.3.0" }, "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", @@ -19812,6 +17964,12 @@ "minimist": "^1.2.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, "@emotion/cache": { "version": "10.0.29", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", @@ -19827,8 +17985,7 @@ "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", - "dev": true + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/memoize": { "version": "0.7.4", @@ -19862,11 +18019,6 @@ "stylis": "^4.0.3" } }, - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, "@emotion/memoize": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz", @@ -19889,21 +18041,11 @@ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.0.2.tgz", "integrity": "sha512-QQPB1B70JEVUHuNtzjHftMGv6eC3Y9wqavyarj4x4lg47RACkeSfNo5pxIOKizwS9AEFLohsqoaxGQj4p0vSIw==" }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, "@emotion/utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, "csstype": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", @@ -19939,8 +18081,7 @@ "@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { "version": "0.11.3", @@ -21248,6 +19389,32 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.3.3.tgz", "integrity": "sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow==" }, + "@types/eslint": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -21415,18 +19582,6 @@ "@typescript-eslint/typescript-estree": "5.9.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - } } }, "@typescript-eslint/scope-manager": { @@ -21490,180 +19645,174 @@ } }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", "dev": true }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0" + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "@webpack-cli/configtest": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" + "envinfo": "^7.7.3" } }, + "@webpack-cli/serve": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", + "dev": true, + "requires": {} + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -21706,6 +19855,13 @@ } } }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -21778,12 +19934,6 @@ "picomatch": "^2.0.4" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -21864,53 +20014,6 @@ "es-abstract": "^1.19.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -21926,13 +20029,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -22495,12 +20591,6 @@ } } }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, "big-integer": { "version": "1.6.49", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", @@ -22512,25 +20602,6 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "optional": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true - }, "bootstrap": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", @@ -22581,116 +20652,12 @@ } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, - "requires": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "4.19.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", @@ -22713,89 +20680,12 @@ "node-int64": "^0.4.0" } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -22893,29 +20783,6 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -22928,16 +20795,6 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "cjs-module-lexer": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", @@ -23019,6 +20876,17 @@ } } }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -23125,12 +20993,6 @@ "date-now": "^0.1.4" } }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -23145,20 +21007,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -23225,24 +21073,6 @@ } } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "create-emotion": { "version": "10.0.27", "resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-10.0.27.tgz", @@ -23255,33 +21085,6 @@ "@emotion/utils": "0.11.3" } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -23295,25 +21098,6 @@ "which": "^1.2.9" } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -23407,12 +21191,6 @@ "integrity": "sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -23524,22 +21302,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -23563,25 +21325,6 @@ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -23646,12 +21389,6 @@ } } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -23687,23 +21424,11 @@ "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "electron-to-chromium": { @@ -23712,47 +21437,12 @@ "integrity": "sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg==", "devOptional": true }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - } - } - }, "emittery": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", "dev": true }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -23805,6 +21495,12 @@ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, "errno": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", @@ -23851,6 +21547,12 @@ "unbox-primitive": "^1.0.1" } }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", @@ -24425,12 +22127,12 @@ "requires": {} }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, @@ -24541,16 +22243,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "exec-sh": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", @@ -24628,15 +22320,6 @@ } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -24847,6 +22530,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -24865,12 +22554,6 @@ "bser": "2.1.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -24899,149 +22582,12 @@ "to-regex-range": "^5.0.1" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -25069,16 +22615,6 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -25128,28 +22664,6 @@ "map-cache": "^0.2.2" } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -25250,40 +22764,11 @@ "is-glob": "^4.0.1" } }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true }, "globals": { "version": "11.12.0", @@ -25314,9 +22799,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", "dev": true }, "growly": { @@ -25414,52 +22899,6 @@ } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "history": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", @@ -25473,17 +22912,6 @@ "value-equal": "^1.0.1" } }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -25492,15 +22920,6 @@ "react-is": "^16.7.0" } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -25572,12 +22991,6 @@ "debug": "4" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -25618,18 +23031,6 @@ "postcss": "^7.0.14" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -25739,12 +23140,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -25759,12 +23154,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "install": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/install/-/install-0.11.2.tgz", @@ -25783,9 +23172,9 @@ } }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, "is-accessor-descriptor": { @@ -25829,16 +23218,6 @@ "has-bigints": "^1.0.1" } }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, "is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -25952,12 +23331,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -26417,12 +23790,6 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -26432,15 +23799,6 @@ "path-key": "^3.0.0" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -27187,37 +24545,22 @@ } }, "jest-junit": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.3.0.tgz", - "integrity": "sha512-+NmE5ogsEjFppEl90GChrk7xgz8xzvF0f+ZT5AnhW6suJC93gvQtmQjfyjDnE0Z2nXJqEkxF0WXlvjG/J+wn/g==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.0.0.tgz", + "integrity": "sha512-JSHR+Dhb32FGJaiKkqsB7AR3OqWKtldLd6ZH2+FJ8D4tsweb8Id8zEVReU4+OlrRO1ZluqJLQEETm+Q6/KilBg==", "dev": true, "requires": { "mkdirp": "^1.0.4", - "strip-ansi": "^5.2.0", + "strip-ansi": "^6.0.1", "uuid": "^8.3.2", "xml": "^1.0.1" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -28863,9 +26206,9 @@ "dev": true }, "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true }, "loader-utils": { @@ -28890,16 +26233,6 @@ } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -29029,16 +26362,6 @@ "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", "dev": true }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -29072,17 +26395,6 @@ "remove-accents": "0.4.2" } }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "memoize-one": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", @@ -29125,24 +26437,6 @@ "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -29164,24 +26458,18 @@ "mime-db": "1.49.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -29191,29 +26479,11 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "devOptional": true }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -29235,29 +26505,6 @@ } } }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -29321,45 +26568,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "node-modules-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", @@ -29594,6 +26802,15 @@ "wrappy": "1" } }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -29626,12 +26843,6 @@ "word-wrap": "~1.2.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "p-each-series": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", @@ -29653,43 +26864,17 @@ "p-try": "^2.0.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, "papaparse": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz", "integrity": "sha512-Dbt2yjLJrCwH2sRqKFFJaN5XgIASO9YOFeFP8rIBRG2Ain8mqk5r1M6DkfvqEVozVcz3r3HaUGw253hA1nLIcA==" }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -29699,19 +26884,6 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -29722,12 +26894,6 @@ "json-parse-better-errors": "^1.0.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", @@ -29740,19 +26906,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -29797,19 +26950,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -29822,12 +26962,6 @@ "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -29837,15 +26971,6 @@ "node-modules-regexp": "^1.0.0" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -29994,12 +27119,6 @@ } } }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -30012,12 +27131,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "prompts": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz", @@ -30056,28 +27169,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -30088,47 +27179,12 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -30144,16 +27200,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "react": { "version": "16.13.0", "resolved": "https://registry.npmjs.org/react/-/react-16.13.0.tgz", @@ -30472,14 +27518,13 @@ "util-deprecate": "~1.0.1" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "optional": true, "requires": { - "picomatch": "^2.2.1" + "resolve": "^1.9.0" } }, "redent": { @@ -30641,29 +27686,6 @@ } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -30693,25 +27715,6 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "rsvp": { "version": "4.8.5", "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", @@ -30727,15 +27730,6 @@ "queue-microtask": "^1.2.2" } }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -30939,9 +27933,9 @@ "dev": true }, "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -30976,20 +27970,13 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "kind-of": "^6.0.2" } }, "shallow-equal": { @@ -31183,12 +28170,6 @@ } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -31276,15 +28257,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, "stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -31323,45 +28295,6 @@ } } }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -31577,52 +28510,80 @@ } }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz", + "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==", "dev": true, "requires": { + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", "dev": true, "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "terser": "^5.7.2" }, "dependencies": { - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -31665,25 +28626,6 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tiny-invariant": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", @@ -31700,12 +28642,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -31822,12 +28758,6 @@ "tslib": "^1.8.1" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -31923,24 +28853,6 @@ "set-value": "^2.0.1" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universal-cookie": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-3.1.0.tgz", @@ -32007,13 +28919,6 @@ } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -32029,24 +28934,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "url-loader": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", @@ -32064,15 +28951,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -32125,12 +29003,6 @@ "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -32142,270 +29014,38 @@ }, "w3c-xmlserializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", - "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", - "dev": true, - "requires": { - "makeerror": "1.0.x" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" - } - }, - "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" - } - }, - "watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "webidl-conversions": { @@ -32415,183 +29055,63 @@ "dev": true }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", + "enhanced-resolve": "^5.9.2", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz", + "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } } } }, @@ -32609,181 +29129,140 @@ } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true }, - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" } }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "path-key": "^3.0.0" } }, - "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "shebang-regex": "^3.0.0" } }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "isexe": "^2.0.0" } } } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" } }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -32838,6 +29317,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -32850,15 +29335,6 @@ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -32961,12 +29437,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, "y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/poem/Poem/package.json b/poem/Poem/package.json index 2e5479c7a..3884d5edc 100644 --- a/poem/Poem/package.json +++ b/poem/Poem/package.json @@ -58,7 +58,7 @@ "file-loader": "^3.0.1", "install": "^0.11.0", "jest": "^26.6.3", - "jest-junit": "^12.2.0", + "jest-junit": "^13.0.0", "jsctags": "git+https://github.com/ramitos/jsctags.git", "jshint": "^2.13.4", "postcss-loader": "^3.0.0", @@ -70,9 +70,9 @@ "reactstrap": "^9.0.1", "style-loader": "^0.23.1", "url-loader": "^1.1.2", - "webpack": "^4.46.0", + "webpack": "^5.70.0", "webpack-bundle-tracker": "^1.4.0", - "webpack-cli": "^3.3.12", + "webpack-cli": "^4.9.2", "word-wrap": "^1.2.3", "yup": "^0.32.11" }, From 9e8467a7ec9eacdbc4dca3cb59e71907708ab68e Mon Sep 17 00:00:00 2001 From: Daniel Vrcic Date: Fri, 25 Mar 2022 16:00:13 +0100 Subject: [PATCH 12/16] bump to Django 3.2.12 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2889f3b5b..a05dc2c32 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ deepdiff==4.0.9 defusedxml==0.7.1 distlib==0.3.0 dj-rest-auth==2.2.2 -Django==3.2.11 +Django==3.2.12 django-tenants==3.4.2 django-webpack-loader==1.4.1 djangorestframework==3.13.1 From 90f545a3a645fef79376c7793fc52c18bd89c68f Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 30 Mar 2022 14:07:24 +0200 Subject: [PATCH 13/16] fixed a bug in update_metrics helper function --- poem/Poem/api/tests/test_helpers.py | 21 +++++++++++++++++++++ poem/Poem/helpers/metrics_helpers.py | 16 ++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/poem/Poem/api/tests/test_helpers.py b/poem/Poem/api/tests/test_helpers.py index da35884d1..6465a5a2d 100644 --- a/poem/Poem/api/tests/test_helpers.py +++ b/poem/Poem/api/tests/test_helpers.py @@ -3256,6 +3256,27 @@ def test_update_all_metrics_on_metrictemplate_change(self, mock_update): ) ], any_order=True) + @patch("Poem.helpers.metrics_helpers.update_metric_in_schema") + def test_update_all_passive_metrics_on_metrictemplate_change( + self, mock_update + ): + mock_update.side_effect = mocked_func + metrictemplate = admin_models.MetricTemplate.objects.get( + name="org.apel.APEL-Pub" + ) + update_metrics(metrictemplate, "org.apel.APEL-Pub", None) + self.assertEqual(mock_update.call_count, 2) + mock_update.assert_has_calls([ + call( + mt_id=metrictemplate.id, name="org.apel.APEL-Pub", + pk_id=None, schema="test", user="" + ), + call( + mt_id=metrictemplate.id, name="org.apel.APEL-Pub", + pk_id=None, schema="test2", user="" + ) + ], any_order=True) + class MetricsInProfilesTests(TenantTestCase): def setUp(self): diff --git a/poem/Poem/helpers/metrics_helpers.py b/poem/Poem/helpers/metrics_helpers.py index 7f995c24a..6169c0a57 100644 --- a/poem/Poem/helpers/metrics_helpers.py +++ b/poem/Poem/helpers/metrics_helpers.py @@ -266,10 +266,18 @@ def update_metrics(metrictemplate, name, probekey, user=''): msgs = [] for schema in schemas: - msg = update_metric_in_schema( - mt_id=metrictemplate.id, name=name, pk_id=probekey.id, - schema=schema, user=user - ) + if probekey: + msg = update_metric_in_schema( + mt_id=metrictemplate.id, name=name, pk_id=probekey.id, + schema=schema, user=user + ) + + else: + msg = update_metric_in_schema( + mt_id=metrictemplate.id, name=name, pk_id=None, + schema=schema, user=user + ) + if msg: msgs.append(msg) From 93aecc85bf31835273faa58d0ba92a33eeb671b4 Mon Sep 17 00:00:00 2001 From: Katarina Zailac Date: Wed, 30 Mar 2022 15:02:56 +0200 Subject: [PATCH 14/16] mark 'eol' tag to be colored red same as 'deprecated' tag --- poem/Poem/frontend/react/Metrics.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poem/Poem/frontend/react/Metrics.js b/poem/Poem/frontend/react/Metrics.js index 2e2b37ecf..a909c6998 100644 --- a/poem/Poem/frontend/react/Metrics.js +++ b/poem/Poem/frontend/react/Metrics.js @@ -542,7 +542,7 @@ export const ListOfMetrics = (props) => { none : row.value.map((tag, i) => - + {tag} ) @@ -758,7 +758,7 @@ export const ListOfMetrics = (props) => { const styles = { multiValue: (base, state) => { - return (state.data.value === 'internal') ? { ...base, backgroundColor: '#d4edda' } : (state.data.value === 'deprecated') ? { ...base, backgroundColor: '#f8d7da' } : base; + return (state.data.value === 'internal') ? { ...base, backgroundColor: '#d4edda' } : (state.data.value === 'deprecated' | state.data.value === 'eol') ? { ...base, backgroundColor: '#f8d7da' } : base; }, }; @@ -988,13 +988,13 @@ export const MetricForm = : (obj_label === 'metrictemplate' && !isHistory) ? props.values.tags.map((tag, i) => - + {tag.value} ) : props.values.tags.map((tag, i) => - + {tag} ) From abb143cad0167a1d8f59375eaf98fccb5710d185 Mon Sep 17 00:00:00 2001 From: Daniel Vrcic Date: Thu, 7 Apr 2022 11:59:55 +0200 Subject: [PATCH 15/16] update CHANGELOG with all issues addressed --- CHANGELOG.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c7a98e13..456923367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Changelog +## [3.4.1] - 2022-04-07 + +### Added + +* ARGO-3499 Poem: Warn user if service exists in metric profile but not in aggregation profile +* ARGO-3618 Token protected API view for metric templates on SuperPOEM + +### Changed + +* ARGO-3672 Color "eol" tag red +* ARGO-3565 Improve fetching and caching data in reports page + +### Fixed + +* ARGO-3670 Error saving tags for passive metrics +* ARGO-3667 Resolve security issues + ## [3.4.0] - 2022-02-10 ### Added From 3f9625272204dbecdc0fcb618ea77cc4a50f99bb Mon Sep 17 00:00:00 2001 From: Daniel Vrcic Date: Thu, 7 Apr 2022 12:01:27 +0200 Subject: [PATCH 16/16] bump version to 3.4.1 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index d743e9707..c2f3ca4d7 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def get_files(install_prefix, directory): setup(name=NAME, - version='3.4.0', + version='3.4.1', description='Reports, Profiles, Probes and Metric Configuration Management (POEM) for ARGO Monitoring framework.', author='SRCE', author_email='dvrcic@srce.hr, kzailac@srce.hr',