diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 134be4a50010..fb4dcd2a7453 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1196,7 +1196,7 @@ configurator_deb11: - .test_script_job - .test_devel_and_maintenance_rules -pfappserver_el8: +pfappserver_configurator_el8: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} extends: @@ -1204,7 +1204,23 @@ pfappserver_el8: - .test_script_job - .test_devel_and_maintenance_rules -pfappserver_deb11: +pfappserver_configurator_deb11: + variables: + VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} + extends: + - .test_job + - .test_script_job + - .test_devel_and_maintenance_rules + +pfappserver_configuration_el8: + variables: + VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} + extends: + - .test_job + - .test_script_job + - .test_devel_and_maintenance_rules + +pfappserver_configuration_deb11: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} extends: @@ -1361,7 +1377,25 @@ configurator_deb11_branches: - .test_script_job - .test_branches_only_rules -pfappserver_el8_branches: +pfappserver_configurator_el8_branches: + variables: + VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} + VAGRANT_COMMON_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-common-devel + extends: + - .test_job + - .test_script_job + - .test_branches_only_rules + +pfappserver_configurator_deb11_branches: + variables: + VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} + VAGRANT_COMMON_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-common-devel + extends: + - .test_job + - .test_script_job + - .test_branches_only_rules + +pfappserver_configuration_el8_branches: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} VAGRANT_COMMON_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-common-devel @@ -1370,7 +1404,7 @@ pfappserver_el8_branches: - .test_script_job - .test_branches_only_rules -pfappserver_deb11_branches: +pfappserver_configuration_deb11_branches: variables: VAGRANT_PF_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-${CI_JOB_NAME}-${CI_JOB_ID} VAGRANT_COMMON_DOTFILE_PATH: /var/local/gitlab-runner/vagrant/vagrant-common-devel diff --git a/html/pfappserver/root/src/App.vue b/html/pfappserver/root/src/App.vue index f625af383e74..c2ddb2080a9c 100644 --- a/html/pfappserver/root/src/App.vue +++ b/html/pfappserver/root/src/App.vue @@ -67,8 +67,9 @@ {{ hostname }} - + + @@ -192,6 +193,8 @@ const setup = (props, context) => { }) }, { immediate: true }) + const CatchNavigationDuplicated = e => { if (e.name !== "NavigationDuplicated") throw e } + useEvent('keydown', e => { const { altKey = false, shiftKey = false, keyCode = false } = e if (altKey && shiftKey) { @@ -199,37 +202,37 @@ const setup = (props, context) => { case keyCode === 65 && canRoute('/auditing'): // A e.preventDefault() $router.push('/auditing') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 67 && canRoute('/configuration'): // C e.preventDefault() $router.push('/configuration') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 72: // H e.preventDefault() $store.dispatch('documentation/toggleViewer') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 78 && canRoute('/nodes'): // N e.preventDefault() $router.push('/nodes') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 82 && canRoute('/reports'): // R e.preventDefault() $router.push('/reports') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 83 && canRoute('/status'): // S e.preventDefault() $router.push('/status') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break case keyCode === 85 && canRoute('/users'): // U e.preventDefault() $router.push('/users') - .catch(e => { if (e.name !== "NavigationDuplicated") throw e }) + .catch(CatchNavigationDuplicated) break default: break diff --git a/html/pfappserver/root/src/components/new/BaseButtonConfirm.vue b/html/pfappserver/root/src/components/new/BaseButtonConfirm.vue index 97c27b6feaf7..dbe69dd5be29 100644 --- a/html/pfappserver/root/src/components/new/BaseButtonConfirm.vue +++ b/html/pfappserver/root/src/components/new/BaseButtonConfirm.vue @@ -21,6 +21,7 @@ ([ - { text: 'Windows Phone OS', value: '33507' }, - { text: 'Mac OS X or macOS', value: '2' }, - { text: 'Android OS', value: '33453' }, - { text: 'Windows OS', value: '1' }, - { text: 'BlackBerry OS', value: '33471' }, - { text: 'iOS', value: '33450' }, - { text: 'Linux OS', value: '5' } - ]) + default: () => Object.entries(oses).map(([value, text]) => ({ text, value })) } } diff --git a/html/pfappserver/root/src/views/Configuration/billingTiers/schema.js b/html/pfappserver/root/src/views/Configuration/billingTiers/schema.js index 8f211f01f1e1..f8adc2a075a5 100644 --- a/html/pfappserver/root/src/views/Configuration/billingTiers/schema.js +++ b/html/pfappserver/root/src/views/Configuration/billingTiers/schema.js @@ -29,10 +29,14 @@ export default (props) => { .nullable() .required(i18n.t('Billing Tier required.')) .billingTierIdentifierNotExistsExcept((!isNew && !isClone) ? id : undefined, i18n.t('Billing Tier exists.')), - name: yup.string().nullable().label(i18n.t('Name')), - description: yup.string().nullable().label(i18n.t('Description')), + name: yup.string().nullable().label(i18n.t('Name')) + .required(i18n.t('Name required.')), + description: yup.string().nullable().label(i18n.t('Description')) + .required(i18n.t('Description required.')), price: yup.string().nullable().label(i18n.t('Price')) - .isPrice(i18n.t('Invalid price.')), + .isPrice(i18n.t('Invalid price.')) + .required(i18n.t('Price required.')), role: yup.string().nullable().label(i18n.t('Role')) + .required(i18n.t('Role required.')) }) } diff --git a/html/pfappserver/root/src/views/Configuration/connectionProfiles/_components/BaseFilter.vue b/html/pfappserver/root/src/views/Configuration/connectionProfiles/_components/BaseFilter.vue index 5bd67cffa668..f31543fadff7 100644 --- a/html/pfappserver/root/src/views/Configuration/connectionProfiles/_components/BaseFilter.vue +++ b/html/pfappserver/root/src/views/Configuration/connectionProfiles/_components/BaseFilter.vue @@ -141,7 +141,7 @@ const setup = (props, context) => { } } } - return undefined + return BaseInput }) const matchOptions = ref([]) diff --git a/html/pfappserver/root/src/views/Configuration/connectors/schema.js b/html/pfappserver/root/src/views/Configuration/connectors/schema.js index af104ffa2bdd..9d7acd671c64 100644 --- a/html/pfappserver/root/src/views/Configuration/connectors/schema.js +++ b/html/pfappserver/root/src/views/Configuration/connectors/schema.js @@ -37,7 +37,10 @@ export default (props) => { .nullable() .required(i18n.t('Connector ID required.')) .connectorIdentifierNotExistsExcept((!isNew && !isClone) ? id : undefined, i18n.t('Connector ID exists.')), - description: yup.string().nullable().label(i18n.t('Description')), - networks: schemaNetworks + description: yup.string().nullable().label(i18n.t('Description')) + .required(i18n.t('Description required.')), + networks: schemaNetworks, + secret: yup.string().nullable().label(i18n.t('Secret')) + .required(i18n.t('Secret required.')) }) } diff --git a/html/pfappserver/root/src/views/Configuration/floatingDevices/schema.js b/html/pfappserver/root/src/views/Configuration/floatingDevices/schema.js index 44ddf8054a52..a8d3e11b0023 100644 --- a/html/pfappserver/root/src/views/Configuration/floatingDevices/schema.js +++ b/html/pfappserver/root/src/views/Configuration/floatingDevices/schema.js @@ -31,7 +31,8 @@ export default (props) => { .isMAC(i18n.t('Invalid MAC address.')) .floatingDeviceIdentifierNotExistsExcept((!isNew && !isClone) ? id : undefined, i18n.t('MAC Address exists.')), ip: yup.string().nullable().label('IP'), - pvid: yup.string().nullable().label('VLAN'), + pvid: yup.string().nullable().label('VLAN') + .required(i18n.t('VLAN required.')), taggedVlan: yup.string().nullable().label('VLAN') }) } diff --git a/html/pfappserver/root/src/views/Configuration/pki/config.js b/html/pfappserver/root/src/views/Configuration/pki/config.js index 8a3275ee75d3..a97b37914883 100644 --- a/html/pfappserver/root/src/views/Configuration/pki/config.js +++ b/html/pfappserver/root/src/views/Configuration/pki/config.js @@ -1,31 +1,17 @@ import { computed } from '@vue/composition-api' import i18n from '@/utils/locale' -export const digests = [ - { value: '0', text: 'UnknownSignatureAlgorithm' }, - { value: '1', text: 'MD2WithRSA' }, - { value: '2', text: 'MD5WithRSA' }, - { value: '3', text: 'SHA1WithRSA' }, - { value: '4', text: 'SHA256WithRSA' }, - { value: '5', text: 'SHA384WithRSA' }, - { value: '6', text: 'SHA512WithRSA' }, - { value: '7', text: 'DSAWithSHA1' }, - { value: '8', text: 'DSAWithSHA256' }, - { value: '9', text: 'ECDSAWithSHA1' }, - { value: '10', text: 'ECDSAWithSHA256' }, - { value: '11', text: 'ECDSAWithSHA384' }, - { value: '12', text: 'ECDSAWithSHA512' }, - { value: '13', text: 'SHA256WithRSAPSS' }, - { value: '14', text: 'SHA384WithRSAPSS' }, - { value: '15', text: 'SHA512WithRSAPSS' }, - { value: '16', text: 'PureEd25519' } -] +import { + digests as _digests, + keyTypes as _keyTypes, + keyUsages as _keyUsages, + extendedKeyUsages as _extendedKeyUsages, + revokeReasons as _revokeReasons, +} from '@/globals/pki' -export const keyTypes = [ - { value: '0', text: 'KEY_ECDSA', sizes: [ '256', '384', '521' ] }, - { value: '1', text: 'KEY_RSA', sizes: [ '2048', '4096' ] }, - { value: '2', text: 'KEY_DSA', sizes: [ '1024', '2048', '3071' ] } -] +export const digests = Object.entries(_digests).map(([value, text]) => ({ value: `${value}`, text })) + +export const keyTypes = Object.entries(_keyTypes).map(([value, [text, sizes]]) => ({ value: `${value}`, text, sizes: sizes.map(s => `${s}`) })) export const keySizes = [...(new Set( keyTypes.reduce((sizes, type) => ([ ...sizes, ...type.sizes.map(size => +size) ]), []) @@ -33,47 +19,11 @@ export const keySizes = [...(new Set( .sort((a, b) => (a > b)) .map(size => ({ value: `${size}`, text: `${size}` })) -export const keyUsages = [ - { value: '1', text: 'DigitalSignature' }, - { value: '2', text: 'ContentCommitment' }, - { value: '4', text: 'KeyEncipherment' }, - { value: '8', text: 'DataEncipherment' }, - { value: '16', text: 'KeyAgreement' }, - { value: '32', text: 'CertSign' }, - { value: '64', text: 'CRLSign' }, - { value: '128', text: 'EncipherOnly' }, - { value: '256', text: 'DecipherOnly' } -] +export const keyUsages = Object.entries(_keyUsages).map(([value, text]) => ({ value: `${value}`, text })) -export const extendedKeyUsages = [ - { value: '0', text: 'Any' }, - { value: '1', text: 'ServerAuth' }, - { value: '2', text: 'ClientAuth' }, - { value: '3', text: 'CodeSigning' }, - { value: '4', text: 'EmailProtection' }, - { value: '5', text: 'IPSECEndSystem' }, - { value: '6', text: 'IPSECTunnel' }, - { value: '7', text: 'IPSECUser' }, - { value: '8', text: 'TimeStamping' }, - { value: '9', text: 'OCSPSigning' }, - { value: '10', text: 'MicrosoftServerGatedCrypto' }, - { value: '11', text: 'NetscapeServerGatedCrypto' }, - { value: '12', text: 'MicrosoftCommercialCodeSigning' }, - { value: '13', text: 'MicrosoftKernelCodeSigning' } -] +export const extendedKeyUsages = Object.entries(_extendedKeyUsages).map(([value, text]) => ({ value: `${value}`, text })) -export const revokeReasons = [ - { value: '0', text: 'Unspecified' }, - { value: '1', text: 'KeyCompromise' }, - { value: '2', text: 'CACompromise' }, - { value: '3', text: 'AffiliationChanged' }, - { value: '4', text: 'Superseded' }, - { value: '5', text: 'CessationOfOperation' }, - { value: '6', text: 'CertificateHold' }, - { value: '8', text: 'RemoveFromCRL' }, - { value: '9', text: 'PrivilegeWithdrawn' }, - { value: '10', text: 'AACompromise' } -] +export const revokeReasons = Object.entries(_revokeReasons).map(([value, text]) => ({ value: `${value}`, text })) export const useServices = () => computed(() => { return { diff --git a/lib/pf/UnifiedApi/Controller/Config/Domains.pm b/lib/pf/UnifiedApi/Controller/Config/Domains.pm index 59bf7b4cfd7b..c0d52ac2cbb7 100644 --- a/lib/pf/UnifiedApi/Controller/Config/Domains.pm +++ b/lib/pf/UnifiedApi/Controller/Config/Domains.pm @@ -67,6 +67,7 @@ sub create { return 0; } + my $ad_skip = $item->{ad_skip}; $item = $self->cleanupItemForCreate($item); (my $status, $item, my $form) = $self->validate_item($item); if (is_error($status)) { @@ -180,6 +181,7 @@ sub update { } my $cs = $self->config_store; + my $ad_skip = delete $data->{ad_skip}; $self->cleanupItemForUpdate($old_item, $new_data, $data); my $bind_dn = $new_item->{bind_dn}; diff --git a/t/html/pfappserver/Makefile b/t/html/pfappserver/Makefile index 34f5ee441796..089a961733f7 100644 --- a/t/html/pfappserver/Makefile +++ b/t/html/pfappserver/Makefile @@ -1,4 +1,5 @@ #!make +THIS_FILE := $(lastword $(MAKEFILE_LIST)) include .local_env export $(shell sed 's/=.*//' .local_env) @@ -11,6 +12,7 @@ DEBUG ?= CI_PIPELINE_ID ?= $$(openssl rand -hex 16) PROJECT_ID ?= RECORD_KEY ?= +CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT ?= 300000 .PHONY: all install test @@ -49,22 +51,27 @@ install: npm install --legacy-peer-deps test: - DEBUG=$(DEBUG) \ - DISPLAY= \ - NO_COLOR=1 \ - BROWSERSLIST_IGNORE_OLD_DATA=true \ - CYPRESS_baseUrl=$(BASE_URL) \ - cypress run --browser $(BROWSER) --config-file $(CONFIG_FILE) --config $(CONFIG) --e2e --env tags=[$(TAGS)] ; \ + DEBUG=$(DEBUG) \ + DISPLAY= \ + NO_COLOR=1 \ + BROWSERSLIST_IGNORE_OLD_DATA=true \ + CYPRESS_baseUrl=$(BASE_URL) \ + CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT=$(CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT) \ + npx cypress run --browser $(BROWSER) --config-file $(CONFIG_FILE) --config $(CONFIG) --e2e --env tags=[$(TAGS)] ; \ + +test-concurrent: + bash concurrent.sh $(MAKE) -f $(THIS_FILE) test test-project: - DEBUG=$(DEBUG) \ - DISPLAY= \ - NO_COLOR=1 \ - BROWSERSLIST_IGNORE_OLD_DATA=true \ - CYPRESS_baseUrl=$(BASE_URL) \ - cypress run --browser $(BROWSER) --config-file $(CONFIG_FILE) --config projectId=$(PROJECT_ID),$(CONFIG) --e2e --ci-build-id $(CI_PIPELINE_ID) --parallel --record --key $(RECORD_KEY) --tag $(TAG) --env tags=[$(TAGS)] ; \ + DEBUG=$(DEBUG) \ + DISPLAY= \ + NO_COLOR=1 \ + BROWSERSLIST_IGNORE_OLD_DATA=true \ + CYPRESS_baseUrl=$(BASE_URL) \ + CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT=$(CYPRESS_INTERNAL_BROWSER_CONNECT_TIMEOUT) \ + npx cypress run --browser $(BROWSER) --config-file $(CONFIG_FILE) --config projectId=$(PROJECT_ID),$(CONFIG) --e2e --ci-build-id $(CI_PIPELINE_ID) --parallel --record --key $(RECORD_KEY) --tag $(TAG) --env tags=[$(TAGS)] ; \ test-x11: DEBUG=$(DEBUG) \ CYPRESS_baseUrl=$(BASE_URL) \ - cypress open --browser $(BROWSER) --config-file $(CONFIG_FILE) --config $(CONFIG) + npx cypress open --browser $(BROWSER) --config-file $(CONFIG_FILE) --config $(CONFIG) diff --git a/t/html/pfappserver/concurrent.sh b/t/html/pfappserver/concurrent.sh new file mode 100755 index 000000000000..30380ae77d34 --- /dev/null +++ b/t/html/pfappserver/concurrent.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +MAX_CONCURRENCY="${MAX_CONCURRENCY:=10}" +MAX_EXEC_TIME="${MAX_EXEC_TIME:=60}" +PARALLEL="${PARALLEL:=10}" + +mkfifo cfifo +exec 10<>cfifo && rm -f cfifo +for _ in $(seq 1 ${MAX_CONCURRENCY}); do { echo >&10; } done +for SLICE in $(seq 0 $(($PARALLEL-1))); do + read -r -u10 + { + CYPRESS_screenshotsFolder=cypress/results/screenshots/slice-${SLICE} \ + CYPRESS_videosFolder=cypress/results/videos/slice-${SLICE} \ + SLICE=${SLICE} \ + timeout ${MAX_EXEC_TIME} \ + $@ + + [[ $? -ne 0 ]] && echo "Slice $SLICE timeout" + + echo >&10 + } & +done +wait +exec 10>&- +exec 10<&- diff --git a/t/html/pfappserver/config/bases/index.js b/t/html/pfappserver/config/bases/index.js new file mode 100644 index 000000000000..1251884eaa63 --- /dev/null +++ b/t/html/pfappserver/config/bases/index.js @@ -0,0 +1,43 @@ +const access_durations = require('./modules/access_durations') +const active_active = require('./modules/active_active') +const admin_login = require('./modules/admin_login') +const advanced = require('./modules/advanced') +const alerting = require('./modules/alerting') +const captive_portal = require('./modules/captive_portal') +const database_advanced = require('./modules/database_advanced') +const database_general = require('./modules/database_general') +const database_proxysql = require('./modules/database_proxysql') +const dns_configuration = require('./modules/dns_configuration') +const fingerbank = require('./modules/fingerbank') +const general = require('./modules/general') +const monit = require('./modules/monit') +const networks_fencing = require('./modules/networks_fencing') +const networks_inline = require('./modules/networks_inline') +const networks_network = require('./modules/networks_network') +const networks_parking = require('./modules/networks_parking') +const services = require('./modules/services') +const snmp_traps = require('./modules/snmp_traps') +const webservices = require('./modules/webservices') + +module.exports = { + access_durations, + active_active, + admin_login, + advanced, + alerting, + captive_portal, + database_advanced, + database_general, + database_proxysql, + dns_configuration, + fingerbank, + general, + monit, + networks_fencing, + networks_inline, + networks_network, + networks_parking, + services, + snmp_traps, + webservices +} \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/access_durations.js b/t/html/pfappserver/config/bases/modules/access_durations.js new file mode 100644 index 000000000000..045cffcbec83 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/access_durations.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/guests_admin_registration'; + +module.exports = { + id: 'configuration-access-durations', + description: 'Configuration - Access durations', + tests: [ + { + description: 'Access durations - Passthrough Form', + url: '/configuration/access_duration', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/active_active.js b/t/html/pfappserver/config/bases/modules/active_active.js new file mode 100644 index 000000000000..36ce1127d096 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/active_active.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/active_active'; + +module.exports = { + id: 'configuration-active-active', + description: 'Configuration - Active active', + tests: [ + { + description: 'Active active - Passthrough Form', + url: '/configuration/active_active', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/admin_login.js b/t/html/pfappserver/config/bases/modules/admin_login.js new file mode 100644 index 000000000000..a196a132e35b --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/admin_login.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/admin_login'; + +module.exports = { + id: 'configuration-admin-login', + description: 'Configuration - Admin login', + tests: [ + { + description: 'Admin login - Passthrough Form', + url: '/configuration/admin_login', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/advanced.js b/t/html/pfappserver/config/bases/modules/advanced.js new file mode 100644 index 000000000000..9ffc1126f725 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/advanced.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/advanced'; + +module.exports = { + id: 'configuration-active-active', + description: 'Configuration - Advanced', + tests: [ + { + description: 'Advanced - Passthrough Form', + url: '/configuration/advanced', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/alerting.js b/t/html/pfappserver/config/bases/modules/alerting.js new file mode 100644 index 000000000000..757fa04ede01 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/alerting.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/alerting'; + +module.exports = { + id: 'configuration-alerting', + description: 'Configuration - Alerting', + tests: [ + { + description: 'Alerting - Passthrough Form', + url: '/configuration/alerting', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/captive_portal.js b/t/html/pfappserver/config/bases/modules/captive_portal.js new file mode 100644 index 000000000000..eb9de4e7642a --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/captive_portal.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/captive_portal'; + +module.exports = { + id: 'configuration-captive-portal', + description: 'Configuration - Captive Portal', + tests: [ + { + description: 'Captive Portal - Passthrough Form', + url: '/configuration/captive_portal', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/database_advanced.js b/t/html/pfappserver/config/bases/modules/database_advanced.js new file mode 100644 index 000000000000..02ff05a4532e --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/database_advanced.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/database_advanced'; + +module.exports = { + id: 'configuration-database-advanced', + description: 'Configuration - Database advanced', + tests: [ + { + description: 'Database advanced - Passthrough Form', + url: '/configuration/database_advanced', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/database_general.js b/t/html/pfappserver/config/bases/modules/database_general.js new file mode 100644 index 000000000000..a6b04612ae58 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/database_general.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/database'; + +module.exports = { + id: 'configuration-database-general', + description: 'Configuration - Database general', + tests: [ + { + description: 'Database general - Passthrough Form', + url: '/configuration/database_general', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/database_proxysql.js b/t/html/pfappserver/config/bases/modules/database_proxysql.js new file mode 100644 index 000000000000..144a6ac8fcf5 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/database_proxysql.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/database_proxysql'; + +module.exports = { + id: 'configuration-database-proxysql', + description: 'Configuration - Database ProxySQL', + tests: [ + { + description: 'Database ProxySQL - Passthrough Form', + url: '/configuration/database_proxysql', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/dns_configuration.js b/t/html/pfappserver/config/bases/modules/dns_configuration.js new file mode 100644 index 000000000000..20eb527c3e54 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/dns_configuration.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/dns_configuration'; + +module.exports = { + id: 'configuration-dns-configuration', + description: 'Configuration - DNS configuration', + tests: [ + { + description: 'DNS configuration - Passthrough Form', + url: '/configuration/dns', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/fingerbank.js b/t/html/pfappserver/config/bases/modules/fingerbank.js new file mode 100644 index 000000000000..0ad2deedcf78 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/fingerbank.js @@ -0,0 +1,41 @@ +const expectByType = (type, req, fixture) => { + if (type in fixture) { + Object.keys(fixture[type]).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[type][key], key) + }) + } +}; + +module.exports = { + id: 'configuration-fingerbank-general-settings', + description: 'Configuration - Fingerbank', + tests: [ + { + description: 'General Settings - Passthrough Form', + url: '/configuration/fingerbank/general_settings', + interceptors: [ + { method: 'GET', url: '/api/**/config/fingerbank_settings?*', fixture: res => res.body.items.reduce((fixture, { id, ...rest }) => ({ ...fixture, [id]: { id, ...rest } }), {}) }, + + { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/collector', expect: (req, fixture) => expectByType('collector', req, fixture) }, + { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/proxy', expect: (req, fixture) => expectByType('proxy', req, fixture) }, + { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/query', expect: (req, fixture) => expectByType('query', req, fixture) }, + { method: '+(PATCH|PUT)', url: '/api/**/config/fingerbank_setting/upstream', expect: (req, fixture) => expectByType('upstream', req, fixture) }, + ] + }, + { + description: 'Device Change Detection - Passthrough Form', + url: '/configuration/fingerbank/device_change_detection', + interceptors: [ + { method: 'GET', url: '/api/**/config/base/fingerbank_device_change', fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url: '/api/**/config/base/fingerbank_device_change', expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/general.js b/t/html/pfappserver/config/bases/modules/general.js new file mode 100644 index 000000000000..bce3051966d2 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/general.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/general'; + +module.exports = { + id: 'configuration-general', + description: 'Configuration - General', + tests: [ + { + description: 'General - Passthrough Form', + url: '/configuration/general', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/monit.js b/t/html/pfappserver/config/bases/modules/monit.js new file mode 100644 index 000000000000..4b351edfee12 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/monit.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/monit'; + +module.exports = { + id: 'configuration-monit', + description: 'Configuration - Monit', + tests: [ + { + description: 'Monit - Passthrough Form', + url: '/configuration/monit', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/networks_fencing.js b/t/html/pfappserver/config/bases/modules/networks_fencing.js new file mode 100644 index 000000000000..367da2bf2485 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/networks_fencing.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/fencing'; + +module.exports = { + id: 'configuration-networks-fencing', + description: 'Configuration - Networks fencing', + tests: [ + { + description: 'Networks fencing - Passthrough Form', + url: '/configuration/fencing', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/networks_inline.js b/t/html/pfappserver/config/bases/modules/networks_inline.js new file mode 100644 index 000000000000..cab406b95f3b --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/networks_inline.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/inline'; + +module.exports = { + id: 'configuration-networks-inline', + description: 'Configuration - Networks inline', + tests: [ + { + description: 'Networks inline - Passthrough Form', + url: '/configuration/inline', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/networks_network.js b/t/html/pfappserver/config/bases/modules/networks_network.js new file mode 100644 index 000000000000..d513e8b4dcfd --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/networks_network.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/network'; + +module.exports = { + id: 'configuration-networks-network', + description: 'Configuration - Networks network', + tests: [ + { + description: 'Networks network - Passthrough Form', + url: '/configuration/network', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/networks_parking.js b/t/html/pfappserver/config/bases/modules/networks_parking.js new file mode 100644 index 000000000000..1fbee320c7a7 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/networks_parking.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/parking'; + +module.exports = { + id: 'configuration-networks-parking', + description: 'Configuration - Networks parking', + tests: [ + { + description: 'Networks parking - Passthrough Form', + url: '/configuration/parking', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/services.js b/t/html/pfappserver/config/bases/modules/services.js new file mode 100644 index 000000000000..f5476b601d29 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/services.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/services'; + +module.exports = { + id: 'configuration-services', + description: 'Configuration - Services', + tests: [ + { + description: 'Services - Passthrough Form', + url: '/configuration/services', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/snmp_traps.js b/t/html/pfappserver/config/bases/modules/snmp_traps.js new file mode 100644 index 000000000000..15948516d18e --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/snmp_traps.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/snmp_traps'; + +module.exports = { + id: 'configuration-snmp-traps', + description: 'Configuration - SNMP Traps', + tests: [ + { + description: 'SNMP Traps - Passthrough Form', + url: '/configuration/snmp_traps', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/bases/modules/webservices.js b/t/html/pfappserver/config/bases/modules/webservices.js new file mode 100644 index 000000000000..13d7c865f048 --- /dev/null +++ b/t/html/pfappserver/config/bases/modules/webservices.js @@ -0,0 +1,22 @@ +const url = '/api/**/config/base/webservices'; + +module.exports = { + id: 'configuration-webservices', + description: 'Configuration - Web Services', + tests: [ + { + description: 'Webservices - Passthrough Form', + url: '/configuration/webservices', + interceptors: [ + { method: 'GET', url, fixture: res => res.body.item }, + + { method: '+(PATCH|PUT)', url, expect: (req, fixture) => { + Object.keys(fixture).forEach(key => { + expect(req.body).to.have.property(key) + expect(req.body[key]).to.deep.equal(fixture[key], key) + }) + } }, + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/config.js b/t/html/pfappserver/config/collections/config.js new file mode 100644 index 000000000000..02f084f27e41 --- /dev/null +++ b/t/html/pfappserver/config/collections/config.js @@ -0,0 +1,9 @@ +const SCOPE_INSERT = 'insert'; +const SCOPE_UPDATE = 'update'; +const SCOPE_DELETE = 'delete'; + +module.exports = { + SCOPE_INSERT, + SCOPE_UPDATE, + SCOPE_DELETE +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/domains.js b/t/html/pfappserver/config/collections/domains.js deleted file mode 100644 index 82838d3caede..000000000000 --- a/t/html/pfappserver/config/collections/domains.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - id: 'domains', - name: 'Domains', - url: '/configuration/domains', -}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/index.js b/t/html/pfappserver/config/collections/index.js index e42bdcb29418..821d08314fbc 100644 --- a/t/html/pfappserver/config/collections/index.js +++ b/t/html/pfappserver/config/collections/index.js @@ -1,7 +1,79 @@ -const domains = require('./domains') -const roles = require('./roles') +const adminRoles = require('./modules/adminRoles') +const billingTiers = require('./modules/billingTiers') +const clouds = require('./modules/clouds') +const connectionProfiles = require('./modules/connectionProfiles') +const connectors = require('./modules/connectors') +const domains = require('./modules/domains') +const eventLoggers = require('./modules/eventLoggers') +const filterEngines = require('./modules/filterEngines') +const fingerbankCombinations = require('./modules/fingerbankCombinations') +const fingerbankDevices = require('./modules/fingerbankDevices') +const fingerbankDhcpFingerprints = require('./modules/fingerbankDhcpFingerprints') +const fingerbankDhcpv6Enterprises = require('./modules/fingerbankDhcpv6Enterprises') +const fingerbankDhcpv6Fingerprints = require('./modules/fingerbankDhcpv6Fingerprints') +const fingerbankDhcpVendors = require('./modules/fingerbankDhcpVendors') +const fingerbankMacVendors = require('./modules/fingerbankMacVendors') +const fingerbankUserAgents = require('./modules/fingerbankUserAgents') +const firewalls = require('./modules/firewalls') +const floatingDevices = require('./modules/floatingDevices') +const maintenaceTasks = require('./modules/maintenanceTasks') +const mfas = require('./modules/mfas') +const networkBehaviorPolicies = require('./modules/networkBehaviorPolicies') +const pkiCas = require('./modules/pkiCas') +const pkiProviders = require('./modules/pkiProviders') +const provisionings = require('./modules/provisionings') +const radiusProfiles = require('./modules/radiusProfiles') +const radiusSslCertificates = require('./modules/radiusSslCertificates') +const realms = require('./modules/realms') +const roles = require('./modules/roles') +const scanEngines = require('./modules/scanEngines') +const securityEvents = require('./modules/securityEvents') +const selfServices = require('./modules/selfServices') +const sources = require('./modules/sources') +const switches = require('./modules/switches') +const switchGroups = require('./modules/switchGroups') +const switchTemplates = require('./modules/switchTemplates') +const syslogForwarders = require('./modules/syslogForwarders') +const syslogParsers = require('./modules/syslogParsers') +const wrixLocations = require('./modules/wrixLocations') module.exports = { + adminRoles, + billingTiers, + clouds, + connectionProfiles, + connectors, domains, - roles + eventLoggers, +// filterEngines, // issue(s) + fingerbankCombinations, + fingerbankDevices, + fingerbankDhcpFingerprints, + fingerbankDhcpv6Enterprises, + fingerbankDhcpv6Fingerprints, + fingerbankDhcpVendors, + fingerbankMacVendors, + fingerbankUserAgents, + firewalls, + floatingDevices, + networkBehaviorPolicies, + maintenaceTasks, + mfas, +// pkiCas, // incomplete + pkiProviders, + provisionings, + radiusProfiles, + radiusSslCertificates, + realms, + roles, + scanEngines, + securityEvents, + selfServices, + sources, + switches, + switchGroups, + switchTemplates, + syslogForwarders, + syslogParsers, + wrixLocations } \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/adminRoles.js b/t/html/pfappserver/config/collections/modules/adminRoles.js new file mode 100644 index 000000000000..7094fd73773a --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/adminRoles.js @@ -0,0 +1,79 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/admin_roles'; +const resource_url = id => `/configuration/admin_role/${id}`; + +const fixture = 'collections/adminRole.json'; + +const acls = require('../../../cypress/fixtures/runtime/acls.json'); +const map = (value, namespace = '') => { + if (namespace === 'actions') { // re-map actions + return value.map(v => acls[v]) + } + return value +} + +module.exports = { + id: 'adminRoles', + description: 'Admin Roles', + tests: [ + { + description: 'Admin Roles - Create New', + scope: SCOPE_INSERT, + fixture, + map, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Admin Role)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/admin_roles', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Admin Roles - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/admin_role/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Admin Roles - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/admin_role/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/billingTiers.js b/t/html/pfappserver/config/collections/modules/billingTiers.js new file mode 100644 index 000000000000..b4a4d93722ab --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/billingTiers.js @@ -0,0 +1,87 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/billing_tiers'; +const resource_url = id => `/configuration/billing_tier/${id}`; + +const fixture = 'collections/billingTier.json'; +const flatten = true; + +const map = (value, namespace = '') => { + if (namespace.endsWith('.unit')) { // re-map access durations + switch (value) { + case 's': return 'second' + case 'm': return 'minute' + case 'h': return 'hour' + case 'D': return 'day' + case 'W': return 'week' + case 'M': return 'month' + case 'Y': return 'year' + } + } + return value +} + +module.exports = { + id: 'billingTiers', + description: 'Billing Tiers', + tests: [ + { + description: 'Billing Tiers - Create New', + scope: SCOPE_INSERT, + fixture, + flatten, + map, + url: collection_url, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/billing_tiers', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Billing Tiers - Update Existing', + scope: SCOPE_UPDATE, + fixture, + flatten, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/billing_tier/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Billing Tiers - Delete Existing', + scope: SCOPE_DELETE, + fixture, + flatten, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/billing_tier/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/clouds.js b/t/html/pfappserver/config/collections/modules/clouds.js new file mode 100644 index 000000000000..959d81b6b655 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/clouds.js @@ -0,0 +1,78 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + intune: 'Intune' +} + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/clouds'; + const resource_url = (id) => `/configuration/cloud/${id}`; + const fixture = `collections/cloud/${type}.json`; + + return [...tests, ...[ + { + description: `Clouds (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Cloud)`, `ul li a[href$="/new/${name}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/clouds', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Clouds (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/cloud/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Clouds (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/cloud/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'clouds', + description: 'Clouds', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/connectionProfiles.js b/t/html/pfappserver/config/collections/modules/connectionProfiles.js new file mode 100644 index 000000000000..baa4cab64e90 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/connectionProfiles.js @@ -0,0 +1,86 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/connection_profiles'; +const resource_url = id => `/configuration/connection_profile/${id}`; + +const fixture = 'collections/connectionProfile.json'; +const flatten = true; + +module.exports = { + id: 'connectionProfiles', + description: 'Connection Profiles', + tests: [ + { + description: 'Connection Profiles - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + flatten, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Connection Profile)'], + }, + beforeFormFill: (selector, options) => { // "filter" required + cy.get(selector, options).then($selector => { + const buttonSelector = `button[type="button"]:contains(Add Filter)` + if ($selector.find(buttonSelector).length) { + cy.get(buttonSelector, options).each((button, n) => { + // click button + cy.get(button, options) + .click({ log: true }) + }) + } + }) + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/connection_profiles', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Connection Profiles - Update Existing', + scope: SCOPE_UPDATE, + fixture, + flatten, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/connection_profile/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Connection Profiles - Delete Existing', + scope: SCOPE_DELETE, + fixture, + flatten, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/connection_profile/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/connectors.js b/t/html/pfappserver/config/collections/modules/connectors.js new file mode 100644 index 000000000000..2d27477fa37e --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/connectors.js @@ -0,0 +1,71 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/connectors'; +const resource_url = id => `/configuration/connector/${id}`; +const fixture = 'collections/connector.json'; + +module.exports = { + id: 'connectors', + description: 'Connectors', + tests: [ + { + description: 'Connectors - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/connectors', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + const { body: { id } = {} } = response + return { id } // push `id` to fixture + } + } + ] + }, + { + description: 'Connectors - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/connector/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Connectors - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/connector/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/domains.js b/t/html/pfappserver/config/collections/modules/domains.js new file mode 100644 index 000000000000..6fd276531dee --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/domains.js @@ -0,0 +1,74 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/domains'; +const resource_url = id => `/configuration/domain/${id}`; +const fixture = 'collections/domain.json'; + +const mutatedKeys = ['machine_account_password']; // form values mutated post-create + +module.exports = { + id: 'domains', + description: 'Domains', + tests: [ + { + description: 'Domains - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/domains', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + request.body.ad_skip = true // skip add_computer w/ AD + return request + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Domains - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/domain/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + if (!mutatedKeys.includes(key)) { // ignore mutated + expect(request.body[key]).to.deep.equal(fixture[key], key) + } + }) + request.body.ad_skip = true // don't use AD + return request + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Domains - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/domain/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/eventLoggers.js b/t/html/pfappserver/config/collections/modules/eventLoggers.js new file mode 100644 index 000000000000..04ab2581aadd --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/eventLoggers.js @@ -0,0 +1,79 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + syslog: 'Syslog' +}; + + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/event_loggers'; + const resource_url = (id) => `/configuration/event_logger/${id}`; + const fixture = `collections/eventLogger/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Event Loggers (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Event Logger)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/event_loggers', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Event Loggers (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/event_logger/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Event Loggers (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/event_logger/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'eventLoggers', + description: 'Event Loggers', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/filterEngines.js b/t/html/pfappserver/config/collections/modules/filterEngines.js new file mode 100644 index 000000000000..24b0ee2c2039 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/filterEngines.js @@ -0,0 +1,84 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { // singular, 's' is appended for plural + dhcp_filter: 'DHCP Filter', + dns_filter: 'DNS Filter', + radius_filter: 'RADIUS Filter', + switch_filter: 'Switch Filter', + vlan_filter: 'VLAN Filter' +}; + + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = `/configuration/filter_engines/${type}s`; + const resource_url = (id) => `/configuration/filter_engines/${type}s/${id}`; + const fixture = `collections/filterEngine/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Filter Engines (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Filter)`], + tabSelector: false, + }, + interceptors: [ + { + method: 'POST', + url: `/api/**/config/filter_engines/${type}s`, + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Filter Engines (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: `/api/**/config/filter_engines/${type}/**`, + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Filter Engines (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: `/api/**/config/filter_engines/${type}/**`, expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'filterEngines', + description: 'Filter Engines', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankCombinations.js b/t/html/pfappserver/config/collections/modules/fingerbankCombinations.js new file mode 100644 index 000000000000..4667281352e6 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankCombinations.js @@ -0,0 +1,82 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const { oses } = require('../../../config/global/fingerbank'); + +const collection_url = 'configuration/fingerbank/combinations'; +const resource_url = id => `/configuration/fingerbank/local/combination/${id}`; +const fixture = 'collections/fingerbank/combination.json'; + +const map = (value, namespace = '') => { + if (namespace === 'device_id') { // remap device_id + return oses[value] + } + return value +} + +module.exports = { + id: 'fingerbankCombinations', + description: 'Fingerbank Combinations', + tests: [ + { + description: 'Fingerbank Combinations - Create New', + scope: SCOPE_INSERT, + fixture, + map, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Combination)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/combinations', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank Combinations - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/combination/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank Combinations - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/combination/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankDevices.js b/t/html/pfappserver/config/collections/modules/fingerbankDevices.js new file mode 100644 index 000000000000..c9f3d123d27a --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankDevices.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/devices'; +const resource_url = id => `/configuration/fingerbank/local/device/${id}`; +const fixture = 'collections/fingerbank/device.json'; + +module.exports = { + id: 'fingerbankDevices', + description: 'Fingerbank Devices', + tests: [ + { + description: 'Fingerbank Devices - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Device)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/devices', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank Devices - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/device/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank Devices - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/device/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankDhcpFingerprints.js b/t/html/pfappserver/config/collections/modules/fingerbankDhcpFingerprints.js new file mode 100644 index 000000000000..4fe565b55902 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankDhcpFingerprints.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/dhcp_fingerprints'; +const resource_url = id => `/configuration/fingerbank/local/dhcp_fingerprint/${id}`; +const fixture = 'collections/fingerbank/dhcpFingerprint.json'; + +module.exports = { + id: 'fingerbankDhcpFingerprints', + description: 'Fingerbank DHCP Fingerprints', + tests: [ + { + description: 'Fingerbank DHCP Fingerprints - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New DHCP Fingerprint)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/dhcp_fingerprints', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank DHCP Fingerprints - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/dhcp_fingerprint/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank DHCP Fingerprints - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/dhcp_fingerprint/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankDhcpVendors.js b/t/html/pfappserver/config/collections/modules/fingerbankDhcpVendors.js new file mode 100644 index 000000000000..17920e31e914 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankDhcpVendors.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/dhcp_vendors'; +const resource_url = id => `/configuration/fingerbank/local/dhcp_vendor/${id}`; +const fixture = 'collections/fingerbank/dhcpVendor.json'; + +module.exports = { + id: 'fingerbankDhcpVendors', + description: 'Fingerbank DHCP Vendors', + tests: [ + { + description: 'Fingerbank DHCP Vendors - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New DHCP Vendor)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/dhcp_vendors', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank DHCP Vendors - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/dhcp_vendor/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank DHCP Vendors - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/dhcp_vendor/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Enterprises.js b/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Enterprises.js new file mode 100644 index 000000000000..e2e9e9001829 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Enterprises.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/dhcpv6_enterprises'; +const resource_url = id => `/configuration/fingerbank/local/dhcpv6_enterprise/${id}`; +const fixture = 'collections/fingerbank/dhcpv6Enterprise.json'; + +module.exports = { + id: 'fingerbankDhcpv6Enterprises', + description: 'Fingerbank DHCPv6 Enterprises', + tests: [ + { + description: 'Fingerbank DHCPv6 Enterprises - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New DHCPv6 Enterprise)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/dhcp6_enterprises', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank DHCPv6 Enterprises - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/dhcp6_enterprise/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank DHCPv6 Enterprises - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/dhcp6_enterprise/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js b/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js new file mode 100644 index 000000000000..36b4e2ed11ac --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankDhcpv6Fingerprints.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/dhcpv6_fingerprints'; +const resource_url = id => `/configuration/fingerbank/local/dhcpv6_fingerprint/${id}`; +const fixture = 'collections/fingerbank/dhcpv6Fingerprint.json'; + +module.exports = { + id: 'fingerbankDhcpv6Fingerprints', + description: 'Fingerbank DHCPv6 Fingerprints', + tests: [ + { + description: 'Fingerbank DHCPv6 Fingerprints - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New DHCPv6 Fingerprint)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/dhcp6_fingerprints', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank DHCPv6 Fingerprints - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/dhcp6_fingerprint/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank DHCPv6 Fingerprints - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/dhcp6_fingerprint/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js new file mode 100644 index 000000000000..1c394c63ad71 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankMacVendors.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/mac_vendors'; +const resource_url = id => `/configuration/fingerbank/local/mac_vendor/${id}`; +const fixture = 'collections/fingerbank/macVendor.json'; + +module.exports = { + id: 'fingerbankMacVendors', + description: 'Fingerbank MAC Vendors', + tests: [ + { + description: 'Fingerbank MAC Vendors - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New MAC Vendor)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/mac_vendors', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank MAC Vendors - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/mac_vendor/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank MAC Vendors - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/mac_vendor/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/fingerbankUserAgents.js b/t/html/pfappserver/config/collections/modules/fingerbankUserAgents.js new file mode 100644 index 000000000000..6a83d49f751f --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/fingerbankUserAgents.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const collection_url = 'configuration/fingerbank/user_agents'; +const resource_url = id => `/configuration/fingerbank/local/user_agent/${id}`; +const fixture = 'collections/fingerbank/userAgent.json'; + +module.exports = { + id: 'fingerbankUserAgents', + description: 'Fingerbank User Agents', + tests: [ + { + description: 'Fingerbank User Agents - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New User Agent)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/fingerbank/local/user_agents', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + return response.body // push `id` to fixture + } + } + ] + }, + { + description: 'Fingerbank User Agents - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/fingerbank/local/user_agent/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Fingerbank User Agents - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/fingerbank/local/user_agent/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/firewalls.js b/t/html/pfappserver/config/collections/modules/firewalls.js new file mode 100644 index 000000000000..2fd9f90cfdb2 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/firewalls.js @@ -0,0 +1,90 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + BarracudaNG: 'BarracudaNG', + Checkpoint: 'Checkpoint', + ContentKeeper: 'ContentKeeper', + CiscoIsePic: 'Cisco ISE-PIC', + FamilyZone: 'FamilyZone', + FortiGate: 'FortiGate', + Iboss: 'Iboss', + JSONRPC: 'JSONRPC', + JuniperSRX: 'JuniperSRX', + LightSpeedRocket: 'LightSpeedRocket', + PaloAlto: 'PaloAlto', + SmoothWall: 'SmoothWall', + WatchGuard: 'WatchGuard' +}; + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/firewalls'; + const resource_url = (id) => `/configuration/firewall/${id}`; + const fixture = `collections/firewall/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Firewalls (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Firewall)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/firewalls', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Firewalls (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/firewall/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Firewalls (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/firewall/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'firewalls', + description: 'Firewalls', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/floatingDevices.js b/t/html/pfappserver/config/collections/modules/floatingDevices.js new file mode 100644 index 000000000000..b8fc4f829b3b --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/floatingDevices.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/floating_devices'; +const resource_url = id => `/configuration/floating_device/${id}`; +const fixture = 'collections/floatingDevice.json'; + +module.exports = { + id: 'floatingDevices', + description: 'Floating Devices', + tests: [ + { + description: 'Floating Devices - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Floating Device)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/floating_devices', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Floating Devices - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/floating_device/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Floating Devices - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/floating_device/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/maintenanceTasks.js b/t/html/pfappserver/config/collections/modules/maintenanceTasks.js new file mode 100644 index 000000000000..4fffc657ceda --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/maintenanceTasks.js @@ -0,0 +1,33 @@ +const { SCOPE_UPDATE } = require('../config'); +const maintenanceTasks = require('../../../cypress/fixtures/runtime/maintenanceTasks.json'); +const collection_url = '/configuration/maintenance_tasks'; +const resource_url = id => `/configuration/maintenance_task/${id}`; + +module.exports = { + id: 'maintenaceTasks', + description: 'Maintenance Tasks', + tests: maintenanceTasks.map(id => { + const fixture = require(`../../../cypress/fixtures/runtime/maintenanceTask-${id}.json`) + return { + description: `Maintenance Task (${id}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture: `/runtime/maintenanceTask-${id}.json`, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/maintenance_task/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + }) +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/mfas.js b/t/html/pfappserver/config/collections/modules/mfas.js new file mode 100644 index 000000000000..aef158f59644 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/mfas.js @@ -0,0 +1,79 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + Akamai: 'Akamai', + TOTP: 'TOTP' +} + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/mfas'; + const resource_url = (id) => `/configuration/mfa/${id}`; + const fixture = `collections/mfa/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `MFAs (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New MFA)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/mfas', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `MFAs (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/mfa/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `MFAs (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/mfa/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'mfas', + description: 'MFAs', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/networkBehaviorPolicies.js b/t/html/pfappserver/config/collections/modules/networkBehaviorPolicies.js new file mode 100644 index 000000000000..545b3929d67c --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/networkBehaviorPolicies.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/fingerbank/network_behavior_policies'; +const resource_url = id => `/configuration/network_behavior_policy/${id}`; +const fixture = 'collections/networkBehaviorPolicy.json'; + +module.exports = { + id: 'networkBehaviorPolicies', + description: 'Network Behavior Policies', + tests: [ + { + description: 'Network Behavior Policies - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Network Behaviour Policy)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/network_behavior_policies', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Network Behavior Policies - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/network_behavior_policy/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Network Behavior Policies - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/network_behavior_policy/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/pkiCas.js b/t/html/pfappserver/config/collections/modules/pkiCas.js new file mode 100644 index 000000000000..207b54b0a684 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/pkiCas.js @@ -0,0 +1,80 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const countries = require('../../../config/global/countries'); +const { digests, keyTypes } = require('../../../config/global/pki'); + +const collection_url = 'configuration/pki/cas'; +const resource_url = id => `/configuration/pki/ca/${id}`; +const fixture = 'collections/pki/ca.json'; + +const map = (value, namespace = '') => { + if (namespace === 'country') { // remap country + return countries.default[value] + } + if (namespace === 'digest') { // remap digest + return digests[value] + } + if (namespace === 'key_type') { // remap key_type + return keyTypes[value] + } + return value +} + +module.exports = { + id: 'pkiCas', + description: 'PKI Certificate Authorities', + tests: [ + { + description: 'PKI Certificate Authorities - Create New', + scope: SCOPE_INSERT, + fixture, + map, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Certificate Authority)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/pki/cas', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + const { body: { items: { 0: { ID } = {} } = {} } = {} } = response + return { ID } // push `id` to fixture + } + } + ] + }, + { + description: 'PKI Certificate Authorities - Resign Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.ID, + selectors: { + buttonDeleteSelector: 'button[type="button"]:contains(Re-Sign)', + buttonDeleteConfirmSelector: 'button[type="button"][data-confirm]:contains(Re-Sign)' + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/pki/ca/resign/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/pkiProviders.js b/t/html/pfappserver/config/collections/modules/pkiProviders.js new file mode 100644 index 000000000000..4ee7e7cd78b1 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/pkiProviders.js @@ -0,0 +1,80 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + packetfence_local: 'Packetfence Local', + packetfence_pki: 'Packetfence PKI', + scep: 'SCEP PKI' +} + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/pki_providers'; + const resource_url = (id) => `/configuration/pki_provider/${id}`; + const fixture = `collections/pkiProvider/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `PKI Providers (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New PKI Provider)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/pki_providers', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `PKI Providers (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/pki_provider/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `PKI Providers (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/pki_provider/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'pkiProviders', + description: 'PKI Providers', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/provisionings.js b/t/html/pfappserver/config/collections/modules/provisionings.js new file mode 100644 index 000000000000..323c1492686e --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/provisionings.js @@ -0,0 +1,90 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + accept: 'Accept', + airwatch: 'Airwatch', + android: 'Android', + deny: 'Deny', + dpsk: 'DPSK', + jamf: 'Jamf', + kandji: 'Kandji', + mobileconfig: 'Apple Devices', + mobileiron: 'Mobileiron', + sentinelone: 'SentinelOne', + windows: 'Windows', + intune: 'Microsoft Intune', + google_workspace_chromebook: 'Google Workspace Chromebook' +}; + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/provisionings'; + const resource_url = (id) => `/configuration/provisioning/${id}`; + const fixture = `collections/provisioning/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Provisionings (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Provisioner)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/provisionings', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Provisionings (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/provisioning/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Provisionings (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/provisioning/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'provisionings', + description: 'Provisionings', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/radiusProfiles.js b/t/html/pfappserver/config/collections/modules/radiusProfiles.js new file mode 100644 index 000000000000..af022ad4d033 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/radiusProfiles.js @@ -0,0 +1,83 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { // singular, 's' is appended for plural + eap: 'EAP Profile', + tls: 'TLS Profile', + fast: 'Fast Profile', + ocsp: 'OCSP Profile' +}; + + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = `/configuration/radius/${type}`; + const resource_url = (id) => `/configuration/radius/${type}/${id}`; + const fixture = `collections/radius/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `RADIUS Profiles (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New ${name})`], + tabSelector: false, + }, + interceptors: [ + { + method: 'POST', + url: `/api/**/config/radiusd/${type}_profiles`, + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `RADIUS Profiles (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: `/api/**/config/radiusd/${type}_profile/**`, + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `RADIUS Profiles (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: `/api/**/config/radiusd/${type}_profile/**`, expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'radiusProfiles', + description: 'RADIUS Profiles', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/radiusSslCertificates.js b/t/html/pfappserver/config/collections/modules/radiusSslCertificates.js new file mode 100644 index 000000000000..533153f7685a --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/radiusSslCertificates.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/radius/ssl'; +const resource_url = id => `/configuration/radius/ssl/${id}`; +const fixture = 'collections/radius/ssl.json'; + +module.exports = { + id: 'radiusSslCertificates', + description: 'RADIUS SSL Certificates', + tests: [ + { + description: 'RADIUS SSL Certificates - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New SSL Certificate)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/ssl_certificates', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'RADIUS SSL Certificates - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/ssl_certificate/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'RADIUS SSL Certificates - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/ssl_certificate/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/realms.js b/t/html/pfappserver/config/collections/modules/realms.js new file mode 100644 index 000000000000..3a98f157eb15 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/realms.js @@ -0,0 +1,61 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/realms'; +const resource_url = id => `/configuration/realm/${id}`; +const fixture = 'collections/realm.json'; + +module.exports = { + id: 'realms', + description: 'Realms', + tests: [ + { + description: 'Realms - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + interceptors: [ + { + method: 'POST', url: '/api/**/config/realms', expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + } + } + ] + }, + { + description: 'Realms - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/realm/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Realms - Delete Existing', + scope: SCOPE_DELETE, + url: resource_url, + fixture, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/realm/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/roles.js b/t/html/pfappserver/config/collections/modules/roles.js new file mode 100644 index 000000000000..3610adc21b6d --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/roles.js @@ -0,0 +1,61 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/roles'; +const resource_url = id => `/configuration/role/${id}`; +const fixture = 'collections/role.json'; + +module.exports = { + id: 'roles', + description: 'Roles', + tests: [ + { + description: 'Roles - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + interceptors: [ + { + method: 'POST', url: '/api/**/config/roles', expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + } + } + ] + }, + { + description: 'Roles - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/role/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Roles - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/role/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/scanEngines.js b/t/html/pfappserver/config/collections/modules/scanEngines.js new file mode 100644 index 000000000000..3de890edc7c3 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/scanEngines.js @@ -0,0 +1,81 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + nessus: 'Nessus', + nessus6: 'Nessus 6', + openvas: 'OpenVAS', + rapid7: 'Rapid7' +} + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/scan_engines'; + const resource_url = (id) => `/configuration/scan_engine/${id}`; + const fixture = `collections/scanEngine/${type}.json`; + + return [...tests, ...[ + { + description: `ScanEngines (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Scan Engine)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/scans', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `ScanEngines (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/scan/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `ScanEngines (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/scan/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'scans', + description: 'Scan Engines', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/securityEvents.js b/t/html/pfappserver/config/collections/modules/securityEvents.js new file mode 100644 index 000000000000..da4cf6b99083 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/securityEvents.js @@ -0,0 +1,73 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/security_events'; +const resource_url = id => `/configuration/security_event/${id}`; +const fixture = 'collections/securityEvent.json'; + +module.exports = { + id: 'securityEvents', + description: 'Security Events', + tests: [ + { + description: 'Security Events - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/security_events', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + const { body: { id } = {} } = response + return { id } // push `id` to fixture + } + } + ] + }, + { + description: 'Security Events - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/security_event/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Security Events - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + idFrom: (_, cache) => cache.id, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/security_event/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/selfServices.js b/t/html/pfappserver/config/collections/modules/selfServices.js new file mode 100644 index 000000000000..78e482704fcf --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/selfServices.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/self_services'; +const resource_url = id => `/configuration/self_service/${id}`; +const fixture = 'collections/selfService.json'; + +module.exports = { + id: 'selfServices', + description: 'Self Services', + tests: [ + { + description: 'Self Services - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Self Service)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/self_services', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Self Services - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/self_service/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Self Services - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/self_service/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/sources.js b/t/html/pfappserver/config/collections/modules/sources.js new file mode 100644 index 000000000000..ceec10307e6b --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/sources.js @@ -0,0 +1,128 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const typeCategories = { + INTERNAL: 'Internal', + EXTERNAL: 'External', + EXCLUSIVE: 'Exclusive', + BILLING: 'Billing' +} + +const typesByCategory = { + [typeCategories.INTERNAL]: [ + 'AD', + 'Authorization', + 'AzureAD', + 'EAPTLS', + 'EDIR', + 'Htpasswd', + 'GoogleWorkspaceLDAP', + 'HTTP', + 'Kerberos', + 'LDAP', +// 'Potd', // Issue #TODO + 'RADIUS', + 'SAML' + ], + [typeCategories.EXTERNAL]: [ + 'Clickatell', + 'Email', + 'Facebook', + 'Github', + 'Google', + 'Kickbox', + 'LinkedIn', + 'Null', + 'OpenID', + 'SMS', + 'SponsorEmail', + 'Twilio', + 'WindowsLive' + ], + [typeCategories.EXCLUSIVE]: [ + 'AdminProxy', + 'Blackhole', + 'Eduroam', + ], + [typeCategories.BILLING]: [ + 'Paypal', + 'Stripe' + ] +}; + +const types = Object.entries(typesByCategory).reduce((types, [category, categoryTypes]) => { + return [ ...types, ...categoryTypes.map(type => ({ [type]: category })) ] +}, []) + +const tests = types.reduce((tests, typeCategory) => { + const { 0: [type, category] } = Object.entries(typeCategory) + const collection_url = '/configuration/sources'; + const resource_url = (id) => `/configuration/source/${id}`; + const fixture = `collections/source/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Sources (${category}/${type}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New ${category.toLowerCase()})`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/sources', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Sources (${category}/${type}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/source/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Sources (${category}/${type}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/source/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'sources', + description: 'Sources', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/switchGroups.js b/t/html/pfappserver/config/collections/modules/switchGroups.js new file mode 100644 index 000000000000..ec8fd3c056f3 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/switchGroups.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/switch_groups'; +const resource_url = id => `/configuration/switch_group/${id}`; +const fixture = 'collections/switchGroup.json'; + +module.exports = { + id: 'switchGroups', + description: 'Switch Groups', + tests: [ + { + description: 'Switch Groups - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Switch Group)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/switch_groups', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Switch Groups - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/switch_group/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Switch Groups - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/switch_group/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/switchTemplates.js b/t/html/pfappserver/config/collections/modules/switchTemplates.js new file mode 100644 index 000000000000..9715a6e18873 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/switchTemplates.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/switch_templates'; +const resource_url = id => `/configuration/switch_template/${id}`; +const fixture = 'collections/switchTemplate.json'; + +module.exports = { + id: 'switchTemplates', + description: 'Switch Templates', + tests: [ + { + description: 'Switch Templates - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Switch Template)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/template_switches', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Switch Templates - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/template_switch/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Switch Templates - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/template_switch/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/switches.js b/t/html/pfappserver/config/collections/modules/switches.js new file mode 100644 index 000000000000..24c7f2d29987 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/switches.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = '/configuration/switches'; +const resource_url = id => `/configuration/switch/${id}`; +const fixture = 'collections/switch.json'; + +module.exports = { + id: 'switches', + description: 'Switches', + tests: [ + { + description: 'Switches - Create New', + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New)', 'ul li a[href]:contains(default)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/switches', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Switches - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/switch/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Switches - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/switch/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/syslogForwarders.js b/t/html/pfappserver/config/collections/modules/syslogForwarders.js new file mode 100644 index 000000000000..bb576d0ec57e --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/syslogForwarders.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/syslog'; +const resource_url = id => `/configuration/syslog/${id}`; +const fixture = 'collections/syslogForwarder.json'; + +module.exports = { + id: 'syslogForwarders', + description: 'Syslog Forwarders', + tests: [ + { + description: 'Syslog Forwarders - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New Syslog Entry)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/syslog_forwarders', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'Syslog Forwarders - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/syslog_forwarder/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'Syslog Forwarders - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/syslog_forwarder/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/syslogParsers.js b/t/html/pfappserver/config/collections/modules/syslogParsers.js new file mode 100644 index 000000000000..78895b08afac --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/syslogParsers.js @@ -0,0 +1,86 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); + +const types = { + dhcp: 'DHCP', + fortianalyser: 'FortiAnalyzer', + nexpose: 'Nexpose', + regex: 'Regex', + security_onion: 'Security Onion', + snort: 'Snort', + suricata: 'Suricata', + suricata_md5: 'Suricata MD5' +}; + + +const tests = Object.entries(types).reduce((tests, [type, name]) => { + const collection_url = '/configuration/pfdetect'; + const resource_url = (id) => `/configuration/pfdetect/${id}`; + const fixture = `collections/syslogParser/${type.toLowerCase()}.json`; + + return [...tests, ...[ + { + description: `Syslog Parsers (${name}) - Create New`, + scope: SCOPE_INSERT, + url: collection_url, + fixture, + selectors: { + buttonNewSelectors: [`button[type="button"]:contains(New Syslog Parser)`, `ul li a[href$="/new/${type}"]`], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/config/syslog_parsers', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: `Syslog Parsers (${name}) - Update Existing`, + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/config/syslog_parser/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: `Syslog Parsers (${name}) - Delete Existing`, + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/config/syslog_parser/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ]] +}, []) + +module.exports = { + id: 'syslogParsers', + description: 'Syslog Parsers', + tests +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/modules/wrixLocations.js b/t/html/pfappserver/config/collections/modules/wrixLocations.js new file mode 100644 index 000000000000..52c04e0da5f5 --- /dev/null +++ b/t/html/pfappserver/config/collections/modules/wrixLocations.js @@ -0,0 +1,69 @@ +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('../config'); +const collection_url = 'configuration/wrix'; +const resource_url = id => `/configuration/wrix/${id}`; +const fixture = 'collections/wrix.json'; + +module.exports = { + id: 'wrixLocations', + description: 'WRIX Locations', + tests: [ + { + description: 'WRIX Locations - Create New', + scope: SCOPE_INSERT, + fixture, + url: collection_url, + selectors: { + buttonNewSelectors: ['button[type="button"]:contains(New WRIX Location)'], + }, + interceptors: [ + { + method: 'POST', + url: '/api/**/wrix_locations', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(201) + } + } + ] + }, + { + description: 'WRIX Locations - Update Existing', + scope: SCOPE_UPDATE, + fixture, + url: resource_url, + interceptors: [ + { + method: '+(PATCH|PUT)', + url: '/api/**/wrix_location/**', + expectRequest: (request, fixture) => { + Object.keys(fixture).forEach(key => { + expect(request.body).to.have.property(key) + expect(request.body[key]).to.deep.equal(fixture[key], key) + }) + }, + expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + }, + { + description: 'WRIX Locations - Delete Existing', + scope: SCOPE_DELETE, + fixture, + url: resource_url, + interceptors: [ + { + method: 'DELETE', url: '/api/**/wrix_location/**', expectResponse: (response, fixture) => { + expect(response.statusCode).to.equal(200) + } + } + ] + } + ] +}; \ No newline at end of file diff --git a/t/html/pfappserver/config/collections/roles.js b/t/html/pfappserver/config/collections/roles.js deleted file mode 100644 index f146aefcb3e7..000000000000 --- a/t/html/pfappserver/config/collections/roles.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - id: 'roles', - name: 'Roles', - url: '/configuration/roles', -}; \ No newline at end of file diff --git a/t/html/pfappserver/config/global/countries.js b/t/html/pfappserver/config/global/countries.js new file mode 120000 index 000000000000..652913278d9f --- /dev/null +++ b/t/html/pfappserver/config/global/countries.js @@ -0,0 +1 @@ +../../../../../html/pfappserver/root/src/globals/countries.js \ No newline at end of file diff --git a/t/html/pfappserver/config/global/fingerbank.js b/t/html/pfappserver/config/global/fingerbank.js new file mode 120000 index 000000000000..12c6aaf8a0e6 --- /dev/null +++ b/t/html/pfappserver/config/global/fingerbank.js @@ -0,0 +1 @@ +../../../../../html/pfappserver/root/src/globals/fingerbank.js \ No newline at end of file diff --git a/t/html/pfappserver/config/global/index.js b/t/html/pfappserver/config/global/index.js new file mode 100644 index 000000000000..91f7ff2476b8 --- /dev/null +++ b/t/html/pfappserver/config/global/index.js @@ -0,0 +1,9 @@ +const countries = require('./countries'); +const url = '/admin#'; +const interceptorTimeoutMs = 60E3; + +module.exports = { + countries, + url, + interceptorTimeoutMs +} \ No newline at end of file diff --git a/t/html/pfappserver/config/global/pki.js b/t/html/pfappserver/config/global/pki.js new file mode 120000 index 000000000000..a8699a6f9e54 --- /dev/null +++ b/t/html/pfappserver/config/global/pki.js @@ -0,0 +1 @@ +../../../../../html/pfappserver/root/src/globals/pki.js \ No newline at end of file diff --git a/t/html/pfappserver/config/index.js b/t/html/pfappserver/config/index.js new file mode 100644 index 000000000000..219ec0416c40 --- /dev/null +++ b/t/html/pfappserver/config/index.js @@ -0,0 +1,15 @@ +const global = require('./global') +const bases = require('./bases') +const collections = require('./collections') + +const latencyInterceptor = (url = `${global.url}**`, setDelayMs = 1E3) => { + cy.intercept({ url, middleware: true, }, req => Cypress.Promise.delay(setDelayMs).then(req.reply)) +} + +module.exports = { + global, + bases, + collections, + + latencyInterceptor, +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/config/cypress.config-configuration.js b/t/html/pfappserver/cypress/config/cypress.config-configuration.js index f1d08b219c59..d692ec9f8d78 100644 --- a/t/html/pfappserver/cypress/config/cypress.config-configuration.js +++ b/t/html/pfappserver/cypress/config/cypress.config-configuration.js @@ -1,13 +1,54 @@ -const config = require('./cypress.config.js'); +const fs = require('fs-extra'); +const fetch = require('node-fetch'); +const path = require('path'); +const base = require('./cypress.config.js'); +const fixturesPath = path.join(__dirname, '../fixtures'); module.exports = { - ...config, + ...base, e2e: { - ...config.e2e, + ...base.e2e, + setupNodeEvents: (on, config) => { + on('before:run', async (details) => { + await fs.readFile('/usr/local/pf/conf/unified_api_system_pass', 'utf-8', async (err, password) => { + // login, get auth token + let request = JSON.stringify({ username: 'system', password: password.trim() }); + let response = await fetch(`${base.e2e.baseUrl}/api/v1/login`, { method: 'POST', body: request }); + let body = await response.text(); + let { token } = JSON.parse(body); + let headers = { 'Authorization': `Bearer ${token}` }; + + // get maintenance tasks, write fixtures + response = await fetch(`${base.e2e.baseUrl}/api/v1/config/maintenance_tasks?limit=1000`, { method: 'GET', headers }); + body = await response.text(); + let { items = [] } = JSON.parse(body); + await fs.writeJson(`${fixturesPath}/runtime/maintenanceTasks.json`, items.map(item => item.id), { spaces: '\t' }); + await items.forEach(async item => { + await fs.writeJson(`${fixturesPath}/runtime/maintenanceTask-${item.id}.json`, item, { spaces: '\t' }); + }) + + // get ACLs, write fixtures + response = await fetch(`${base.e2e.baseUrl}/api/v1/config/admin_roles`, { method: 'OPTIONS', headers }); + body = await response.text(); + let { meta: { actions: { item: { allowed = [] } = {} } = {} } = {} } = JSON.parse(body); + let acls = allowed.reduce((acls, { options }) => { + options.forEach(({ text, value }) => { + acls[value] = text + }) + return acls + }, {}) + await fs.writeJson(`${fixturesPath}/runtime/acls.json`, acls, { spaces: '\t' }); + }) + }); + return base.e2e.setupNodeEvents(on, config); + }, + + defaultCommandTimeout: 60E3, + requestTimeout: 60E3, specPattern: [ 'cypress/specs/e2e/*-configuration/**/*.cy.{js,jsx,ts,tsx}', ], - } + }, }; diff --git a/t/html/pfappserver/cypress/config/cypress.config.js b/t/html/pfappserver/cypress/config/cypress.config.js index 9b34a3665ac9..eccc797c306b 100644 --- a/t/html/pfappserver/cypress/config/cypress.config.js +++ b/t/html/pfappserver/cypress/config/cypress.config.js @@ -4,6 +4,12 @@ const webpackOptions = { watchOptions: {} } +require('dotenv').config() + +// screenshot and video resolution +const width = 3840 // 4k +const height = 2160 // 4k + // see https://docs.cypress.io/guides/references/configuration#Global module.exports = { @@ -18,22 +24,42 @@ module.exports = { on('before:browser:launch', (browser = {}, launchOptions) => { switch (browser.name) { case 'chrome': + case 'chrome:canary': + case 'chromium': launchOptions.args.push('--disable-gpu'); // headless + launchOptions.args.push(`--window-size=${width},${height}`) + launchOptions.args.push('--force-device-scale-factor=1') + break; + case 'electron': + launchOptions.preferences.width = width + launchOptions.preferences.height = height break; case 'firefox': launchOptions.args.push('-headless'); // headless + launchOptions.args.push(`--width=${width}`) + launchOptions.args.push(`--height=${height}`) break; } return launchOptions; }); on('task', { log(message) { - console.log(message) + console.log(`\t => ${message}`) + return null + } + }); + on('task', { + error(message) { + console.error(`\t => ${message}`) return null } - }) + }); return config; }, + env: { + PARALLEL: +process.env.PARALLEL || 1, + SLICE: +process.env.SLICE || 0, + }, specPattern: [ 'cypress/specs/e2e/*.cy.{js,jsx,ts,tsx}', ], @@ -43,13 +69,10 @@ module.exports = { screenshotsFolder: 'cypress/results/screenshots', video: false, videosFolder: 'cypress/results/videos', - viewportWidth: 1280, - viewportHeight: 1024, + viewportWidth: width, + viewportHeight: height, // The number of tests for which snapshots and command data are kept in memory (default: 50). // Reduce this number if you are experiencing high memory consumption in your browser during a test run. numTestsKeptInMemory: 1, - - // Enables support for improved memory management within Chromium-based browsers. - experimentalMemoryManagement: true, }; diff --git a/t/html/pfappserver/cypress/fixtures/collections/adminRole.json b/t/html/pfappserver/cypress/fixtures/collections/adminRole.json new file mode 100644 index 000000000000..26dbb5c351ec --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/adminRole.json @@ -0,0 +1,10 @@ +{ + "id": "test", + "description": "test", + "actions": [ + "NODES_READ", + "NODES_CREATE", + "NODES_UPDATE", + "NODES_DELETE" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/billingTier.json b/t/html/pfappserver/cypress/fixtures/collections/billingTier.json new file mode 100644 index 000000000000..16ee0cdcbc17 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/billingTier.json @@ -0,0 +1,11 @@ +{ + "id": "test", + "name": "test", + "description": "test", + "price": "13.37", + "role": "guest", + "access_duration": { + "interval": "1", + "unit": "D" + } +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/cloud/intune.json b/t/html/pfappserver/cypress/fixtures/collections/cloud/intune.json new file mode 100644 index 000000000000..42571dd3ef37 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/cloud/intune.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "tenant_id": "foo", + "client_id": "bar", + "client_secret": "baz" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/connectionProfile.json b/t/html/pfappserver/cypress/fixtures/collections/connectionProfile.json new file mode 100644 index 000000000000..2125bcc645e0 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/connectionProfile.json @@ -0,0 +1,9 @@ +{ + "id": "test", + "filter": [ + { + "type": "port", + "match": "1337" + } + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/connector.json b/t/html/pfappserver/cypress/fixtures/collections/connector.json new file mode 100644 index 000000000000..486ae15149b8 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/connector.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "secret": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/domain.json b/t/html/pfappserver/cypress/fixtures/collections/domain.json new file mode 100644 index 000000000000..5117fe9f2ac7 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/domain.json @@ -0,0 +1,9 @@ +{ + "id": "test", + "workgroup": "test", + "dns_name": "test.local", + "ad_server": "1.2.3.4", + "ad_fqdn": "test.local", + "dns_servers": "8.8.8.8", + "machine_account_password": "foobarbaz" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/eventLogger/syslog.json b/t/html/pfappserver/cypress/fixtures/collections/eventLogger/syslog.json new file mode 100644 index 000000000000..30109fdd0ff6 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/eventLogger/syslog.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "host": "foo", + "facility": "syslog" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dhcp_filter.json b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dhcp_filter.json new file mode 100644 index 000000000000..c864fd891eaa --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dhcp_filter.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "scopes": [ + "Discover" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dns_filter.json b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dns_filter.json new file mode 100644 index 000000000000..5df64c385966 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/dns_filter.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "scopes": [ + "registration" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/filterEngine/radius_filter.json b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/radius_filter.json new file mode 100644 index 000000000000..723b2b91f49e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/radius_filter.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "scopes": [ + "returnRadiusAccessAccept" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/filterEngine/switch_filter.json b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/switch_filter.json new file mode 100644 index 000000000000..f19635f7427f --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/switch_filter.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "scopes": [ + "radius_request" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/filterEngine/vlan_filter.json b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/vlan_filter.json new file mode 100644 index 000000000000..c61c64f1a431 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/filterEngine/vlan_filter.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "scopes": [ + "RegistrationRole" + ] +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/combination.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/combination.json new file mode 100644 index 000000000000..257590f51716 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/combination.json @@ -0,0 +1,3 @@ +{ + "device_id": "33507" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/device.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/device.json new file mode 100644 index 000000000000..2f37dc5b0939 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/device.json @@ -0,0 +1,3 @@ +{ + "name": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpFingerprint.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpFingerprint.json new file mode 100644 index 000000000000..0dd12ec0f9f6 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpFingerprint.json @@ -0,0 +1,3 @@ +{ + "value": "1,2,3" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpVendor.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpVendor.json new file mode 100644 index 000000000000..a2eef532e428 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpVendor.json @@ -0,0 +1,3 @@ +{ + "value": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Enterprise.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Enterprise.json new file mode 100644 index 000000000000..a2eef532e428 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Enterprise.json @@ -0,0 +1,3 @@ +{ + "value": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Fingerprint.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Fingerprint.json new file mode 100644 index 000000000000..0dd12ec0f9f6 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/dhcpv6Fingerprint.json @@ -0,0 +1,3 @@ +{ + "value": "1,2,3" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/macVendor.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/macVendor.json new file mode 100644 index 000000000000..b7d2bea7e19e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/macVendor.json @@ -0,0 +1,4 @@ +{ + "name": "test", + "mac": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/fingerbank/userAgent.json b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/userAgent.json new file mode 100644 index 000000000000..a2eef532e428 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/fingerbank/userAgent.json @@ -0,0 +1,3 @@ +{ + "value": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/barracudang.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/barracudang.json new file mode 100644 index 000000000000..85323df3a52f --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/barracudang.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/checkpoint.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/checkpoint.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/checkpoint.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/ciscoisepic.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/ciscoisepic.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/ciscoisepic.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/contentkeeper.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/contentkeeper.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/contentkeeper.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/familyzone.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/familyzone.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/familyzone.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/fortigate.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/fortigate.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/fortigate.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/iboss.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/iboss.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/iboss.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/jsonrpc.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/jsonrpc.json new file mode 100644 index 000000000000..85323df3a52f --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/jsonrpc.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/junipersrx.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/junipersrx.json new file mode 100644 index 000000000000..85323df3a52f --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/junipersrx.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/lightspeedrocket.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/lightspeedrocket.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/lightspeedrocket.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/paloalto.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/paloalto.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/paloalto.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/smoothwall.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/smoothwall.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/smoothwall.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/firewall/watchguard.json b/t/html/pfappserver/cypress/fixtures/collections/firewall/watchguard.json new file mode 100644 index 000000000000..b853ed858384 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/firewall/watchguard.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "password": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/floatingDevice.json b/t/html/pfappserver/cypress/fixtures/collections/floatingDevice.json new file mode 100644 index 000000000000..3af397305ba4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/floatingDevice.json @@ -0,0 +1,4 @@ +{ + "id": "de:ad:b4:c0:ff:ee", + "pvid": "1337" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/mfa/akamai.json b/t/html/pfappserver/cypress/fixtures/collections/mfa/akamai.json new file mode 100644 index 000000000000..11a1a6029955 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/mfa/akamai.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "app_id": "foo", + "signing_key": "bar", + "verify_key": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/mfa/totp.json b/t/html/pfappserver/cypress/fixtures/collections/mfa/totp.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/mfa/totp.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/networkBehaviorPolicy.json b/t/html/pfappserver/cypress/fixtures/collections/networkBehaviorPolicy.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/networkBehaviorPolicy.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/pki/ca.json b/t/html/pfappserver/cypress/fixtures/collections/pki/ca.json new file mode 100644 index 000000000000..e2f9e05d4c5a --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/pki/ca.json @@ -0,0 +1,12 @@ +{ + "cn": "test", + "mail": "email@test.local", + "organisation": "test", + "country": "CA", + "state": "Quebec", + "locality": "Montreal", + "key_type": "1", + "key_size": "2048", + "digest": "4", + "days": "365" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_local.json b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_local.json new file mode 100644 index 000000000000..460cfc6773c9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_local.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "client_cert_path": "/dev/null", + "client_key_path": "/dev/null", + "ca_cert_path": "/dev/null", + "server_cert_path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_pki.json b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_pki.json new file mode 100644 index 000000000000..44d761119eaa --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/packetfence_pki.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "ca_cert_path": "/dev/null", + "server_cert_path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/scep.json b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/scep.json new file mode 100644 index 000000000000..44d761119eaa --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/pkiProvider/scep.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "ca_cert_path": "/dev/null", + "server_cert_path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/accept.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/accept.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/accept.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/airwatch.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/airwatch.json new file mode 100644 index 000000000000..6ae168e8181d --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/airwatch.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "api_username": "foo", + "api_password": "bar", + "tenant_code": "baz" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/android.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/android.json new file mode 100644 index 000000000000..a171a89f7627 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/android.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "ssid": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/deny.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/deny.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/deny.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/dpsk.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/dpsk.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/dpsk.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/google_workspace_chromebook.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/google_workspace_chromebook.json new file mode 100644 index 000000000000..1a74e5011c26 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/google_workspace_chromebook.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "user": "foobar", + "service_account": "{}" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/intune.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/intune.json new file mode 100644 index 000000000000..3d1c6a575641 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/intune.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "applicationID": "foobar", + "applicationSecret": "foobaz", + "tenantID": "farboo" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/jamf.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/jamf.json new file mode 100644 index 000000000000..03b249ef7998 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/jamf.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "api_username": "foo", + "api_password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/kandji.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/kandji.json new file mode 100644 index 000000000000..cfa39364c76a --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/kandji.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "api_token": "foobar", + "host": "test.local" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileconfig.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileconfig.json new file mode 100644 index 000000000000..a171a89f7627 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileconfig.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "ssid": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileiron.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileiron.json new file mode 100644 index 000000000000..a40ec821a74d --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/mobileiron.json @@ -0,0 +1,11 @@ +{ + "id": "test", + "username": "foo", + "password": "bar", + "host": "test.local", + "android_download_uri": "https://test.local", + "ios_download_uri": "https://test.local", + "windows_phone_download_uri": "https://test.local", + "boarding_host": "test.local", + "boarding_port": "1337" + } \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/sentinelone.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/sentinelone.json new file mode 100644 index 000000000000..8630b5d87b91 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/sentinelone.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "api_username": "foo", + "api_password": "bar", + "windows_agent_download_uri": "https://test.local", + "mac_osx_agent_download_uri": "https://test.local" + } \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/provisioning/windows.json b/t/html/pfappserver/cypress/fixtures/collections/provisioning/windows.json new file mode 100644 index 000000000000..a171a89f7627 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/provisioning/windows.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "ssid": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/radius/eap.json b/t/html/pfappserver/cypress/fixtures/collections/radius/eap.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/radius/eap.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/radius/fast.json b/t/html/pfappserver/cypress/fixtures/collections/radius/fast.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/radius/fast.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/radius/ocsp.json b/t/html/pfappserver/cypress/fixtures/collections/radius/ocsp.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/radius/ocsp.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/radius/ssl.json b/t/html/pfappserver/cypress/fixtures/collections/radius/ssl.json new file mode 100644 index 000000000000..0de45e902f60 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/radius/ssl.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "cert": "foo", + "key": "bar", + "intermediate": "baz" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/radius/tls.json b/t/html/pfappserver/cypress/fixtures/collections/radius/tls.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/radius/tls.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/realm.json b/t/html/pfappserver/cypress/fixtures/collections/realm.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/realm.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/role.json b/t/html/pfappserver/cypress/fixtures/collections/role.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/role.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus.json b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus.json new file mode 100644 index 000000000000..05bd15d511c1 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "ip": "test.local", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus6.json b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus6.json new file mode 100644 index 000000000000..05bd15d511c1 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/nessus6.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "ip": "test.local", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/scanEngine/openvas.json b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/openvas.json new file mode 100644 index 000000000000..05bd15d511c1 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/openvas.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "ip": "test.local", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/scanEngine/rapid7.json b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/rapid7.json new file mode 100644 index 000000000000..92e58b0e3bd3 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/scanEngine/rapid7.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "host": "test.local", + "username": "foo", + "password": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/securityEvent.json b/t/html/pfappserver/cypress/fixtures/collections/securityEvent.json new file mode 100644 index 000000000000..7ce6fe30f066 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/securityEvent.json @@ -0,0 +1,3 @@ +{ + "desc": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/selfService.json b/t/html/pfappserver/cypress/fixtures/collections/selfService.json new file mode 100644 index 000000000000..7f3445f98133 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/selfService.json @@ -0,0 +1,3 @@ +{ + "id": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/ad.json b/t/html/pfappserver/cypress/fixtures/collections/source/ad.json new file mode 100644 index 000000000000..3287e4cc2ed4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/ad.json @@ -0,0 +1,9 @@ +{ + "id": "test", + "description": "test", + "host": [ + "foo", + "bar" + ], + "basedn": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/adminproxy.json b/t/html/pfappserver/cypress/fixtures/collections/source/adminproxy.json new file mode 100644 index 000000000000..bba31b3f951c --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/adminproxy.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "proxy_addresses": "1.2.3.4", + "user_header": "foo", + "group_header": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/authorization.json b/t/html/pfappserver/cypress/fixtures/collections/source/authorization.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/authorization.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/azuread.json b/t/html/pfappserver/cypress/fixtures/collections/source/azuread.json new file mode 100644 index 000000000000..3365f5706d13 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/azuread.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar", + "tenant_id": "baz" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/blackhole.json b/t/html/pfappserver/cypress/fixtures/collections/source/blackhole.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/blackhole.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/clickatell.json b/t/html/pfappserver/cypress/fixtures/collections/source/clickatell.json new file mode 100644 index 000000000000..1a7e5cbc0d03 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/clickatell.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "api_key": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/eaptls.json b/t/html/pfappserver/cypress/fixtures/collections/source/eaptls.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/eaptls.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/edir.json b/t/html/pfappserver/cypress/fixtures/collections/source/edir.json new file mode 100644 index 000000000000..542a217a5a39 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/edir.json @@ -0,0 +1,10 @@ +{ + "id": "test", + "description": "test", + "host": [ + "foo", + "bar" + ], + "basedn": "baz", + "usernameattribute": "cn" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/eduroam.json b/t/html/pfappserver/cypress/fixtures/collections/source/eduroam.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/eduroam.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/email.json b/t/html/pfappserver/cypress/fixtures/collections/source/email.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/email.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/facebook.json b/t/html/pfappserver/cypress/fixtures/collections/source/facebook.json new file mode 100644 index 000000000000..b791ff83a7c4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/facebook.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/github.json b/t/html/pfappserver/cypress/fixtures/collections/source/github.json new file mode 100644 index 000000000000..b791ff83a7c4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/github.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/google.json b/t/html/pfappserver/cypress/fixtures/collections/source/google.json new file mode 100644 index 000000000000..b791ff83a7c4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/google.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json b/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json new file mode 100644 index 000000000000..c91b8d1326b7 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/googleworkspaceldap.json @@ -0,0 +1,12 @@ +{ + "id": "test", + "description": "test", + "host": [ + "foo", + "bar" + ], + "basedn": "baz", + "usernameattribute": "cn", + "client_cert_file": "/usr/local/pf/conf/ssl/server.crt", + "client_key_file": "/usr/local/pf/conf/ssl/server.key" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/htpasswd.json b/t/html/pfappserver/cypress/fixtures/collections/source/htpasswd.json new file mode 100644 index 000000000000..ad7bf744897c --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/htpasswd.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/http.json b/t/html/pfappserver/cypress/fixtures/collections/source/http.json new file mode 100644 index 000000000000..01b09c8e231d --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/http.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "authentication_url": "foo", + "authorization_url": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/kerberos.json b/t/html/pfappserver/cypress/fixtures/collections/source/kerberos.json new file mode 100644 index 000000000000..32906116968e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/kerberos.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "host": "foo", + "authenticate_realm": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/kickbox.json b/t/html/pfappserver/cypress/fixtures/collections/source/kickbox.json new file mode 100644 index 000000000000..1a7e5cbc0d03 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/kickbox.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "api_key": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/ldap.json b/t/html/pfappserver/cypress/fixtures/collections/source/ldap.json new file mode 100644 index 000000000000..542a217a5a39 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/ldap.json @@ -0,0 +1,10 @@ +{ + "id": "test", + "description": "test", + "host": [ + "foo", + "bar" + ], + "basedn": "baz", + "usernameattribute": "cn" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/linkedin.json b/t/html/pfappserver/cypress/fixtures/collections/source/linkedin.json new file mode 100644 index 000000000000..b791ff83a7c4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/linkedin.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/null.json b/t/html/pfappserver/cypress/fixtures/collections/source/null.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/null.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/openid.json b/t/html/pfappserver/cypress/fixtures/collections/source/openid.json new file mode 100644 index 000000000000..c8958c03f9e6 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/openid.json @@ -0,0 +1,11 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar", + "site": "foobar", + "authorize_path": "foobar", + "access_token_path": "foobar", + "protected_resource_url": "foobar", + "domains": "foobar.local" +} diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/paypal.json b/t/html/pfappserver/cypress/fixtures/collections/source/paypal.json new file mode 100644 index 000000000000..ef4dff4717d7 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/paypal.json @@ -0,0 +1,10 @@ +{ + "id": "test", + "description": "test", + "identity_token": "test", + "cert_id": "test", + "cert_file": "/dev/null", + "key_file": "/dev/null", + "paypal_cert_file": "/dev/null", + "email_address": "user@example.com" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/potd.json b/t/html/pfappserver/cypress/fixtures/collections/source/potd.json new file mode 100644 index 000000000000..df3b29c9e109 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/potd.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "password_email_update": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/radius.json b/t/html/pfappserver/cypress/fixtures/collections/source/radius.json new file mode 100644 index 000000000000..486ae15149b8 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/radius.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "description": "test", + "secret": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/saml.json b/t/html/pfappserver/cypress/fixtures/collections/source/saml.json new file mode 100644 index 000000000000..866b62ef3585 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/saml.json @@ -0,0 +1,12 @@ +{ + "id": "test", + "description": "test", + "sp_entity_id": "foo", + "sp_key_path": "/dev/null", + "sp_cert_path": "/dev/null", + "idp_entity_id": "bar", + "idp_metadata_path": "/dev/null", + "idp_cert_path": "/dev/null", + "idp_ca_cert_path": "/dev/null", + "authorization_source_id": "local" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/sms.json b/t/html/pfappserver/cypress/fixtures/collections/source/sms.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/sms.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/sponsoremail.json b/t/html/pfappserver/cypress/fixtures/collections/source/sponsoremail.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/sponsoremail.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/stripe.json b/t/html/pfappserver/cypress/fixtures/collections/source/stripe.json new file mode 100644 index 000000000000..93fb6c480eae --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/stripe.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "secret_key": "foo", + "publishable_key": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/twilio.json b/t/html/pfappserver/cypress/fixtures/collections/source/twilio.json new file mode 100644 index 000000000000..a012c2f29304 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/twilio.json @@ -0,0 +1,7 @@ +{ + "id": "test", + "description": "test", + "account_sid": "foo", + "auth_token": "bar", + "twilio_phone_number": "(555) 555-5555" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/source/windowslive.json b/t/html/pfappserver/cypress/fixtures/collections/source/windowslive.json new file mode 100644 index 000000000000..b791ff83a7c4 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/source/windowslive.json @@ -0,0 +1,6 @@ +{ + "id": "test", + "description": "test", + "client_id": "foo", + "client_secret": "bar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/switch.json b/t/html/pfappserver/cypress/fixtures/collections/switch.json new file mode 100644 index 000000000000..9ed1646004ca --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/switch.json @@ -0,0 +1,4 @@ +{ + "id": "1.2.3.4", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/switchGroup.json b/t/html/pfappserver/cypress/fixtures/collections/switchGroup.json new file mode 100644 index 000000000000..9ed1646004ca --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/switchGroup.json @@ -0,0 +1,4 @@ +{ + "id": "1.2.3.4", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/switchTemplate.json b/t/html/pfappserver/cypress/fixtures/collections/switchTemplate.json new file mode 100644 index 000000000000..29ac6101f3b9 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/switchTemplate.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "description": "test" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogForwarder.json b/t/html/pfappserver/cypress/fixtures/collections/syslogForwarder.json new file mode 100644 index 000000000000..97c5ab15dcbe --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogForwarder.json @@ -0,0 +1,5 @@ +{ + "id": "test", + "proto": "tcp", + "host": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/dhcp.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/dhcp.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/dhcp.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/fortianalyser.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/fortianalyser.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/fortianalyser.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/nexpose.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/nexpose.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/nexpose.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/regex.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/regex.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/regex.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/security_onion.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/security_onion.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/security_onion.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/snort.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/snort.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/snort.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata_md5.json b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata_md5.json new file mode 100644 index 000000000000..2788fdd8215e --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/syslogParser/suricata_md5.json @@ -0,0 +1,4 @@ +{ + "id": "test", + "path": "/dev/null" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/collections/wrix.json b/t/html/pfappserver/cypress/fixtures/collections/wrix.json new file mode 100644 index 000000000000..c2bfa08eadea --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/collections/wrix.json @@ -0,0 +1,15 @@ +{ + "id": "test", + "Provider_Identifier": "foobar", + "Location_Identifier": "foobar", + "Service_Provider_Brand": "foobar", + "Location_Type": "foobar", + "Sub_Location_Type": "foobar", + "English_Location_Name": "foobar", + "Location_Address1": "foobar", + "English_Location_City": "foobar", + "Location_Zip_Postal_Code": "foobar", + "Location_State_Province_Name": "foobar", + "Location_Country_Name": "foobar", + "Location_Phone_Number": "foobar" +} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/configurator.js b/t/html/pfappserver/cypress/fixtures/configurator.js index 9fdf85d3c6b8..12782e775a1c 100644 --- a/t/html/pfappserver/cypress/fixtures/configurator.js +++ b/t/html/pfappserver/cypress/fixtures/configurator.js @@ -8,4 +8,4 @@ fingerbank: { 'upstream.api_key': null } -} \ No newline at end of file +} diff --git a/t/html/pfappserver/cypress/fixtures/empty.json b/t/html/pfappserver/cypress/fixtures/empty.json new file mode 100644 index 000000000000..9e26dfeeb6e6 --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/empty.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/t/html/pfappserver/cypress/fixtures/runtime/.gitignore b/t/html/pfappserver/cypress/fixtures/runtime/.gitignore new file mode 100644 index 000000000000..c96a04f008ee --- /dev/null +++ b/t/html/pfappserver/cypress/fixtures/runtime/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/00-configurator/01-configurator.cy.js b/t/html/pfappserver/cypress/specs/e2e/00-configurator/01-configurator.cy.js index f2096ec2b793..42aac14c1e69 100644 --- a/t/html/pfappserver/cypress/specs/e2e/00-configurator/01-configurator.cy.js +++ b/t/html/pfappserver/cypress/specs/e2e/00-configurator/01-configurator.cy.js @@ -95,7 +95,7 @@ describe('Configurator', () => { // wait for form, then fill it out cy.get('.base-form').then(() => { cy.fixture('configurator').then(configurator => { - cy.formFillNamespace('.base-form', configurator.network) + cy.formFillNamespace(configurator.network, '.base-form') }) }) @@ -137,7 +137,7 @@ describe('Configurator', () => { // fill administrator form cy.fixture('configurator').then(configurator => { - cy.formFillNamespace('*[data-form="administrator"]', configurator.administrator) + cy.formFillNamespace(configurator.administrator, '*[data-form="administrator"]') }) // next button enabled @@ -164,7 +164,7 @@ describe('Configurator', () => { // wait for form, then fill it out cy.get('.base-form').then(() => { cy.fixture('configurator').then(configurator => { - cy.formFillNamespace('.base-form', configurator.fingerbank) + cy.formFillNamespace(configurator.fingerbank, '.base-form') // verify fingerbank upstream api_key if (configurator.fingerbank['upstream.api_key']) { cy.get('button[type="button"]:contains(Verify)').click() diff --git a/t/html/pfappserver/cypress/specs/e2e/10-configuration/10-bases.cy.js b/t/html/pfappserver/cypress/specs/e2e/10-configuration/10-bases.cy.js new file mode 100644 index 000000000000..293e0402f9dc --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/10-configuration/10-bases.cy.js @@ -0,0 +1,72 @@ +/// + +const { global, bases } = require('config'); + +const PARALLEL = Cypress.env('PARALLEL') +const SLICE = Cypress.env('SLICE') + +describe('Bases', () => { + Object.values(bases).forEach((base, b) => { + context(`Base - ${base.description}`, () => { + beforeEach('Login as system', () => { + cy.session('system', () => { + cy.pfSystemLogin() + }) + }) + base.tests.forEach(test => { + const { description, url, interceptors = [], selectors } = test + const { + buttonSelector = 'button[type="submit"]' + } = selectors || [] + + const unit = () => { + + // storage from getter (fixture) to setter (expect) + let cache = {} + + // setup API interceptors + interceptors.forEach((interceptor, i) => { + const { method, url, expect, timeout = 3E3 } = interceptor + cy.intercept({ method, url }, (req) => { + if (expect) { + req.destroy() // block + cy.window().then(() => { + expect(req, cache) // expect + }) + } + else { + req.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + // load page + cy.visit(`${global.url}${url}`) + + interceptors.forEach(async (interceptor, i) => { + const { url, fixture, timeout = 10E3 } = interceptor + if (fixture) { + await cy.wait(`@interceptor${i}`, { timeout }) + .then(interception => { + const response = interception.response + cache = fixture(response) || response + }) + } + }) + + // click button + cy.get(buttonSelector).first().as('button') + cy.get('@button') + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click() + } + if (PARALLEL > 1 && ((b % PARALLEL) !== SLICE)) { + // parallel processing, skip slice + return it.skip(`[${b % PARALLEL}/${PARALLEL}: skip] ${description}`, unit) + } + it(`[${b % PARALLEL}/${PARALLEL}: run] ${description}`, unit) + }) + }) + }) +}); \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/10-configuration/20-collections.cy.js b/t/html/pfappserver/cypress/specs/e2e/10-configuration/20-collections.cy.js new file mode 100644 index 000000000000..e1ce53736334 --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/10-configuration/20-collections.cy.js @@ -0,0 +1,261 @@ +/// +const { global, collections } = require('config'); +const { flatten } = require('utils') +const { SCOPE_INSERT, SCOPE_UPDATE, SCOPE_DELETE } = require('config/collections/config'); + +const PARALLEL = Cypress.env('PARALLEL') +const SLICE = Cypress.env('SLICE') + +describe('Collections', () => { + Object.values(collections).forEach((collection, c) => { + context(`Collection - ${collection.description}`, () => { + beforeEach('Login as system', () => { + cy.session('system', () => { + cy.pfSystemLogin() + }) + }) + let cache = {}; + collection.tests.forEach(test => { + const { description, fixture = 'empty.json', flatten: flattenFixture, scope, url, interceptors = [], selectors, + timeout = 15E3, + idFrom = ({ id }) => id, + beforeFormFill, + map = (v) => v, + } = test + const { + containerSelector = 'div[data-router-view] > div > div.card', + buttonNewSelectors = ['button[type="button"]:contains(New)'], + buttonCreateSelector = 'button[type="submit"]:contains(Create)', + buttonDeleteSelector = 'button[type="button"]:contains(Delete)', + buttonDeleteConfirmSelector = 'button[type="button"][data-confirm]:contains(Delete)', + buttonSaveSelector = 'button[type="submit"]:contains(Save)', + tabSelector = 'div.tabs a[role="tab"]:is(:visible)', + } = selectors || {}; + const selectorOptions = { timeout } + + const unit = () => { + cy.fixture(fixture).then((data) => { + const associative = (flattenFixture) ? flatten(data): data + const form = Object.entries(associative).reduce((items, [k, v]) => { + return { ...items, [k]: map(v, k) } + }, {}) + const resourceId = idFrom(data, cache) // `id` may only be available post-create + const resourceUrl = (url.constructor == Function) ? url(resourceId) : url + + switch (scope) { + + + /** + * SCOPE_INSERT + */ + case SCOPE_INSERT: + cy.visit(`${global.url}${url}`) + + // click "New" button(s) + buttonNewSelectors.forEach((buttonNewSelector, n) => { + cy.get(buttonNewSelector, selectorOptions).first().as(`buttonNew${n}`) + cy.get(`@buttonNew${n}`, selectorOptions) + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true, force: true }) + }) + + // expect new url + cy.url().should('not.equal', url) + + // setup API interceptors + interceptors.forEach((interceptor, i) => { + const { method, url, expectRequest, timeout = global.interceptorTimeoutMs, block } = interceptor + cy.intercept({ method, url }, (request) => { + if (expectRequest) { + let retVal = expectRequest(request, data, cache) // expect + request = retVal || request + } + if (block) { + request.destroy() // block + } + else { + request.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') + + cy.get(containerSelector, selectorOptions).within($body => { // DOM ready + + // iterate tabs (optional) + if ($body.find(tabSelector).length) { + cy.get(tabSelector, selectorOptions).should("have.length.gte", 0).then((tab, n) => { + // click tab + cy.get(tab, selectorOptions) + .click({ log: true }) + .invoke('attr', 'aria-selected').should('eq', 'true') + + cy.get(`div[role="tabpanel"]:nth-child(${n + 1})`, selectorOptions).as(`tab${n}`) + cy.get(`@tab${n}`, selectorOptions) + .invoke('attr', 'aria-hidden').should('eq', 'false') + + // before form fill + if (beforeFormFill) { + beforeFormFill(`@tab${n}`, selectorOptions) + } + + // fill form + cy.formFillNamespace(form, `@tab${n}`) + }) + + // click first tab + cy.get(tabSelector, selectorOptions).first() + .click({ log: true }) + .invoke('attr', 'aria-selected').should('eq', 'true') + } + else { + // before form fill + if (beforeFormFill) { + beforeFormFill($body, selectorOptions) + } + + // fill form + cy.formFillNamespace(form, $body) + } + }) + + // click "Create" button + cy.get(buttonCreateSelector, selectorOptions).first().as('buttonCreate') + cy.get('@buttonCreate', selectorOptions) + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + // wait, expect response + interceptors.forEach(async (interceptor, i) => { + const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor + await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { + if (expectResponse) { + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } + } + }) + }) + break; + + + /** + * SCOPE_UPDATE + */ + case SCOPE_UPDATE: + + // setup API interceptors + interceptors.forEach((interceptor, i) => { + const { method, url, expectRequest, timeout = global.interceptorTimeoutMs, block } = interceptor + cy.intercept({ method, url }, (request) => { + if (expectRequest) { + let retVal = expectRequest(request, data, cache) // expect + request = retVal || request + } + if (block) { + request.destroy() // block + } + else { + request.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + cy.visit(`${global.url}${resourceUrl}`) + + cy.get(containerSelector, selectorOptions).then($body => { // DOM ready + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') + + // click "Save" button + cy.get(buttonSaveSelector, selectorOptions).first().as('buttonSave') + cy.get('@buttonSave', selectorOptions) + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + // wait, expect response + interceptors.forEach(async (interceptor, i) => { + const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor + await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { + if (expectResponse) { + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } + } + }) + }) + }) + break; + + + /** + * SCOPE_DELETE + */ + case SCOPE_DELETE: + // setup API interceptors + interceptors.forEach((interceptor, i) => { + const { method, url, timeout = global.interceptorTimeoutMs, block } = interceptor + cy.intercept({ method, url }, (request) => { + if (block) { + request.destroy() // block + } + else { + request.continue() // passthrough + } + }).as(`interceptor${i}`) + }) + + cy.visit(`${global.url}${resourceUrl}`) + + cy.get(containerSelector, selectorOptions).then($body => { // DOM ready + // wait for progress + cy.get('div.progress[style*="display: none"]', selectorOptions).should('exist') + + // click "Delete" button + cy.get(buttonDeleteSelector, selectorOptions).first().as('buttonDelete') + cy.get('@buttonDelete', selectorOptions) + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + .click({ log: true }) + + // click "Delete" button again (confirm) + cy.get(buttonDeleteConfirmSelector, selectorOptions).first().as('buttonDeleteConfirm') + cy.get('@buttonDeleteConfirm', selectorOptions) + .click({ log: true }) + + // wait, expect response + interceptors.forEach(async (interceptor, i) => { + const { url, expectResponse, timeout = global.interceptorTimeoutMs } = interceptor + await cy.wait(`@interceptor${i}`, { timeout }).then(({ request, response }) => { + if (expectResponse) { + let retVal = expectResponse(response, data, cache) + if (retVal) { + cache = { ...cache, ...retVal } + } + } + }) + }) + }) + break; + + default: + cy.task('error', `Unhandled scope '${scope || 'unknown'}'`) + } + }) + } + if (PARALLEL > 1 && ((c % PARALLEL) !== SLICE)) { + // parallel processing, skip slice + return it.skip(`[${c % PARALLEL}/${PARALLEL}: skip] ${description}`, unit) + } + it(`[${c % PARALLEL}/${PARALLEL}: run] ${description}`, unit) + }) + }) + }) +}) \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/90-configuration/40-policies-and-access-control/01-roles.cy.js b/t/html/pfappserver/cypress/specs/e2e/90-configuration/40-policies-and-access-control/01-roles.cy.js new file mode 100644 index 000000000000..0f018c464bc5 --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/90-configuration/40-policies-and-access-control/01-roles.cy.js @@ -0,0 +1,25 @@ +/// + +describe('Roles', () => { + + context('Roles List', () => { + + before('Login as system', () => { + cy.pfConfiguratorDisable() + cy.pfSystemLogin() + }) + + beforeEach('Load URI', () => { + cy.visit('/admin#/configuration/roles') + }) + + it('assert add new button exists', () => { + cy.get('form button[type="submit"]').first().as('btnSubmit') + cy.get('@btnSubmit') + .should('have.class', 'disabled') + .and('have.disabled', 'disabled') + }) + + }) + +}) \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/90-extras/01-login.cy.js b/t/html/pfappserver/cypress/specs/e2e/90-extras/01-login.cy.js new file mode 100644 index 000000000000..418b68ac34b9 --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/90-extras/01-login.cy.js @@ -0,0 +1,41 @@ +/// + +context('Login', () => { + + before(() => { + cy.pfConfiguratorDisable() + }) + + beforeEach(() => { + cy.visit('/') + }) + + it('assert login button is disabled when form is empty', () => { + cy.get('form button[type="submit"]').first().as('btnSubmit') + cy.get('@btnSubmit') + .should('have.class', 'disabled') + .and('have.disabled', 'disabled') + }) + + it('assert login button is enabled when form is filled', () => { + cy.get('form input#username').first().as('inputUsername') + cy.get('form input#password').first().as('inputPassword') + cy.get('form button[type="submit"]').first().as('btnSubmit') + cy.get('@inputUsername').type('foo') + cy.get('@inputPassword').type('bar') + cy.get('@btnSubmit') + .should('not.have.class', 'disabled') + .and('not.have.disabled', 'disabled') + }) + + it('assert invalid login shows an alert', () => { + cy.get('form input#username').first().as('inputUsername') + cy.get('form input#password').first().as('inputPassword') + cy.get('form button[type="submit"]').first().as('btnSubmit') + cy.get('@inputUsername').type('foo') + cy.get('@inputPassword').type('bar') + cy.get('@btnSubmit').click() + cy.get('form div[role="alert"]').first().should('contain', `Wasn't able to authenticate those credentials`) + }) + +}) \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/90-extras/02-locale.cy.js b/t/html/pfappserver/cypress/specs/e2e/90-extras/02-locale.cy.js new file mode 100644 index 000000000000..296da0050143 --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/90-extras/02-locale.cy.js @@ -0,0 +1,14 @@ +/// + +context('Locale', () => { + + before(() => { + cy.pfConfiguratorDisable() + cy.pfSystemLogin() + }) + + beforeEach(() => { + cy.visit('/admin') + }) + +}) \ No newline at end of file diff --git a/t/html/pfappserver/cypress/specs/e2e/90-extras/40-policies-and-access-control/01-roles.cy.js b/t/html/pfappserver/cypress/specs/e2e/90-extras/40-policies-and-access-control/01-roles.cy.js new file mode 100644 index 000000000000..0f018c464bc5 --- /dev/null +++ b/t/html/pfappserver/cypress/specs/e2e/90-extras/40-policies-and-access-control/01-roles.cy.js @@ -0,0 +1,25 @@ +/// + +describe('Roles', () => { + + context('Roles List', () => { + + before('Login as system', () => { + cy.pfConfiguratorDisable() + cy.pfSystemLogin() + }) + + beforeEach('Load URI', () => { + cy.visit('/admin#/configuration/roles') + }) + + it('assert add new button exists', () => { + cy.get('form button[type="submit"]').first().as('btnSubmit') + cy.get('@btnSubmit') + .should('have.class', 'disabled') + .and('have.disabled', 'disabled') + }) + + }) + +}) \ No newline at end of file diff --git a/t/html/pfappserver/cypress/support/commands.js b/t/html/pfappserver/cypress/support/commands.js index 6b822ba337fb..96f87b120c4f 100644 --- a/t/html/pfappserver/cypress/support/commands.js +++ b/t/html/pfappserver/cypress/support/commands.js @@ -54,20 +54,47 @@ Cypress.Commands.add('pfConfiguratorDisable', () => { }) }) -Cypress.Commands.add('formFillNamespace', (selector, data) => { - cy.get(selector).then($ => { - for (let entry of Object.entries(data)) { - const [namespace, value] = entry - cy.get(`${selector} *[data-namespace="${namespace}"]:not([disabled])`).first().then(el => { - const tagName = Cypress.$(el)[0].tagName.toLowerCase() - switch (tagName) { - case "input": - cy.get(el).type(`{selectAll}{del}${value}`) - break - default: - throw new Error(`unhandled form tagName "${tagName}"`) - } - }) - } +Cypress.Commands.add('formFillNamespace', (data, selector = 'body') => { + return cy.get(selector) + .should('exist') + .each(() => { + const list = Object.keys(data).map(key => `*[data-namespace="${key}"]`).join(','); + return cy.get(list) + .should("have.length.gte", 0) + .each(element => { +// if (element.is(':visible')) { + const namespace = element.attr('data-namespace') + const chosen = element.attr('data-chosen') + if (namespace in data && data[namespace]) { + const value = data[namespace] + const type = element.attr('type') + const e = Cypress.$(element)[0] + const tagName = e.tagName.toLowerCase() + switch (true) { + case tagName === 'input' && ['text', 'password', 'number'].includes(type): + case tagName === 'textarea': + cy.get(`*[data-namespace="${namespace}"]`).as(namespace) + cy.get(`@${namespace}`) + .clear({ log: true, force: true }) + .type(value, { log: true, force: true }) + break + case tagName === 'input' && ['range'].includes(type): + // TODO + break + case tagName === 'div' && !!chosen: + cy.get(`*[data-namespace="${namespace}"]`).within(() => { + const values = ((Array.isArray(value)) ? value : [value]).reduce((values, _value) => `${values}${_value}{selectAll}{enter}`, '') + cy.get('input.multiselect__input').as(namespace) + cy.get(`@${namespace}`) + .clear({ log: true, force: true }) + .type(values, { log: true, force: true }) + }) + break + default: + throw new Error(`unhandled element <${tagName} type="${type || ''}" data-chosen="${chosen}" data-namespace="${namespace}" />`) + } + } +// } + }) }) }) diff --git a/t/html/pfappserver/package-lock.json b/t/html/pfappserver/package-lock.json index de4f85f396d9..adaaf4878ffb 100644 --- a/t/html/pfappserver/package-lock.json +++ b/t/html/pfappserver/package-lock.json @@ -1,17 +1,20 @@ { "name": "packetfence-e2e", "version": "0.99.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "packetfence-e2e", "version": "0.99.0", "dependencies": { - "@babel/core": "^7.24.3", - "@babel/preset-env": "^7.24.3", - "@cypress/webpack-preprocessor": "^5.15.3", + "@babel/core": "^7.24.5", + "@babel/preset-env": "^7.24.5", + "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "dotenv": "^16.3.1", + "fs-extra": "^11.2.0", + "node-fetch": "^2.7.0", "webpack": "^5.91.0" } }, @@ -28,11 +31,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.6.tgz", + "integrity": "sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/highlight": "^7.24.6", "picocolors": "^1.0.0" }, "engines": { @@ -40,28 +43,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.6.tgz", + "integrity": "sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.6.tgz", + "integrity": "sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helpers": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/traverse": "^7.24.6", + "@babel/types": "^7.24.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -77,11 +80,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.6.tgz", + "integrity": "sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -104,34 +107,34 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.6.tgz", + "integrity": "sha512-DitEzDfOMnd13kZnDqns1ccmftwJTS9DMkyn9pYTxulS7bZxUxpMly3Nf23QQ6NwA4UB8lAqjbqWtyvElEMAkg==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.6.tgz", + "integrity": "sha512-+wnfqc5uHiMYtvRX7qu80Toef8BXeh4HHR1SPeonGb1SKPniNEd4a/nlaJJMv/OIEYvIVavvo0yR7u10Gqz0Iw==", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.6.tgz", + "integrity": "sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -141,18 +144,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.6.tgz", + "integrity": "sha512-djsosdPJVZE6Vsw3kk7IPRWethP94WHGOhQTc67SNXE0ZzMhHgALw8iGmYS0TD1bbMM0VDROy43od7/hN6WYcA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "semver": "^6.3.1" }, "engines": { @@ -163,11 +166,11 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.6.tgz", + "integrity": "sha512-C875lFBIWWwyv6MHZUG9HmRrlTDgOsLWZfYR0nW69gaKJNe0/Mpxx5r0EID2ZdHQkdUmQo2t0uNckTL08/1BgA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.6", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -179,9 +182,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -194,68 +197,68 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.6.tgz", + "integrity": "sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.6.tgz", + "integrity": "sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.6.tgz", + "integrity": "sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.6.tgz", + "integrity": "sha512-OTsCufZTxDUsv2/eDXanw/mUZHWOxSbEmC3pP8cgjcy5rgeVPWWMStnv274DV60JtHxTk0adT0QrCzC4M9NWGg==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.6.tgz", + "integrity": "sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.6.tgz", + "integrity": "sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -265,32 +268,32 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.6.tgz", + "integrity": "sha512-3SFDJRbx7KuPRl8XDUr8O7GAEB8iGyWPjLKJh/ywP/Iy9WOmEfMrsWbaZpvBu2HSYn4KQygIsz0O7m8y10ncMA==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.6.tgz", + "integrity": "sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.6.tgz", + "integrity": "sha512-1Qursq9ArRZPAMOZf/nuzVW8HgJLkTB9y9LfP4lW2MVp4e9WkLJDovfKBxoDcCk6VuzIxyqWHyBoaCtSRP10yg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-wrap-function": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -300,13 +303,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.6.tgz", + "integrity": "sha512-mRhfPwDqDpba8o1F8ESxsEkJMQkUF8ZIWrAc0FtWhxnjfextxMWxr22RtFizxxSYLjVHDeMgVsRq8BBZR2ikJQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-member-expression-to-functions": "^7.24.6", + "@babel/helper-optimise-call-expression": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -316,94 +319,93 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.6.tgz", + "integrity": "sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.6.tgz", + "integrity": "sha512-jhbbkK3IUKc4T43WadP96a27oYti9gEf1LdyGSP2rHGH77kwLwfhO7TgwnWvxxQVmke0ImmCSS47vcuxEMGD3Q==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.6.tgz", + "integrity": "sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.6.tgz", + "integrity": "sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.6.tgz", + "integrity": "sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.6.tgz", + "integrity": "sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.6.tgz", + "integrity": "sha512-f1JLrlw/jbiNfxvdrfBgio/gRBk3yTAEJWirpAkiJG2Hb22E7cEYKHWo0dFPTv/niPovzIdPdEDetrv6tC6gPQ==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.6", + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.6.tgz", + "integrity": "sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.6.tgz", + "integrity": "sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.6", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -413,9 +415,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.6.tgz", + "integrity": "sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -424,12 +426,12 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.6.tgz", + "integrity": "sha512-bYndrJ6Ph6Ar+GaB5VAc0JPoP80bQCm4qon6JEzXfRl5QZyQ8Ur1K6k7htxWmPA5z+k7JQvaMUrtXlqclWYzKw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -439,11 +441,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.6.tgz", + "integrity": "sha512-iVuhb6poq5ikqRq2XWU6OQ+R5o9wF+r/or9CeUyovgptz0UlnK4/seOQ1Istu/XybYjAhQv1FRSSfHHufIku5Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -453,13 +455,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.6.tgz", + "integrity": "sha512-c8TER5xMDYzzFcGqOEp9l4hvB7dcbhcGjcLVwxWfe4P5DOafdwjsBJZKsmv+o3aXh7NhopvayQIovHrh2zSRUQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -469,12 +471,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.6.tgz", + "integrity": "sha512-z8zEjYmwBUHN/pCF3NuWBhHQjJCrd33qAi8MgANfMrAvn72k2cImT8VjK9LJFu4ysOLJqhfkYYb3MvwANRUNZQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -553,11 +555,11 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.6.tgz", + "integrity": "sha512-BE6o2BogJKJImTmGpkmOic4V0hlRRxVtzqxiSPa8TIFxyhi4EFjHm08nq1M4STK4RytuLMgnSz0/wfflvGFNOg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -567,11 +569,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.6.tgz", + "integrity": "sha512-D+CfsVZousPXIdudSII7RGy52+dYRtbyKAZcvtQKq/NpsivyMVduepzcLqG5pMBugtMdedxdC8Ramdpcne9ZWQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -712,11 +714,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.6.tgz", + "integrity": "sha512-jSSSDt4ZidNMggcLx8SaKsbGNEfIl0PHx/4mFEulorE7bpYLbN0d3pDW3eJ7Y5Z3yPhy3L3NaPCYyTUY7TuugQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -726,13 +728,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.6.tgz", + "integrity": "sha512-VEP2o4iR2DqQU6KPgizTW2mnMx6BG5b5O9iQdrW9HesLkv8GIA8x2daXBQxw1MrsIkFQGA/iJ204CKoQ8UcnAA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -743,13 +745,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.6.tgz", + "integrity": "sha512-NTBA2SioI3OsHeIn6sQmhvXleSl9T70YY/hostQLveWs0ic+qvbA3fa0kwAwQ0OA/XGaAerNZRQGJyRfhbJK4g==", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-remap-async-to-generator": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -759,11 +761,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.6.tgz", + "integrity": "sha512-XNW7jolYHW9CwORrZgA/97tL/k05qe/HL0z/qqJq1mdWhwwCM6D4BJBV7wAz9HgFziN5dTOG31znkVIzwxv+vw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -773,11 +775,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.6.tgz", + "integrity": "sha512-S/t1Xh4ehW7sGA7c1j/hiOBLnEYCp/c2sEG4ZkL8kI1xX9tW2pqJTCHKtdhe/jHKt8nG0pFCrDHUXd4DvjHS9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -787,12 +789,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.6.tgz", + "integrity": "sha512-j6dZ0Z2Z2slWLR3kt9aOmSIrBvnntWjMDN/TVcMPxhXMLmJVqX605CBRlcGI4b32GMbfifTEsdEjGjiE+j/c3A==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -802,12 +804,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.6.tgz", + "integrity": "sha512-1QSRfoPI9RoLRa8Mnakc6v3e0gJxiZQTYrMfLn+mD0sz5+ndSzwymp2hDcYJTyT0MOn0yuWzj8phlIvO72gTHA==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -818,17 +820,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.6.tgz", + "integrity": "sha512-+fN+NO2gh8JtRmDSOB6gaCVo36ha8kfCW1nMq2Gc0DABln0VcHN4PrALDvF5/diLzIRKptC7z/d7Lp64zk92Fg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", "globals": "^11.1.0" }, "engines": { @@ -839,12 +841,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.6.tgz", + "integrity": "sha512-cRzPobcfRP0ZtuIEkA8QzghoUpSB3X3qSH5W2+FzG+VjWbJXExtx0nbRqwumdBN1x/ot2SlTNQLfBCnPdzp6kg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/template": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -854,11 +856,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.6.tgz", + "integrity": "sha512-YLW6AE5LQpk5npNXL7i/O+U9CE4XsBCuRPgyjl1EICZYKmcitV+ayuuUGMJm2lC1WWjXYszeTnIxF/dq/GhIZQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -868,12 +870,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.6.tgz", + "integrity": "sha512-rCXPnSEKvkm/EjzOtLoGvKseK+dS4kZwx1HexO3BtRtgL0fQ34awHn34aeSHuXtZY2F8a1X8xqBBPRtOxDVmcA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -883,11 +885,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.6.tgz", + "integrity": "sha512-/8Odwp/aVkZwPFJMllSbawhDAO3UJi65foB00HYnK/uXvvCPm0TAXSByjz1mpRmp0q6oX2SIxpkUOpPFHk7FLA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -897,11 +899,11 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.6.tgz", + "integrity": "sha512-vpq8SSLRTBLOHUZHSnBqVo0AKX3PBaoPs2vVzYVWslXDTDIpwAcCDtfhUcHSQQoYoUvcFPTdC8TZYXu9ZnLT/w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -912,12 +914,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.6.tgz", + "integrity": "sha512-EemYpHtmz0lHE7hxxxYEuTYOOBZ43WkDgZ4arQ4r+VX9QHuNZC+WH3wUWmRNvR8ECpTRne29aZV6XO22qpOtdA==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -927,11 +929,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.6.tgz", + "integrity": "sha512-inXaTM1SVrIxCkIJ5gqWiozHfFMStuGbGJAxZFBoHcRRdDP0ySLb3jH6JOwmfiinPwyMZqMBX+7NBDCO4z0NSA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -942,12 +944,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.6.tgz", + "integrity": "sha512-n3Sf72TnqK4nw/jziSqEl1qaWPbCRw2CziHH+jdRYvw4J6yeCzsj4jdw8hIntOEeDGTmHVe2w4MVL44PN0GMzg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -957,13 +959,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.6.tgz", + "integrity": "sha512-sOajCu6V0P1KPljWHKiDq6ymgqB+vfo3isUS4McqW1DZtvSVU2v/wuMhmRmkg3sFoq6GMaUUf8W4WtoSLkOV/Q==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -973,11 +975,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.6.tgz", + "integrity": "sha512-Uvgd9p2gUnzYJxVdBLcU0KurF8aVhkmVyMKW4MIY1/BByvs3EBpv45q01o7pRTVmTvtQq5zDlytP3dcUgm7v9w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -988,11 +990,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.6.tgz", + "integrity": "sha512-f2wHfR2HF6yMj+y+/y07+SLqnOSwRp8KYLpQKOzS58XLVlULhXbiYcygfXQxJlMbhII9+yXDwOUFLf60/TL5tw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1002,11 +1004,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.6.tgz", + "integrity": "sha512-EKaWvnezBCMkRIHxMJSIIylzhqK09YpiJtDbr2wsXTwnO0TxyjMUkaw4RlFIZMIS0iDj0KyIg7H7XCguHu/YDA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1017,11 +1019,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.6.tgz", + "integrity": "sha512-9g8iV146szUo5GWgXpRbq/GALTnY+WnNuRTuRHWWFfWGbP9ukRL0aO/jpu9dmOPikclkxnNsjY8/gsWl6bmZJQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1031,12 +1033,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.6.tgz", + "integrity": "sha512-eAGogjZgcwqAxhyFgqghvoHRr+EYRQPFjUXrTYKBRb5qPnAVxOOglaxc4/byHqjvq/bqO2F3/CGwTHsgKJYHhQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1046,13 +1048,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.6.tgz", + "integrity": "sha512-JEV8l3MHdmmdb7S7Cmx6rbNEjRCgTQMZxllveHO0mx6uiclB0NflCawlQQ6+o5ZrwjUBYPzHm2XoK4wqGVUFuw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-simple-access": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1062,14 +1064,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.6.tgz", + "integrity": "sha512-xg1Z0J5JVYxtpX954XqaaAT6NpAY6LtZXvYFCJmGFJWwtlz2EmJoR8LycFRGNE8dBKizGWkGQZGegtkV8y8s+w==", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1079,12 +1081,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.6.tgz", + "integrity": "sha512-esRCC/KsSEUvrSjv5rFYnjZI6qv4R1e/iHQrqwbZIoRJqk7xCvEUiN7L1XrmW5QSmQe3n1XD88wbgDTWLbVSyg==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1094,12 +1096,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.6.tgz", + "integrity": "sha512-6DneiCiu91wm3YiNIGDWZsl6GfTTbspuj/toTEqLh9d4cx50UIzSdg+T96p8DuT7aJOBRhFyaE9ZvTHkXrXr6Q==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1109,11 +1111,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.6.tgz", + "integrity": "sha512-f8liz9JG2Va8A4J5ZBuaSdwfPqN6axfWRK+y66fjKYbwf9VBLuq4WxtinhJhvp1w6lamKUwLG0slK2RxqFgvHA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1123,11 +1125,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.6.tgz", + "integrity": "sha512-+QlAiZBMsBK5NqrBWFXCYeXyiU1y7BQ/OYaiPAcQJMomn5Tyg+r5WuVtyEuvTbpV7L25ZSLfE+2E9ywj4FD48A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1138,11 +1140,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.6.tgz", + "integrity": "sha512-6voawq8T25Jvvnc4/rXcWZQKKxUNZcKMS8ZNrjxQqoRFernJJKjE3s18Qo6VFaatG5aiX5JV1oPD7DbJhn0a4Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1153,14 +1155,14 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.6.tgz", + "integrity": "sha512-OKmi5wiMoRW5Smttne7BwHM8s/fb5JFs+bVGNSeHWzwZkWXWValR1M30jyXo1s/RaqgwwhEC62u4rFH/FBcBPg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1170,12 +1172,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.6.tgz", + "integrity": "sha512-N/C76ihFKlZgKfdkEYKtaRUtXZAgK7sOY4h2qrbVbVTXPrKGIi8aww5WGe/+Wmg8onn8sr2ut6FXlsbu/j6JHg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-replace-supers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1185,11 +1187,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.6.tgz", + "integrity": "sha512-L5pZ+b3O1mSzJ71HmxSCmTVd03VOT2GXOigug6vDYJzE5awLI7P1g0wFcdmGuwSDSrQ0L2rDOe/hHws8J1rv3w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1200,12 +1202,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.6.tgz", + "integrity": "sha512-cHbqF6l1QP11OkYTYQ+hhVx1E017O5ZcSPXk9oODpqhcAD1htsWG2NpHrrhthEO2qZomLK0FXS+u7NfrkF5aOQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1216,11 +1218,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.6.tgz", + "integrity": "sha512-ST7guE8vLV+vI70wmAxuZpIKzVjvFX9Qs8bl5w6tN/6gOypPWUmMQL2p7LJz5E63vEGrDhAiYetniJFyBH1RkA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1230,12 +1232,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.6.tgz", + "integrity": "sha512-T9LtDI0BgwXOzyXrvgLTT8DFjCC/XgWLjflczTLXyvxbnSR/gpv0hbmzlHE/kmh9nOvlygbamLKRo6Op4yB6aw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1245,13 +1247,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.6.tgz", + "integrity": "sha512-Qu/ypFxCY5NkAnEhCF86Mvg3NSabKsh/TPpBVswEdkGl7+FbsYHy1ziRqJpwGH4thBdQHh8zx+z7vMYmcJ7iaQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-annotate-as-pure": "^7.24.6", + "@babel/helper-create-class-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1262,11 +1264,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.6.tgz", + "integrity": "sha512-oARaglxhRsN18OYsnPTpb8TcKQWDYNsPNmTnx5++WOAsUJ0cSC/FZVlIJCKvPbU4yn/UXsS0551CFKJhN0CaMw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1276,11 +1278,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.6.tgz", + "integrity": "sha512-SMDxO95I8WXRtXhTAc8t/NFQUT7VYbIWwJCJgEli9ml4MhqUMh4S6hxgH6SmAC3eAQNWCDJFxcFeEt9w2sDdXg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.6", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1291,11 +1293,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.6.tgz", + "integrity": "sha512-DcrgFXRRlK64dGE0ZFBPD5egM2uM8mgfrvTMOSB2yKzOtjpGegVYkzh3s1zZg1bBck3nkXiaOamJUqK3Syk+4A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1305,11 +1307,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.6.tgz", + "integrity": "sha512-xnEUvHSMr9eOWS5Al2YPfc32ten7CXdH7Zwyyk7IqITg4nX61oHj+GxpNvl+y5JHjfN3KXE2IV55wAWowBYMVw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1319,12 +1321,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.6.tgz", + "integrity": "sha512-h/2j7oIUDjS+ULsIrNZ6/TKG97FgmEk1PXryk/HQq6op4XUUUwif2f69fJrzK0wza2zjCS1xhXmouACaWV5uPA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1334,11 +1336,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.6.tgz", + "integrity": "sha512-fN8OcTLfGmYv7FnDrsjodYBo1DhPL3Pze/9mIIE2MGCT1KgADYIOD7rEglpLHZj8PZlC/JFX5WcD+85FLAQusw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1348,11 +1350,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.6.tgz", + "integrity": "sha512-BJbEqJIcKwrqUP+KfUIkxz3q8VzXe2R8Wv8TaNgO1cx+nNavxn/2+H8kp9tgFSOL6wYPPEgFvU6IKS4qoGqhmg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1362,11 +1364,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.6.tgz", + "integrity": "sha512-IshCXQ+G9JIFJI7bUpxTE/oA2lgVLAIK8q1KdJNoPXOpvRaNjMySGuvLfBw/Xi2/1lLo953uE8hyYSDW3TSYig==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1376,11 +1378,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.6.tgz", + "integrity": "sha512-bKl3xxcPbkQQo5eX9LjjDpU2xYHeEeNQbOhj0iPvetSzA+Tu9q/o5lujF4Sek60CM6MgYvOS/DJuwGbiEYAnLw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1390,12 +1392,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.6.tgz", + "integrity": "sha512-8EIgImzVUxy15cZiPii9GvLZwsy7Vxc+8meSlR3cXFmBIl5W5Tn9LGBf7CDKkHj4uVfNXCJB8RsVfnmY61iedA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1405,12 +1407,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.6.tgz", + "integrity": "sha512-pssN6ExsvxaKU638qcWb81RrvvgZom3jDgU/r5xFZ7TONkZGFf4MhI2ltMb8OcQWhHyxgIavEU+hgqtbKOmsPA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1420,12 +1422,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.6.tgz", + "integrity": "sha512-quiMsb28oXWIDK0gXLALOJRXLgICLiulqdZGOaPPd0vRT7fQp74NtdADAVu+D8s00C+0Xs0MxVP0VKF/sZEUgw==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6" }, "engines": { "node": ">=6.9.0" @@ -1435,26 +1437,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.6.tgz", + "integrity": "sha512-CrxEAvN7VxfjOG8JNF2Y/eMqMJbZPZ185amwGUBp8D9USK90xQmv7dLdFSa+VbD7fdIqcy/Mfv7WtzG8+/qxKg==", + "dependencies": { + "@babel/compat-data": "^7.24.6", + "@babel/helper-compilation-targets": "^7.24.6", + "@babel/helper-plugin-utils": "^7.24.6", + "@babel/helper-validator-option": "^7.24.6", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.6", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", + "@babel/plugin-syntax-import-assertions": "^7.24.6", + "@babel/plugin-syntax-import-attributes": "^7.24.6", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1466,54 +1468,54 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.24.6", + "@babel/plugin-transform-async-generator-functions": "^7.24.6", + "@babel/plugin-transform-async-to-generator": "^7.24.6", + "@babel/plugin-transform-block-scoped-functions": "^7.24.6", + "@babel/plugin-transform-block-scoping": "^7.24.6", + "@babel/plugin-transform-class-properties": "^7.24.6", + "@babel/plugin-transform-class-static-block": "^7.24.6", + "@babel/plugin-transform-classes": "^7.24.6", + "@babel/plugin-transform-computed-properties": "^7.24.6", + "@babel/plugin-transform-destructuring": "^7.24.6", + "@babel/plugin-transform-dotall-regex": "^7.24.6", + "@babel/plugin-transform-duplicate-keys": "^7.24.6", + "@babel/plugin-transform-dynamic-import": "^7.24.6", + "@babel/plugin-transform-exponentiation-operator": "^7.24.6", + "@babel/plugin-transform-export-namespace-from": "^7.24.6", + "@babel/plugin-transform-for-of": "^7.24.6", + "@babel/plugin-transform-function-name": "^7.24.6", + "@babel/plugin-transform-json-strings": "^7.24.6", + "@babel/plugin-transform-literals": "^7.24.6", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.6", + "@babel/plugin-transform-member-expression-literals": "^7.24.6", + "@babel/plugin-transform-modules-amd": "^7.24.6", + "@babel/plugin-transform-modules-commonjs": "^7.24.6", + "@babel/plugin-transform-modules-systemjs": "^7.24.6", + "@babel/plugin-transform-modules-umd": "^7.24.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.6", + "@babel/plugin-transform-new-target": "^7.24.6", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.6", + "@babel/plugin-transform-numeric-separator": "^7.24.6", + "@babel/plugin-transform-object-rest-spread": "^7.24.6", + "@babel/plugin-transform-object-super": "^7.24.6", + "@babel/plugin-transform-optional-catch-binding": "^7.24.6", + "@babel/plugin-transform-optional-chaining": "^7.24.6", + "@babel/plugin-transform-parameters": "^7.24.6", + "@babel/plugin-transform-private-methods": "^7.24.6", + "@babel/plugin-transform-private-property-in-object": "^7.24.6", + "@babel/plugin-transform-property-literals": "^7.24.6", + "@babel/plugin-transform-regenerator": "^7.24.6", + "@babel/plugin-transform-reserved-words": "^7.24.6", + "@babel/plugin-transform-shorthand-properties": "^7.24.6", + "@babel/plugin-transform-spread": "^7.24.6", + "@babel/plugin-transform-sticky-regex": "^7.24.6", + "@babel/plugin-transform-template-literals": "^7.24.6", + "@babel/plugin-transform-typeof-symbol": "^7.24.6", + "@babel/plugin-transform-unicode-escapes": "^7.24.6", + "@babel/plugin-transform-unicode-property-regex": "^7.24.6", + "@babel/plugin-transform-unicode-regex": "^7.24.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", @@ -1547,9 +1549,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.6.tgz", + "integrity": "sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1558,31 +1560,31 @@ } }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.6.tgz", + "integrity": "sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.6.tgz", + "integrity": "sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==", + "dependencies": { + "@babel/code-frame": "^7.24.6", + "@babel/generator": "^7.24.6", + "@babel/helper-environment-visitor": "^7.24.6", + "@babel/helper-function-name": "^7.24.6", + "@babel/helper-hoist-variables": "^7.24.6", + "@babel/helper-split-export-declaration": "^7.24.6", + "@babel/parser": "^7.24.6", + "@babel/types": "^7.24.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1591,12 +1593,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.6.tgz", + "integrity": "sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.6", + "@babel/helper-validator-identifier": "^7.24.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1604,23 +1606,18 @@ } }, "node_modules/@cypress/webpack-preprocessor": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.15.4.tgz", - "integrity": "sha512-spqrTlso5AC4tGET/bsgpC5aUiyZkPVi+aZnmg0xEvTdD/5QXRe3Tyh8t92en6rcJVzlc4PqLkZqDZEYySYyZQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.1.tgz", + "integrity": "sha512-WVNeFVSnFKxE3WZNRIriduTgqJRpevaiJIPlfqYTTzfXRD7X1Pv4woDE+G4caPV9bJqVKmVFiwzrXMRNeJxpxA==", "dependencies": { "bluebird": "3.7.1", - "debug": "^4.3.2", - "fs-extra": "^10.1.0", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "md5": "2.3.0", - "source-map": "^0.6.1", - "webpack-virtual-modules": "^0.4.4" + "debug": "^4.3.4", + "lodash": "^4.17.20" }, "peerDependencies": { "@babel/core": "^7.0.1", "@babel/preset-env": "^7.0.0", - "babel-loader": "^8.0.2", + "babel-loader": "^8.3 || ^9", "webpack": "^4 || ^5" } }, @@ -1954,12 +1951,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -1979,24 +1976,16 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, "node_modules/bluebird": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", @@ -2039,9 +2028,9 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==", + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", "funding": [ { "type": "opencollective", @@ -2070,14 +2059,6 @@ "node": ">=4" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" - } - }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -2115,9 +2096,9 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dependencies": { "browserslist": "^4.23.0" }, @@ -2126,14 +2107,6 @@ "url": "https://opencollective.com/core-js" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2150,19 +2123,22 @@ } } }, - "node_modules/electron-to-chromium": { - "version": "1.4.737", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz", - "integrity": "sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { - "node": ">= 4" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, + "node_modules/electron-to-chromium": { + "version": "1.4.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", + "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==" + }, "node_modules/enhanced-resolve": { "version": "5.16.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", @@ -2292,16 +2268,16 @@ } }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/function-bind": { @@ -2357,11 +2333,6 @@ "node": ">= 0.4" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/is-core-module": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", @@ -2464,19 +2435,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/locate-path": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", @@ -2509,16 +2467,6 @@ "yallist": "^3.0.2" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2553,6 +2501,25 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -2823,9 +2790,9 @@ } }, "node_modules/terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "version": "5.30.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.4.tgz", + "integrity": "sha512-xRdd0v64a8mFK9bnsKVdoNP9GQIKUAaJPTaqEQDL4w/J8WaW4sWXXoMZ+6SimPkfT5bElreXf8m9HnmPc3E1BQ==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -2925,6 +2892,11 @@ "node": ">=4" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -2967,9 +2939,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -3023,6 +2995,11 @@ "node": ">=10.13.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, "node_modules/webpack": { "version": "5.91.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", @@ -3077,11 +3054,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==" - }, "node_modules/webpack/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3127,6 +3099,15 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -3143,2191 +3124,5 @@ "url": "https://github.com/sponsors/sindresorhus" } } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "requires": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - } - }, - "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==" - }, - "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", - "requires": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "requires": { - "@babel/types": "^7.24.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", - "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==" - }, - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" - } - }, - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", - "requires": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", - "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", - "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", - "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", - "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", - "requires": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - } - }, - "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@cypress/webpack-preprocessor": { - "version": "5.15.4", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-5.15.4.tgz", - "integrity": "sha512-spqrTlso5AC4tGET/bsgpC5aUiyZkPVi+aZnmg0xEvTdD/5QXRe3Tyh8t92en6rcJVzlc4PqLkZqDZEYySYyZQ==", - "requires": { - "bluebird": "3.7.1", - "debug": "^4.3.2", - "fs-extra": "^10.1.0", - "loader-utils": "^2.0.0", - "lodash": "^4.17.20", - "md5": "2.3.0", - "source-map": "^0.6.1", - "webpack-virtual-modules": "^0.4.4" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" - }, - "@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "requires": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "requires": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - } - } - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@types/eslint": { - "version": "8.4.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.10.tgz", - "integrity": "sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "requires": { - "undici-types": "~5.26.4" - } - }, - "@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "requires": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} - }, - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "requires": { - "ajv": "^8.0.0" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", - "requires": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", - "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==" - }, - "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "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==" - }, - "caniuse-lite": { - "version": "1.0.30001610", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz", - "integrity": "sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" - }, - "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==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", - "requires": { - "browserslist": "^4.23.0" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "electron-to-chromium": { - "version": "1.4.737", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.737.tgz", - "integrity": "sha512-QvLTxaLHKdy5YxvixAw/FfHq2eWLUL9KvsPjp0aHK1gI5d3EDuDgITkvj0nFO2c6zUY3ZqVAJQiBYyQP9tQpfw==" - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==" - }, - "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "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==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "requires": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - } - }, - "find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "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==" - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "requires": { - "hasown": "^2.0.0" - } - }, - "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==", - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" - }, - "loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - }, - "locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "requires": { - "p-locate": "^6.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "requires": { - "find-up": "^6.3.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "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==" - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" - }, - "terser": { - "version": "5.30.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", - "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - } - } - }, - "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==" - }, - "webpack-virtual-modules": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", - "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" - } } } diff --git a/t/html/pfappserver/package.json b/t/html/pfappserver/package.json index fcf291419173..cac7c017a054 100644 --- a/t/html/pfappserver/package.json +++ b/t/html/pfappserver/package.json @@ -5,8 +5,11 @@ "dependencies": { "@babel/core": "^7.24.5", "@babel/preset-env": "^7.24.5", - "@cypress/webpack-preprocessor": "^5.15.3", + "@cypress/webpack-preprocessor": "^6.0.0", "babel-loader": "^9.1.3", + "dotenv": "^16.3.1", + "fs-extra": "^11.2.0", + "node-fetch": "^2.7.0", "webpack": "^5.91.0" } } diff --git a/t/html/pfappserver/utils/index.js b/t/html/pfappserver/utils/index.js new file mode 100644 index 000000000000..9afdc17de291 --- /dev/null +++ b/t/html/pfappserver/utils/index.js @@ -0,0 +1,34 @@ +const splitKeys = (o, s='.') => { + return Object.entries(o) + .reduce((types, [ns, v]) => { + const [t, k] = ns.split(s, 2) + types[t] = { ...types[t], [k]: v } + return types + }, {}) +}; + +const flatten = (data, prefix = false, result = null) => { + result = result || {}; + if (prefix && typeof data === 'object' && data !== null && Object.keys(data).length === 0) { + result[prefix] = Array.isArray(data) ? [] : {}; + return result; + } + prefix = prefix ? prefix + '.' : '' + for (const i in data) { + if (Object.prototype.hasOwnProperty.call(data, i)) { + // Only recurse on true objects and arrays, ignore custom classes like dates + if (typeof data[i] === 'object' && (Array.isArray(data[i]) || Object.prototype.toString.call(data[i]) === '[object Object]') && data[i] !== null) { + // Recursion on deeper objects + flatten(data[i], prefix + i, result) + } else { + result[prefix + i] = data[i] + } + } + } + return result +}; + +module.exports = { + splitKeys, + flatten +}; \ No newline at end of file diff --git a/t/html/pfappserver/webpack.config.js b/t/html/pfappserver/webpack.config.js index c24208487d88..b8875b28a81d 100644 --- a/t/html/pfappserver/webpack.config.js +++ b/t/html/pfappserver/webpack.config.js @@ -18,7 +18,8 @@ module.exports = { }, resolve: { modules: [ + path.resolve(__dirname, './'), path.resolve(__dirname, './cypress'), ], - } + }, }; \ No newline at end of file diff --git a/t/venom/Makefile b/t/venom/Makefile index 61b246810176..99beaeb40f26 100644 --- a/t/venom/Makefile +++ b/t/venom/Makefile @@ -232,16 +232,28 @@ inline_l2_and_radius_deb11: SCENARIOS_TO_RUN=inline_l2_and_radius \ $(MAKE_TARGET) -pfappserver_el8: +pfappserver_configurator_el8: make \ PF_VM_NAMES=pfel8$(DEV_ENV) \ - SCENARIOS_TO_RUN=pfappserver \ + SCENARIOS_TO_RUN=pfappserver_configurator \ $(MAKE_TARGET) -pfappserver_deb11: +pfappserver_configurator_deb11: make \ PF_VM_NAMES=pfdeb11$(DEV_ENV) \ - SCENARIOS_TO_RUN=pfappserver \ + SCENARIOS_TO_RUN=pfappserver_configurator \ + $(MAKE_TARGET) + +pfappserver_configuration_el8: + make \ + PF_VM_NAMES=pfel8$(DEV_ENV) \ + SCENARIOS_TO_RUN=pfappserver_configuration \ + $(MAKE_TARGET) + +pfappserver_configuration_deb11: + make \ + PF_VM_NAMES=pfdeb11$(DEV_ENV) \ + SCENARIOS_TO_RUN=pfappserver_configuration \ $(MAKE_TARGET) example_el8: SCENARIOS_TO_RUN=example @@ -302,5 +314,7 @@ mac_auth_deb11_branches: mac_auth_deb11 mac_auth_el8_branches: mac_auth_el8 security_events_deb11_branches: security_events_deb11 unit_tests_el8_branches: unit_tests_el8 -pfappserver_el8_branches: pfappserver_el8 -pfappserver_deb11_branches: pfappserver_deb11 +pfappserver_configurator_el8_branches: pfappserver_configurator_el8 +pfappserver_configurator_deb11_branches: pfappserver_configurator_deb11 +pfappserver_configuration_el8_branches: pfappserver_configuration_el8 +pfappserver_configuration_deb11_branches: pfappserver_configuration_deb11 diff --git a/t/venom/lib/html_e2e.yml b/t/venom/lib/html_e2e.yml index fce96df6f1a5..156409ef0593 100644 --- a/t/venom/lib/html_e2e.yml +++ b/t/venom/lib/html_e2e.yml @@ -13,6 +13,7 @@ steps: CONFIG_FILE={{.input.config_file}} \ CONFIG="downloadsFolder={{.test_suite_results_dir}}/downloads,screenshotsFolder={{.test_suite_results_dir}}/screenshots,videosFolder={{.test_suite_results_dir}}/videos" \ TAG="{{.input.tag}}" \ + DEBUG=cypress:* \ # Info is only returned if assertion passes info: - "{{.result.systemout}}" diff --git a/t/venom/scenarios/pfappserver/site.yml b/t/venom/scenarios/pfappserver/site.yml deleted file mode 100644 index 97ba9bff099c..000000000000 --- a/t/venom/scenarios/pfappserver/site.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -# rsync before tests when doing local development -- import_playbook: playbooks/rsync.yml - when: lookup("env", "CI") != 'true' - -- import_playbook: playbooks/configure.yml - -- import_playbook: playbooks/localdev.yml - when: lookup("env", "CI") != 'true' - -- import_playbook: playbooks/run_tests.yml diff --git a/t/venom/scenarios/pfappserver/playbooks/configure.yml b/t/venom/scenarios/pfappserver_common/playbooks/configure.yml similarity index 100% rename from t/venom/scenarios/pfappserver/playbooks/configure.yml rename to t/venom/scenarios/pfappserver_common/playbooks/configure.yml diff --git a/t/venom/scenarios/pfappserver/playbooks/localdev.yml b/t/venom/scenarios/pfappserver_common/playbooks/localdev.yml similarity index 100% rename from t/venom/scenarios/pfappserver/playbooks/localdev.yml rename to t/venom/scenarios/pfappserver_common/playbooks/localdev.yml diff --git a/t/venom/scenarios/pfappserver/playbooks/rsync.yml b/t/venom/scenarios/pfappserver_common/playbooks/rsync.yml similarity index 100% rename from t/venom/scenarios/pfappserver/playbooks/rsync.yml rename to t/venom/scenarios/pfappserver_common/playbooks/rsync.yml diff --git a/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml b/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml new file mode 100644 index 000000000000..81946e0beb1c --- /dev/null +++ b/t/venom/scenarios/pfappserver_configuration/playbooks/run_tests.yml @@ -0,0 +1,28 @@ +--- +- hosts: pfservers + name: Run HTML pfappserver configuration tests + become: True + + vars: + test_suites: + - pfappserver_configurator + - pfappserver_configuration + + tasks: + - name: Run Venom testsuites + command: '{{ venom_dir }}/venom-wrapper.sh {{ venom_dir }}/test_suites/{{ item }}' + args: + chdir: '{{ venom_dir }}' + loop: '{{ test_suites }}' + vars: + venom_wrapper_args: + # temp, overcome Venom issue: + # - when running test suite one by one, previous logs and results are overriden + # Venom will create one directory per test suite to store results + VENOM_COMMON_FLAGS: '--output-dir={{ venom_dir }}/results/{{ item }} + --var test_suite_results_dir={{ venom_dir }}/results/{{ item }}' + + # add inventory__group_environment to Ansible environment + # useful to make env vars available for Venom + environment: '{{ inventory__group_environment | d({}) + | combine(venom_wrapper_args | d({})) }}' diff --git a/t/venom/scenarios/pfappserver_configuration/site.yml b/t/venom/scenarios/pfappserver_configuration/site.yml new file mode 100644 index 000000000000..8936e63c470a --- /dev/null +++ b/t/venom/scenarios/pfappserver_configuration/site.yml @@ -0,0 +1,11 @@ +--- +# rsync before tests when doing local development +- import_playbook: ../pfappserver_common/playbooks/rsync.yml + when: lookup("env", "CI") != 'true' + +- import_playbook: ../pfappserver_common/playbooks/configure.yml + +- import_playbook: ../pfappserver_common/playbooks/localdev.yml + when: lookup("env", "CI") != 'true' + +- import_playbook: playbooks/run_tests.yml diff --git a/t/venom/scenarios/pfappserver/playbooks/run_tests.yml b/t/venom/scenarios/pfappserver_configurator/playbooks/run_tests.yml similarity index 100% rename from t/venom/scenarios/pfappserver/playbooks/run_tests.yml rename to t/venom/scenarios/pfappserver_configurator/playbooks/run_tests.yml diff --git a/t/venom/scenarios/pfappserver_configurator/site.yml b/t/venom/scenarios/pfappserver_configurator/site.yml new file mode 100644 index 000000000000..8936e63c470a --- /dev/null +++ b/t/venom/scenarios/pfappserver_configurator/site.yml @@ -0,0 +1,11 @@ +--- +# rsync before tests when doing local development +- import_playbook: ../pfappserver_common/playbooks/rsync.yml + when: lookup("env", "CI") != 'true' + +- import_playbook: ../pfappserver_common/playbooks/configure.yml + +- import_playbook: ../pfappserver_common/playbooks/localdev.yml + when: lookup("env", "CI") != 'true' + +- import_playbook: playbooks/run_tests.yml diff --git a/t/venom/test_suites/pfappserver_configuration/TESTSUITE.md b/t/venom/test_suites/pfappserver_configuration/TESTSUITE.md new file mode 100644 index 000000000000..dc58926c792d --- /dev/null +++ b/t/venom/test_suites/pfappserver_configuration/TESTSUITE.md @@ -0,0 +1,13 @@ +# Venom End To End (E2E) Testing - Pfappserver + +## Test Suites + +* [Configurator](../../test_suites/pfappserver_configurator/run_e2e.yml) + +## Execution + +This scenario uses Cypress E2E testing through a custom Venom executor [`html_e2e`](../../lib/html_e2e.yml). + +## More Information + +See the [Cypress E2E Testing README](../../../html/pfappserver/README.md) for more information about running the tests without Ansible or Venom. \ No newline at end of file diff --git a/t/venom/test_suites/pfappserver_configuration/run_e2e.yml b/t/venom/test_suites/pfappserver_configuration/run_e2e.yml new file mode 100644 index 000000000000..5e4a5648d6ef --- /dev/null +++ b/t/venom/test_suites/pfappserver_configuration/run_e2e.yml @@ -0,0 +1,14 @@ +name: Run Cypress E2E Tests +testcases: + +- name: run_e2e + steps: + - type: html_e2e + base_url: "{{.html.pfappserver_baseurl}}" + browser: firefox + config_file: "cypress/config/cypress.config-configuration.js" + tag: "pfappserver_configuration" + info: + - "{{.result.html_e2e_systemout}}" + assertions: + - result.html_e2e_code ShouldEqual 0 \ No newline at end of file